| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/memory/singleton.h" | 11 #include "base/memory/singleton.h" |
| 12 #include "base/memory/weak_ptr.h" | 12 #include "base/memory/weak_ptr.h" |
| 13 #include "base/message_loop/message_loop.h" | 13 #include "base/message_loop/message_loop.h" |
| 14 #include "base/metrics/histogram.h" | 14 #include "base/metrics/histogram.h" |
| 15 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
| 16 #include "base/strings/utf_string_conversions.h" | 16 #include "base/strings/utf_string_conversions.h" |
| 17 #include "chrome/browser/browser_shutdown.h" | 17 #include "chrome/browser/browser_shutdown.h" |
| 18 #include "chrome/browser/chrome_notification_types.h" | 18 #include "chrome/browser/chrome_notification_types.h" |
| 19 #include "chrome/browser/extensions/error_console/error_console.h" | 19 #include "chrome/browser/extensions/error_console/error_console.h" |
| 20 #include "chrome/browser/extensions/extension_service.h" | 20 #include "chrome/browser/extensions/extension_service.h" |
| 21 #include "chrome/browser/extensions/extension_system.h" | 21 #include "chrome/browser/extensions/extension_system.h" |
| 22 #include "chrome/browser/extensions/extension_tab_util.h" | 22 #include "chrome/browser/extensions/extension_tab_util.h" |
| 23 #include "chrome/browser/extensions/extension_web_contents_observer.h" | 23 #include "chrome/browser/extensions/extension_web_contents_observer.h" |
| 24 #include "chrome/browser/file_select_helper.h" | 24 #include "chrome/browser/file_select_helper.h" |
| 25 #include "chrome/browser/media/media_capture_devices_dispatcher.h" | 25 #include "chrome/browser/media/media_capture_devices_dispatcher.h" |
| 26 #include "chrome/browser/ui/app_modal_dialogs/javascript_dialog_manager.h" | 26 #include "chrome/browser/ui/app_modal_dialogs/javascript_dialog_manager.h" |
| 27 #include "chrome/browser/ui/browser_dialogs.h" | 27 #include "chrome/browser/ui/browser_dialogs.h" |
| 28 #include "chrome/browser/ui/browser_window.h" | |
| 29 #include "chrome/browser/ui/prefs/prefs_tab_helper.h" | 28 #include "chrome/browser/ui/prefs/prefs_tab_helper.h" |
| 30 #include "chrome/common/chrome_constants.h" | 29 #include "chrome/common/chrome_constants.h" |
| 31 #include "chrome/common/extensions/extension_constants.h" | 30 #include "chrome/common/extensions/extension_constants.h" |
| 32 #include "chrome/common/extensions/extension_messages.h" | 31 #include "chrome/common/extensions/extension_messages.h" |
| 33 #include "chrome/common/render_messages.h" | 32 #include "chrome/common/render_messages.h" |
| 34 #include "chrome/common/url_constants.h" | 33 #include "chrome/common/url_constants.h" |
| 34 #include "content/public/browser/browser_context.h" |
| 35 #include "content/public/browser/content_browser_client.h" | 35 #include "content/public/browser/content_browser_client.h" |
| 36 #include "content/public/browser/native_web_keyboard_event.h" | 36 #include "content/public/browser/native_web_keyboard_event.h" |
| 37 #include "content/public/browser/notification_service.h" | 37 #include "content/public/browser/notification_service.h" |
| 38 #include "content/public/browser/render_process_host.h" | 38 #include "content/public/browser/render_process_host.h" |
| 39 #include "content/public/browser/render_view_host.h" | 39 #include "content/public/browser/render_view_host.h" |
| 40 #include "content/public/browser/render_widget_host_view.h" | 40 #include "content/public/browser/render_widget_host_view.h" |
| 41 #include "content/public/browser/site_instance.h" | 41 #include "content/public/browser/site_instance.h" |
| 42 #include "content/public/browser/web_contents.h" | 42 #include "content/public/browser/web_contents.h" |
| 43 #include "content/public/browser/web_contents_view.h" | |
| 44 #include "extensions/browser/event_router.h" | 43 #include "extensions/browser/event_router.h" |
| 45 #include "extensions/browser/extension_error.h" | 44 #include "extensions/browser/extension_error.h" |
| 46 #include "extensions/browser/process_manager.h" | 45 #include "extensions/browser/process_manager.h" |
| 47 #include "extensions/browser/view_type_utils.h" | 46 #include "extensions/browser/view_type_utils.h" |
| 48 #include "extensions/common/extension.h" | 47 #include "extensions/common/extension.h" |
| 49 #include "extensions/common/extension_urls.h" | 48 #include "extensions/common/extension_urls.h" |
| 50 #include "extensions/common/feature_switch.h" | 49 #include "extensions/common/feature_switch.h" |
| 51 #include "extensions/common/manifest_handlers/background_info.h" | 50 #include "extensions/common/manifest_handlers/background_info.h" |
| 52 #include "ui/base/l10n/l10n_util.h" | 51 #include "ui/base/l10n/l10n_util.h" |
| 53 | 52 #include "ui/base/window_open_disposition.h" |
| 54 #if !defined(OS_ANDROID) | |
| 55 #include "components/web_modal/web_contents_modal_dialog_manager.h" | |
| 56 #endif | |
| 57 | 53 |
| 58 using blink::WebDragOperation; | 54 using blink::WebDragOperation; |
| 59 using blink::WebDragOperationsMask; | 55 using blink::WebDragOperationsMask; |
| 60 using content::BrowserContext; | 56 using content::BrowserContext; |
| 61 using content::NativeWebKeyboardEvent; | 57 using content::NativeWebKeyboardEvent; |
| 62 using content::OpenURLParams; | 58 using content::OpenURLParams; |
| 63 using content::RenderViewHost; | 59 using content::RenderViewHost; |
| 64 using content::SiteInstance; | 60 using content::SiteInstance; |
| 65 using content::WebContents; | 61 using content::WebContents; |
| 66 | 62 |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 ExtensionSystem::GetForBrowserContext(browser_context_)-> | 201 ExtensionSystem::GetForBrowserContext(browser_context_)-> |
| 206 extension_service()->DidCreateRenderViewForBackgroundPage(this); | 202 extension_service()->DidCreateRenderViewForBackgroundPage(this); |
| 207 } | 203 } |
| 208 } | 204 } |
| 209 | 205 |
| 210 const GURL& ExtensionHost::GetURL() const { | 206 const GURL& ExtensionHost::GetURL() const { |
| 211 return host_contents()->GetURL(); | 207 return host_contents()->GetURL(); |
| 212 } | 208 } |
| 213 | 209 |
| 214 void ExtensionHost::LoadInitialURL() { | 210 void ExtensionHost::LoadInitialURL() { |
| 215 if (!IsBackgroundPage() && | |
| 216 !ExtensionSystem::GetForBrowserContext(browser_context_)-> | |
| 217 extension_service()->IsBackgroundPageReady(extension_)) { | |
| 218 // Make sure the background page loads before any others. | |
| 219 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_BACKGROUND_PAGE_READY, | |
| 220 content::Source<Extension>(extension_)); | |
| 221 return; | |
| 222 } | |
| 223 | |
| 224 #if !defined(OS_ANDROID) | |
| 225 // TODO(jamescook): Move this to ExtensionViewHost, which handles popups. | |
| 226 if (extension_host_type_ == VIEW_TYPE_EXTENSION_POPUP) { | |
| 227 web_modal::WebContentsModalDialogManager::CreateForWebContents( | |
| 228 host_contents_.get()); | |
| 229 web_modal::WebContentsModalDialogManager::FromWebContents( | |
| 230 host_contents_.get())->SetDelegate(this); | |
| 231 } | |
| 232 #endif | |
| 233 | |
| 234 host_contents_->GetController().LoadURL( | 211 host_contents_->GetController().LoadURL( |
| 235 initial_url_, content::Referrer(), content::PAGE_TRANSITION_LINK, | 212 initial_url_, content::Referrer(), content::PAGE_TRANSITION_LINK, |
| 236 std::string()); | 213 std::string()); |
| 237 } | 214 } |
| 238 | 215 |
| 239 bool ExtensionHost::IsBackgroundPage() const { | 216 bool ExtensionHost::IsBackgroundPage() const { |
| 240 DCHECK(extension_host_type_ == VIEW_TYPE_EXTENSION_BACKGROUND_PAGE); | 217 DCHECK(extension_host_type_ == VIEW_TYPE_EXTENSION_BACKGROUND_PAGE); |
| 241 return true; | 218 return true; |
| 242 } | 219 } |
| 243 | 220 |
| 244 void ExtensionHost::Close() { | 221 void ExtensionHost::Close() { |
| 245 content::NotificationService::current()->Notify( | 222 content::NotificationService::current()->Notify( |
| 246 chrome::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE, | 223 chrome::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE, |
| 247 content::Source<BrowserContext>(browser_context_), | 224 content::Source<BrowserContext>(browser_context_), |
| 248 content::Details<ExtensionHost>(this)); | 225 content::Details<ExtensionHost>(this)); |
| 249 } | 226 } |
| 250 | 227 |
| 251 #if !defined(OS_ANDROID) | |
| 252 web_modal::WebContentsModalDialogHost* | |
| 253 ExtensionHost::GetWebContentsModalDialogHost() { | |
| 254 return this; | |
| 255 } | |
| 256 | |
| 257 gfx::NativeView ExtensionHost::GetHostView() const { | |
| 258 return NULL; | |
| 259 } | |
| 260 | |
| 261 gfx::Point ExtensionHost::GetDialogPosition(const gfx::Size& size) { | |
| 262 if (!GetVisibleWebContents()) | |
| 263 return gfx::Point(); | |
| 264 gfx::Rect bounds = GetVisibleWebContents()->GetView()->GetViewBounds(); | |
| 265 return gfx::Point( | |
| 266 std::max(0, (bounds.width() - size.width()) / 2), | |
| 267 std::max(0, (bounds.height() - size.height()) / 2)); | |
| 268 } | |
| 269 | |
| 270 gfx::Size ExtensionHost::GetMaximumDialogSize() { | |
| 271 if (!GetVisibleWebContents()) | |
| 272 return gfx::Size(); | |
| 273 return GetVisibleWebContents()->GetView()->GetViewBounds().size(); | |
| 274 } | |
| 275 | |
| 276 void ExtensionHost::AddObserver( | |
| 277 web_modal::ModalDialogHostObserver* observer) { | |
| 278 } | |
| 279 | |
| 280 void ExtensionHost::RemoveObserver( | |
| 281 web_modal::ModalDialogHostObserver* observer) { | |
| 282 } | |
| 283 #endif | |
| 284 | |
| 285 void ExtensionHost::Observe(int type, | 228 void ExtensionHost::Observe(int type, |
| 286 const content::NotificationSource& source, | 229 const content::NotificationSource& source, |
| 287 const content::NotificationDetails& details) { | 230 const content::NotificationDetails& details) { |
| 288 switch (type) { | 231 switch (type) { |
| 289 case chrome::NOTIFICATION_EXTENSION_BACKGROUND_PAGE_READY: | |
| 290 DCHECK(ExtensionSystem::GetForBrowserContext(browser_context_)-> | |
| 291 extension_service()->IsBackgroundPageReady(extension_)); | |
| 292 LoadInitialURL(); | |
| 293 break; | |
| 294 case chrome::NOTIFICATION_EXTENSION_UNLOADED: | 232 case chrome::NOTIFICATION_EXTENSION_UNLOADED: |
| 295 // The extension object will be deleted after this notification has been | 233 // The extension object will be deleted after this notification has been |
| 296 // sent. NULL it out so that dirty pointer issues don't arise in cases | 234 // sent. NULL it out so that dirty pointer issues don't arise in cases |
| 297 // when multiple ExtensionHost objects pointing to the same Extension are | 235 // when multiple ExtensionHost objects pointing to the same Extension are |
| 298 // present. | 236 // present. |
| 299 if (extension_ == content::Details<UnloadedExtensionInfo>(details)-> | 237 if (extension_ == content::Details<UnloadedExtensionInfo>(details)-> |
| 300 extension) { | 238 extension) { |
| 301 extension_ = NULL; | 239 extension_ = NULL; |
| 302 } | 240 } |
| 303 break; | 241 break; |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 | 490 |
| 553 void ExtensionHost::RequestMediaAccessPermission( | 491 void ExtensionHost::RequestMediaAccessPermission( |
| 554 content::WebContents* web_contents, | 492 content::WebContents* web_contents, |
| 555 const content::MediaStreamRequest& request, | 493 const content::MediaStreamRequest& request, |
| 556 const content::MediaResponseCallback& callback) { | 494 const content::MediaResponseCallback& callback) { |
| 557 MediaCaptureDevicesDispatcher::GetInstance()->ProcessMediaAccessRequest( | 495 MediaCaptureDevicesDispatcher::GetInstance()->ProcessMediaAccessRequest( |
| 558 web_contents, request, callback, extension()); | 496 web_contents, request, callback, extension()); |
| 559 } | 497 } |
| 560 | 498 |
| 561 } // namespace extensions | 499 } // namespace extensions |
| OLD | NEW |