| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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_EXTENSIONS_EXTENSION_HOST_H_ | 5 #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_HOST_H_ |
| 6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_HOST_H_ | 6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_HOST_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/perftimer.h" | 13 #include "base/perftimer.h" |
| 14 #include "chrome/browser/extensions/extension_function_dispatcher.h" | 14 #include "chrome/browser/extensions/extension_function_dispatcher.h" |
| 15 #include "chrome/browser/tab_contents/render_view_host_delegate_helper.h" |
| 15 #include "content/browser/javascript_dialogs.h" | 16 #include "content/browser/javascript_dialogs.h" |
| 16 #include "content/browser/tab_contents/tab_contents_delegate.h" | 17 #include "content/browser/renderer_host/render_view_host_delegate.h" |
| 17 #include "content/browser/tab_contents/tab_contents_observer.h" | |
| 18 #include "content/public/browser/notification_observer.h" | 18 #include "content/public/browser/notification_observer.h" |
| 19 #include "content/public/browser/notification_registrar.h" | 19 #include "content/public/browser/notification_registrar.h" |
| 20 #include "content/public/common/view_types.h" | |
| 21 | 20 |
| 22 #if defined(TOOLKIT_VIEWS) | 21 #if defined(TOOLKIT_VIEWS) |
| 23 #include "chrome/browser/ui/views/extensions/extension_view.h" | 22 #include "chrome/browser/ui/views/extensions/extension_view.h" |
| 24 #elif defined(OS_MACOSX) | 23 #elif defined(OS_MACOSX) |
| 25 #include "chrome/browser/ui/cocoa/extensions/extension_view_mac.h" | 24 #include "chrome/browser/ui/cocoa/extensions/extension_view_mac.h" |
| 26 #elif defined(TOOLKIT_GTK) | 25 #elif defined(TOOLKIT_GTK) |
| 27 #include "chrome/browser/ui/gtk/extensions/extension_view_gtk.h" | 26 #include "chrome/browser/ui/gtk/extensions/extension_view_gtk.h" |
| 28 #endif | 27 #endif |
| 29 | 28 |
| 30 class Browser; | 29 class Browser; |
| 31 class Extension; | 30 class Extension; |
| 32 class RenderProcessHost; | 31 class RenderProcessHost; |
| 33 class RenderWidgetHostView; | 32 class RenderWidgetHostView; |
| 34 class TabContents; | 33 class TabContents; |
| 35 struct ViewHostMsg_RunFileChooser_Params; | 34 struct ViewHostMsg_RunFileChooser_Params; |
| 36 struct WebPreferences; | 35 struct WebPreferences; |
| 37 | 36 |
| 38 // This class is the browser component of an extension component's RenderView. | 37 // This class is the browser component of an extension component's RenderView. |
| 39 // It handles setting up the renderer process, if needed, with special | 38 // It handles setting up the renderer process, if needed, with special |
| 40 // privileges available to extensions. It may have a view to be shown in the | 39 // privileges available to extensions. It may have a view to be shown in the |
| 41 // browser UI, or it may be hidden. | 40 // browser UI, or it may be hidden. |
| 42 class ExtensionHost : public TabContentsDelegate, | 41 class ExtensionHost : public RenderViewHostDelegate, |
| 43 public TabContentsObserver, | 42 public RenderViewHostDelegate::View, |
| 44 public ExtensionFunctionDispatcher::Delegate, | 43 public ExtensionFunctionDispatcher::Delegate, |
| 45 public content::NotificationObserver { | 44 public content::NotificationObserver, |
| 45 public content::JavaScriptDialogDelegate { |
| 46 public: | 46 public: |
| 47 class ProcessCreationQueue; | 47 class ProcessCreationQueue; |
| 48 | 48 |
| 49 // Enable DOM automation in created render view hosts. |
| 50 static void EnableDOMAutomation() { enable_dom_automation_ = true; } |
| 51 |
| 49 ExtensionHost(const Extension* extension, SiteInstance* site_instance, | 52 ExtensionHost(const Extension* extension, SiteInstance* site_instance, |
| 50 const GURL& url, content::ViewType host_type); | 53 const GURL& url, content::ViewType host_type); |
| 51 virtual ~ExtensionHost(); | 54 virtual ~ExtensionHost(); |
| 52 | 55 |
| 53 #if defined(TOOLKIT_VIEWS) | 56 #if defined(TOOLKIT_VIEWS) |
| 54 void set_view(ExtensionView* view) { view_.reset(view); } | 57 void set_view(ExtensionView* view) { view_.reset(view); } |
| 55 const ExtensionView* view() const { return view_.get(); } | 58 const ExtensionView* view() const { return view_.get(); } |
| 56 ExtensionView* view() { return view_.get(); } | 59 ExtensionView* view() { return view_.get(); } |
| 57 #elif defined(OS_MACOSX) | 60 #elif defined(OS_MACOSX) |
| 58 const ExtensionViewMac* view() const { return view_.get(); } | 61 const ExtensionViewMac* view() const { return view_.get(); } |
| 59 ExtensionViewMac* view() { return view_.get(); } | 62 ExtensionViewMac* view() { return view_.get(); } |
| 60 #elif defined(TOOLKIT_GTK) | 63 #elif defined(TOOLKIT_GTK) |
| 61 const ExtensionViewGtk* view() const { return view_.get(); } | 64 const ExtensionViewGtk* view() const { return view_.get(); } |
| 62 ExtensionViewGtk* view() { return view_.get(); } | 65 ExtensionViewGtk* view() { return view_.get(); } |
| 63 #endif | 66 #endif |
| 64 | 67 |
| 65 // Create an ExtensionView and tie it to this host and |browser|. Note NULL | 68 // Create an ExtensionView and tie it to this host and |browser|. Note NULL |
| 66 // is a valid argument for |browser|. Extension views may be bound to | 69 // is a valid argument for |browser|. Extension views may be bound to |
| 67 // tab-contents hosted in ExternalTabContainer objects, which do not | 70 // tab-contents hosted in ExternalTabContainer objects, which do not |
| 68 // instantiate Browser objects. | 71 // instantiate Browser objects. |
| 69 void CreateView(Browser* browser); | 72 void CreateView(Browser* browser); |
| 70 | 73 |
| 71 const Extension* extension() const { return extension_; } | 74 const Extension* extension() const { return extension_; } |
| 72 const std::string& extension_id() const { return extension_id_; } | 75 const std::string& extension_id() const { return extension_id_; } |
| 73 TabContents* host_contents() const { return host_contents_.get(); } | 76 RenderViewHost* render_view_host() const { return render_view_host_; } |
| 74 RenderViewHost* render_view_host() const; | |
| 75 RenderProcessHost* render_process_host() const; | 77 RenderProcessHost* render_process_host() const; |
| 78 SiteInstance* site_instance() const; |
| 76 bool did_stop_loading() const { return did_stop_loading_; } | 79 bool did_stop_loading() const { return did_stop_loading_; } |
| 77 bool document_element_available() const { | 80 bool document_element_available() const { |
| 78 return document_element_available_; | 81 return document_element_available_; |
| 79 } | 82 } |
| 80 | 83 |
| 81 Profile* profile() const { return profile_; } | 84 Profile* profile() const { return profile_; } |
| 82 | 85 |
| 83 content::ViewType extension_host_type() const { return extension_host_type_; } | 86 content::ViewType extension_host_type() const { |
| 84 const GURL& GetURL() const; | 87 return extension_host_type_; |
| 88 } |
| 85 | 89 |
| 86 // ExtensionFunctionDispatcher::Delegate | 90 // ExtensionFunctionDispatcher::Delegate |
| 87 virtual TabContents* GetAssociatedTabContents() const OVERRIDE; | 91 virtual TabContents* GetAssociatedTabContents() const OVERRIDE; |
| 88 void set_associated_tab_contents(TabContents* associated_tab_contents) { | 92 void set_associated_tab_contents(TabContents* associated_tab_contents) { |
| 89 associated_tab_contents_ = associated_tab_contents; | 93 associated_tab_contents_ = associated_tab_contents; |
| 90 } | 94 } |
| 91 | 95 |
| 92 // Returns true if the render view is initialized and didn't crash. | 96 // Returns true if the render view is initialized and didn't crash. |
| 93 bool IsRenderViewLive() const; | 97 bool IsRenderViewLive() const; |
| 94 | 98 |
| 95 // Prepares to initializes our RenderViewHost by creating its RenderView and | 99 // Prepares to initializes our RenderViewHost by creating its RenderView and |
| 96 // navigating to this host's url. Uses host_view for the RenderViewHost's view | 100 // navigating to this host's url. Uses host_view for the RenderViewHost's view |
| 97 // (can be NULL). This happens delayed to avoid locking the UI. | 101 // (can be NULL). This happens delayed to avoid locking the UI. |
| 98 void CreateRenderViewSoon(); | 102 void CreateRenderViewSoon(RenderWidgetHostView* host_view); |
| 103 |
| 104 // Sets |url_| and navigates |render_view_host_|. |
| 105 void NavigateToURL(const GURL& url); |
| 99 | 106 |
| 100 // Insert a default style sheet for Extension Infobars. | 107 // Insert a default style sheet for Extension Infobars. |
| 101 void InsertInfobarCSS(); | 108 void InsertInfobarCSS(); |
| 102 | 109 |
| 103 // Tell the renderer not to draw scrollbars on windows smaller than | 110 // Tell the renderer not to draw scrollbars on windows smaller than |
| 104 // |size_limit| in both width and height. | 111 // |size_limit| in both width and height. |
| 105 void DisableScrollbarsForSmallWindows(const gfx::Size& size_limit); | 112 void DisableScrollbarsForSmallWindows(const gfx::Size& size_limit); |
| 106 | 113 |
| 107 // TabContentsObserver | 114 // RenderViewHostDelegate implementation. |
| 108 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; | 115 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; |
| 116 virtual const GURL& GetURL() const OVERRIDE; |
| 109 virtual void RenderViewCreated(RenderViewHost* render_view_host) OVERRIDE; | 117 virtual void RenderViewCreated(RenderViewHost* render_view_host) OVERRIDE; |
| 110 virtual void RenderViewReady() OVERRIDE; | 118 virtual void RenderViewReady(RenderViewHost* render_view_host) OVERRIDE; |
| 111 virtual void RenderViewGone(base::TerminationStatus status) OVERRIDE; | 119 virtual content::ViewType GetRenderViewType() const OVERRIDE; |
| 112 virtual void DocumentAvailableInMainFrame() OVERRIDE; | 120 virtual void RenderViewGone(RenderViewHost* render_view_host, |
| 121 base::TerminationStatus status, |
| 122 int error_code) OVERRIDE; |
| 123 virtual void DidNavigate( |
| 124 RenderViewHost* render_view_host, |
| 125 const ViewHostMsg_FrameNavigate_Params& params) OVERRIDE; |
| 113 virtual void DidStopLoading() OVERRIDE; | 126 virtual void DidStopLoading() OVERRIDE; |
| 114 | 127 virtual void DocumentAvailableInMainFrame( |
| 115 // TabContentsDelegate | 128 RenderViewHost* render_view_host) OVERRIDE; |
| 129 virtual void DocumentOnLoadCompletedInMainFrame( |
| 130 RenderViewHost* render_view_host, |
| 131 int32 page_id) OVERRIDE; |
| 132 virtual RenderViewHostDelegate::View* GetViewDelegate() OVERRIDE; |
| 133 virtual WebPreferences GetWebkitPrefs() OVERRIDE; |
| 134 virtual void RunJavaScriptMessage(const RenderViewHost* rvh, |
| 135 const string16& message, |
| 136 const string16& default_prompt, |
| 137 const GURL& frame_url, |
| 138 const int flags, |
| 139 IPC::Message* reply_msg, |
| 140 bool* did_suppress_message) OVERRIDE; |
| 141 virtual void Close(RenderViewHost* render_view_host) OVERRIDE; |
| 142 virtual content::RendererPreferences GetRendererPrefs( |
| 143 content::BrowserContext* browser_context) const OVERRIDE; |
| 116 virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event, | 144 virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event, |
| 117 bool* is_keyboard_shortcut) OVERRIDE; | 145 bool* is_keyboard_shortcut) OVERRIDE; |
| 118 virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) | 146 virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) |
| 119 OVERRIDE; | 147 OVERRIDE; |
| 120 virtual void UpdatePreferredSize(TabContents* source, | 148 virtual void HandleMouseMove() OVERRIDE; |
| 121 const gfx::Size& pref_size) OVERRIDE; | 149 virtual void HandleMouseDown() OVERRIDE; |
| 122 virtual content::JavaScriptDialogCreator* GetJavaScriptDialogCreator() | 150 virtual void HandleMouseLeave() OVERRIDE; |
| 123 OVERRIDE; | 151 virtual void HandleMouseUp() OVERRIDE; |
| 124 virtual void AddNewContents(TabContents* source, | 152 virtual void HandleMouseActivate() OVERRIDE; |
| 125 TabContents* new_contents, | 153 virtual void RunFileChooser(RenderViewHost* render_view_host, |
| 126 WindowOpenDisposition disposition, | 154 const ViewHostMsg_RunFileChooser_Params& params); |
| 127 const gfx::Rect& initial_pos, | 155 virtual void UpdatePreferredSize(const gfx::Size& new_size); |
| 128 bool user_gesture) OVERRIDE; | 156 |
| 129 virtual void CloseContents(TabContents* contents) OVERRIDE; | 157 // RenderViewHostDelegate::View |
| 158 virtual void CreateNewWindow( |
| 159 int route_id, |
| 160 const ViewHostMsg_CreateWindow_Params& params) OVERRIDE; |
| 161 virtual void CreateNewWidget(int route_id, |
| 162 WebKit::WebPopupType popup_type) OVERRIDE; |
| 163 virtual void CreateNewFullscreenWidget(int route_id) OVERRIDE; |
| 164 virtual void ShowCreatedWindow(int route_id, |
| 165 WindowOpenDisposition disposition, |
| 166 const gfx::Rect& initial_pos, |
| 167 bool user_gesture) OVERRIDE; |
| 168 virtual void ShowCreatedWidget(int route_id, |
| 169 const gfx::Rect& initial_pos) OVERRIDE; |
| 170 virtual void ShowCreatedFullscreenWidget(int route_id) OVERRIDE; |
| 171 virtual void ShowContextMenu(const ContextMenuParams& params) OVERRIDE; |
| 172 virtual void ShowPopupMenu(const gfx::Rect& bounds, |
| 173 int item_height, |
| 174 double item_font_size, |
| 175 int selected_item, |
| 176 const std::vector<WebMenuItem>& items, |
| 177 bool right_aligned) OVERRIDE; |
| 178 virtual void StartDragging(const WebDropData& drop_data, |
| 179 WebKit::WebDragOperationsMask allowed_operations, |
| 180 const SkBitmap& image, |
| 181 const gfx::Point& image_offset) OVERRIDE; |
| 182 virtual void UpdateDragCursor(WebKit::WebDragOperation operation) OVERRIDE; |
| 183 virtual void GotFocus() OVERRIDE; |
| 184 virtual void TakeFocus(bool reverse) OVERRIDE; |
| 130 | 185 |
| 131 // content::NotificationObserver | 186 // content::NotificationObserver |
| 132 virtual void Observe(int type, | 187 virtual void Observe(int type, |
| 133 const content::NotificationSource& source, | 188 const content::NotificationSource& source, |
| 134 const content::NotificationDetails& details) OVERRIDE; | 189 const content::NotificationDetails& details) OVERRIDE; |
| 135 | 190 |
| 191 // Overridden from content::JavaScriptDialogDelegate: |
| 192 virtual void OnDialogClosed(IPC::Message* reply_msg, |
| 193 bool success, |
| 194 const string16& user_input) OVERRIDE; |
| 195 virtual gfx::NativeWindow GetDialogRootWindow() OVERRIDE; |
| 196 |
| 136 protected: | 197 protected: |
| 137 // This should only be used by unit tests. | 198 // This should only be used by unit tests. |
| 138 ExtensionHost(const Extension* extension, content::ViewType host_type); | 199 ExtensionHost(const Extension* extension, content::ViewType host_type); |
| 139 | 200 |
| 201 // Internal functions used to support the CreateNewWidget() method. If a |
| 202 // platform requires plugging into widget creation at a lower level, then a |
| 203 // subclass might want to override these functions, but otherwise they should |
| 204 // be fine just implementing RenderWidgetHostView::InitAsPopup(). |
| 205 // |
| 206 // The Create function returns the newly created widget so it can be |
| 207 // associated with the given route. When the widget needs to be shown later, |
| 208 // we'll look it up again and pass the object to the Show functions rather |
| 209 // than the route ID. |
| 210 virtual RenderWidgetHostView* CreateNewWidgetInternal( |
| 211 int route_id, |
| 212 WebKit::WebPopupType popup_type); |
| 213 virtual void ShowCreatedWidgetInternal(RenderWidgetHostView* widget_host_view, |
| 214 const gfx::Rect& initial_pos); |
| 140 private: | 215 private: |
| 141 friend class ProcessCreationQueue; | 216 friend class ProcessCreationQueue; |
| 142 | 217 |
| 218 // Whether to allow DOM automation for created RenderViewHosts. This is used |
| 219 // for testing. |
| 220 static bool enable_dom_automation_; |
| 221 |
| 143 // Actually create the RenderView for this host. See CreateRenderViewSoon. | 222 // Actually create the RenderView for this host. See CreateRenderViewSoon. |
| 144 void CreateRenderViewNow(); | 223 void CreateRenderViewNow(); |
| 145 | 224 |
| 146 // Navigates to the initial page. | |
| 147 void LoadInitialURL(); | |
| 148 | |
| 149 // Const version of below function. | 225 // Const version of below function. |
| 150 const Browser* GetBrowser() const; | 226 const Browser* GetBrowser() const; |
| 151 | 227 |
| 152 // ExtensionFunctionDispatcher::Delegate | 228 // ExtensionFunctionDispatcher::Delegate |
| 153 virtual Browser* GetBrowser() OVERRIDE; | 229 virtual Browser* GetBrowser() OVERRIDE; |
| 154 virtual gfx::NativeView GetNativeViewOfHost() OVERRIDE; | 230 virtual gfx::NativeView GetNativeViewOfHost() OVERRIDE; |
| 155 | 231 |
| 156 // Message handlers. | 232 // Message handlers. |
| 157 void OnRequest(const ExtensionHostMsg_Request_Params& params); | 233 void OnRequest(const ExtensionHostMsg_Request_Params& params); |
| 158 | 234 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 177 // Optional view that shows the rendered content in the UI. | 253 // Optional view that shows the rendered content in the UI. |
| 178 #if defined(TOOLKIT_VIEWS) | 254 #if defined(TOOLKIT_VIEWS) |
| 179 scoped_ptr<ExtensionView> view_; | 255 scoped_ptr<ExtensionView> view_; |
| 180 #elif defined(OS_MACOSX) | 256 #elif defined(OS_MACOSX) |
| 181 scoped_ptr<ExtensionViewMac> view_; | 257 scoped_ptr<ExtensionViewMac> view_; |
| 182 #elif defined(TOOLKIT_GTK) | 258 #elif defined(TOOLKIT_GTK) |
| 183 scoped_ptr<ExtensionViewGtk> view_; | 259 scoped_ptr<ExtensionViewGtk> view_; |
| 184 #endif | 260 #endif |
| 185 | 261 |
| 186 // The host for our HTML content. | 262 // The host for our HTML content. |
| 187 scoped_ptr<TabContents> host_contents_; | 263 RenderViewHost* render_view_host_; |
| 264 |
| 265 // Common implementations of some RenderViewHostDelegate::View methods. |
| 266 RenderViewHostDelegateViewHelper delegate_view_helper_; |
| 188 | 267 |
| 189 // Whether the RenderWidget has reported that it has stopped loading. | 268 // Whether the RenderWidget has reported that it has stopped loading. |
| 190 bool did_stop_loading_; | 269 bool did_stop_loading_; |
| 191 | 270 |
| 192 // True if the main frame has finished parsing. | 271 // True if the main frame has finished parsing. |
| 193 bool document_element_available_; | 272 bool document_element_available_; |
| 194 | 273 |
| 195 // The original URL of the page being hosted. | 274 // The URL being hosted. |
| 196 GURL initial_url_; | 275 GURL url_; |
| 197 | 276 |
| 198 content::NotificationRegistrar registrar_; | 277 content::NotificationRegistrar registrar_; |
| 199 | 278 |
| 200 ExtensionFunctionDispatcher extension_function_dispatcher_; | 279 ExtensionFunctionDispatcher extension_function_dispatcher_; |
| 201 | 280 |
| 202 // Only EXTENSION_INFOBAR, EXTENSION_POPUP, and EXTENSION_BACKGROUND_PAGE | 281 // Only EXTENSION_INFOBAR, EXTENSION_POPUP, and EXTENSION_BACKGROUND_PAGE |
| 203 // are used here, others are not hosted by ExtensionHost. | 282 // are used here, others are not hosted by ExtensionHost. |
| 204 content::ViewType extension_host_type_; | 283 content::ViewType extension_host_type_; |
| 205 | 284 |
| 206 // The relevant TabContents associated with this ExtensionHost, if any. | 285 // The relevant TabContents associated with this ExtensionHost, if any. |
| 207 TabContents* associated_tab_contents_; | 286 TabContents* associated_tab_contents_; |
| 208 | 287 |
| 209 // Used to measure how long it's been since the host was created. | 288 // Used to measure how long it's been since the host was created. |
| 210 PerfTimer since_created_; | 289 PerfTimer since_created_; |
| 211 | 290 |
| 212 DISALLOW_COPY_AND_ASSIGN(ExtensionHost); | 291 DISALLOW_COPY_AND_ASSIGN(ExtensionHost); |
| 213 }; | 292 }; |
| 214 | 293 |
| 215 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_HOST_H_ | 294 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_HOST_H_ |
| OLD | NEW |