Index: chrome/browser/media/permission_bubble_media_access_handler.cc |
diff --git a/chrome/browser/media/permission_bubble_media_access_handler.cc b/chrome/browser/media/permission_bubble_media_access_handler.cc |
deleted file mode 100644 |
index 4d2f7019f85d78f77070cf0875755cd086c66147..0000000000000000000000000000000000000000 |
--- a/chrome/browser/media/permission_bubble_media_access_handler.cc |
+++ /dev/null |
@@ -1,244 +0,0 @@ |
-// Copyright 2015 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/media/permission_bubble_media_access_handler.h" |
- |
-#include <utility> |
- |
-#include "base/metrics/field_trial.h" |
-#include "chrome/browser/media/media_permission.h" |
-#include "chrome/browser/media/media_stream_device_permissions.h" |
-#include "chrome/browser/media/media_stream_devices_controller.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/common/features.h" |
-#include "chrome/common/pref_names.h" |
-#include "components/content_settings/core/browser/host_content_settings_map.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "content/public/browser/notification_service.h" |
-#include "content/public/browser/notification_types.h" |
-#include "content/public/browser/web_contents.h" |
- |
-#if BUILDFLAG(ANDROID_JAVA_UI) |
-#include <vector> |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "chrome/browser/media/media_stream_infobar_delegate_android.h" |
-#include "chrome/browser/permissions/permission_update_infobar_delegate_android.h" |
-#else |
-#include "chrome/browser/permissions/permission_request_manager.h" |
-#endif // BUILDFLAG(ANDROID_JAVA_UI) |
- |
-#if BUILDFLAG(ANDROID_JAVA_UI) |
-namespace { |
-// Callback for the permission update infobar when the site and Chrome |
-// permissions are mismatched on Android. |
-void OnPermissionConflictResolved( |
- std::unique_ptr<MediaStreamDevicesController> controller, |
- bool allowed) { |
- if (allowed) |
- controller->PermissionGranted(); |
- else |
- controller->ForcePermissionDeniedTemporarily(); |
-} |
-} // namespace |
- |
-#endif // BUILDFLAG(ANDROID_JAVA_UI) |
- |
-using content::BrowserThread; |
- |
-struct PermissionBubbleMediaAccessHandler::PendingAccessRequest { |
- PendingAccessRequest(const content::MediaStreamRequest& request, |
- const content::MediaResponseCallback& callback) |
- : request(request), callback(callback) {} |
- ~PendingAccessRequest() {} |
- |
- // TODO(gbillock): make the MediaStreamDevicesController owned by |
- // this object when we're using bubbles. |
- content::MediaStreamRequest request; |
- content::MediaResponseCallback callback; |
-}; |
- |
-PermissionBubbleMediaAccessHandler::PermissionBubbleMediaAccessHandler() { |
- // PermissionBubbleMediaAccessHandler should be created on UI thread. |
- // Otherwise, it will not receive |
- // content::NOTIFICATION_WEB_CONTENTS_DESTROYED, and that will result in |
- // possible use after free. |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- notifications_registrar_.Add(this, |
- content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
- content::NotificationService::AllSources()); |
-} |
- |
-PermissionBubbleMediaAccessHandler::~PermissionBubbleMediaAccessHandler() { |
-} |
- |
-bool PermissionBubbleMediaAccessHandler::SupportsStreamType( |
- const content::MediaStreamType type, |
- const extensions::Extension* extension) { |
- return type == content::MEDIA_DEVICE_VIDEO_CAPTURE || |
- type == content::MEDIA_DEVICE_AUDIO_CAPTURE; |
-} |
- |
-bool PermissionBubbleMediaAccessHandler::CheckMediaAccessPermission( |
- content::WebContents* web_contents, |
- const GURL& security_origin, |
- content::MediaStreamType type, |
- const extensions::Extension* extension) { |
- Profile* profile = |
- Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
- ContentSettingsType content_settings_type = |
- type == content::MEDIA_DEVICE_AUDIO_CAPTURE |
- ? CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC |
- : CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA; |
- |
- MediaPermission permission(content_settings_type, security_origin, |
- web_contents->GetLastCommittedURL().GetOrigin(), profile); |
- content::MediaStreamRequestResult unused; |
- return permission.GetPermissionStatus(&unused) == CONTENT_SETTING_ALLOW; |
-} |
- |
-void PermissionBubbleMediaAccessHandler::HandleRequest( |
- content::WebContents* web_contents, |
- const content::MediaStreamRequest& request, |
- const content::MediaResponseCallback& callback, |
- const extensions::Extension* extension) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- |
- RequestsQueue& queue = pending_requests_[web_contents]; |
- queue.push_back(PendingAccessRequest(request, callback)); |
- |
- // If this is the only request then show the infobar. |
- if (queue.size() == 1) |
- ProcessQueuedAccessRequest(web_contents); |
-} |
- |
-void PermissionBubbleMediaAccessHandler::ProcessQueuedAccessRequest( |
- content::WebContents* web_contents) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- |
- std::map<content::WebContents*, RequestsQueue>::iterator it = |
- pending_requests_.find(web_contents); |
- |
- if (it == pending_requests_.end() || it->second.empty()) { |
- // Don't do anything if the tab was closed. |
- return; |
- } |
- |
- DCHECK(!it->second.empty()); |
- |
- std::unique_ptr<MediaStreamDevicesController> controller( |
- new MediaStreamDevicesController( |
- web_contents, it->second.front().request, |
- base::Bind( |
- &PermissionBubbleMediaAccessHandler::OnAccessRequestResponse, |
- base::Unretained(this), web_contents))); |
- if (!controller->IsAskingForAudio() && !controller->IsAskingForVideo()) { |
-#if BUILDFLAG(ANDROID_JAVA_UI) |
- // If either audio or video was previously allowed and Chrome no longer has |
- // the necessary permissions, show a infobar to attempt to address this |
- // mismatch. |
- std::vector<ContentSettingsType> content_settings_types; |
- if (controller->IsAllowedForAudio()) |
- content_settings_types.push_back(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC); |
- |
- if (controller->IsAllowedForVideo()) { |
- content_settings_types.push_back( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA); |
- } |
- if (!content_settings_types.empty() && |
- PermissionUpdateInfoBarDelegate::ShouldShowPermissionInfobar( |
- web_contents, content_settings_types)) { |
- PermissionUpdateInfoBarDelegate::Create( |
- web_contents, content_settings_types, |
- base::Bind( |
- &OnPermissionConflictResolved, base::Passed(&controller))); |
- } |
-#endif |
- return; |
- } |
- |
-#if BUILDFLAG(ANDROID_JAVA_UI) |
- MediaStreamInfoBarDelegateAndroid::Create(web_contents, |
- std::move(controller)); |
-#else |
- PermissionRequestManager* permission_request_manager = |
- PermissionRequestManager::FromWebContents(web_contents); |
- if (permission_request_manager) |
- permission_request_manager->AddRequest(controller.release()); |
-#endif |
-} |
- |
-void PermissionBubbleMediaAccessHandler::UpdateMediaRequestState( |
- int render_process_id, |
- int render_frame_id, |
- int page_request_id, |
- content::MediaStreamType stream_type, |
- content::MediaRequestState state) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- if (state != content::MEDIA_REQUEST_STATE_CLOSING) |
- return; |
- |
- bool found = false; |
- for (RequestsQueues::iterator rqs_it = pending_requests_.begin(); |
- rqs_it != pending_requests_.end(); ++rqs_it) { |
- RequestsQueue& queue = rqs_it->second; |
- for (RequestsQueue::iterator it = queue.begin(); it != queue.end(); ++it) { |
- if (it->request.render_process_id == render_process_id && |
- it->request.render_frame_id == render_frame_id && |
- it->request.page_request_id == page_request_id) { |
- queue.erase(it); |
- found = true; |
- break; |
- } |
- } |
- if (found) |
- break; |
- } |
-} |
- |
-void PermissionBubbleMediaAccessHandler::OnAccessRequestResponse( |
- content::WebContents* web_contents, |
- const content::MediaStreamDevices& devices, |
- content::MediaStreamRequestResult result, |
- std::unique_ptr<content::MediaStreamUI> ui) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- |
- std::map<content::WebContents*, RequestsQueue>::iterator it = |
- pending_requests_.find(web_contents); |
- if (it == pending_requests_.end()) { |
- // WebContents has been destroyed. Don't need to do anything. |
- return; |
- } |
- |
- RequestsQueue& queue(it->second); |
- if (queue.empty()) |
- return; |
- |
- content::MediaResponseCallback callback = queue.front().callback; |
- queue.pop_front(); |
- |
- if (!queue.empty()) { |
- // Post a task to process next queued request. It has to be done |
- // asynchronously to make sure that calling infobar is not destroyed until |
- // after this function returns. |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind( |
- &PermissionBubbleMediaAccessHandler::ProcessQueuedAccessRequest, |
- base::Unretained(this), web_contents)); |
- } |
- |
- callback.Run(devices, result, std::move(ui)); |
-} |
- |
-void PermissionBubbleMediaAccessHandler::Observe( |
- int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- DCHECK_EQ(content::NOTIFICATION_WEB_CONTENTS_DESTROYED, type); |
- |
- pending_requests_.erase(content::Source<content::WebContents>(source).ptr()); |
-} |