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) |