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 #include "chrome/browser/extensions/extension_host.h" | 5 #include "chrome/browser/extensions/extension_host.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 | 8 |
9 #include "base/memory/singleton.h" | 9 #include "base/memory/singleton.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 }; | 119 }; |
120 | 120 |
121 //////////////// | 121 //////////////// |
122 // ExtensionHost | 122 // ExtensionHost |
123 | 123 |
124 ExtensionHost::ExtensionHost(const Extension* extension, | 124 ExtensionHost::ExtensionHost(const Extension* extension, |
125 SiteInstance* site_instance, | 125 SiteInstance* site_instance, |
126 const GURL& url, | 126 const GURL& url, |
127 ViewType::Type host_type) | 127 ViewType::Type host_type) |
128 : extension_(extension), | 128 : extension_(extension), |
| 129 extension_id_(extension->id()), |
129 profile_(site_instance->browsing_instance()->profile()), | 130 profile_(site_instance->browsing_instance()->profile()), |
130 did_stop_loading_(false), | 131 did_stop_loading_(false), |
131 document_element_available_(false), | 132 document_element_available_(false), |
132 url_(url), | 133 url_(url), |
133 extension_host_type_(host_type), | 134 extension_host_type_(host_type), |
134 associated_tab_contents_(NULL), | 135 associated_tab_contents_(NULL), |
135 suppress_javascript_messages_(false) { | 136 suppress_javascript_messages_(false) { |
136 render_view_host_ = new RenderViewHost(site_instance, this, MSG_ROUTING_NONE, | 137 render_view_host_ = new RenderViewHost(site_instance, this, MSG_ROUTING_NONE, |
137 NULL); | 138 NULL); |
138 render_view_host_->set_is_extension_process(true); | 139 render_view_host_->set_is_extension_process(true); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 } | 228 } |
228 | 229 |
229 gfx::NativeView ExtensionHost::GetNativeViewOfHost() { | 230 gfx::NativeView ExtensionHost::GetNativeViewOfHost() { |
230 return view() ? view()->native_view() : NULL; | 231 return view() ? view()->native_view() : NULL; |
231 } | 232 } |
232 | 233 |
233 void ExtensionHost::NavigateToURL(const GURL& url) { | 234 void ExtensionHost::NavigateToURL(const GURL& url) { |
234 // Prevent explicit navigation to another extension id's pages. | 235 // Prevent explicit navigation to another extension id's pages. |
235 // This method is only called by some APIs, so we still need to protect | 236 // This method is only called by some APIs, so we still need to protect |
236 // DidNavigate below (location = ""). | 237 // DidNavigate below (location = ""). |
237 if (url.SchemeIs(chrome::kExtensionScheme) && | 238 if (url.SchemeIs(chrome::kExtensionScheme) && url.host() != extension_id()) { |
238 url.host() != extension_->id()) { | |
239 // TODO(erikkay) communicate this back to the caller? | 239 // TODO(erikkay) communicate this back to the caller? |
240 return; | 240 return; |
241 } | 241 } |
242 | 242 |
243 url_ = url; | 243 url_ = url; |
244 | 244 |
245 if (!is_background_page() && | 245 if (!is_background_page() && |
246 !profile_->GetExtensionService()->IsBackgroundPageReady(extension_)) { | 246 !profile_->GetExtensionService()->IsBackgroundPageReady(extension_)) { |
247 // Make sure the background page loads before any others. | 247 // Make sure the background page loads before any others. |
248 registrar_.Add(this, NotificationType::EXTENSION_BACKGROUND_PAGE_READY, | 248 registrar_.Add(this, NotificationType::EXTENSION_BACKGROUND_PAGE_READY, |
249 Source<Extension>(extension_)); | 249 Source<Extension>(extension_)); |
250 return; | 250 return; |
251 } | 251 } |
252 | 252 |
253 render_view_host_->NavigateToURL(url_); | 253 render_view_host_->NavigateToURL(url_); |
254 } | 254 } |
255 | 255 |
256 void ExtensionHost::Observe(NotificationType type, | 256 void ExtensionHost::Observe(NotificationType type, |
257 const NotificationSource& source, | 257 const NotificationSource& source, |
258 const NotificationDetails& details) { | 258 const NotificationDetails& details) { |
259 switch (type.value) { | 259 switch (type.value) { |
260 case NotificationType::EXTENSION_BACKGROUND_PAGE_READY: | 260 case NotificationType::EXTENSION_BACKGROUND_PAGE_READY: |
261 DCHECK(profile_->GetExtensionService()-> | 261 DCHECK(profile_->GetExtensionService()-> |
262 IsBackgroundPageReady(extension_)); | 262 IsBackgroundPageReady(extension_)); |
263 NavigateToURL(url_); | 263 NavigateToURL(url_); |
264 break; | 264 break; |
265 case NotificationType::RENDERER_PROCESS_CREATED: | 265 case NotificationType::RENDERER_PROCESS_CREATED: |
266 NotificationService::current()->Notify( | 266 NotificationService::current()->Notify( |
267 NotificationType::EXTENSION_PROCESS_CREATED, | 267 NotificationType::EXTENSION_PROCESS_CREATED, |
268 Source<Profile>(profile_), | 268 Source<Profile>(profile_), |
269 Details<ExtensionHost>(this)); | 269 Details<ExtensionHost>(this)); |
270 break; | 270 break; |
271 case NotificationType::EXTENSION_UNLOADED: | 271 case NotificationType::EXTENSION_UNLOADED: |
272 // The extension object will be deleted after this notification has been | 272 // The extension object will be deleted after this notification has been |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 | 335 |
336 // This catches two bogus use cases: | 336 // This catches two bogus use cases: |
337 // (1) URLs that look like chrome-extension://somethingbogus or | 337 // (1) URLs that look like chrome-extension://somethingbogus or |
338 // chrome-extension://nosuchid/, in other words, no Extension would | 338 // chrome-extension://nosuchid/, in other words, no Extension would |
339 // be found. | 339 // be found. |
340 // (2) URLs that refer to a different extension than this one. | 340 // (2) URLs that refer to a different extension than this one. |
341 // In both cases, we preserve the old URL and reset the EFD to NULL. This | 341 // In both cases, we preserve the old URL and reset the EFD to NULL. This |
342 // will leave the host in kind of a bad state with poor UI and errors, but | 342 // will leave the host in kind of a bad state with poor UI and errors, but |
343 // it's better than the alternative. | 343 // it's better than the alternative. |
344 // TODO(erikkay) Perhaps we should display errors in developer mode. | 344 // TODO(erikkay) Perhaps we should display errors in developer mode. |
345 if (params.url.host() != extension_->id()) { | 345 if (params.url.host() != extension_id()) { |
346 extension_function_dispatcher_.reset(NULL); | 346 extension_function_dispatcher_.reset(NULL); |
347 return; | 347 return; |
348 } | 348 } |
349 | 349 |
350 url_ = params.url; | 350 url_ = params.url; |
351 extension_function_dispatcher_.reset( | 351 extension_function_dispatcher_.reset( |
352 ExtensionFunctionDispatcher::Create(render_view_host_, this, url_)); | 352 ExtensionFunctionDispatcher::Create(render_view_host_, this, url_)); |
353 } | 353 } |
354 | 354 |
355 void ExtensionHost::InsertInfobarCSS() { | 355 void ExtensionHost::InsertInfobarCSS() { |
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 return window_id; | 827 return window_id; |
828 } | 828 } |
829 | 829 |
830 void ExtensionHost::OnRunFileChooser( | 830 void ExtensionHost::OnRunFileChooser( |
831 const ViewHostMsg_RunFileChooser_Params& params) { | 831 const ViewHostMsg_RunFileChooser_Params& params) { |
832 if (file_select_helper_.get() == NULL) | 832 if (file_select_helper_.get() == NULL) |
833 file_select_helper_.reset(new FileSelectHelper(profile())); | 833 file_select_helper_.reset(new FileSelectHelper(profile())); |
834 file_select_helper_->RunFileChooser(render_view_host_, | 834 file_select_helper_->RunFileChooser(render_view_host_, |
835 associated_tab_contents(), params); | 835 associated_tab_contents(), params); |
836 } | 836 } |
OLD | NEW |