| Index: chrome/browser/permissions/permission_manager.cc
|
| diff --git a/chrome/browser/permissions/permission_manager.cc b/chrome/browser/permissions/permission_manager.cc
|
| index 951966c92e750f67c3ad04e43e095a7529ae6967..0bb7a820571de9772b17828d1e19e880162f81fa 100644
|
| --- a/chrome/browser/permissions/permission_manager.cc
|
| +++ b/chrome/browser/permissions/permission_manager.cc
|
| @@ -7,23 +7,41 @@
|
| #include <stddef.h>
|
|
|
| #include "base/callback.h"
|
| +#include "base/memory/ptr_util.h"
|
| #include "build/build_config.h"
|
| +#include "chrome/browser/background_sync/background_sync_permission_context.h"
|
| #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
|
| -#include "chrome/browser/permissions/permission_context.h"
|
| +#include "chrome/browser/media/media_stream_device_permission_context.h"
|
| +#include "chrome/browser/media/midi_permission_context.h"
|
| +#include "chrome/browser/notifications/notification_permission_context.h"
|
| #include "chrome/browser/permissions/permission_context_base.h"
|
| +#include "chrome/browser/permissions/permission_manager_factory.h"
|
| #include "chrome/browser/permissions/permission_request_id.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/push_messaging/push_messaging_permission_context.h"
|
| +#include "chrome/browser/storage/durable_storage_permission_context.h"
|
| #include "chrome/browser/tab_contents/tab_util.h"
|
| +#include "chrome/common/features.h"
|
| #include "components/content_settings/core/browser/host_content_settings_map.h"
|
| #include "content/public/browser/permission_type.h"
|
| #include "content/public/browser/render_frame_host.h"
|
| #include "content/public/browser/render_process_host.h"
|
| #include "content/public/browser/web_contents.h"
|
|
|
| +#if defined(OS_ANDROID) || defined(OS_CHROMEOS)
|
| +#include "chrome/browser/media/protected_media_identifier_permission_context.h"
|
| +#endif
|
| +
|
| #if !defined(OS_ANDROID)
|
| #include "chrome/browser/ui/website_settings/permission_bubble_manager.h"
|
| #endif
|
|
|
| +#if BUILDFLAG(ANDROID_JAVA_UI)
|
| +#include "chrome/browser/geolocation/geolocation_permission_context_android.h"
|
| +#else
|
| +#include "chrome/browser/geolocation/geolocation_permission_context.h"
|
| +#endif
|
| +
|
| using blink::mojom::PermissionStatus;
|
| using content::PermissionType;
|
|
|
| @@ -99,7 +117,8 @@ ContentSettingsType PermissionTypeToContentSetting(PermissionType permission) {
|
| // Returns whether the permission has a constant PermissionStatus value (i.e.
|
| // always approved or always denied)
|
| // The PermissionTypes for which true is returned should be exactly those which
|
| -// return nullptr in PermissionContext::Get since they don't have a context.
|
| +// return nullptr in PermissionManager::GetPermissionContext since they don't
|
| +// have a context.
|
| bool IsConstantPermission(PermissionType type) {
|
| switch (type) {
|
| case PermissionType::MIDI:
|
| @@ -195,9 +214,43 @@ struct PermissionManager::Subscription {
|
| ContentSetting current_value;
|
| };
|
|
|
| +// static
|
| +PermissionManager* PermissionManager::Get(Profile* profile) {
|
| + return PermissionManagerFactory::GetForProfile(profile);
|
| +}
|
| +
|
| PermissionManager::PermissionManager(Profile* profile)
|
| : profile_(profile),
|
| weak_ptr_factory_(this) {
|
| + permission_contexts_[PermissionType::MIDI_SYSEX] =
|
| + base::WrapUnique(new MidiPermissionContext(profile));
|
| + permission_contexts_[PermissionType::PUSH_MESSAGING] =
|
| + base::WrapUnique(new PushMessagingPermissionContext(profile));
|
| + permission_contexts_[PermissionType::NOTIFICATIONS] =
|
| + base::WrapUnique(new NotificationPermissionContext(profile));
|
| +#if !BUILDFLAG(ANDROID_JAVA_UI)
|
| + permission_contexts_[PermissionType::GEOLOCATION] =
|
| + base::WrapUnique(new GeolocationPermissionContext(profile));
|
| +#else
|
| + permission_contexts_[PermissionType::GEOLOCATION] =
|
| + base::WrapUnique(new GeolocationPermissionContextAndroid(profile));
|
| +#endif
|
| +#if defined(OS_CHROMEOS) || defined(OS_ANDROID)
|
| + permission_contexts_[PermissionType::PROTECTED_MEDIA_IDENTIFIER] =
|
| + base::WrapUnique(new ProtectedMediaIdentifierPermissionContext(profile));
|
| +#endif
|
| + permission_contexts_[PermissionType::DURABLE_STORAGE] =
|
| + base::WrapUnique(new DurableStoragePermissionContext(profile));
|
| + permission_contexts_[PermissionType::AUDIO_CAPTURE] =
|
| + base::WrapUnique(new MediaStreamDevicePermissionContext(
|
| + profile, content::PermissionType::AUDIO_CAPTURE,
|
| + CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC));
|
| + permission_contexts_[PermissionType::VIDEO_CAPTURE] =
|
| + base::WrapUnique(new MediaStreamDevicePermissionContext(
|
| + profile, content::PermissionType::VIDEO_CAPTURE,
|
| + CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA));
|
| + permission_contexts_[PermissionType::BACKGROUND_SYNC] =
|
| + base::WrapUnique(new BackgroundSyncPermissionContext(profile));
|
| }
|
|
|
| PermissionManager::~PermissionManager() {
|
| @@ -244,14 +297,13 @@ int PermissionManager::RequestPermissions(
|
|
|
| if (IsConstantPermission(permission) ||
|
| IsPermissionBubbleManagerMissing(web_contents) ||
|
| - !PermissionContext::Get(profile_, permission)) {
|
| + !GetPermissionContext(permission)) {
|
| OnPermissionsRequestResponseStatus(request_id, i,
|
| GetPermissionStatus(permission, requesting_origin, embedding_origin));
|
| continue;
|
| }
|
|
|
| - PermissionContextBase* context = PermissionContext::Get(
|
| - profile_, permission);
|
| + PermissionContextBase* context = GetPermissionContext(permission);
|
| context->RequestPermission(
|
| web_contents, request, requesting_origin,
|
| base::Bind(&ContentSettingToPermissionStatusCallbackWrapper,
|
| @@ -266,6 +318,17 @@ int PermissionManager::RequestPermissions(
|
| return request_id;
|
| }
|
|
|
| +std::size_t PermissionManager::PermissionTypeHash::operator()(
|
| + const content::PermissionType& type) const {
|
| + return static_cast<size_t>(type);
|
| +}
|
| +
|
| +PermissionContextBase* PermissionManager::GetPermissionContext(
|
| + PermissionType type) {
|
| + const auto& it = permission_contexts_.find(type);
|
| + return it == permission_contexts_.end() ? nullptr : it->second.get();
|
| +}
|
| +
|
| void PermissionManager::OnPermissionsRequestResponseStatus(
|
| int request_id,
|
| int permission_id,
|
| @@ -297,8 +360,7 @@ void PermissionManager::CancelPermissionRequest(int request_id) {
|
| pending_request->render_frame_id(),
|
| request_id);
|
| for (PermissionType permission : pending_request->permissions()) {
|
| - PermissionContextBase* context = PermissionContext::Get(
|
| - profile_, permission);
|
| + PermissionContextBase* context = GetPermissionContext(permission);
|
| if (!context)
|
| continue;
|
| context->CancelPermissionRequest(web_contents, request);
|
| @@ -309,7 +371,7 @@ void PermissionManager::CancelPermissionRequest(int request_id) {
|
| void PermissionManager::ResetPermission(PermissionType permission,
|
| const GURL& requesting_origin,
|
| const GURL& embedding_origin) {
|
| - PermissionContextBase* context = PermissionContext::Get(profile_, permission);
|
| + PermissionContextBase* context = GetPermissionContext(permission);
|
| if (!context)
|
| return;
|
|
|
| @@ -324,7 +386,7 @@ PermissionStatus PermissionManager::GetPermissionStatus(
|
| if (IsConstantPermission(permission))
|
| return GetPermissionStatusForConstantPermission(permission);
|
|
|
| - PermissionContextBase* context = PermissionContext::Get(profile_, permission);
|
| + PermissionContextBase* context = GetPermissionContext(permission);
|
| if (!context)
|
| return PermissionStatus::DENIED;
|
|
|
| @@ -364,9 +426,10 @@ int PermissionManager::SubscribePermissionStatusChange(
|
| subscription->current_value = GetContentSettingForConstantPermission(
|
| permission);
|
| } else {
|
| - subscription->current_value = PermissionContext::Get(profile_, permission)
|
| - ->GetPermissionStatus(subscription->requesting_origin,
|
| - subscription->embedding_origin);
|
| + subscription->current_value =
|
| + GetPermissionContext(permission)
|
| + ->GetPermissionStatus(subscription->requesting_origin,
|
| + subscription->embedding_origin);
|
| }
|
|
|
| return subscriptions_.Add(subscription);
|
| @@ -411,7 +474,7 @@ void PermissionManager::OnContentSettingChanged(
|
| continue;
|
|
|
| ContentSetting new_value =
|
| - PermissionContext::Get(profile_, subscription->permission)
|
| + GetPermissionContext(subscription->permission)
|
| ->GetPermissionStatus(subscription->requesting_origin,
|
| subscription->embedding_origin);
|
| if (subscription->current_value == new_value)
|
|
|