summaryrefslogtreecommitdiffstats
path: root/chrome/browser/renderer_host/render_process_host.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/renderer_host/render_process_host.h')
-rw-r--r--chrome/browser/renderer_host/render_process_host.h203
1 files changed, 203 insertions, 0 deletions
diff --git a/chrome/browser/renderer_host/render_process_host.h b/chrome/browser/renderer_host/render_process_host.h
new file mode 100644
index 0000000..46e1353
--- /dev/null
+++ b/chrome/browser/renderer_host/render_process_host.h
@@ -0,0 +1,203 @@
+// Copyright (c) 2009 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 CHROME_BROWSER_RENDERER_HOST_RENDER_PROCESS_HOST_H_
+#define CHROME_BROWSER_RENDERER_HOST_RENDER_PROCESS_HOST_H_
+
+#include "base/basictypes.h"
+#include "base/id_map.h"
+#include "base/process.h"
+#include "base/scoped_ptr.h"
+#include "chrome/common/ipc_sync_channel.h"
+
+class Profile;
+
+// Virtual interface that represents the browser side of the browser <->
+// renderer communication channel. There will generally be one
+// RenderProcessHost per renderer process.
+//
+// The concrete implementation of this class for normal use is the
+// BrowserRenderProcessHost. It may also be implemented by a testing interface
+// for mocking purposes.
+class RenderProcessHost : public IPC::Channel::Sender,
+ public IPC::Channel::Listener {
+ public:
+ typedef IDMap<RenderProcessHost>::const_iterator iterator;
+
+ RenderProcessHost(Profile* profile);
+ virtual ~RenderProcessHost();
+
+ // Returns the user profile associated with this renderer process.
+ Profile* profile() const { return profile_; }
+
+ // Returns the unique identifier for this host. This can be used later in
+ // a call to FromID() to get back to this object (this is used to avoid
+ // sending non-threadsafe pointers to other threads).
+ int host_id() const { return host_id_; }
+
+ // Returns the process object associated with the child process. In certain
+ // tests or single-process mode, this will actually represent the current
+ // process.
+ const base::Process& process() const { return process_; }
+
+ // May return NULL if there is no connection.
+ IPC::SyncChannel* channel() { return channel_.get(); }
+
+ // Used for refcounting, each holder of this object must Attach and Release
+ // just like it would for a COM object. This object should be allocated on
+ // the heap; when no listeners own it any more, it will delete itself.
+ void Attach(IPC::Channel::Listener* listener, int routing_id);
+
+ // See Attach()
+ void Release(int listener_id);
+
+ // Listeners should call this when they've sent a "Close" message and
+ // they're waiting for a "Close_ACK", so that if the renderer process
+ // goes away we'll know that it was intentional rather than a crash.
+ void ReportExpectingClose(int32 listener_id);
+
+ // Allows iteration over this RenderProcessHost's RenderViewHost listeners.
+ // Use from UI thread only.
+ typedef IDMap<IPC::Channel::Listener>::const_iterator listeners_iterator;
+ listeners_iterator listeners_begin() {
+ return listeners_.begin();
+ }
+ listeners_iterator listeners_end() {
+ return listeners_.end();
+ }
+
+ IPC::Channel::Listener* GetListenerByID(int routing_id) {
+ return listeners_.Lookup(routing_id);
+ }
+
+ // Called to inform the render process host of a new "max page id" for a
+ // render view host. The render process host computes the largest page id
+ // across all render view hosts and uses the value when it needs to
+ // initialize a new renderer in place of the current one.
+ void UpdateMaxPageID(int32 page_id);
+
+ // Virtual interface ---------------------------------------------------------
+
+ // Initialize the new renderer process, returning true on success. This must
+ // be called once before the object can be used, but can be called after
+ // that with no effect. Therefore, if the caller isn't sure about whether
+ // the process has been created, it should just call Init().
+ virtual bool Init() = 0;
+
+ // Gets the next available routing id.
+ virtual int GetNextRoutingID() = 0;
+
+ // Called on the UI thread to cancel any outstanding resource requests for
+ // the specified render widget.
+ virtual void CancelResourceRequests(int render_widget_id) = 0;
+
+ // Called on the UI thread to simulate a ClosePage_ACK message to the
+ // ResourceDispatcherHost. Necessary for a cross-site request, in the case
+ // that the original RenderViewHost is not live and thus cannot run an
+ // onunload handler.
+ virtual void CrossSiteClosePageACK(int new_render_process_host_id,
+ int new_request_id) = 0;
+
+ // Called on the UI thread to wait for the next PaintRect message for the
+ // specified render widget. Returns true if successful, and the msg out-
+ // param will contain a copy of the received PaintRect message.
+ virtual bool WaitForPaintMsg(int render_widget_id,
+ const base::TimeDelta& max_delay,
+ IPC::Message* msg) = 0;
+
+ // Called when a received message cannot be decoded.
+ virtual void ReceivedBadMessage(uint16 msg_type) = 0;
+
+ // Track the count of visible widgets. Called by listeners to register and
+ // unregister visibility.
+ virtual void WidgetRestored() = 0;
+ virtual void WidgetHidden() = 0;
+
+ // Add a word in the spellchecker.
+ virtual void AddWord(const std::wstring& word) = 0;
+
+ // Try to shutdown the associated renderer process as fast as possible.
+ // If this renderer has any RenderViews with unload handlers, then this
+ // function does nothing. The current implementation uses TerminateProcess.
+ // Returns True if it was able to do fast shutdown.
+ virtual bool FastShutdownIfPossible() = 0;
+
+ // Static management functions -----------------------------------------------
+
+ // Flag to run the renderer in process. This is primarily
+ // for debugging purposes. When running "in process", the
+ // browser maintains a single RenderProcessHost which communicates
+ // to a RenderProcess which is instantiated in the same process
+ // with the Browser. All IPC between the Browser and the
+ // Renderer is the same, it's just not crossing a process boundary.
+ static bool run_renderer_in_process() {
+ return run_renderer_in_process_;
+ }
+ static void set_run_renderer_in_process(bool value) {
+ run_renderer_in_process_ = value;
+ }
+
+ // Allows iteration over all the RenderProcessHosts in the browser. Note
+ // that each host may not be active, and therefore may have NULL channels.
+ // This is just a standard STL iterator, so it is not valid if the list
+ // of RenderProcessHosts changes between iterations.
+ static iterator begin();
+ static iterator end();
+ static size_t size(); // TODO(brettw) rename this, it's very unclear.
+
+ // Returns the RenderProcessHost given its ID. Returns NULL if the ID does
+ // not correspond to a live RenderProcessHost.
+ static RenderProcessHost* FromID(int render_process_id);
+
+ // Returns true if the caller should attempt to use an existing
+ // RenderProcessHost rather than creating a new one.
+ static bool ShouldTryToUseExistingProcessHost();
+
+ // Get an existing RenderProcessHost associated with the given profile, if
+ // possible. The renderer process is chosen randomly from the
+ // processes associated with the given profile.
+ // Returns NULL if no suitable renderer process is available.
+ static RenderProcessHost* GetExistingProcessHost(Profile* profile);
+
+ protected:
+ // Unregister this object from all globals that reference it.
+ // This would naturally be part of the destructor, but we destruct
+ // asynchronously.
+ //
+ // This can be overridden by derived classes to add their own unregister code,
+ // but you should be sure to always call this one AT THE END of your own.
+ virtual void Unregister();
+
+ base::Process process_;
+
+ // A proxy for our IPC::Channel that lives on the IO thread (see
+ // browser_process.h)
+ scoped_ptr<IPC::SyncChannel> channel_;
+
+ // the registered listeners. When this list is empty or all NULL, we should
+ // delete ourselves
+ IDMap<IPC::Channel::Listener> listeners_;
+
+ // The maximum page ID we've ever seen from the renderer process.
+ int32 max_page_id_;
+
+ // Indicates whether we have notified that the process has terminated. We
+ // only want to send this out once.
+ bool notified_termination_;
+
+ private:
+ int host_id_;
+
+ Profile* profile_;
+
+ // set of listeners that expect the renderer process to close
+ std::set<int> listeners_expecting_close_;
+
+ // See getter above.
+ static bool run_renderer_in_process_;
+
+ DISALLOW_COPY_AND_ASSIGN(RenderProcessHost);
+};
+
+#endif // CHROME_BROWSER_RENDERER_HOST_RENDER_PROCESS_HOST_H_