15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_PUBLIC_RENDERER_RENDER_THREAD_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_PUBLIC_RENDERER_RENDER_THREAD_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/callback.h" 10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/memory/shared_memory.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h" 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/common/user_metrics_action.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_channel_proxy.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sender.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GURL; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MessageLoop; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageLoopProxy; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncChannel; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncMessageFilter; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace v8 { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderProcessObserver; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceDispatcherDelegate; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT RenderThread : public IPC::Sender { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the one render thread for this process. Note that this can only 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be accessed when running on the render thread itself. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static RenderThread* Get(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThread(); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~RenderThread(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual base::MessageLoop* GetMessageLoop() = 0; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual IPC::SyncChannel* GetChannel() = 0; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::string GetLocale() = 0; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual IPC::SyncMessageFilter* GetSyncMessageFilter() = 0; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual scoped_refptr<base::MessageLoopProxy> GetIOMessageLoopProxy() = 0; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called to add or remove a listener for a particular message routing ID. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These methods normally get delegated to a MessageRouter. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddRoute(int32 routing_id, IPC::Listener* listener) = 0; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RemoveRoute(int32 routing_id) = 0; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GenerateRoutingID() = 0; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These map to IPC::ChannelProxy methods. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddFilter(IPC::ChannelProxy::MessageFilter* filter) = 0; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RemoveFilter(IPC::ChannelProxy::MessageFilter* filter) = 0; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add/remove observers for the process. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddObserver(RenderProcessObserver* observer) = 0; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RemoveObserver(RenderProcessObserver* observer) = 0; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the ResourceDispatcher delegate object for this process. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetResourceDispatcherDelegate( 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceDispatcherDelegate* delegate) = 0; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by a RenderWidget when it is hidden or restored. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void WidgetHidden() = 0; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void WidgetRestored() = 0; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We initialize WebKit as late as possible. Call this to force 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initialization. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EnsureWebKitInitialized() = 0; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Sends over a UserMetricsAction to be recorded by user metrics as an action. 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Once a new user metric is added, run 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // tools/metrics/actions/extract_actions.py --hash 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // to generate a new mapping of [action hashes -> metric names] and send it 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // out for review to be updated. 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // WARNING: When using UserMetricsAction, UserMetricsAction and a string 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // literal parameter must be on the same line, e.g. 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // RenderThread::Get()->RecordAction( 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // UserMetricsAction("my extremely long action name")); 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // because otherwise our processing scripts won't pick up on new actions. 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void RecordAction(const UserMetricsAction& action) = 0; 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Sends over a string to be recorded by user metrics as a computed action. 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // When you use this you need to also update the rules for extracting known 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // actions in chrome/tools/extract_actions.py. 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void RecordComputedAction(const std::string& action) = 0; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Asks the host to create a block of shared memory for the renderer. 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The shared memory allocated by the host is returned back. 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<base::SharedMemory> HostAllocateSharedMemoryBuffer( 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t buffer_size) = 0; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Registers the given V8 extension with WebKit. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RegisterExtension(v8::Extension* extension) = 0; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Schedule a call to IdleHandler with the given initial delay. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ScheduleIdleHandler(int64 initial_delay_ms) = 0; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A task we invoke periodically to assist with idle cleanup. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void IdleHandler() = 0; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get/Set the delay for how often the idle handler is called. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int64 GetIdleNotificationDelayInMs() const = 0; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetIdleNotificationDelayInMs( 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 idle_notification_delay_in_ms) = 0; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Suspend/resume the webkit timer for this renderer. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ToggleWebKitSharedTimer(bool suspend) = 0; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateHistograms(int sequence_number) = 0; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Post task to all worker threads. Returns number of workers. 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual int PostTaskToAllWebWorkers(const base::Closure& closure) = 0; 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resolve the proxy servers to use for a given url. On success true is 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // returned and |proxy_list| is set to a PAC string containing a list of 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // proxy servers. 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool ResolveProxy(const GURL& url, std::string* proxy_list) = 0; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request that the given font be loaded by the browser so it's cached by the 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OS. Please see ChildProcessHost::PreCacheFont for details. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PreCacheFont(const LOGFONT& log_font) = 0; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Release cached font. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReleaseCachedFonts() = 0; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_PUBLIC_RENDERER_RENDER_THREAD_H_ 144