1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// Copyright (c) 2012 The Chromium Authors. All rights reserved.
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// Use of this source code is governed by a BSD-style license that can be
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// found in the LICENSE file.
48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com#ifndef CONTENT_PUBLIC_RENDERER_RENDER_THREAD_H_
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com#define CONTENT_PUBLIC_RENDERER_RENDER_THREAD_H_
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "base/basictypes.h"
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com#include "base/callback.h"
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "base/memory/shared_memory.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "base/metrics/user_metrics_action.h"
12c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com#include "content/common/content_export.h"
134b163ed2c22facbe8891616874ae07ba7827d9c9reed@google.com#include "ipc/ipc_channel_proxy.h"
14b83b6b4f7690fe929d8d6b1a3d2b7ed562b95ba6robertphillips@google.com#include "ipc/ipc_sender.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
160456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com#if defined(OS_WIN)
170456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com#include <windows.h>
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
20fc25abdabff76f913fb9d4f373418c10a1eca92breed@android.comclass GURL;
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comnamespace base {
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass MessageLoop;
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass MessageLoopProxy;
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass WaitableEvent;
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comnamespace IPC {
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass MessageFilter;
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SyncChannel;
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SyncMessageFilter;
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
33fc25abdabff76f913fb9d4f373418c10a1eca92breed@android.com
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comnamespace v8 {
35da94699149a40a90731425766d3b994e34c5ba26deanm@chromium.orgclass Extension;
36543ed9352c7dfd93071c08b14930cca2e82a08d4reed@android.com}
37543ed9352c7dfd93071c08b14930cca2e82a08d4reed@android.com
38543ed9352c7dfd93071c08b14930cca2e82a08d4reed@android.comnamespace content {
39543ed9352c7dfd93071c08b14930cca2e82a08d4reed@android.com
40543ed9352c7dfd93071c08b14930cca2e82a08d4reed@android.comclass RenderProcessObserver;
41543ed9352c7dfd93071c08b14930cca2e82a08d4reed@android.comclass ResourceDispatcherDelegate;
42543ed9352c7dfd93071c08b14930cca2e82a08d4reed@android.comclass ServiceRegistry;
43543ed9352c7dfd93071c08b14930cca2e82a08d4reed@android.com
44543ed9352c7dfd93071c08b14930cca2e82a08d4reed@android.comclass CONTENT_EXPORT RenderThread : public IPC::Sender {
45da94699149a40a90731425766d3b994e34c5ba26deanm@chromium.org public:
46a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  // Returns the one render thread for this process.  Note that this can only
47a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  // be accessed when running on the render thread itself.
48a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  static RenderThread* Get();
49a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
50a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  RenderThread();
51a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  virtual ~RenderThread();
52a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
53a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  virtual base::MessageLoop* GetMessageLoop() = 0;
54da94699149a40a90731425766d3b994e34c5ba26deanm@chromium.org  virtual IPC::SyncChannel* GetChannel() = 0;
55a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  virtual std::string GetLocale() = 0;
56a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  virtual IPC::SyncMessageFilter* GetSyncMessageFilter() = 0;
57a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  virtual scoped_refptr<base::MessageLoopProxy> GetIOMessageLoopProxy() = 0;
58a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
59a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  // Called to add or remove a listener for a particular message routing ID.
60a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  // These methods normally get delegated to a MessageRouter.
61a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  virtual void AddRoute(int32 routing_id, IPC::Listener* listener) = 0;
62a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  virtual void RemoveRoute(int32 routing_id) = 0;
63a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  virtual int GenerateRoutingID() = 0;
64da94699149a40a90731425766d3b994e34c5ba26deanm@chromium.org
65a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  // These map to IPC::ChannelProxy methods.
66a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  virtual void AddFilter(IPC::MessageFilter* filter) = 0;
67a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  virtual void RemoveFilter(IPC::MessageFilter* filter) = 0;
68a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
69a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  // Add/remove observers for the process.
70a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com  virtual void AddObserver(RenderProcessObserver* observer) = 0;
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  virtual void RemoveObserver(RenderProcessObserver* observer) = 0;
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7348543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // Set the ResourceDispatcher delegate object for this process.
7448543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  virtual void SetResourceDispatcherDelegate(
7548543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org      ResourceDispatcherDelegate* delegate) = 0;
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // We initialize WebKit as late as possible. Call this to force
7848543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // initialization.
7948543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  virtual void EnsureWebKitInitialized() = 0;
8048543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Sends over a base::UserMetricsAction to be recorded by user metrics as
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // an action. Once a new user metric is added, run
8348543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  //   tools/metrics/actions/extract_actions.py
8448543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // to add the metric to actions.xml, then update the <owner>s and
8548543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // <description> sections. Make sure to include the actions.xml file when you
8648543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // upload your code for review!
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  //
881447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com  // WARNING: When using base::UserMetricsAction, base::UserMetricsAction
8948543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // and a string literal parameter must be on the same line, e.g.
9048543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  //   RenderThread::Get()->RecordAction(
9148543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  //       base::UserMetricsAction("my extremely long action name"));
9248543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // because otherwise our processing scripts won't pick up on new actions.
9348543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  virtual void RecordAction(const base::UserMetricsAction& action) = 0;
9448543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
9548543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // Sends over a string to be recorded by user metrics as a computed action.
9648543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // When you use this you need to also update the rules for extracting known
9748543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // actions in chrome/tools/extract_actions.py.
9848543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  virtual void RecordComputedAction(const std::string& action) = 0;
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Asks the host to create a block of shared memory for the renderer.
10148543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // The shared memory allocated by the host is returned back.
10248543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  virtual scoped_ptr<base::SharedMemory> HostAllocateSharedMemoryBuffer(
10348543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org      size_t buffer_size) = 0;
10448543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
10548543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // Registers the given V8 extension with WebKit.
10648543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  virtual void RegisterExtension(v8::Extension* extension) = 0;
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
10848543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // Schedule a call to IdleHandler with the given initial delay.
10948543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  virtual void ScheduleIdleHandler(int64 initial_delay_ms) = 0;
11048543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // A task we invoke periodically to assist with idle cleanup.
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  virtual void IdleHandler() = 0;
11348543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
11448543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // Get/Set the delay for how often the idle handler is called.
11548543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  virtual int64 GetIdleNotificationDelayInMs() const = 0;
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  virtual void SetIdleNotificationDelayInMs(
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      int64 idle_notification_delay_in_ms) = 0;
11848543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
11948543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  virtual void UpdateHistograms(int sequence_number) = 0;
12048543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
12148543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // Post task to all worker threads. Returns number of workers.
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  virtual int PostTaskToAllWebWorkers(const base::Closure& closure) = 0;
12348543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
12448543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // Resolve the proxy servers to use for a given url. On success true is
12548543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // returned and |proxy_list| is set to a PAC string containing a list of
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // proxy servers.
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  virtual bool ResolveProxy(const GURL& url, std::string* proxy_list) = 0;
12848543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
12948543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // Gets the shutdown event for the process.
13048543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  virtual base::WaitableEvent* GetShutdownEvent() = 0;
13148543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
13248543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org#if defined(OS_WIN)
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Request that the given font be loaded by the browser so it's cached by the
13448543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // OS. Please see ChildProcessHost::PreCacheFont for details.
13548543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  virtual void PreCacheFont(const LOGFONT& log_font) = 0;
13648543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
13748543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // Release cached font.
13848543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  virtual void ReleaseCachedFonts() = 0;
13948543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org#endif
14048543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
14148543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org  // Returns the ServiceRegistry for this thread.
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  virtual ServiceRegistry* GetServiceRegistry() = 0;
14348543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org};
14448543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
14548543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org}  // namespace content
14648543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
14748543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org#endif  // CONTENT_PUBLIC_RENDERER_RENDER_THREAD_H_
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com