| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_VIEW_H_ | 5 #ifndef CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_VIEW_H_ |
| 6 #define CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_VIEW_H_ | 6 #define CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_VIEW_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include <map> | 9 // TODO(jam): remove this file when all files have been converted. |
| 10 #include <string> | 10 #include "content/browser/tab_contents/tab_contents_view.h" |
| 11 | |
| 12 #include "base/basictypes.h" | |
| 13 #include "chrome/browser/renderer_host/render_view_host_delegate.h" | |
| 14 #include "chrome/browser/tab_contents/render_view_host_delegate_helper.h" | |
| 15 #include "ui/gfx/native_widget_types.h" | |
| 16 #include "ui/gfx/rect.h" | |
| 17 #include "ui/gfx/size.h" | |
| 18 | |
| 19 class RenderViewHost; | |
| 20 class RenderWidgetHost; | |
| 21 class RenderWidgetHostView; | |
| 22 class TabContents; | |
| 23 | |
| 24 // The TabContentsView is an interface that is implemented by the platform- | |
| 25 // dependent web contents views. The TabContents uses this interface to talk to | |
| 26 // them. View-related messages will also get forwarded directly to this class | |
| 27 // from RenderViewHost via RenderViewHostDelegate::View. | |
| 28 // | |
| 29 // It contains a small amount of logic with respect to creating new sub-view | |
| 30 // that should be the same for all platforms. | |
| 31 class TabContentsView : public RenderViewHostDelegate::View { | |
| 32 public: | |
| 33 explicit TabContentsView(TabContents* tab_contents); | |
| 34 virtual ~TabContentsView(); | |
| 35 | |
| 36 // Creates the appropriate type of TabContentsView for the current system. | |
| 37 // The return value is a new heap allocated view with ownership passing to | |
| 38 // the caller. | |
| 39 static TabContentsView* Create(TabContents* tab_contents); | |
| 40 | |
| 41 TabContents* tab_contents() const { return tab_contents_; } | |
| 42 | |
| 43 virtual void CreateView(const gfx::Size& initial_size) = 0; | |
| 44 | |
| 45 // Sets up the View that holds the rendered web page, receives messages for | |
| 46 // it and contains page plugins. The host view should be sized to the current | |
| 47 // size of the TabContents. | |
| 48 virtual RenderWidgetHostView* CreateViewForWidget( | |
| 49 RenderWidgetHost* render_widget_host) = 0; | |
| 50 | |
| 51 // Returns the native widget that contains the contents of the tab. | |
| 52 virtual gfx::NativeView GetNativeView() const = 0; | |
| 53 | |
| 54 // Returns the native widget with the main content of the tab (i.e. the main | |
| 55 // render view host, though there may be many popups in the tab as children of | |
| 56 // the container). | |
| 57 virtual gfx::NativeView GetContentNativeView() const = 0; | |
| 58 | |
| 59 // Returns the outermost native view. This will be used as the parent for | |
| 60 // dialog boxes. | |
| 61 virtual gfx::NativeWindow GetTopLevelNativeWindow() const = 0; | |
| 62 | |
| 63 // Computes the rectangle for the native widget that contains the contents of | |
| 64 // the tab relative to its parent. | |
| 65 virtual void GetContainerBounds(gfx::Rect *out) const = 0; | |
| 66 | |
| 67 // Helper function for GetContainerBounds. Most callers just want to know the | |
| 68 // size, and this makes it more clear. | |
| 69 gfx::Size GetContainerSize() const { | |
| 70 gfx::Rect rc; | |
| 71 GetContainerBounds(&rc); | |
| 72 return gfx::Size(rc.width(), rc.height()); | |
| 73 } | |
| 74 | |
| 75 // Sets the page title for the native widgets corresponding to the view. This | |
| 76 // is not strictly necessary and isn't expected to be displayed anywhere, but | |
| 77 // can aid certain debugging tools such as Spy++ on Windows where you are | |
| 78 // trying to find a specific window. | |
| 79 virtual void SetPageTitle(const std::wstring& title) = 0; | |
| 80 | |
| 81 // Used to notify the view that a tab has crashed so each platform can | |
| 82 // prepare the sad tab. | |
| 83 virtual void OnTabCrashed(base::TerminationStatus status, | |
| 84 int error_code) = 0; | |
| 85 | |
| 86 // TODO(brettw) this is a hack. It's used in two places at the time of this | |
| 87 // writing: (1) when render view hosts switch, we need to size the replaced | |
| 88 // one to be correct, since it wouldn't have known about sizes that happened | |
| 89 // while it was hidden; (2) in constrained windows. | |
| 90 // | |
| 91 // (1) will be fixed once interstitials are cleaned up. (2) seems like it | |
| 92 // should be cleaned up or done some other way, since this works for normal | |
| 93 // TabContents without the special code. | |
| 94 virtual void SizeContents(const gfx::Size& size) = 0; | |
| 95 | |
| 96 // Invoked from the platform dependent web contents view when a | |
| 97 // RenderWidgetHost is deleted. Removes |host| from internal maps. | |
| 98 void RenderWidgetHostDestroyed(RenderWidgetHost* host); | |
| 99 | |
| 100 // Invoked when the TabContents is notified that the RenderView has been | |
| 101 // fully created. The default implementation does nothing; override | |
| 102 // for platform-specific behavior is needed. | |
| 103 virtual void RenderViewCreated(RenderViewHost* host); | |
| 104 | |
| 105 // Sets focus to the native widget for this tab. | |
| 106 virtual void Focus() = 0; | |
| 107 | |
| 108 // Sets focus to the appropriate element when the tab contents is shown the | |
| 109 // first time. | |
| 110 virtual void SetInitialFocus() = 0; | |
| 111 | |
| 112 // Stores the currently focused view. | |
| 113 virtual void StoreFocus() = 0; | |
| 114 | |
| 115 // Restores focus to the last focus view. If StoreFocus has not yet been | |
| 116 // invoked, SetInitialFocus is invoked. | |
| 117 virtual void RestoreFocus() = 0; | |
| 118 | |
| 119 // RenderViewHostDelegate::View method. Forwards to the TabContentsDelegate. | |
| 120 virtual void LostCapture(); | |
| 121 | |
| 122 // Keyboard events forwarding from the RenderViewHost. | |
| 123 // The default implementation just forward the events to the | |
| 124 // TabContentsDelegate object. | |
| 125 virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event, | |
| 126 bool* is_keyboard_shortcut); | |
| 127 | |
| 128 // Keyboard events forwarding from the RenderViewHost. | |
| 129 // The default implementation just forward the events to the | |
| 130 // TabContentsDelegate object. | |
| 131 virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event); | |
| 132 | |
| 133 // Simple mouse event forwarding from the RenderViewHost. | |
| 134 virtual void HandleMouseMove() {} | |
| 135 virtual void HandleMouseDown() {} | |
| 136 virtual void HandleMouseLeave() {} | |
| 137 virtual void HandleMouseUp(); | |
| 138 virtual void HandleMouseActivate(); | |
| 139 | |
| 140 // Notification that the preferred size of the contents has changed. | |
| 141 virtual void UpdatePreferredSize(const gfx::Size& pref_size); | |
| 142 | |
| 143 // If we try to close the tab while a drag is in progress, we crash. These | |
| 144 // methods allow the tab contents to determine if a drag is in progress and | |
| 145 // postpone the tab closing. | |
| 146 virtual bool IsDoingDrag() const; | |
| 147 virtual void CancelDragAndCloseTab() {} | |
| 148 | |
| 149 // If we close the tab while a UI control is in an event-tracking | |
| 150 // loop, the control may message freed objects and crash. | |
| 151 // TabContents::Close() calls IsEventTracking(), and if it returns | |
| 152 // true CloseTabAfterEventTracking() is called and the close is not | |
| 153 // completed. | |
| 154 virtual bool IsEventTracking() const; | |
| 155 virtual void CloseTabAfterEventTracking() {} | |
| 156 | |
| 157 // Get the bounds of the View, relative to the parent. | |
| 158 virtual void GetViewBounds(gfx::Rect* out) const = 0; | |
| 159 | |
| 160 protected: | |
| 161 TabContentsView(); // Abstract interface. | |
| 162 | |
| 163 // Internal functions used to support the CreateNewWidget() method. If a | |
| 164 // platform requires plugging into widget creation at a lower level then a | |
| 165 // subclass might want to override these functions, but otherwise they should | |
| 166 // be fine just implementing RenderWidgetHostView::InitAsPopup(). | |
| 167 // | |
| 168 // The Create function returns the newly created widget so it can be | |
| 169 // associated with the given route. When the widget needs to be shown later, | |
| 170 // we'll look it up again and pass the object to the Show functions rather | |
| 171 // than the route ID. | |
| 172 virtual RenderWidgetHostView* CreateNewWidgetInternal( | |
| 173 int route_id, | |
| 174 WebKit::WebPopupType popup_type); | |
| 175 virtual void ShowCreatedWidgetInternal(RenderWidgetHostView* widget_host_view, | |
| 176 const gfx::Rect& initial_pos); | |
| 177 virtual void ShowCreatedFullscreenWidgetInternal( | |
| 178 RenderWidgetHostView* widget_host_view); | |
| 179 virtual RenderWidgetHostView* CreateNewFullscreenWidgetInternal(int route_id); | |
| 180 | |
| 181 // Common implementations of some RenderViewHostDelegate::View methods. | |
| 182 RenderViewHostDelegateViewHelper delegate_view_helper_; | |
| 183 | |
| 184 private: | |
| 185 // We implement these functions on RenderViewHostDelegate::View directly and | |
| 186 // do some book-keeping associated with the request. The request is then | |
| 187 // forwarded to *Internal which does platform-specific work. | |
| 188 virtual void CreateNewWindow( | |
| 189 int route_id, | |
| 190 const ViewHostMsg_CreateWindow_Params& params); | |
| 191 virtual void CreateNewWidget(int route_id, WebKit::WebPopupType popup_type); | |
| 192 virtual void CreateNewFullscreenWidget(int route_id); | |
| 193 virtual void ShowCreatedWindow(int route_id, | |
| 194 WindowOpenDisposition disposition, | |
| 195 const gfx::Rect& initial_pos, | |
| 196 bool user_gesture); | |
| 197 virtual void ShowCreatedWidget(int route_id, const gfx::Rect& initial_pos); | |
| 198 virtual void Activate(); | |
| 199 virtual void Deactivate(); | |
| 200 virtual void ShowCreatedFullscreenWidget(int route_id); | |
| 201 | |
| 202 // The TabContents whose contents we display. | |
| 203 TabContents* tab_contents_; | |
| 204 | |
| 205 // Tracks created TabContents objects that have not been shown yet. They are | |
| 206 // identified by the route ID passed to CreateNewWindow. | |
| 207 typedef std::map<int, TabContents*> PendingContents; | |
| 208 PendingContents pending_contents_; | |
| 209 | |
| 210 // These maps hold on to the widgets that we created on behalf of the | |
| 211 // renderer that haven't shown yet. | |
| 212 typedef std::map<int, RenderWidgetHostView*> PendingWidgetViews; | |
| 213 PendingWidgetViews pending_widget_views_; | |
| 214 | |
| 215 DISALLOW_COPY_AND_ASSIGN(TabContentsView); | |
| 216 }; | |
| 217 | 11 |
| 218 #endif // CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_VIEW_H_ | 12 #endif // CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_VIEW_H_ |
| OLD | NEW |