summaryrefslogtreecommitdiffstats
path: root/chrome/browser/tab_contents/web_contents_view.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/tab_contents/web_contents_view.h')
-rw-r--r--chrome/browser/tab_contents/web_contents_view.h191
1 files changed, 191 insertions, 0 deletions
diff --git a/chrome/browser/tab_contents/web_contents_view.h b/chrome/browser/tab_contents/web_contents_view.h
new file mode 100644
index 0000000..232b449
--- /dev/null
+++ b/chrome/browser/tab_contents/web_contents_view.h
@@ -0,0 +1,191 @@
+// 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 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() = 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;
+
+ // 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;
+
+ // Invoked from the platform dependent web contents view when a
+ // RenderWidgetHost is deleted. Removes |host| from internal maps.
+ void RenderWidgetHostDestroyed(RenderWidgetHost* host);
+
+ // 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 activatable) = 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 activatable);
+ 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_