| 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/memory/singleton.h" | 10 #include "base/memory/singleton.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 #include "chrome/browser/extensions/window_controller.h" | 22 #include "chrome/browser/extensions/window_controller.h" |
| 23 #include "chrome/browser/file_select_helper.h" | 23 #include "chrome/browser/file_select_helper.h" |
| 24 #include "chrome/browser/media/media_capture_devices_dispatcher.h" | 24 #include "chrome/browser/media/media_capture_devices_dispatcher.h" |
| 25 #include "chrome/browser/profiles/profile.h" | 25 #include "chrome/browser/profiles/profile.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.h" | 27 #include "chrome/browser/ui/browser.h" |
| 28 #include "chrome/browser/ui/browser_finder.h" | 28 #include "chrome/browser/ui/browser_finder.h" |
| 29 #include "chrome/browser/ui/browser_list.h" | 29 #include "chrome/browser/ui/browser_list.h" |
| 30 #include "chrome/browser/ui/browser_window.h" | 30 #include "chrome/browser/ui/browser_window.h" |
| 31 #include "chrome/browser/ui/prefs/prefs_tab_helper.h" | 31 #include "chrome/browser/ui/prefs/prefs_tab_helper.h" |
| 32 #include "chrome/browser/view_type_utils.h" | |
| 33 #include "chrome/common/chrome_constants.h" | 32 #include "chrome/common/chrome_constants.h" |
| 34 #include "chrome/common/chrome_notification_types.h" | 33 #include "chrome/common/chrome_notification_types.h" |
| 35 #include "chrome/common/extensions/background_info.h" | 34 #include "chrome/common/extensions/background_info.h" |
| 36 #include "chrome/common/extensions/extension.h" | 35 #include "chrome/common/extensions/extension.h" |
| 37 #include "chrome/common/extensions/extension_constants.h" | 36 #include "chrome/common/extensions/extension_constants.h" |
| 38 #include "chrome/common/extensions/extension_messages.h" | 37 #include "chrome/common/extensions/extension_messages.h" |
| 39 #include "chrome/common/extensions/feature_switch.h" | 38 #include "chrome/common/extensions/feature_switch.h" |
| 40 #include "chrome/common/extensions/request_media_access_permission_helper.h" | 39 #include "chrome/common/extensions/request_media_access_permission_helper.h" |
| 41 #include "chrome/common/render_messages.h" | 40 #include "chrome/common/render_messages.h" |
| 42 #include "chrome/common/url_constants.h" | 41 #include "chrome/common/url_constants.h" |
| 43 #include "content/public/browser/content_browser_client.h" | 42 #include "content/public/browser/content_browser_client.h" |
| 44 #include "content/public/browser/native_web_keyboard_event.h" | 43 #include "content/public/browser/native_web_keyboard_event.h" |
| 45 #include "content/public/browser/notification_service.h" | 44 #include "content/public/browser/notification_service.h" |
| 46 #include "content/public/browser/render_process_host.h" | 45 #include "content/public/browser/render_process_host.h" |
| 47 #include "content/public/browser/render_view_host.h" | 46 #include "content/public/browser/render_view_host.h" |
| 48 #include "content/public/browser/site_instance.h" | 47 #include "content/public/browser/site_instance.h" |
| 49 #include "content/public/browser/web_contents.h" | 48 #include "content/public/browser/web_contents.h" |
| 50 #include "content/public/browser/web_contents_view.h" | 49 #include "content/public/browser/web_contents_view.h" |
| 50 #include "extensions/browser/view_type_utils.h" |
| 51 #include "grit/browser_resources.h" | 51 #include "grit/browser_resources.h" |
| 52 #include "grit/chromium_strings.h" | 52 #include "grit/chromium_strings.h" |
| 53 #include "grit/generated_resources.h" | 53 #include "grit/generated_resources.h" |
| 54 #include "ui/base/keycodes/keyboard_codes.h" | 54 #include "ui/base/keycodes/keyboard_codes.h" |
| 55 #include "ui/base/l10n/l10n_util.h" | 55 #include "ui/base/l10n/l10n_util.h" |
| 56 #include "ui/base/resource/resource_bundle.h" | 56 #include "ui/base/resource/resource_bundle.h" |
| 57 | 57 |
| 58 using WebKit::WebDragOperation; | 58 using WebKit::WebDragOperation; |
| 59 using WebKit::WebDragOperationsMask; | 59 using WebKit::WebDragOperationsMask; |
| 60 using content::NativeWebKeyboardEvent; | 60 using content::NativeWebKeyboardEvent; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 bool pending_create_; | 121 bool pending_create_; |
| 122 base::WeakPtrFactory<ProcessCreationQueue> ptr_factory_; | 122 base::WeakPtrFactory<ProcessCreationQueue> ptr_factory_; |
| 123 }; | 123 }; |
| 124 | 124 |
| 125 //////////////// | 125 //////////////// |
| 126 // ExtensionHost | 126 // ExtensionHost |
| 127 | 127 |
| 128 ExtensionHost::ExtensionHost(const Extension* extension, | 128 ExtensionHost::ExtensionHost(const Extension* extension, |
| 129 SiteInstance* site_instance, | 129 SiteInstance* site_instance, |
| 130 const GURL& url, | 130 const GURL& url, |
| 131 chrome::ViewType host_type) | 131 ViewType host_type) |
| 132 : extension_(extension), | 132 : extension_(extension), |
| 133 extension_id_(extension->id()), | 133 extension_id_(extension->id()), |
| 134 profile_(Profile::FromBrowserContext( | 134 profile_(Profile::FromBrowserContext( |
| 135 site_instance->GetBrowserContext())), | 135 site_instance->GetBrowserContext())), |
| 136 render_view_host_(NULL), | 136 render_view_host_(NULL), |
| 137 did_stop_loading_(false), | 137 did_stop_loading_(false), |
| 138 document_element_available_(false), | 138 document_element_available_(false), |
| 139 initial_url_(url), | 139 initial_url_(url), |
| 140 ALLOW_THIS_IN_INITIALIZER_LIST( | 140 ALLOW_THIS_IN_INITIALIZER_LIST( |
| 141 extension_function_dispatcher_(profile_, this)), | 141 extension_function_dispatcher_(profile_, this)), |
| 142 extension_host_type_(host_type), | 142 extension_host_type_(host_type), |
| 143 associated_web_contents_(NULL) { | 143 associated_web_contents_(NULL) { |
| 144 host_contents_.reset(WebContents::Create( | 144 host_contents_.reset(WebContents::Create( |
| 145 WebContents::CreateParams(profile_, site_instance))), | 145 WebContents::CreateParams(profile_, site_instance))), |
| 146 content::WebContentsObserver::Observe(host_contents_.get()); | 146 content::WebContentsObserver::Observe(host_contents_.get()); |
| 147 host_contents_->SetDelegate(this); | 147 host_contents_->SetDelegate(this); |
| 148 chrome::SetViewType(host_contents_.get(), host_type); | 148 SetViewType(host_contents_.get(), host_type); |
| 149 | 149 |
| 150 PrefsTabHelper::CreateForWebContents(host_contents()); | 150 PrefsTabHelper::CreateForWebContents(host_contents()); |
| 151 | 151 |
| 152 render_view_host_ = host_contents_->GetRenderViewHost(); | 152 render_view_host_ = host_contents_->GetRenderViewHost(); |
| 153 | 153 |
| 154 // Listen for when an extension is unloaded from the same profile, as it may | 154 // Listen for when an extension is unloaded from the same profile, as it may |
| 155 // be the same extension that this points to. | 155 // be the same extension that this points to. |
| 156 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, | 156 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, |
| 157 content::Source<Profile>(profile_)); | 157 content::Source<Profile>(profile_)); |
| 158 } | 158 } |
| 159 | 159 |
| 160 ExtensionHost::~ExtensionHost() { | 160 ExtensionHost::~ExtensionHost() { |
| 161 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE && | 161 if (extension_host_type_ == VIEW_TYPE_EXTENSION_BACKGROUND_PAGE && |
| 162 extension_ && BackgroundInfo::HasLazyBackgroundPage(extension_)) { | 162 extension_ && BackgroundInfo::HasLazyBackgroundPage(extension_)) { |
| 163 UMA_HISTOGRAM_LONG_TIMES("Extensions.EventPageActiveTime", | 163 UMA_HISTOGRAM_LONG_TIMES("Extensions.EventPageActiveTime", |
| 164 since_created_.Elapsed()); | 164 since_created_.Elapsed()); |
| 165 } | 165 } |
| 166 // Clear the extension's renderer process out from any WebContents | 166 // Clear the extension's renderer process out from any WebContents |
| 167 // that might have it in their back history. | 167 // that might have it in their back history. |
| 168 // TODO(jyasskin): Remove this hack by making extension reloading | 168 // TODO(jyasskin): Remove this hack by making extension reloading |
| 169 // wait for renderer shutdown. | 169 // wait for renderer shutdown. |
| 170 content::NotificationService::current()->Notify( | 170 content::NotificationService::current()->Notify( |
| 171 content::NOTIFICATION_RENDERER_PROCESS_CLOSING, | 171 content::NOTIFICATION_RENDERER_PROCESS_CLOSING, |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 231 CreateRenderViewNow(); | 231 CreateRenderViewNow(); |
| 232 } else { | 232 } else { |
| 233 ProcessCreationQueue::GetInstance()->CreateSoon(this); | 233 ProcessCreationQueue::GetInstance()->CreateSoon(this); |
| 234 } | 234 } |
| 235 } | 235 } |
| 236 | 236 |
| 237 void ExtensionHost::CreateRenderViewNow() { | 237 void ExtensionHost::CreateRenderViewNow() { |
| 238 LoadInitialURL(); | 238 LoadInitialURL(); |
| 239 if (is_background_page()) { | 239 if (is_background_page()) { |
| 240 DCHECK(IsRenderViewLive()); | 240 DCHECK(IsRenderViewLive()); |
| 241 extensions::ExtensionSystem::Get(profile_)->extension_service()-> | 241 ExtensionSystem::Get(profile_)->extension_service()-> |
| 242 DidCreateRenderViewForBackgroundPage(this); | 242 DidCreateRenderViewForBackgroundPage(this); |
| 243 } | 243 } |
| 244 } | 244 } |
| 245 | 245 |
| 246 extensions::WindowController* | 246 WindowController* ExtensionHost::GetExtensionWindowController() const { |
| 247 ExtensionHost::GetExtensionWindowController() const { | |
| 248 return view() && view()->browser() ? | 247 return view() && view()->browser() ? |
| 249 view()->browser()->extension_window_controller() : NULL; | 248 view()->browser()->extension_window_controller() : NULL; |
| 250 } | 249 } |
| 251 | 250 |
| 252 const GURL& ExtensionHost::GetURL() const { | 251 const GURL& ExtensionHost::GetURL() const { |
| 253 return host_contents()->GetURL(); | 252 return host_contents()->GetURL(); |
| 254 } | 253 } |
| 255 | 254 |
| 256 void ExtensionHost::LoadInitialURL() { | 255 void ExtensionHost::LoadInitialURL() { |
| 257 if (!is_background_page() && | 256 if (!is_background_page() && |
| 258 !extensions::ExtensionSystem::Get(profile_)->extension_service()-> | 257 !ExtensionSystem::Get(profile_)->extension_service()-> |
| 259 IsBackgroundPageReady(extension_)) { | 258 IsBackgroundPageReady(extension_)) { |
| 260 // Make sure the background page loads before any others. | 259 // Make sure the background page loads before any others. |
| 261 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_BACKGROUND_PAGE_READY, | 260 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_BACKGROUND_PAGE_READY, |
| 262 content::Source<Extension>(extension_)); | 261 content::Source<Extension>(extension_)); |
| 263 return; | 262 return; |
| 264 } | 263 } |
| 265 | 264 |
| 266 host_contents_->GetController().LoadURL( | 265 host_contents_->GetController().LoadURL( |
| 267 initial_url_, content::Referrer(), content::PAGE_TRANSITION_LINK, | 266 initial_url_, content::Referrer(), content::PAGE_TRANSITION_LINK, |
| 268 std::string()); | 267 std::string()); |
| 269 } | 268 } |
| 270 | 269 |
| 271 void ExtensionHost::Close() { | 270 void ExtensionHost::Close() { |
| 272 content::NotificationService::current()->Notify( | 271 content::NotificationService::current()->Notify( |
| 273 chrome::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE, | 272 chrome::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE, |
| 274 content::Source<Profile>(profile_), | 273 content::Source<Profile>(profile_), |
| 275 content::Details<ExtensionHost>(this)); | 274 content::Details<ExtensionHost>(this)); |
| 276 } | 275 } |
| 277 | 276 |
| 278 void ExtensionHost::Observe(int type, | 277 void ExtensionHost::Observe(int type, |
| 279 const content::NotificationSource& source, | 278 const content::NotificationSource& source, |
| 280 const content::NotificationDetails& details) { | 279 const content::NotificationDetails& details) { |
| 281 switch (type) { | 280 switch (type) { |
| 282 case chrome::NOTIFICATION_EXTENSION_BACKGROUND_PAGE_READY: | 281 case chrome::NOTIFICATION_EXTENSION_BACKGROUND_PAGE_READY: |
| 283 DCHECK(extensions::ExtensionSystem::Get(profile_)->extension_service()-> | 282 DCHECK(ExtensionSystem::Get(profile_)->extension_service()-> |
| 284 IsBackgroundPageReady(extension_)); | 283 IsBackgroundPageReady(extension_)); |
| 285 LoadInitialURL(); | 284 LoadInitialURL(); |
| 286 break; | 285 break; |
| 287 case chrome::NOTIFICATION_EXTENSION_UNLOADED: | 286 case chrome::NOTIFICATION_EXTENSION_UNLOADED: |
| 288 // The extension object will be deleted after this notification has been | 287 // The extension object will be deleted after this notification has been |
| 289 // sent. NULL it out so that dirty pointer issues don't arise in cases | 288 // sent. NULL it out so that dirty pointer issues don't arise in cases |
| 290 // when multiple ExtensionHost objects pointing to the same Extension are | 289 // when multiple ExtensionHost objects pointing to the same Extension are |
| 291 // present. | 290 // present. |
| 292 if (extension_ == content::Details<UnloadedExtensionInfo>(details)-> | 291 if (extension_ == content::Details<UnloadedExtensionInfo>(details)-> |
| 293 extension) { | 292 extension) { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 343 static const base::StringPiece css( | 342 static const base::StringPiece css( |
| 344 ResourceBundle::GetSharedInstance().GetRawDataResource( | 343 ResourceBundle::GetSharedInstance().GetRawDataResource( |
| 345 IDR_EXTENSIONS_INFOBAR_CSS)); | 344 IDR_EXTENSIONS_INFOBAR_CSS)); |
| 346 | 345 |
| 347 render_view_host()->InsertCSS(string16(), css.as_string()); | 346 render_view_host()->InsertCSS(string16(), css.as_string()); |
| 348 } | 347 } |
| 349 | 348 |
| 350 void ExtensionHost::DidStopLoading(content::RenderViewHost* render_view_host) { | 349 void ExtensionHost::DidStopLoading(content::RenderViewHost* render_view_host) { |
| 351 bool notify = !did_stop_loading_; | 350 bool notify = !did_stop_loading_; |
| 352 did_stop_loading_ = true; | 351 did_stop_loading_ = true; |
| 353 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP || | 352 if (extension_host_type_ == VIEW_TYPE_EXTENSION_POPUP || |
| 354 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG || | 353 extension_host_type_ == VIEW_TYPE_EXTENSION_DIALOG || |
| 355 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR || | 354 extension_host_type_ == VIEW_TYPE_EXTENSION_INFOBAR || |
| 356 extension_host_type_ == chrome::VIEW_TYPE_PANEL) { | 355 extension_host_type_ == VIEW_TYPE_PANEL) { |
| 357 #if defined(TOOLKIT_VIEWS) || defined(OS_MACOSX) | 356 #if defined(TOOLKIT_VIEWS) || defined(OS_MACOSX) |
| 358 if (view()) | 357 if (view()) |
| 359 view()->DidStopLoading(); | 358 view()->DidStopLoading(); |
| 360 #endif | 359 #endif |
| 361 } | 360 } |
| 362 if (notify) { | 361 if (notify) { |
| 363 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { | 362 if (extension_host_type_ == VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { |
| 364 if (extension_ && BackgroundInfo::HasLazyBackgroundPage(extension_)) { | 363 if (extension_ && BackgroundInfo::HasLazyBackgroundPage(extension_)) { |
| 365 UMA_HISTOGRAM_TIMES("Extensions.EventPageLoadTime", | 364 UMA_HISTOGRAM_TIMES("Extensions.EventPageLoadTime", |
| 366 since_created_.Elapsed()); | 365 since_created_.Elapsed()); |
| 367 } else { | 366 } else { |
| 368 UMA_HISTOGRAM_TIMES("Extensions.BackgroundPageLoadTime", | 367 UMA_HISTOGRAM_TIMES("Extensions.BackgroundPageLoadTime", |
| 369 since_created_.Elapsed()); | 368 since_created_.Elapsed()); |
| 370 } | 369 } |
| 371 } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG) { | 370 } else if (extension_host_type_ == VIEW_TYPE_EXTENSION_DIALOG) { |
| 372 UMA_HISTOGRAM_TIMES("Extensions.DialogLoadTime", | 371 UMA_HISTOGRAM_TIMES("Extensions.DialogLoadTime", |
| 373 since_created_.Elapsed()); | 372 since_created_.Elapsed()); |
| 374 } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP) { | 373 } else if (extension_host_type_ == VIEW_TYPE_EXTENSION_POPUP) { |
| 375 UMA_HISTOGRAM_TIMES("Extensions.PopupLoadTime", | 374 UMA_HISTOGRAM_TIMES("Extensions.PopupLoadTime", |
| 376 since_created_.Elapsed()); | 375 since_created_.Elapsed()); |
| 377 } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR) { | 376 } else if (extension_host_type_ == VIEW_TYPE_EXTENSION_INFOBAR) { |
| 378 UMA_HISTOGRAM_TIMES("Extensions.InfobarLoadTime", | 377 UMA_HISTOGRAM_TIMES("Extensions.InfobarLoadTime", |
| 379 since_created_.Elapsed()); | 378 since_created_.Elapsed()); |
| 380 } else if (extension_host_type_ == chrome::VIEW_TYPE_PANEL) { | 379 } else if (extension_host_type_ == VIEW_TYPE_PANEL) { |
| 381 UMA_HISTOGRAM_TIMES("Extensions.PanelLoadTime", since_created_.Elapsed()); | 380 UMA_HISTOGRAM_TIMES("Extensions.PanelLoadTime", since_created_.Elapsed()); |
| 382 } | 381 } |
| 383 | 382 |
| 384 // Send the notification last, because it might result in this being | 383 // Send the notification last, because it might result in this being |
| 385 // deleted. | 384 // deleted. |
| 386 content::NotificationService::current()->Notify( | 385 content::NotificationService::current()->Notify( |
| 387 chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING, | 386 chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING, |
| 388 content::Source<Profile>(profile_), | 387 content::Source<Profile>(profile_), |
| 389 content::Details<ExtensionHost>(this)); | 388 content::Details<ExtensionHost>(this)); |
| 390 } | 389 } |
| 391 } | 390 } |
| 392 | 391 |
| 393 void ExtensionHost::DocumentAvailableInMainFrame() { | 392 void ExtensionHost::DocumentAvailableInMainFrame() { |
| 394 // If the document has already been marked as available for this host, then | 393 // If the document has already been marked as available for this host, then |
| 395 // bail. No need for the redundant setup. http://crbug.com/31170 | 394 // bail. No need for the redundant setup. http://crbug.com/31170 |
| 396 if (document_element_available_) | 395 if (document_element_available_) |
| 397 return; | 396 return; |
| 398 | 397 |
| 399 document_element_available_ = true; | 398 document_element_available_ = true; |
| 400 if (is_background_page()) { | 399 if (is_background_page()) { |
| 401 extensions::ExtensionSystem::Get(profile_)->extension_service()-> | 400 ExtensionSystem::Get(profile_)->extension_service()-> |
| 402 SetBackgroundPageReady(extension_); | 401 SetBackgroundPageReady(extension_); |
| 403 } else { | 402 } else { |
| 404 switch (extension_host_type_) { | 403 switch (extension_host_type_) { |
| 405 case chrome::VIEW_TYPE_EXTENSION_INFOBAR: | 404 case VIEW_TYPE_EXTENSION_INFOBAR: |
| 406 InsertInfobarCSS(); | 405 InsertInfobarCSS(); |
| 407 break; | 406 break; |
| 408 default: | 407 default: |
| 409 break; // No style sheet for other types, at the moment. | 408 break; // No style sheet for other types, at the moment. |
| 410 } | 409 } |
| 411 } | 410 } |
| 412 } | 411 } |
| 413 | 412 |
| 414 void ExtensionHost::CloseContents(WebContents* contents) { | 413 void ExtensionHost::CloseContents(WebContents* contents) { |
| 415 // TODO(mpcomplete): is this check really necessary? | 414 // TODO(mpcomplete): is this check really necessary? |
| 416 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP || | 415 if (extension_host_type_ == VIEW_TYPE_EXTENSION_POPUP || |
| 417 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG || | 416 extension_host_type_ == VIEW_TYPE_EXTENSION_DIALOG || |
| 418 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE || | 417 extension_host_type_ == VIEW_TYPE_EXTENSION_BACKGROUND_PAGE || |
| 419 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR || | 418 extension_host_type_ == VIEW_TYPE_EXTENSION_INFOBAR || |
| 420 extension_host_type_ == chrome::VIEW_TYPE_PANEL) { | 419 extension_host_type_ == VIEW_TYPE_PANEL) { |
| 421 Close(); | 420 Close(); |
| 422 } | 421 } |
| 423 } | 422 } |
| 424 | 423 |
| 425 void ExtensionHost::WillRunJavaScriptDialog() { | 424 void ExtensionHost::WillRunJavaScriptDialog() { |
| 426 ExtensionProcessManager* pm = | 425 ExtensionProcessManager* pm = |
| 427 ExtensionSystem::Get(profile_)->process_manager(); | 426 ExtensionSystem::Get(profile_)->process_manager(); |
| 428 if (pm) | 427 if (pm) |
| 429 pm->IncrementLazyKeepaliveCount(extension()); | 428 pm->IncrementLazyKeepaliveCount(extension()); |
| 430 } | 429 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 453 return browser ? browser->OpenURL(params) : NULL; | 452 return browser ? browser->OpenURL(params) : NULL; |
| 454 } | 453 } |
| 455 default: | 454 default: |
| 456 return NULL; | 455 return NULL; |
| 457 } | 456 } |
| 458 } | 457 } |
| 459 | 458 |
| 460 bool ExtensionHost::PreHandleKeyboardEvent(WebContents* source, | 459 bool ExtensionHost::PreHandleKeyboardEvent(WebContents* source, |
| 461 const NativeWebKeyboardEvent& event, | 460 const NativeWebKeyboardEvent& event, |
| 462 bool* is_keyboard_shortcut) { | 461 bool* is_keyboard_shortcut) { |
| 463 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP && | 462 if (extension_host_type_ == VIEW_TYPE_EXTENSION_POPUP && |
| 464 event.type == NativeWebKeyboardEvent::RawKeyDown && | 463 event.type == NativeWebKeyboardEvent::RawKeyDown && |
| 465 event.windowsKeyCode == ui::VKEY_ESCAPE) { | 464 event.windowsKeyCode == ui::VKEY_ESCAPE) { |
| 466 DCHECK(is_keyboard_shortcut != NULL); | 465 DCHECK(is_keyboard_shortcut != NULL); |
| 467 *is_keyboard_shortcut = true; | 466 *is_keyboard_shortcut = true; |
| 468 return false; | 467 return false; |
| 469 } | 468 } |
| 470 | 469 |
| 471 // Handle higher priority browser shortcuts such as Ctrl-w. | 470 // Handle higher priority browser shortcuts such as Ctrl-w. |
| 472 Browser* browser = view() ? view()->browser() : NULL; | 471 Browser* browser = view() ? view()->browser() : NULL; |
| 473 if (browser) | 472 if (browser) |
| 474 return browser->PreHandleKeyboardEvent(source, event, is_keyboard_shortcut); | 473 return browser->PreHandleKeyboardEvent(source, event, is_keyboard_shortcut); |
| 475 | 474 |
| 476 *is_keyboard_shortcut = false; | 475 *is_keyboard_shortcut = false; |
| 477 return false; | 476 return false; |
| 478 } | 477 } |
| 479 | 478 |
| 480 void ExtensionHost::HandleKeyboardEvent(WebContents* source, | 479 void ExtensionHost::HandleKeyboardEvent(WebContents* source, |
| 481 const NativeWebKeyboardEvent& event) { | 480 const NativeWebKeyboardEvent& event) { |
| 482 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP) { | 481 if (extension_host_type_ == VIEW_TYPE_EXTENSION_POPUP) { |
| 483 if (event.type == NativeWebKeyboardEvent::RawKeyDown && | 482 if (event.type == NativeWebKeyboardEvent::RawKeyDown && |
| 484 event.windowsKeyCode == ui::VKEY_ESCAPE) { | 483 event.windowsKeyCode == ui::VKEY_ESCAPE) { |
| 485 Close(); | 484 Close(); |
| 486 return; | 485 return; |
| 487 } | 486 } |
| 488 } | 487 } |
| 489 UnhandledKeyboardEvent(source, event); | 488 UnhandledKeyboardEvent(source, event); |
| 490 } | 489 } |
| 491 | 490 |
| 492 bool ExtensionHost::OnMessageReceived(const IPC::Message& message) { | 491 bool ExtensionHost::OnMessageReceived(const IPC::Message& message) { |
| 493 bool handled = true; | 492 bool handled = true; |
| 494 IPC_BEGIN_MESSAGE_MAP(ExtensionHost, message) | 493 IPC_BEGIN_MESSAGE_MAP(ExtensionHost, message) |
| 495 IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest) | 494 IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest) |
| 496 IPC_MESSAGE_HANDLER(ExtensionHostMsg_EventAck, OnEventAck) | 495 IPC_MESSAGE_HANDLER(ExtensionHostMsg_EventAck, OnEventAck) |
| 497 IPC_MESSAGE_HANDLER(ExtensionHostMsg_IncrementLazyKeepaliveCount, | 496 IPC_MESSAGE_HANDLER(ExtensionHostMsg_IncrementLazyKeepaliveCount, |
| 498 OnIncrementLazyKeepaliveCount) | 497 OnIncrementLazyKeepaliveCount) |
| 499 IPC_MESSAGE_HANDLER(ExtensionHostMsg_DecrementLazyKeepaliveCount, | 498 IPC_MESSAGE_HANDLER(ExtensionHostMsg_DecrementLazyKeepaliveCount, |
| 500 OnDecrementLazyKeepaliveCount) | 499 OnDecrementLazyKeepaliveCount) |
| 501 IPC_MESSAGE_UNHANDLED(handled = false) | 500 IPC_MESSAGE_UNHANDLED(handled = false) |
| 502 IPC_END_MESSAGE_MAP() | 501 IPC_END_MESSAGE_MAP() |
| 503 return handled; | 502 return handled; |
| 504 } | 503 } |
| 505 | 504 |
| 506 void ExtensionHost::OnRequest(const ExtensionHostMsg_Request_Params& params) { | 505 void ExtensionHost::OnRequest(const ExtensionHostMsg_Request_Params& params) { |
| 507 extension_function_dispatcher_.Dispatch(params, render_view_host()); | 506 extension_function_dispatcher_.Dispatch(params, render_view_host()); |
| 508 } | 507 } |
| 509 | 508 |
| 510 void ExtensionHost::OnEventAck() { | 509 void ExtensionHost::OnEventAck() { |
| 511 extensions::EventRouter* router = | 510 EventRouter* router = ExtensionSystem::Get(profile_)->event_router(); |
| 512 ExtensionSystem::Get(profile_)->event_router(); | |
| 513 if (router) | 511 if (router) |
| 514 router->OnEventAck(profile_, extension_id()); | 512 router->OnEventAck(profile_, extension_id()); |
| 515 } | 513 } |
| 516 | 514 |
| 517 void ExtensionHost::OnIncrementLazyKeepaliveCount() { | 515 void ExtensionHost::OnIncrementLazyKeepaliveCount() { |
| 518 ExtensionProcessManager* pm = | 516 ExtensionProcessManager* pm = |
| 519 ExtensionSystem::Get(profile_)->process_manager(); | 517 ExtensionSystem::Get(profile_)->process_manager(); |
| 520 if (pm) | 518 if (pm) |
| 521 pm->IncrementLazyKeepaliveCount(extension()); | 519 pm->IncrementLazyKeepaliveCount(extension()); |
| 522 } | 520 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 548 } | 546 } |
| 549 | 547 |
| 550 void ExtensionHost::RenderViewCreated(RenderViewHost* render_view_host) { | 548 void ExtensionHost::RenderViewCreated(RenderViewHost* render_view_host) { |
| 551 render_view_host_ = render_view_host; | 549 render_view_host_ = render_view_host; |
| 552 | 550 |
| 553 if (view()) | 551 if (view()) |
| 554 view()->RenderViewCreated(); | 552 view()->RenderViewCreated(); |
| 555 | 553 |
| 556 // If the host is bound to a window, then extract its id. Extensions hosted | 554 // If the host is bound to a window, then extract its id. Extensions hosted |
| 557 // in ExternalTabContainer objects may not have an associated window. | 555 // in ExternalTabContainer objects may not have an associated window. |
| 558 extensions::WindowController* window = GetExtensionWindowController(); | 556 WindowController* window = GetExtensionWindowController(); |
| 559 if (window) { | 557 if (window) { |
| 560 render_view_host->Send(new ExtensionMsg_UpdateBrowserWindowId( | 558 render_view_host->Send(new ExtensionMsg_UpdateBrowserWindowId( |
| 561 render_view_host->GetRoutingID(), window->GetWindowId())); | 559 render_view_host->GetRoutingID(), window->GetWindowId())); |
| 562 } | 560 } |
| 563 } | 561 } |
| 564 | 562 |
| 565 void ExtensionHost::RenderViewDeleted(RenderViewHost* render_view_host) { | 563 void ExtensionHost::RenderViewDeleted(RenderViewHost* render_view_host) { |
| 566 // If our RenderViewHost is deleted, fall back to the host_contents' current | 564 // If our RenderViewHost is deleted, fall back to the host_contents' current |
| 567 // RVH. There is sometimes a small gap between the pending RVH being deleted | 565 // RVH. There is sometimes a small gap between the pending RVH being deleted |
| 568 // and RenderViewCreated being called, so we update it here. | 566 // and RenderViewCreated being called, so we update it here. |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 633 content::IsAudioMediaType(request.audio_type), | 631 content::IsAudioMediaType(request.audio_type), |
| 634 content::IsVideoMediaType(request.video_type), | 632 content::IsVideoMediaType(request.video_type), |
| 635 &devices); | 633 &devices); |
| 636 | 634 |
| 637 // For tab capture device, we require the tabCapture permission. | 635 // For tab capture device, we require the tabCapture permission. |
| 638 RequestMediaAccessPermissionHelper::AuthorizeRequest( | 636 RequestMediaAccessPermissionHelper::AuthorizeRequest( |
| 639 devices, request, callback, extension(), false); | 637 devices, request, callback, extension(), false); |
| 640 } | 638 } |
| 641 | 639 |
| 642 } // namespace extensions | 640 } // namespace extensions |
| OLD | NEW |