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 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_HOST_H_ 6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_HOST_H_ 7 #pragma once 8 9 #include <string> 10 #include <vector> 11 12 #include "base/memory/scoped_ptr.h" 13 #include "base/perftimer.h" 14 #include "chrome/browser/extensions/extension_function_dispatcher.h" 15 #include "chrome/browser/tab_contents/render_view_host_delegate_helper.h" 16 #include "chrome/browser/ui/app_modal_dialogs/js_modal_dialog.h" 17 #include "content/browser/renderer_host/render_view_host_delegate.h" 18 #include "content/common/notification_registrar.h" 19 20 #if defined(TOOLKIT_VIEWS) 21 #include "chrome/browser/ui/views/extensions/extension_view.h" 22 #elif defined(OS_MACOSX) 23 #include "chrome/browser/ui/cocoa/extensions/extension_view_mac.h" 24 #elif defined(TOOLKIT_GTK) 25 #include "chrome/browser/ui/gtk/extensions/extension_view_gtk.h" 26 #endif 27 28 class Browser; 29 class Extension; 30 class FileSelectHelper; 31 class RenderProcessHost; 32 class RenderWidgetHostView; 33 class TabContents; 34 struct ViewHostMsg_RunFileChooser_Params; 35 struct WebPreferences; 36 37 // This class is the browser component of an extension component's RenderView. 38 // It handles setting up the renderer process, if needed, with special 39 // privileges available to extensions. It may have a view to be shown in the 40 // browser UI, or it may be hidden. 41 class ExtensionHost : public RenderViewHostDelegate, 42 public RenderViewHostDelegate::View, 43 public ExtensionFunctionDispatcher::Delegate, 44 public NotificationObserver, 45 public JavaScriptAppModalDialogDelegate { 46 public: 47 class ProcessCreationQueue; 48 49 // Enable DOM automation in created render view hosts. 50 static void EnableDOMAutomation() { enable_dom_automation_ = true; } 51 52 ExtensionHost(const Extension* extension, SiteInstance* site_instance, 53 const GURL& url, ViewType::Type host_type); 54 ~ExtensionHost(); 55 56 #if defined(TOOLKIT_VIEWS) 57 void set_view(ExtensionView* view) { view_.reset(view); } 58 const ExtensionView* view() const { return view_.get(); } 59 ExtensionView* view() { return view_.get(); } 60 #elif defined(OS_MACOSX) 61 const ExtensionViewMac* view() const { return view_.get(); } 62 ExtensionViewMac* view() { return view_.get(); } 63 #elif defined(TOOLKIT_GTK) 64 const ExtensionViewGtk* view() const { return view_.get(); } 65 ExtensionViewGtk* view() { return view_.get(); } 66 #endif 67 68 // Create an ExtensionView and tie it to this host and |browser|. Note NULL 69 // is a valid argument for |browser|. Extension views may be bound to 70 // tab-contents hosted in ExternalTabContainer objects, which do not 71 // instantiate Browser objects. 72 void CreateView(Browser* browser); 73 74 const Extension* extension() const { return extension_; } 75 const std::string& extension_id() const { return extension_id_; } 76 RenderViewHost* render_view_host() const { return render_view_host_; } 77 RenderProcessHost* render_process_host() const; 78 SiteInstance* site_instance() const; 79 bool did_stop_loading() const { return did_stop_loading_; } 80 bool document_element_available() const { 81 return document_element_available_; 82 } 83 84 Profile* profile() const { return profile_; } 85 86 ViewType::Type extension_host_type() const { return extension_host_type_; } 87 88 // ExtensionFunctionDispatcher::Delegate 89 virtual TabContents* associated_tab_contents() const; 90 void set_associated_tab_contents(TabContents* associated_tab_contents) { 91 associated_tab_contents_ = associated_tab_contents; 92 } 93 94 // Returns true if the render view is initialized and didn't crash. 95 bool IsRenderViewLive() const; 96 97 // Prepares to initializes our RenderViewHost by creating its RenderView and 98 // navigating to this host's url. Uses host_view for the RenderViewHost's view 99 // (can be NULL). This happens delayed to avoid locking the UI. 100 void CreateRenderViewSoon(RenderWidgetHostView* host_view); 101 102 // Sets |url_| and navigates |render_view_host_|. 103 void NavigateToURL(const GURL& url); 104 105 // Insert a default style sheet for Extension Infobars. 106 void InsertInfobarCSS(); 107 108 // Tell the renderer not to draw scrollbars on windows smaller than 109 // |size_limit| in both width and height. 110 void DisableScrollbarsForSmallWindows(const gfx::Size& size_limit); 111 112 // RenderViewHostDelegate implementation. 113 virtual bool OnMessageReceived(const IPC::Message& message); 114 virtual const GURL& GetURL() const; 115 virtual void RenderViewCreated(RenderViewHost* render_view_host); 116 virtual ViewType::Type GetRenderViewType() const; 117 virtual int GetBrowserWindowID() const; 118 virtual void RenderViewGone(RenderViewHost* render_view_host, 119 base::TerminationStatus status, 120 int error_code); 121 virtual void DidNavigate(RenderViewHost* render_view_host, 122 const ViewHostMsg_FrameNavigate_Params& params); 123 virtual void DidStopLoading(); 124 virtual void DocumentAvailableInMainFrame(RenderViewHost* render_view_host); 125 virtual void DocumentOnLoadCompletedInMainFrame( 126 RenderViewHost* render_view_host, 127 int32 page_id); 128 129 // RenderViewHostDelegate implementation. 130 virtual RenderViewHostDelegate::View* GetViewDelegate(); 131 virtual WebPreferences GetWebkitPrefs(); 132 virtual void ProcessWebUIMessage( 133 const ExtensionHostMsg_DomMessage_Params& params); 134 virtual void RunJavaScriptMessage(const std::wstring& message, 135 const std::wstring& default_prompt, 136 const GURL& frame_url, 137 const int flags, 138 IPC::Message* reply_msg, 139 bool* did_suppress_message); 140 virtual void Close(RenderViewHost* render_view_host); 141 virtual RendererPreferences GetRendererPrefs(Profile* profile) const; 142 143 // RenderViewHostDelegate::View 144 virtual void CreateNewWindow( 145 int route_id, 146 const ViewHostMsg_CreateWindow_Params& params); 147 virtual void CreateNewWidget(int route_id, WebKit::WebPopupType popup_type); 148 virtual void CreateNewFullscreenWidget(int route_id); 149 virtual void ShowCreatedWindow(int route_id, 150 WindowOpenDisposition disposition, 151 const gfx::Rect& initial_pos, 152 bool user_gesture); 153 virtual void ShowCreatedWidget(int route_id, 154 const gfx::Rect& initial_pos); 155 virtual void ShowCreatedFullscreenWidget(int route_id); 156 virtual void ShowContextMenu(const ContextMenuParams& params); 157 virtual void ShowPopupMenu(const gfx::Rect& bounds, 158 int item_height, 159 double item_font_size, 160 int selected_item, 161 const std::vector<WebMenuItem>& items, 162 bool right_aligned); 163 virtual void StartDragging(const WebDropData& drop_data, 164 WebKit::WebDragOperationsMask allowed_operations, 165 const SkBitmap& image, 166 const gfx::Point& image_offset); 167 virtual void UpdateDragCursor(WebKit::WebDragOperation operation); 168 virtual void GotFocus(); 169 virtual void TakeFocus(bool reverse); 170 virtual void LostCapture(); 171 virtual void Activate(); 172 virtual void Deactivate(); 173 virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event, 174 bool* is_keyboard_shortcut); 175 virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event); 176 virtual void HandleMouseMove(); 177 virtual void HandleMouseDown(); 178 virtual void HandleMouseLeave(); 179 virtual void HandleMouseUp(); 180 virtual void HandleMouseActivate(); 181 virtual void UpdatePreferredSize(const gfx::Size& new_size); 182 virtual void UpdateInspectorSetting(const std::string& key, 183 const std::string& value); 184 virtual void ClearInspectorSettings(); 185 186 // NotificationObserver 187 virtual void Observe(NotificationType type, 188 const NotificationSource& source, 189 const NotificationDetails& details); 190 191 // Overridden from JavaScriptAppModalDialogDelegate: 192 virtual void OnMessageBoxClosed(IPC::Message* reply_msg, 193 bool success, 194 const std::wstring& prompt); 195 virtual void SetSuppressMessageBoxes(bool suppress_message_boxes); 196 virtual gfx::NativeWindow GetMessageBoxRootWindow(); 197 virtual TabContents* AsTabContents(); 198 virtual ExtensionHost* AsExtensionHost(); 199 200 protected: 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); 215 private: 216 friend class ProcessCreationQueue; 217 218 // Whether to allow DOM automation for created RenderViewHosts. This is used 219 // for testing. 220 static bool enable_dom_automation_; 221 222 // Actually create the RenderView for this host. See CreateRenderViewSoon. 223 void CreateRenderViewNow(); 224 225 // Const version of below function. 226 const Browser* GetBrowser() const; 227 228 // ExtensionFunctionDispatcher::Delegate 229 virtual Browser* GetBrowser(); 230 virtual gfx::NativeView GetNativeViewOfHost(); 231 232 // Message handlers. 233 void OnRunFileChooser(const ViewHostMsg_RunFileChooser_Params& params); 234 235 // Handles keyboard events that were not handled by HandleKeyboardEvent(). 236 // Platform specific implementation may override this method to handle the 237 // event in platform specific way. 238 virtual void UnhandledKeyboardEvent(const NativeWebKeyboardEvent& event) {} 239 240 // Returns true if we're hosting a background page. 241 // This isn't valid until CreateRenderView is called. 242 bool is_background_page() const { return !view(); } 243 244 // The extension that we're hosting in this view. 245 const Extension* extension_; 246 247 // Id of extension that we're hosting in this view. 248 const std::string extension_id_; 249 250 // The profile that this host is tied to. 251 Profile* profile_; 252 253 // Optional view that shows the rendered content in the UI. 254 #if defined(TOOLKIT_VIEWS) 255 scoped_ptr<ExtensionView> view_; 256 #elif defined(OS_MACOSX) 257 scoped_ptr<ExtensionViewMac> view_; 258 #elif defined(TOOLKIT_GTK) 259 scoped_ptr<ExtensionViewGtk> view_; 260 #endif 261 262 // The host for our HTML content. 263 RenderViewHost* render_view_host_; 264 265 // Common implementations of some RenderViewHostDelegate::View methods. 266 RenderViewHostDelegateViewHelper delegate_view_helper_; 267 268 // Whether the RenderWidget has reported that it has stopped loading. 269 bool did_stop_loading_; 270 271 // True if the main frame has finished parsing. 272 bool document_element_available_; 273 274 // The URL being hosted. 275 GURL url_; 276 277 NotificationRegistrar registrar_; 278 279 scoped_ptr<ExtensionFunctionDispatcher> extension_function_dispatcher_; 280 281 // Only EXTENSION_INFOBAR, EXTENSION_POPUP, and EXTENSION_BACKGROUND_PAGE 282 // are used here, others are not hosted by ExtensionHost. 283 ViewType::Type extension_host_type_; 284 285 // The relevant TabContents associated with this ExtensionHost, if any. 286 TabContents* associated_tab_contents_; 287 288 // Used to measure how long it's been since the host was created. 289 PerfTimer since_created_; 290 291 // FileSelectHelper, lazily created. 292 scoped_ptr<FileSelectHelper> file_select_helper_; 293 294 // The time that the last javascript message was dismissed. 295 base::TimeTicks last_javascript_message_dismissal_; 296 297 // Whether to suppress all javascript messages. 298 bool suppress_javascript_messages_; 299 300 DISALLOW_COPY_AND_ASSIGN(ExtensionHost); 301 }; 302 303 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_HOST_H_ 304