// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef CHROME_BROWSER_RENDER_WIDGET_HOST_H__ #define CHROME_BROWSER_RENDER_WIDGET_HOST_H__ #include #include "base/task.h" #include "base/gfx/size.h" #include "chrome/common/ipc_channel.h" namespace gfx { class Rect; } class BackingStore; class PaintObserver; class RenderProcessHost; class RenderWidgetHostView; class WebInputEvent; class WebKeyboardEvent; class WebMouseEvent; class WebMouseWheelEvent; class WebCursor; enum ViewHostMsg_ImeControl; struct ViewHostMsg_PaintRect_Params; struct ViewHostMsg_ScrollRect_Params; struct WebPluginGeometry; // This class manages the browser side of a browser<->renderer HWND connection. // The HWND lives in the browser process, and windows events are sent over // IPC to the corresponding object in the renderer. The renderer paints into // shared memory, which we transfer to a backing store and blit to the screen // when Windows sends us a WM_PAINT message. // // How Shutdown Works // // There are two situations in which this object, a RenderWidgetHost, can be // instantiated: // // 1. By a WebContents as the communication conduit for a rendered web page. // The WebContents instantiates a derived class: RenderViewHost. // 2. By a WebContents as the communication conduit for a select widget. The // WebContents instantiates the RenderWidgetHost directly. // // For every WebContents there are several objects in play that need to be // properly destroyed or cleaned up when certain events occur. // // - WebContents - the TabContents itself, and its associated HWND. // - RenderViewHost - representing the communication conduit with the child // process. // - RenderWidgetHostHWND - the view of the web page content, message handler, // and plugin root. // // Normally, the WebContents contains a child RenderWidgetHostHWND that renders // the contents of the loaded page. It has a WS_CLIPCHILDREN style so that it // does no painting of its own. // // The lifetime of the RenderWidgetHostHWND is tied to the render process. If // the render process dies, the RenderWidgetHostHWND goes away and all // references to it must become NULL. If the WebContents finds itself without a // RenderWidgetHostHWND, it paints Sad Tab instead. // // RenderViewHost (a RenderWidgetHost subclass) is the conduit used to // communicate with the RenderView and is owned by the WebContents. If the // render process crashes, the RenderViewHost remains and restarts the render // process if needed to continue navigation. // // The WebContents is itself owned by the NavigationController in which it // resides. // // Some examples of how shutdown works: // // When a tab is closed (either by the user, the web page calling window.close, // etc) the TabStrip destroys the associated NavigationController, which calls // Destroy on each TabContents it owns. // // For a WebContents, its Destroy method tells the RenderViewHost to // shut down the render process and die. // // When the render process is destroyed it destroys the View: the // RenderWidgetHostHWND, which destroys its HWND and deletes that object. // // For select popups, the situation is a little different. The RenderWidgetHost // associated with the select popup owns the view and itself (is responsible // for destroying itself when the view is closed). The WebContents's only // responsibility is to select popups is to create them when it is told to. When // the View is destroyed via an IPC message (for when WebCore destroys the // popup, e.g. if the user selects one of the options), or because // WM_CANCELMODE is received by the view, the View schedules the destruction of // the render process. However in this case since there's no WebContents // container, when the render process is destroyed, the RenderWidgetHost just // deletes itself, which is safe because no one else should have any references // to it (the WebContents does not). // // It should be noted that the RenderViewHost, not the RenderWidgetHost, // handles IPC messages relating to the render process going away, since the // way a RenderViewHost (WebContents) handles the process dying is different to // the way a select popup does. As such the RenderWidgetHostHWND handles these // messages for select popups. This placement is more out of convenience than // anything else. When the view is live, these messages are forwarded to it by // the RenderWidgetHost's IPC message map. // class RenderWidgetHost : public IPC::Channel::Listener { public: // routing_id can be MSG_ROUTING_NONE, in which case the next available // routing id is taken from the RenderProcessHost. RenderWidgetHost(RenderProcessHost* process, int routing_id); virtual ~RenderWidgetHost(); // Gets/Sets the View of this RenderWidgetHost. Can be NULL, e.g. if the // RenderWidget is being destroyed or the render process crashed. You should // never cache this pointer since it can become NULL if the renderer crashes, // instead you should always ask for it using the accessor. void set_view(RenderWidgetHostView* view) { view_ = view; } RenderWidgetHostView* view() const { return view_; } RenderProcessHost* process() const { return process_; } int routing_id() const { return routing_id_; } // Manual RTTI FTW. We are not hosting a web page. virtual bool IsRenderView() { return false; } // Called when a renderer object already been created for this host, and we // just need to be attached to it. Used for window.open,