blob: 84074108768cab6014c5328c2d180cef8e4bc26e [file] [log] [blame]
// 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/permissions/permission_manager_factory.h"
#include "build/build_config.h"
#include "chrome/browser/accessibility/accessibility_permission_context.h"
#include "chrome/browser/background_fetch/background_fetch_permission_context.h"
#include "chrome/browser/background_sync/periodic_background_sync_permission_context.h"
#include "chrome/browser/clipboard/clipboard_read_write_permission_context.h"
#include "chrome/browser/clipboard/clipboard_sanitized_write_permission_context.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/generic_sensor/sensor_permission_context.h"
#include "chrome/browser/idle/idle_detection_permission_context.h"
#include "chrome/browser/media/midi_permission_context.h"
#include "chrome/browser/media/midi_sysex_permission_context.h"
#include "chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h"
#include "chrome/browser/media/webrtc/media_stream_device_permission_context.h"
#include "chrome/browser/notifications/notification_permission_context.h"
#include "chrome/browser/profiles/incognito_helpers.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search_engines/ui_thread_search_terms_data.h"
#include "chrome/browser/storage/durable_storage_permission_context.h"
#include "chrome/browser/storage_access_api/storage_access_grant_permission_context.h"
#include "chrome/browser/tab_contents/tab_util.h"
#include "chrome/browser/wake_lock/wake_lock_permission_context.h"
#include "chrome/browser/window_placement/window_placement_permission_context.h"
#include "chrome/common/buildflags.h"
#include "chrome/common/url_constants.h"
#include "chrome/common/webui_url_constants.h"
#include "components/background_sync/background_sync_permission_context.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "components/permissions/contexts/font_access_permission_context.h"
#include "components/permissions/contexts/payment_handler_permission_context.h"
#include "components/permissions/contexts/webxr_permission_context.h"
#include "components/permissions/permission_manager.h"
#include "ppapi/buildflags/buildflags.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/geolocation/geolocation_permission_context_delegate_android.h"
#include "chrome/browser/nfc/nfc_permission_context_android.h"
#include "components/permissions/contexts/geolocation_permission_context_android.h"
#else
#include "chrome/browser/geolocation/geolocation_permission_context_delegate.h"
#include "chrome/browser/nfc/nfc_permission_context.h"
#include "components/permissions/contexts/geolocation_permission_context.h"
#endif
namespace {
permissions::PermissionManager::PermissionContextMap CreatePermissionContexts(
Profile* profile) {
permissions::PermissionManager::PermissionContextMap permission_contexts;
permission_contexts[ContentSettingsType::MIDI_SYSEX] =
std::make_unique<MidiSysexPermissionContext>(profile);
permission_contexts[ContentSettingsType::MIDI] =
std::make_unique<MidiPermissionContext>(profile);
permission_contexts[ContentSettingsType::NOTIFICATIONS] =
std::make_unique<NotificationPermissionContext>(profile);
#if !defined(OS_ANDROID)
permission_contexts[ContentSettingsType::GEOLOCATION] =
std::make_unique<permissions::GeolocationPermissionContext>(
profile,
std::make_unique<GeolocationPermissionContextDelegate>(profile));
#else
permission_contexts[ContentSettingsType::GEOLOCATION] =
std::make_unique<permissions::GeolocationPermissionContextAndroid>(
profile,
std::make_unique<GeolocationPermissionContextDelegateAndroid>(
profile));
#endif
#if defined(OS_CHROMEOS) || defined(OS_ANDROID)
permission_contexts[ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER] =
std::make_unique<ProtectedMediaIdentifierPermissionContext>(profile);
#endif
permission_contexts[ContentSettingsType::DURABLE_STORAGE] =
std::make_unique<DurableStoragePermissionContext>(profile);
permission_contexts[ContentSettingsType::MEDIASTREAM_MIC] =
std::make_unique<MediaStreamDevicePermissionContext>(
profile, ContentSettingsType::MEDIASTREAM_MIC);
permission_contexts[ContentSettingsType::MEDIASTREAM_CAMERA] =
std::make_unique<MediaStreamDevicePermissionContext>(
profile, ContentSettingsType::MEDIASTREAM_CAMERA);
permission_contexts[ContentSettingsType::BACKGROUND_SYNC] =
std::make_unique<BackgroundSyncPermissionContext>(profile);
permission_contexts[ContentSettingsType::SENSORS] =
std::make_unique<SensorPermissionContext>(profile);
permission_contexts[ContentSettingsType::ACCESSIBILITY_EVENTS] =
std::make_unique<AccessibilityPermissionContext>(profile);
permission_contexts[ContentSettingsType::CLIPBOARD_READ_WRITE] =
std::make_unique<ClipboardReadWritePermissionContext>(profile);
permission_contexts[ContentSettingsType::CLIPBOARD_SANITIZED_WRITE] =
std::make_unique<ClipboardSanitizedWritePermissionContext>(profile);
permission_contexts[ContentSettingsType::PAYMENT_HANDLER] =
std::make_unique<payments::PaymentHandlerPermissionContext>(profile);
permission_contexts[ContentSettingsType::BACKGROUND_FETCH] =
std::make_unique<BackgroundFetchPermissionContext>(profile);
permission_contexts[ContentSettingsType::IDLE_DETECTION] =
std::make_unique<IdleDetectionPermissionContext>(profile);
permission_contexts[ContentSettingsType::PERIODIC_BACKGROUND_SYNC] =
std::make_unique<PeriodicBackgroundSyncPermissionContext>(profile);
permission_contexts[ContentSettingsType::WAKE_LOCK_SCREEN] =
std::make_unique<WakeLockPermissionContext>(
profile, ContentSettingsType::WAKE_LOCK_SCREEN);
permission_contexts[ContentSettingsType::WAKE_LOCK_SYSTEM] =
std::make_unique<WakeLockPermissionContext>(
profile, ContentSettingsType::WAKE_LOCK_SYSTEM);
#if !defined(OS_ANDROID)
permission_contexts[ContentSettingsType::NFC] =
std::make_unique<NfcPermissionContext>(profile);
#else
permission_contexts[ContentSettingsType::NFC] =
std::make_unique<NfcPermissionContextAndroid>(profile);
#endif
permission_contexts[ContentSettingsType::VR] =
std::make_unique<permissions::WebXrPermissionContext>(
profile, ContentSettingsType::VR);
permission_contexts[ContentSettingsType::AR] =
std::make_unique<permissions::WebXrPermissionContext>(
profile, ContentSettingsType::AR);
permission_contexts[ContentSettingsType::STORAGE_ACCESS] =
std::make_unique<StorageAccessGrantPermissionContext>(profile);
permission_contexts[ContentSettingsType::CAMERA_PAN_TILT_ZOOM] =
std::make_unique<CameraPanTiltZoomPermissionContext>(profile);
permission_contexts[ContentSettingsType::WINDOW_PLACEMENT] =
std::make_unique<WindowPlacementPermissionContext>(profile);
permission_contexts[ContentSettingsType::FONT_ACCESS] =
std::make_unique<FontAccessPermissionContext>(profile);
return permission_contexts;
}
} // namespace
// static
permissions::PermissionManager* PermissionManagerFactory::GetForProfile(
Profile* profile) {
return static_cast<permissions::PermissionManager*>(
GetInstance()->GetServiceForBrowserContext(profile, true));
}
// static
PermissionManagerFactory* PermissionManagerFactory::GetInstance() {
return base::Singleton<PermissionManagerFactory>::get();
}
PermissionManagerFactory::PermissionManagerFactory()
: BrowserContextKeyedServiceFactory(
"PermissionManagerFactory",
BrowserContextDependencyManager::GetInstance()) {
DependsOn(HostContentSettingsMapFactory::GetInstance());
}
PermissionManagerFactory::~PermissionManagerFactory() {
}
KeyedService* PermissionManagerFactory::BuildServiceInstanceFor(
content::BrowserContext* context) const {
Profile* profile = Profile::FromBrowserContext(context);
return new permissions::PermissionManager(profile,
CreatePermissionContexts(profile));
}
content::BrowserContext*
PermissionManagerFactory::GetBrowserContextToUse(
content::BrowserContext* context) const {
return chrome::GetBrowserContextOwnInstanceInIncognito(context);
}