1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_CHILD_WEBTHREAD_IMPL_H_
6#define CONTENT_CHILD_WEBTHREAD_IMPL_H_
7
8#include <map>
9
10#include "base/memory/scoped_ptr.h"
11#include "base/threading/thread.h"
12#include "content/common/content_export.h"
13#include "third_party/WebKit/public/platform/WebThread.h"
14
15namespace content {
16
17class CONTENT_EXPORT WebThreadBase : public blink::WebThread {
18 public:
19  virtual ~WebThreadBase();
20
21  virtual void addTaskObserver(TaskObserver* observer);
22  virtual void removeTaskObserver(TaskObserver* observer);
23
24  virtual bool isCurrentThread() const = 0;
25  virtual blink::PlatformThreadId threadId() const = 0;
26
27 protected:
28  WebThreadBase();
29
30 private:
31  class TaskObserverAdapter;
32
33  typedef std::map<TaskObserver*, TaskObserverAdapter*> TaskObserverMap;
34  TaskObserverMap task_observer_map_;
35};
36
37class CONTENT_EXPORT WebThreadImpl : public WebThreadBase {
38 public:
39  explicit WebThreadImpl(const char* name);
40  virtual ~WebThreadImpl();
41
42  virtual void postTask(Task* task);
43  virtual void postDelayedTask(Task* task, long long delay_ms);
44
45  virtual void enterRunLoop();
46  virtual void exitRunLoop();
47
48  base::MessageLoop* message_loop() const { return thread_->message_loop(); }
49
50  virtual bool isCurrentThread() const OVERRIDE;
51  virtual blink::PlatformThreadId threadId() const OVERRIDE;
52
53 private:
54  scoped_ptr<base::Thread> thread_;
55};
56
57class WebThreadImplForMessageLoop : public WebThreadBase {
58 public:
59  CONTENT_EXPORT explicit WebThreadImplForMessageLoop(
60      base::MessageLoopProxy* message_loop);
61  CONTENT_EXPORT virtual ~WebThreadImplForMessageLoop();
62
63  virtual void postTask(Task* task) OVERRIDE;
64  virtual void postDelayedTask(Task* task, long long delay_ms) OVERRIDE;
65
66  virtual void enterRunLoop() OVERRIDE;
67  virtual void exitRunLoop() OVERRIDE;
68
69 private:
70  virtual bool isCurrentThread() const OVERRIDE;
71  virtual blink::PlatformThreadId threadId() const OVERRIDE;
72
73  scoped_refptr<base::MessageLoopProxy> message_loop_;
74  blink::PlatformThreadId thread_id_;
75};
76
77} // namespace content
78
79#endif  // CONTENT_CHILD_WEBTHREAD_IMPL_H_
80