// Copyright (c) 2006-2008 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_WEB_CONTENTS_VIEW_H_ #define CHROME_BROWSER_WEB_CONTENTS_VIEW_H_ #include #include #include #include "base/basictypes.h" #include "base/gfx/rect.h" #include "base/gfx/size.h" #include "chrome/browser/render_view_host_delegate.h" class Browser; class InfoBarView; class RenderViewHost; class RenderWidgetHost; class RenderWidgetHostView; class RenderWidgetHostViewWin; // TODO(brettw) this should not be necessary. class WebContents; struct WebDropData; class WebKeyboardEvent; // The WebContentsView is an interface that is implemented by the platform- // dependent web contents views. The WebContents uses this interface to talk to // them. View-related messages will also get forwarded directly to this class // from RenderViewHost via RenderViewHostDelegate::View. // // It contains a small amount of logic with respect to creating new sub-view // that should be the same for all platforms. class WebContentsView : public RenderViewHostDelegate::View { public: virtual ~WebContentsView() {} virtual WebContents* GetWebContents() = 0; virtual void CreateView(HWND parent_hwnd, const gfx::Rect& initial_bounds) = 0; // Sets up the View that holds the rendered web page, receives messages for // it and contains page plugins. // TODO(brettw) make this so we don't need to return the Win version (see the // caller in WebContents). virtual RenderWidgetHostViewWin* CreateViewForWidget( RenderWidgetHost* render_widget_host) = 0; // Returns the HWND that contains the contents of the tab. // TODO(brettw) this should not be necessary in this cross-platform interface. virtual HWND GetContainerHWND() const = 0; // Returns the HWND with the main content of the tab (i.e. the main render // view host, though there may be many popups in the tab as children of the // container HWND). // TODO(brettw) this should not be necessary in this cross-platform interface. virtual HWND GetContentHWND() const = 0; // Computes the rectangle for the native widget that contains the contents of // the tab relative to its parent. virtual void GetContainerBounds(gfx::Rect *out) const = 0; // Helper function for GetContainerBounds. Most callers just want to know the // size, and this makes it more clear. gfx::Size GetContainerSize() const { gfx::Rect rc; GetContainerBounds(&rc); return gfx::Size(rc.width(), rc.height()); } // Called when the WebContents is being destroyed. This should clean up child // windows that are part of the view. // // TODO(brettw) It seems like this might be able to be done internally as the // window is being torn down without input from the WebContents. Try to // implement functions that way rather than adding stuff here. virtual void OnContentsDestroy() = 0; // Displays the given error in the info bar. A new info bar will be shown if // one is not shown already. The new error text will replace any existing // text shown by this same function. // // Note: this replacement behavior is historical; crashed plugin and out of // JS memory used the same message. This seems reasonable, but it may not be // the best thing for all error messages. virtual void DisplayErrorInInfoBar(const std::wstring& text) = 0; // Set/get whether or not the info bar is visible. See also the ChromeFrame // method InfoBarVisibilityChanged and TabContents::IsInfoBarVisible. virtual void SetInfoBarVisible(bool visible) = 0; virtual bool IsInfoBarVisible() const = 0; // Create the InfoBarView and returns it if none has been created. // Just returns existing InfoBarView if it is already created. // TODO(brettw) this probably shouldn't be here. There should be methods to // tell us what we need to display instead. virtual InfoBarView* GetInfoBarView() = 0; // Sets the page title for the native widgets corresponding to the view. This // is not strictly necessary and isn't expected to be displayed anywhere, but // can aid certain debugging tools such as Spy++ on Windows where you are // trying to find a specific window. virtual void SetPageTitle(const std::wstring& title) = 0; // Schedules a complete repaint of the window. This is used for cases where // the existing contents became invalid due to an external event, such as the // renderer crashing. virtual void Invalidate() = 0; // TODO(brettw) this is a hack. It's used in two places at the time of this // writing: (1) when render view hosts switch, we need to size the replaced // one to be correct, since it wouldn't have known about sizes that happened // while it was hidden; (2) in constrained windows. // // (1) will be fixed once interstitials are cleaned up. (2) seems like it // should be cleaned up or done some other way, since this works for normal // TabContents without the special code. virtual void SizeContents(const gfx::Size& size) = 0; // Find in page -------------------------------------------------------------- // Opens the find in page window if it isn't already open. It will advance to // the next match if |find_next| is set and there is a search string, // otherwise, the find window will merely be opened. |forward_direction| // indicates the direction to search when find_next is set, otherwise it is // ignored. virtual void FindInPage(const Browser& browser, bool find_next, bool forward_direction) = 0; // Hides the find bar if there is one shown. Does nothing otherwise. The find // bar will not be deleted, merely hidden. This ensures that any search terms // are preserved if the user subsequently opens the find bar. // // If |end_session| is true, then the find session will be ended, which // indicates the user requested they no longer be in find mode for that tab. // The find bar will not be restored when we switch back to the tab. // Otherwise, we assume that the find bar is being hidden because the tab is // being hidden, and all state like visibility and tickmarks will be restored // when the tab comes back. virtual void HideFindBar(bool end_session) = 0; // Called when the tab is reparented to a new browser window. On MS Windows, // we have to change the parent of our find bar to go with the new window. // // TODO(brettw) this seems like it could be improved. Possibly all doohickies // around the tab like this, the download bar etc. should be managed by the // BrowserView2 object. virtual void ReparentFindWindow(Browser* new_browser) const = 0; // Computes the location of the find bar and whether it is fully visible in // its parent window. The return value indicates if the window is visible at // all. Both out arguments are required. // // This is used for UI tests of the find bar. If the find bar is not currently // shown (return value of false), the out params will be {(0, 0), false}. virtual bool GetFindBarWindowInfo(gfx::Point* position, bool* fully_visible) const = 0; protected: WebContentsView() {} // Abstract interface. // Internal interface for some functions in the RenderViewHostDelegate::View // interface. Subclasses should implement this rather than the corresponding // ...::View functions directly, since the routing stuff will already be // computed. They should implement the rest of the functions as normal. // // The only difference is that the Create functions return the newly // created objects so that they can be associated with the given routes. When // they are shown later, we'll look them up again and pass the objects to // the Show functions rather than the route ID. virtual WebContents* CreateNewWindowInternal(int route_id, HANDLE modal_dialog_event) = 0; virtual RenderWidgetHostView* CreateNewWidgetInternal(int route_id, bool focus_on_show) = 0; virtual void ShowCreatedWindowInternal(WebContents* new_web_contents, WindowOpenDisposition disposition, const gfx::Rect& initial_pos, bool user_gesture) = 0; virtual void ShowCreatedWidgetInternal(RenderWidgetHostView* widget_host_view, const gfx::Rect& initial_pos) = 0; private: // We implement these functions on RenderViewHostDelegate::View directly and // do some book-keeping associated with the request. The request is then // forwarded to *Internal which does platform-specific work. virtual void CreateNewWindow(int route_id, HANDLE modal_dialog_event); virtual void CreateNewWidget(int route_id, bool focus_on_show); virtual void ShowCreatedWindow(int route_id, WindowOpenDisposition disposition, const gfx::Rect& initial_pos, bool user_gesture); virtual void ShowCreatedWidget(int route_id, const gfx::Rect& initial_pos); // Tracks created WebContents objects that have not been shown yet. They are // identified by the route ID passed to CreateNewWindow. typedef std::map PendingContents; PendingContents pending_contents_; // These maps hold on to the widgets that we created on behalf of the // renderer that haven't shown yet. typedef std::map PendingWidgetViews; PendingWidgetViews pending_widget_views_; DISALLOW_COPY_AND_ASSIGN(WebContentsView); }; #endif // CHROME_BROWSER_WEB_CONTENTS_VIEW_H_