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" | |
16 #include "content/browser/javascript_dialogs.h" | 15 #include "content/browser/javascript_dialogs.h" |
17 #include "content/browser/renderer_host/render_view_host_delegate.h" | 16 #include "content/browser/tab_contents/tab_contents_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" |
20 | 21 |
21 #if defined(TOOLKIT_VIEWS) | 22 #if defined(TOOLKIT_VIEWS) |
22 #include "chrome/browser/ui/views/extensions/extension_view.h" | 23 #include "chrome/browser/ui/views/extensions/extension_view.h" |
23 #elif defined(OS_MACOSX) | 24 #elif defined(OS_MACOSX) |
24 #include "chrome/browser/ui/cocoa/extensions/extension_view_mac.h" | 25 #include "chrome/browser/ui/cocoa/extensions/extension_view_mac.h" |
25 #elif defined(TOOLKIT_GTK) | 26 #elif defined(TOOLKIT_GTK) |
26 #include "chrome/browser/ui/gtk/extensions/extension_view_gtk.h" | 27 #include "chrome/browser/ui/gtk/extensions/extension_view_gtk.h" |
27 #endif | 28 #endif |
28 | 29 |
29 class Browser; | 30 class Browser; |
30 class Extension; | 31 class Extension; |
31 class RenderProcessHost; | 32 class RenderProcessHost; |
32 class RenderWidgetHostView; | 33 class RenderWidgetHostView; |
33 class TabContents; | 34 class TabContents; |
34 struct ViewHostMsg_RunFileChooser_Params; | 35 struct ViewHostMsg_RunFileChooser_Params; |
35 struct WebPreferences; | 36 struct WebPreferences; |
36 | 37 |
37 // This class is the browser component of an extension component's RenderView. | 38 // 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 // 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 // privileges available to extensions. It may have a view to be shown in the |
40 // browser UI, or it may be hidden. | 41 // browser UI, or it may be hidden. |
41 class ExtensionHost : public RenderViewHostDelegate, | 42 class ExtensionHost : public TabContentsDelegate, |
42 public RenderViewHostDelegate::View, | 43 public TabContentsObserver, |
43 public ExtensionFunctionDispatcher::Delegate, | 44 public ExtensionFunctionDispatcher::Delegate, |
44 public content::NotificationObserver, | 45 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 | |
52 ExtensionHost(const Extension* extension, SiteInstance* site_instance, | 49 ExtensionHost(const Extension* extension, SiteInstance* site_instance, |
53 const GURL& url, content::ViewType host_type); | 50 const GURL& url, content::ViewType host_type); |
54 virtual ~ExtensionHost(); | 51 virtual ~ExtensionHost(); |
55 | 52 |
56 #if defined(TOOLKIT_VIEWS) | 53 #if defined(TOOLKIT_VIEWS) |
57 void set_view(ExtensionView* view) { view_.reset(view); } | 54 void set_view(ExtensionView* view) { view_.reset(view); } |
58 const ExtensionView* view() const { return view_.get(); } | 55 const ExtensionView* view() const { return view_.get(); } |
59 ExtensionView* view() { return view_.get(); } | 56 ExtensionView* view() { return view_.get(); } |
60 #elif defined(OS_MACOSX) | 57 #elif defined(OS_MACOSX) |
61 const ExtensionViewMac* view() const { return view_.get(); } | 58 const ExtensionViewMac* view() const { return view_.get(); } |
62 ExtensionViewMac* view() { return view_.get(); } | 59 ExtensionViewMac* view() { return view_.get(); } |
63 #elif defined(TOOLKIT_GTK) | 60 #elif defined(TOOLKIT_GTK) |
64 const ExtensionViewGtk* view() const { return view_.get(); } | 61 const ExtensionViewGtk* view() const { return view_.get(); } |
65 ExtensionViewGtk* view() { return view_.get(); } | 62 ExtensionViewGtk* view() { return view_.get(); } |
66 #endif | 63 #endif |
67 | 64 |
68 // Create an ExtensionView and tie it to this host and |browser|. Note NULL | 65 // 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 | 66 // is a valid argument for |browser|. Extension views may be bound to |
70 // tab-contents hosted in ExternalTabContainer objects, which do not | 67 // tab-contents hosted in ExternalTabContainer objects, which do not |
71 // instantiate Browser objects. | 68 // instantiate Browser objects. |
72 void CreateView(Browser* browser); | 69 void CreateView(Browser* browser); |
73 | 70 |
74 const Extension* extension() const { return extension_; } | 71 const Extension* extension() const { return extension_; } |
75 const std::string& extension_id() const { return extension_id_; } | 72 const std::string& extension_id() const { return extension_id_; } |
76 RenderViewHost* render_view_host() const { return render_view_host_; } | 73 TabContents* host_contents() const { return host_contents_.get(); } |
| 74 RenderViewHost* render_view_host() const; |
77 RenderProcessHost* render_process_host() const; | 75 RenderProcessHost* render_process_host() const; |
78 SiteInstance* site_instance() const; | |
79 bool did_stop_loading() const { return did_stop_loading_; } | 76 bool did_stop_loading() const { return did_stop_loading_; } |
80 bool document_element_available() const { | 77 bool document_element_available() const { |
81 return document_element_available_; | 78 return document_element_available_; |
82 } | 79 } |
83 | 80 |
84 Profile* profile() const { return profile_; } | 81 Profile* profile() const { return profile_; } |
85 | 82 |
86 content::ViewType extension_host_type() const { | 83 content::ViewType extension_host_type() const { return extension_host_type_; } |
87 return extension_host_type_; | 84 const GURL& GetURL() const; |
88 } | |
89 | 85 |
90 // ExtensionFunctionDispatcher::Delegate | 86 // ExtensionFunctionDispatcher::Delegate |
91 virtual TabContents* GetAssociatedTabContents() const OVERRIDE; | 87 virtual TabContents* GetAssociatedTabContents() const OVERRIDE; |
92 void set_associated_tab_contents(TabContents* associated_tab_contents) { | 88 void set_associated_tab_contents(TabContents* associated_tab_contents) { |
93 associated_tab_contents_ = associated_tab_contents; | 89 associated_tab_contents_ = associated_tab_contents; |
94 } | 90 } |
95 | 91 |
96 // Returns true if the render view is initialized and didn't crash. | 92 // Returns true if the render view is initialized and didn't crash. |
97 bool IsRenderViewLive() const; | 93 bool IsRenderViewLive() const; |
98 | 94 |
99 // Prepares to initializes our RenderViewHost by creating its RenderView and | 95 // Prepares to initializes our RenderViewHost by creating its RenderView and |
100 // navigating to this host's url. Uses host_view for the RenderViewHost's view | 96 // navigating to this host's url. Uses host_view for the RenderViewHost's view |
101 // (can be NULL). This happens delayed to avoid locking the UI. | 97 // (can be NULL). This happens delayed to avoid locking the UI. |
102 void CreateRenderViewSoon(RenderWidgetHostView* host_view); | 98 void CreateRenderViewSoon(); |
103 | |
104 // Sets |url_| and navigates |render_view_host_|. | |
105 void NavigateToURL(const GURL& url); | |
106 | 99 |
107 // Insert a default style sheet for Extension Infobars. | 100 // Insert a default style sheet for Extension Infobars. |
108 void InsertInfobarCSS(); | 101 void InsertInfobarCSS(); |
109 | 102 |
110 // Tell the renderer not to draw scrollbars on windows smaller than | 103 // Tell the renderer not to draw scrollbars on windows smaller than |
111 // |size_limit| in both width and height. | 104 // |size_limit| in both width and height. |
112 void DisableScrollbarsForSmallWindows(const gfx::Size& size_limit); | 105 void DisableScrollbarsForSmallWindows(const gfx::Size& size_limit); |
113 | 106 |
114 // RenderViewHostDelegate implementation. | 107 // TabContentsObserver |
115 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; | 108 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; |
116 virtual const GURL& GetURL() const OVERRIDE; | |
117 virtual void RenderViewCreated(RenderViewHost* render_view_host) OVERRIDE; | 109 virtual void RenderViewCreated(RenderViewHost* render_view_host) OVERRIDE; |
118 virtual void RenderViewReady(RenderViewHost* render_view_host) OVERRIDE; | 110 virtual void RenderViewReady() OVERRIDE; |
119 virtual content::ViewType GetRenderViewType() const OVERRIDE; | 111 virtual void RenderViewGone(base::TerminationStatus status) OVERRIDE; |
120 virtual void RenderViewGone(RenderViewHost* render_view_host, | 112 virtual void DocumentAvailableInMainFrame() OVERRIDE; |
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; | |
126 virtual void DidStopLoading() OVERRIDE; | 113 virtual void DidStopLoading() OVERRIDE; |
127 virtual void DocumentAvailableInMainFrame( | 114 |
128 RenderViewHost* render_view_host) OVERRIDE; | 115 // TabContentsDelegate |
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; | |
144 virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event, | 116 virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event, |
145 bool* is_keyboard_shortcut) OVERRIDE; | 117 bool* is_keyboard_shortcut) OVERRIDE; |
146 virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) | 118 virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) |
147 OVERRIDE; | 119 OVERRIDE; |
148 virtual void HandleMouseMove() OVERRIDE; | 120 virtual void UpdatePreferredSize(TabContents* source, |
149 virtual void HandleMouseDown() OVERRIDE; | 121 const gfx::Size& pref_size) OVERRIDE; |
150 virtual void HandleMouseLeave() OVERRIDE; | 122 virtual content::JavaScriptDialogCreator* GetJavaScriptDialogCreator() |
151 virtual void HandleMouseUp() OVERRIDE; | 123 OVERRIDE; |
152 virtual void HandleMouseActivate() OVERRIDE; | 124 virtual void AddNewContents(TabContents* source, |
153 virtual void RunFileChooser(RenderViewHost* render_view_host, | 125 TabContents* new_contents, |
154 const ViewHostMsg_RunFileChooser_Params& params); | 126 WindowOpenDisposition disposition, |
155 virtual void UpdatePreferredSize(const gfx::Size& new_size); | 127 const gfx::Rect& initial_pos, |
156 | 128 bool user_gesture) OVERRIDE; |
157 // RenderViewHostDelegate::View | 129 virtual void CloseContents(TabContents* contents) OVERRIDE; |
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; | |
185 | 130 |
186 // content::NotificationObserver | 131 // content::NotificationObserver |
187 virtual void Observe(int type, | 132 virtual void Observe(int type, |
188 const content::NotificationSource& source, | 133 const content::NotificationSource& source, |
189 const content::NotificationDetails& details) OVERRIDE; | 134 const content::NotificationDetails& details) OVERRIDE; |
190 | 135 |
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 | |
197 protected: | 136 protected: |
198 // This should only be used by unit tests. | 137 // This should only be used by unit tests. |
199 ExtensionHost(const Extension* extension, content::ViewType host_type); | 138 ExtensionHost(const Extension* extension, content::ViewType host_type); |
200 | 139 |
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: | 140 private: |
216 friend class ProcessCreationQueue; | 141 friend class ProcessCreationQueue; |
217 | 142 |
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. | 143 // Actually create the RenderView for this host. See CreateRenderViewSoon. |
223 void CreateRenderViewNow(); | 144 void CreateRenderViewNow(); |
224 | 145 |
| 146 // Navigates to the initial page. |
| 147 void LoadInitialURL(); |
| 148 |
225 // Const version of below function. | 149 // Const version of below function. |
226 const Browser* GetBrowser() const; | 150 const Browser* GetBrowser() const; |
227 | 151 |
228 // ExtensionFunctionDispatcher::Delegate | 152 // ExtensionFunctionDispatcher::Delegate |
229 virtual Browser* GetBrowser() OVERRIDE; | 153 virtual Browser* GetBrowser() OVERRIDE; |
230 virtual gfx::NativeView GetNativeViewOfHost() OVERRIDE; | 154 virtual gfx::NativeView GetNativeViewOfHost() OVERRIDE; |
231 | 155 |
232 // Message handlers. | 156 // Message handlers. |
233 void OnRequest(const ExtensionHostMsg_Request_Params& params); | 157 void OnRequest(const ExtensionHostMsg_Request_Params& params); |
234 | 158 |
(...skipping 18 matching lines...) Expand all Loading... |
253 // Optional view that shows the rendered content in the UI. | 177 // Optional view that shows the rendered content in the UI. |
254 #if defined(TOOLKIT_VIEWS) | 178 #if defined(TOOLKIT_VIEWS) |
255 scoped_ptr<ExtensionView> view_; | 179 scoped_ptr<ExtensionView> view_; |
256 #elif defined(OS_MACOSX) | 180 #elif defined(OS_MACOSX) |
257 scoped_ptr<ExtensionViewMac> view_; | 181 scoped_ptr<ExtensionViewMac> view_; |
258 #elif defined(TOOLKIT_GTK) | 182 #elif defined(TOOLKIT_GTK) |
259 scoped_ptr<ExtensionViewGtk> view_; | 183 scoped_ptr<ExtensionViewGtk> view_; |
260 #endif | 184 #endif |
261 | 185 |
262 // The host for our HTML content. | 186 // The host for our HTML content. |
263 RenderViewHost* render_view_host_; | 187 scoped_ptr<TabContents> host_contents_; |
264 | |
265 // Common implementations of some RenderViewHostDelegate::View methods. | |
266 RenderViewHostDelegateViewHelper delegate_view_helper_; | |
267 | 188 |
268 // Whether the RenderWidget has reported that it has stopped loading. | 189 // Whether the RenderWidget has reported that it has stopped loading. |
269 bool did_stop_loading_; | 190 bool did_stop_loading_; |
270 | 191 |
271 // True if the main frame has finished parsing. | 192 // True if the main frame has finished parsing. |
272 bool document_element_available_; | 193 bool document_element_available_; |
273 | 194 |
274 // The URL being hosted. | 195 // The original URL of the page being hosted. |
275 GURL url_; | 196 GURL initial_url_; |
276 | 197 |
277 content::NotificationRegistrar registrar_; | 198 content::NotificationRegistrar registrar_; |
278 | 199 |
279 ExtensionFunctionDispatcher extension_function_dispatcher_; | 200 ExtensionFunctionDispatcher extension_function_dispatcher_; |
280 | 201 |
281 // Only EXTENSION_INFOBAR, EXTENSION_POPUP, and EXTENSION_BACKGROUND_PAGE | 202 // Only EXTENSION_INFOBAR, EXTENSION_POPUP, and EXTENSION_BACKGROUND_PAGE |
282 // are used here, others are not hosted by ExtensionHost. | 203 // are used here, others are not hosted by ExtensionHost. |
283 content::ViewType extension_host_type_; | 204 content::ViewType extension_host_type_; |
284 | 205 |
285 // The relevant TabContents associated with this ExtensionHost, if any. | 206 // The relevant TabContents associated with this ExtensionHost, if any. |
286 TabContents* associated_tab_contents_; | 207 TabContents* associated_tab_contents_; |
287 | 208 |
288 // Used to measure how long it's been since the host was created. | 209 // Used to measure how long it's been since the host was created. |
289 PerfTimer since_created_; | 210 PerfTimer since_created_; |
290 | 211 |
291 DISALLOW_COPY_AND_ASSIGN(ExtensionHost); | 212 DISALLOW_COPY_AND_ASSIGN(ExtensionHost); |
292 }; | 213 }; |
293 | 214 |
294 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_HOST_H_ | 215 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_HOST_H_ |
OLD | NEW |