blob: ee85f5cb4d9440fc59c7c1ef7548ceedb915e4a6 [file] [log] [blame]
[email protected]6c0f179f2014-03-19 11:04:411// 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
kundaji0a0662302016-09-26 23:50:227#include <memory>
8#include <string>
9
yozd61dfe192015-02-21 01:30:3710#include "base/lazy_instance.h"
Becca Hughesae7e6672018-11-30 22:27:4511#include "chrome/browser/apps/platform_apps/audio_focus_web_contents_observer.h"
dgn5e9c04bd2016-12-30 11:28:0012#include "chrome/browser/browser_process.h"
[email protected]13e062e2014-08-09 10:21:5513#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
[email protected]6c0f179f2014-03-19 11:04:4114#include "chrome/browser/extensions/extension_service.h"
15#include "chrome/browser/extensions/extension_tab_util.h"
mcasasa2023ab2016-09-08 01:06:3616#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
Sigurdur Asgeirssonb59e66ee2019-02-27 13:59:2517#include "chrome/browser/performance_manager/performance_manager_tab_helper.h"
Sigurdur Asgeirsson779bd062019-09-11 14:40:4918#include "chrome/browser/performance_manager/public/performance_manager.h"
François Beaufort48cf2722018-08-28 09:33:5219#include "chrome/browser/picture_in_picture/picture_in_picture_window_manager.h"
[email protected]6c0f179f2014-03-19 11:04:4120#include "chrome/browser/ui/prefs/prefs_tab_helper.h"
oshimaf65398422014-11-18 23:30:4221#include "components/app_modal/javascript_dialog_manager.h"
[email protected]22401dc2014-03-21 01:38:5722#include "extensions/browser/extension_host.h"
[email protected]6c0f179f2014-03-19 11:04:4123#include "extensions/browser/extension_system.h"
kalmand49594b52015-02-27 17:27:1624#include "extensions/browser/load_monitoring_extension_host_queue.h"
yozd61dfe192015-02-21 01:30:3725#include "extensions/browser/serial_extension_host_queue.h"
[email protected]6c0f179f2014-03-19 11:04:4126
27namespace extensions {
28
kalmand49594b52015-02-27 17:27:1629namespace {
30
31// Singleton for GetExtensionHostQueue().
32struct QueueWrapper {
33 QueueWrapper() {
34 queue.reset(new LoadMonitoringExtensionHostQueue(
dchengc963c7142016-04-08 03:55:2235 std::unique_ptr<ExtensionHostQueue>(new SerialExtensionHostQueue())));
kalmand49594b52015-02-27 17:27:1636 }
dchengc963c7142016-04-08 03:55:2237 std::unique_ptr<ExtensionHostQueue> queue;
kalmand49594b52015-02-27 17:27:1638};
scottmg5e65e3a2017-03-08 08:48:4639base::LazyInstance<QueueWrapper>::DestructorAtExit g_queue =
40 LAZY_INSTANCE_INITIALIZER;
kalmand49594b52015-02-27 17:27:1641
42} // namespace
43
[email protected]6c0f179f2014-03-19 11:04:4144ChromeExtensionHostDelegate::ChromeExtensionHostDelegate() {}
45
46ChromeExtensionHostDelegate::~ChromeExtensionHostDelegate() {}
47
48void ChromeExtensionHostDelegate::OnExtensionHostCreated(
49 content::WebContents* web_contents) {
[email protected]1ce15972014-03-20 19:25:4850 ChromeExtensionWebContentsObserver::CreateForWebContents(web_contents);
[email protected]6c0f179f2014-03-19 11:04:4151 PrefsTabHelper::CreateForWebContents(web_contents);
Becca Hughesae7e6672018-11-30 22:27:4552 apps::AudioFocusWebContentsObserver::CreateForWebContents(web_contents);
Sigurdur Asgeirsson53806eb32019-03-14 13:00:5153
Chris Hamiltonda276020f72019-07-29 21:11:4054 if (performance_manager::PerformanceManager::IsAvailable()) {
Sigurdur Asgeirsson53806eb32019-03-14 13:00:5155 performance_manager::PerformanceManagerTabHelper::CreateForWebContents(
56 web_contents);
57 }
[email protected]6c0f179f2014-03-19 11:04:4158}
59
60void 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
68content::JavaScriptDialogManager*
69ChromeExtensionHostDelegate::GetJavaScriptDialogManager() {
oshima0929be2a2014-11-19 22:21:0370 return app_modal::JavaScriptDialogManager::GetInstance();
[email protected]6c0f179f2014-03-19 11:04:4171}
72
erikchen38fa4022018-04-26 20:37:5273void 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) {
dgn5e9c04bd2016-12-30 11:28:0079 // 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
erikchen38fa4022018-04-26 20:37:5285 ExtensionTabUtil::CreateTab(std::move(web_contents), extension_id,
86 disposition, initial_rect, user_gesture);
[email protected]6c0f179f2014-03-19 11:04:4187}
88
89void ChromeExtensionHostDelegate::ProcessMediaAccessRequest(
90 content::WebContents* web_contents,
91 const content::MediaStreamRequest& request,
Mark Pilgrim57499082018-06-12 12:38:3092 content::MediaResponseCallback callback,
[email protected]6c0f179f2014-03-19 11:04:4193 const Extension* extension) {
94 MediaCaptureDevicesDispatcher::GetInstance()->ProcessMediaAccessRequest(
Mark Pilgrim57499082018-06-12 12:38:3095 web_contents, request, std::move(callback), extension);
[email protected]6c0f179f2014-03-19 11:04:4196}
97
grunell657d4d82014-09-18 00:09:4398bool ChromeExtensionHostDelegate::CheckMediaAccessPermission(
Raymes Khouryad7c24a12018-03-05 23:22:5899 content::RenderFrameHost* render_frame_host,
grunell657d4d82014-09-18 00:09:43100 const GURL& security_origin,
Antonio Gomesc8b734b2019-06-05 18:22:16101 blink::mojom::MediaStreamType type,
grunell657d4d82014-09-18 00:09:43102 const Extension* extension) {
103 return MediaCaptureDevicesDispatcher::GetInstance()
Raymes Khouryad7c24a12018-03-05 23:22:58104 ->CheckMediaAccessPermission(render_frame_host, security_origin, type,
105 extension);
grunell657d4d82014-09-18 00:09:43106}
107
yozd61dfe192015-02-21 01:30:37108ExtensionHostQueue* ChromeExtensionHostDelegate::GetExtensionHostQueue() const {
kalmand49594b52015-02-27 17:27:16109 return g_queue.Get().queue.get();
yozd61dfe192015-02-21 01:30:37110}
111
Becca Hughes112832e2019-06-11 17:19:02112content::PictureInPictureResult
113ChromeExtensionHostDelegate::EnterPictureInPicture(
François Beaufort48cf2722018-08-28 09:33:52114 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
121void ChromeExtensionHostDelegate::ExitPictureInPicture() {
122 PictureInPictureWindowManager::GetInstance()->ExitPictureInPicture();
123}
124
[email protected]6c0f179f2014-03-19 11:04:41125} // namespace extensions