// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_BROWSER_RENDERER_HOST_BROWSER_RENDER_PROCESS_HOST_H_ #define CONTENT_BROWSER_RENDERER_HOST_BROWSER_RENDER_PROCESS_HOST_H_ #pragma once #include #include #include #include "base/memory/scoped_ptr.h" #include "base/process.h" #include "base/timer.h" #include "content/browser/child_process_launcher.h" #include "content/browser/renderer_host/render_process_host.h" #include "ui/gfx/surface/transport_dib.h" class CommandLine; class RendererMainThread; class RenderWidgetHelper; namespace base { class SharedMemory; } // Implements a concrete RenderProcessHost for the browser process for talking // to actual renderer processes (as opposed to mocks). // // Represents the browser side of the browser <--> renderer communication // channel. There will be one RenderProcessHost per renderer process. // // This object is refcounted so that it can release its resources when all // hosts using it go away. // // This object communicates back and forth with the RenderProcess object // running in the renderer process. Each RenderProcessHost and RenderProcess // keeps a list of RenderView (renderer) and TabContents (browser) which // are correlated with IDs. This way, the Views and the corresponding ViewHosts // communicate through the two process objects. class BrowserRenderProcessHost : public RenderProcessHost, public ChildProcessLauncher::Client { public: explicit BrowserRenderProcessHost(Profile* profile); virtual ~BrowserRenderProcessHost(); // RenderProcessHost implementation (public portion). virtual bool Init(bool is_accessibility_enabled); virtual int GetNextRoutingID(); virtual void CancelResourceRequests(int render_widget_id); virtual void CrossSiteSwapOutACK(const ViewMsg_SwapOut_Params& params); virtual bool WaitForUpdateMsg(int render_widget_id, const base::TimeDelta& max_delay, IPC::Message* msg); virtual void ReceivedBadMessage(); virtual void WidgetRestored(); virtual void WidgetHidden(); virtual int VisibleWidgetCount() const; virtual bool FastShutdownIfPossible(); virtual bool SendWithTimeout(IPC::Message* msg, int timeout_ms); virtual base::ProcessHandle GetHandle(); virtual TransportDIB* GetTransportDIB(TransportDIB::Id dib_id); // IPC::Channel::Sender via RenderProcessHost. virtual bool Send(IPC::Message* msg); // IPC::Channel::Listener via RenderProcessHost. virtual bool OnMessageReceived(const IPC::Message& msg); virtual void OnChannelConnected(int32 peer_pid); virtual void OnChannelError(); // ChildProcessLauncher::Client implementation. virtual void OnProcessLaunched(); private: friend class VisitRelayingRenderProcessHost; // Creates and adds the IO thread message filters. void CreateMessageFilters(); // Control message handlers. void OnShutdownRequest(); void SuddenTerminationChanged(bool enabled); void OnUserMetricsRecordAction(const std::string& action); void OnRevealFolderInOS(const FilePath& path); // Generates a command line to be used to spawn a renderer and appends the // results to |*command_line|. void AppendRendererCommandLine(CommandLine* command_line) const; // Copies applicable command line switches from the given |browser_cmd| line // flags to the output |renderer_cmd| line flags. Not all switches will be // copied over. void PropagateBrowserCommandLineToRenderer(const CommandLine& browser_cmd, CommandLine* renderer_cmd) const; // Callers can reduce the RenderProcess' priority. void SetBackgrounded(bool backgrounded); // The count of currently visible widgets. Since the host can be a container // for multiple widgets, it uses this count to determine when it should be // backgrounded. int32 visible_widgets_; // Does this process have backgrounded priority. bool backgrounded_; // Used to allow a RenderWidgetHost to intercept various messages on the // IO thread. scoped_refptr widget_helper_; // A map of transport DIB ids to cached TransportDIBs std::map cached_dibs_; enum { // This is the maximum size of |cached_dibs_| MAX_MAPPED_TRANSPORT_DIBS = 3, }; // Map a transport DIB from its Id and return it. Returns NULL on error. TransportDIB* MapTransportDIB(TransportDIB::Id dib_id); void ClearTransportDIBCache(); // This is used to clear our cache five seconds after the last use. base::DelayTimer cached_dibs_cleaner_; // Used in single-process mode. scoped_ptr in_process_renderer_; // True if this prcoess should have accessibility enabled; bool accessibility_enabled_; // True after Init() has been called. We can't just check channel_ because we // also reset that in the case of process termination. bool is_initialized_; // Used to launch and terminate the process without blocking the UI thread. scoped_ptr child_process_launcher_; // Messages we queue while waiting for the process handle. We queue them here // instead of in the channel so that we ensure they're sent after init related // messages that are sent once the process handle is available. This is // because the queued messages may have dependencies on the init messages. std::queue queued_messages_; DISALLOW_COPY_AND_ASSIGN(BrowserRenderProcessHost); }; #endif // CONTENT_BROWSER_RENDERER_HOST_BROWSER_RENDER_PROCESS_HOST_H_