[email protected] | 6c0f179f | 2014-03-19 11:04:41 | [diff] [blame] | 1 | // Copyright 2014 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 | #include "chrome/browser/extensions/chrome_extension_host_delegate.h" |
| 6 | |
kundaji | 0a066230 | 2016-09-26 23:50:22 | [diff] [blame] | 7 | #include <memory> |
| 8 | #include <string> |
| 9 | |
yoz | d61dfe19 | 2015-02-21 01:30:37 | [diff] [blame] | 10 | #include "base/lazy_instance.h" |
Becca Hughes | ae7e667 | 2018-11-30 22:27:45 | [diff] [blame] | 11 | #include "chrome/browser/apps/platform_apps/audio_focus_web_contents_observer.h" |
dgn | 5e9c04bd | 2016-12-30 11:28:00 | [diff] [blame] | 12 | #include "chrome/browser/browser_process.h" |
[email protected] | 13e062e | 2014-08-09 10:21:55 | [diff] [blame] | 13 | #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" |
[email protected] | 6c0f179f | 2014-03-19 11:04:41 | [diff] [blame] | 14 | #include "chrome/browser/extensions/extension_service.h" |
| 15 | #include "chrome/browser/extensions/extension_tab_util.h" |
mcasas | a2023ab | 2016-09-08 01:06:36 | [diff] [blame] | 16 | #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" |
Sigurdur Asgeirsson | b59e66ee | 2019-02-27 13:59:25 | [diff] [blame] | 17 | #include "chrome/browser/performance_manager/performance_manager_tab_helper.h" |
Sigurdur Asgeirsson | 779bd06 | 2019-09-11 14:40:49 | [diff] [blame] | 18 | #include "chrome/browser/performance_manager/public/performance_manager.h" |
François Beaufort | 48cf272 | 2018-08-28 09:33:52 | [diff] [blame] | 19 | #include "chrome/browser/picture_in_picture/picture_in_picture_window_manager.h" |
[email protected] | 6c0f179f | 2014-03-19 11:04:41 | [diff] [blame] | 20 | #include "chrome/browser/ui/prefs/prefs_tab_helper.h" |
oshima | f6539842 | 2014-11-18 23:30:42 | [diff] [blame] | 21 | #include "components/app_modal/javascript_dialog_manager.h" |
[email protected] | 22401dc | 2014-03-21 01:38:57 | [diff] [blame] | 22 | #include "extensions/browser/extension_host.h" |
[email protected] | 6c0f179f | 2014-03-19 11:04:41 | [diff] [blame] | 23 | #include "extensions/browser/extension_system.h" |
kalman | d49594b5 | 2015-02-27 17:27:16 | [diff] [blame] | 24 | #include "extensions/browser/load_monitoring_extension_host_queue.h" |
yoz | d61dfe19 | 2015-02-21 01:30:37 | [diff] [blame] | 25 | #include "extensions/browser/serial_extension_host_queue.h" |
[email protected] | 6c0f179f | 2014-03-19 11:04:41 | [diff] [blame] | 26 | |
| 27 | namespace extensions { |
| 28 | |
kalman | d49594b5 | 2015-02-27 17:27:16 | [diff] [blame] | 29 | namespace { |
| 30 | |
| 31 | // Singleton for GetExtensionHostQueue(). |
| 32 | struct QueueWrapper { |
| 33 | QueueWrapper() { |
| 34 | queue.reset(new LoadMonitoringExtensionHostQueue( |
dcheng | c963c714 | 2016-04-08 03:55:22 | [diff] [blame] | 35 | std::unique_ptr<ExtensionHostQueue>(new SerialExtensionHostQueue()))); |
kalman | d49594b5 | 2015-02-27 17:27:16 | [diff] [blame] | 36 | } |
dcheng | c963c714 | 2016-04-08 03:55:22 | [diff] [blame] | 37 | std::unique_ptr<ExtensionHostQueue> queue; |
kalman | d49594b5 | 2015-02-27 17:27:16 | [diff] [blame] | 38 | }; |
scottmg | 5e65e3a | 2017-03-08 08:48:46 | [diff] [blame] | 39 | base::LazyInstance<QueueWrapper>::DestructorAtExit g_queue = |
| 40 | LAZY_INSTANCE_INITIALIZER; |
kalman | d49594b5 | 2015-02-27 17:27:16 | [diff] [blame] | 41 | |
| 42 | } // namespace |
| 43 | |
[email protected] | 6c0f179f | 2014-03-19 11:04:41 | [diff] [blame] | 44 | ChromeExtensionHostDelegate::ChromeExtensionHostDelegate() {} |
| 45 | |
| 46 | ChromeExtensionHostDelegate::~ChromeExtensionHostDelegate() {} |
| 47 | |
| 48 | void ChromeExtensionHostDelegate::OnExtensionHostCreated( |
| 49 | content::WebContents* web_contents) { |
[email protected] | 1ce1597 | 2014-03-20 19:25:48 | [diff] [blame] | 50 | ChromeExtensionWebContentsObserver::CreateForWebContents(web_contents); |
[email protected] | 6c0f179f | 2014-03-19 11:04:41 | [diff] [blame] | 51 | PrefsTabHelper::CreateForWebContents(web_contents); |
Becca Hughes | ae7e667 | 2018-11-30 22:27:45 | [diff] [blame] | 52 | apps::AudioFocusWebContentsObserver::CreateForWebContents(web_contents); |
Sigurdur Asgeirsson | 53806eb3 | 2019-03-14 13:00:51 | [diff] [blame] | 53 | |
Chris Hamilton | da276020f7 | 2019-07-29 21:11:40 | [diff] [blame] | 54 | if (performance_manager::PerformanceManager::IsAvailable()) { |
Sigurdur Asgeirsson | 53806eb3 | 2019-03-14 13:00:51 | [diff] [blame] | 55 | performance_manager::PerformanceManagerTabHelper::CreateForWebContents( |
| 56 | web_contents); |
| 57 | } |
[email protected] | 6c0f179f | 2014-03-19 11:04:41 | [diff] [blame] | 58 | } |
| 59 | |
| 60 | void ChromeExtensionHostDelegate::OnRenderViewCreatedForBackgroundPage( |
| 61 | ExtensionHost* host) { |
| 62 | ExtensionService* service = |
| 63 | ExtensionSystem::Get(host->browser_context())->extension_service(); |
| 64 | if (service) |
| 65 | service->DidCreateRenderViewForBackgroundPage(host); |
| 66 | } |
| 67 | |
| 68 | content::JavaScriptDialogManager* |
| 69 | ChromeExtensionHostDelegate::GetJavaScriptDialogManager() { |
oshima | 0929be2a | 2014-11-19 22:21:03 | [diff] [blame] | 70 | return app_modal::JavaScriptDialogManager::GetInstance(); |
[email protected] | 6c0f179f | 2014-03-19 11:04:41 | [diff] [blame] | 71 | } |
| 72 | |
erikchen | 38fa402 | 2018-04-26 20:37:52 | [diff] [blame] | 73 | void ChromeExtensionHostDelegate::CreateTab( |
| 74 | std::unique_ptr<content::WebContents> web_contents, |
| 75 | const std::string& extension_id, |
| 76 | WindowOpenDisposition disposition, |
| 77 | const gfx::Rect& initial_rect, |
| 78 | bool user_gesture) { |
dgn | 5e9c04bd | 2016-12-30 11:28:00 | [diff] [blame] | 79 | // Verify that the browser is not shutting down. It can be the case if the |
| 80 | // call is propagated through a posted task that was already in the queue when |
| 81 | // shutdown started. See crbug.com/625646 |
| 82 | if (g_browser_process->IsShuttingDown()) |
| 83 | return; |
| 84 | |
erikchen | 38fa402 | 2018-04-26 20:37:52 | [diff] [blame] | 85 | ExtensionTabUtil::CreateTab(std::move(web_contents), extension_id, |
| 86 | disposition, initial_rect, user_gesture); |
[email protected] | 6c0f179f | 2014-03-19 11:04:41 | [diff] [blame] | 87 | } |
| 88 | |
| 89 | void ChromeExtensionHostDelegate::ProcessMediaAccessRequest( |
| 90 | content::WebContents* web_contents, |
| 91 | const content::MediaStreamRequest& request, |
Mark Pilgrim | 5749908 | 2018-06-12 12:38:30 | [diff] [blame] | 92 | content::MediaResponseCallback callback, |
[email protected] | 6c0f179f | 2014-03-19 11:04:41 | [diff] [blame] | 93 | const Extension* extension) { |
| 94 | MediaCaptureDevicesDispatcher::GetInstance()->ProcessMediaAccessRequest( |
Mark Pilgrim | 5749908 | 2018-06-12 12:38:30 | [diff] [blame] | 95 | web_contents, request, std::move(callback), extension); |
[email protected] | 6c0f179f | 2014-03-19 11:04:41 | [diff] [blame] | 96 | } |
| 97 | |
grunell | 657d4d8 | 2014-09-18 00:09:43 | [diff] [blame] | 98 | bool ChromeExtensionHostDelegate::CheckMediaAccessPermission( |
Raymes Khoury | ad7c24a1 | 2018-03-05 23:22:58 | [diff] [blame] | 99 | content::RenderFrameHost* render_frame_host, |
grunell | 657d4d8 | 2014-09-18 00:09:43 | [diff] [blame] | 100 | const GURL& security_origin, |
Antonio Gomes | c8b734b | 2019-06-05 18:22:16 | [diff] [blame] | 101 | blink::mojom::MediaStreamType type, |
grunell | 657d4d8 | 2014-09-18 00:09:43 | [diff] [blame] | 102 | const Extension* extension) { |
| 103 | return MediaCaptureDevicesDispatcher::GetInstance() |
Raymes Khoury | ad7c24a1 | 2018-03-05 23:22:58 | [diff] [blame] | 104 | ->CheckMediaAccessPermission(render_frame_host, security_origin, type, |
| 105 | extension); |
grunell | 657d4d8 | 2014-09-18 00:09:43 | [diff] [blame] | 106 | } |
| 107 | |
yoz | d61dfe19 | 2015-02-21 01:30:37 | [diff] [blame] | 108 | ExtensionHostQueue* ChromeExtensionHostDelegate::GetExtensionHostQueue() const { |
kalman | d49594b5 | 2015-02-27 17:27:16 | [diff] [blame] | 109 | return g_queue.Get().queue.get(); |
yoz | d61dfe19 | 2015-02-21 01:30:37 | [diff] [blame] | 110 | } |
| 111 | |
Becca Hughes | 112832e | 2019-06-11 17:19:02 | [diff] [blame] | 112 | content::PictureInPictureResult |
| 113 | ChromeExtensionHostDelegate::EnterPictureInPicture( |
François Beaufort | 48cf272 | 2018-08-28 09:33:52 | [diff] [blame] | 114 | content::WebContents* web_contents, |
| 115 | const viz::SurfaceId& surface_id, |
| 116 | const gfx::Size& natural_size) { |
| 117 | return PictureInPictureWindowManager::GetInstance()->EnterPictureInPicture( |
| 118 | web_contents, surface_id, natural_size); |
| 119 | } |
| 120 | |
| 121 | void ChromeExtensionHostDelegate::ExitPictureInPicture() { |
| 122 | PictureInPictureWindowManager::GetInstance()->ExitPictureInPicture(); |
| 123 | } |
| 124 | |
[email protected] | 6c0f179f | 2014-03-19 11:04:41 | [diff] [blame] | 125 | } // namespace extensions |