blob: e6b24c2bedadc37af3dd51567cc35a409afab86b [file] [log] [blame]
// 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 <windows.h>
#include <map>
#include <string>
#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<int, WebContents*> 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<int, RenderWidgetHostView*> PendingWidgetViews;
PendingWidgetViews pending_widget_views_;
DISALLOW_COPY_AND_ASSIGN(WebContentsView);
};
#endif // CHROME_BROWSER_WEB_CONTENTS_VIEW_H_