diff options
Diffstat (limited to 'src/core/permission_manager_qt.cpp')
-rw-r--r-- | src/core/permission_manager_qt.cpp | 458 |
1 files changed, 322 insertions, 136 deletions
diff --git a/src/core/permission_manager_qt.cpp b/src/core/permission_manager_qt.cpp index 9d98c0592..95f79bb11 100644 --- a/src/core/permission_manager_qt.cpp +++ b/src/core/permission_manager_qt.cpp @@ -3,38 +3,55 @@ #include "permission_manager_qt.h" +#include "base/threading/thread_restrictions.h" #include "content/browser/renderer_host/render_view_host_delegate.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/permission_controller.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_view_host.h" #include "third_party/blink/public/common/permissions/permission_utils.h" - +#include "chrome/browser/prefs/chrome_command_line_pref_store.h" +#include "components/prefs/pref_member.h" +#include "components/prefs/in_memory_pref_store.h" +#include "components/prefs/json_pref_store.h" +#include "components/prefs/pref_service.h" +#include "components/prefs/pref_service_factory.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/scoped_user_pref_update.h" +#include "components/proxy_config/pref_proxy_config_tracker_impl.h" +#include "components/prefs/pref_service.h" + +#include <QtWebEngineCore/private/qwebenginepermission_p.h> #include "type_conversion.h" #include "web_contents_delegate_qt.h" #include "web_engine_settings.h" namespace QtWebEngineCore { -static ProfileAdapter::PermissionType toQt(blink::PermissionType type) +static QWebEnginePermission::Feature toQt(blink::PermissionType type) { switch (type) { case blink::PermissionType::GEOLOCATION: - return ProfileAdapter::GeolocationPermission; + return QWebEnginePermission::Geolocation; case blink::PermissionType::AUDIO_CAPTURE: - return ProfileAdapter::AudioCapturePermission; + return QWebEnginePermission::MediaAudioCapture; case blink::PermissionType::VIDEO_CAPTURE: - return ProfileAdapter::VideoCapturePermission; + return QWebEnginePermission::MediaVideoCapture; + case blink::PermissionType::DISPLAY_CAPTURE: + return QWebEnginePermission::DesktopAudioVideoCapture; + // We treat these both as read/write since we do not currently have a + // ClipboardSanitizedWrite feature. case blink::PermissionType::CLIPBOARD_READ_WRITE: - return ProfileAdapter::ClipboardRead; case blink::PermissionType::CLIPBOARD_SANITIZED_WRITE: - return ProfileAdapter::ClipboardWrite; + return QWebEnginePermission::ClipboardReadWrite; case blink::PermissionType::NOTIFICATIONS: - return ProfileAdapter::NotificationPermission; + return QWebEnginePermission::Notifications; + case blink::PermissionType::LOCAL_FONTS: + return QWebEnginePermission::LocalFontsAccess; case blink::PermissionType::ACCESSIBILITY_EVENTS: case blink::PermissionType::CAMERA_PAN_TILT_ZOOM: - case blink::PermissionType::WINDOW_PLACEMENT: - return ProfileAdapter::UnsupportedPermission; + case blink::PermissionType::WINDOW_MANAGEMENT: + return QWebEnginePermission::Unsupported; case blink::PermissionType::MIDI_SYSEX: case blink::PermissionType::PROTECTED_MEDIA_IDENTIFIER: case blink::PermissionType::MIDI: @@ -51,77 +68,190 @@ static ProfileAdapter::PermissionType toQt(blink::PermissionType type) case blink::PermissionType::AR: case blink::PermissionType::VR: case blink::PermissionType::STORAGE_ACCESS_GRANT: - case blink::PermissionType::LOCAL_FONTS: - case blink::PermissionType::DISPLAY_CAPTURE: + case blink::PermissionType::TOP_LEVEL_STORAGE_ACCESS: + case blink::PermissionType::CAPTURED_SURFACE_CONTROL: + case blink::PermissionType::SMART_CARD: + case blink::PermissionType::WEB_PRINTING: case blink::PermissionType::NUM: - LOG(INFO) << "Unexpected unsupported permission type: " << static_cast<int>(type); + LOG(INFO) << "Unexpected unsupported Blink permission type: " << static_cast<int>(type); break; } - return ProfileAdapter::UnsupportedPermission; + return QWebEnginePermission::Unsupported; } -static bool canRequestPermissionFor(ProfileAdapter::PermissionType type) +static blink::PermissionType toBlink(QWebEnginePermission::Feature feature) { - switch (type) { - case ProfileAdapter::GeolocationPermission: - case ProfileAdapter::NotificationPermission: - return true; - default: - break; + switch (feature) { + case QWebEnginePermission::Notifications: + return blink::PermissionType::NOTIFICATIONS; + case QWebEnginePermission::Geolocation: + return blink::PermissionType::GEOLOCATION; + case QWebEnginePermission::MediaAudioCapture: + return blink::PermissionType::AUDIO_CAPTURE; + case QWebEnginePermission::MediaVideoCapture: + return blink::PermissionType::VIDEO_CAPTURE; + case QWebEnginePermission::DesktopVideoCapture: + case QWebEnginePermission::DesktopAudioVideoCapture: + return blink::PermissionType::DISPLAY_CAPTURE; + case QWebEnginePermission::ClipboardReadWrite: + return blink::PermissionType::CLIPBOARD_READ_WRITE; + case QWebEnginePermission::LocalFontsAccess: + return blink::PermissionType::LOCAL_FONTS; + case QWebEnginePermission::MediaAudioVideoCapture: + case QWebEnginePermission::Unsupported: + LOG(INFO) << "Unexpected unsupported WebEngine permission type: " << static_cast<int>(feature); + return blink::PermissionType::NUM; } - return false; + + Q_UNREACHABLE(); } -static blink::mojom::PermissionStatus toBlink(ProfileAdapter::PermissionState reply) +static QWebEnginePermission::State toQt(blink::mojom::PermissionStatus state) { - switch (reply) { - case ProfileAdapter::AskPermission: + switch (state) { + case blink::mojom::PermissionStatus::ASK: + return QWebEnginePermission::Ask; + case blink::mojom::PermissionStatus::GRANTED: + return QWebEnginePermission::Granted; + case blink::mojom::PermissionStatus::DENIED: + return QWebEnginePermission::Denied; + } +} + +static blink::mojom::PermissionStatus toBlink(QWebEnginePermission::State state) +{ + switch (state) { + case QWebEnginePermission::Invalid: + case QWebEnginePermission::Ask: return blink::mojom::PermissionStatus::ASK; - case ProfileAdapter::AllowedPermission: + case QWebEnginePermission::Granted: return blink::mojom::PermissionStatus::GRANTED; - case ProfileAdapter::DeniedPermission: + case QWebEnginePermission::Denied: return blink::mojom::PermissionStatus::DENIED; } } -PermissionManagerQt::PermissionManagerQt() +std::string featureString(QWebEnginePermission::Feature feature) +{ + // This is separate from blink::featureString() for the sake of future-proofing; + // e.g. in case we add extra Features that do not correspond to a PermissionType, and + // we need to store them. + switch (feature) { + case QWebEnginePermission::Notifications: + return "Notifications"; + case QWebEnginePermission::Geolocation: + return "Geolocation"; + case QWebEnginePermission::ClipboardReadWrite: + return "ClipboardReadWrite"; + case QWebEnginePermission::LocalFontsAccess: + return "LocalFontsAccess"; + case QWebEnginePermission::MediaAudioCapture: + return "MediaAudioCapture"; + case QWebEnginePermission::MediaVideoCapture: + return "MediaVideoCapture"; + case QWebEnginePermission::DesktopAudioVideoCapture: + return "DesktopAudioVideoCapture"; + default: + Q_UNREACHABLE(); + return nullptr; + } +} + +static blink::mojom::PermissionStatus getStatusFromSettings(blink::PermissionType type, WebEngineSettings *settings) +{ + switch (type) { + case blink::PermissionType::CLIPBOARD_READ_WRITE: + case blink::PermissionType::CLIPBOARD_SANITIZED_WRITE: + if (settings->testAttribute(QWebEngineSettings::JavascriptCanPaste) + && settings->testAttribute(QWebEngineSettings::JavascriptCanAccessClipboard)) + return blink::mojom::PermissionStatus::GRANTED; + return blink::mojom::PermissionStatus::ASK; + default: + return blink::mojom::PermissionStatus::ASK; + } +} + +PermissionManagerQt::PermissionManagerQt(ProfileAdapter *profileAdapter) : m_requestIdCount(0) + , m_persistence(true) + , m_profileAdapter(profileAdapter) { + PrefServiceFactory factory; + factory.set_async(false); + factory.set_command_line_prefs(base::MakeRefCounted<ChromeCommandLinePrefStore>( + base::CommandLine::ForCurrentProcess())); + + QString userPrefStorePath = profileAdapter->dataPath(); + auto prefRegistry = base::MakeRefCounted<PrefRegistrySimple>(); + + auto policy = profileAdapter->persistentPermissionsPolicy(); + if (!profileAdapter->isOffTheRecord() && policy == ProfileAdapter::PersistentPermissionsOnDisk && + !userPrefStorePath.isEmpty() && profileAdapter->ensureDataPathExists()) { + userPrefStorePath += QDir::separator(); + userPrefStorePath += QStringLiteral("permissions.json"); + factory.set_user_prefs(base::MakeRefCounted<JsonPrefStore>(toFilePath(userPrefStorePath))); + } else { + factory.set_user_prefs(new InMemoryPrefStore); + } + + m_featureTypes.push_back(QWebEnginePermission::Notifications); + m_featureTypes.push_back(QWebEnginePermission::Geolocation); + m_featureTypes.push_back(QWebEnginePermission::ClipboardReadWrite); + m_featureTypes.push_back(QWebEnginePermission::LocalFontsAccess); + + // Transient, but the implementation relies on them being written to storage + m_featureTypes.push_back(QWebEnginePermission::MediaAudioCapture); + m_featureTypes.push_back(QWebEnginePermission::MediaVideoCapture); + + // Register all preference types as keys prior to doing anything else + for (auto &type : m_featureTypes) { + prefRegistry->RegisterDictionaryPref(featureString(type)); + } + PrefProxyConfigTrackerImpl::RegisterPrefs(prefRegistry.get()); + + if (policy == ProfileAdapter::NoPersistentPermissions) + m_persistence = false; + + { + base::ScopedAllowBlocking allowBlock; + m_prefService = factory.Create(prefRegistry); + } } PermissionManagerQt::~PermissionManagerQt() { + commit(); } -void PermissionManagerQt::permissionRequestReply(const QUrl &url, ProfileAdapter::PermissionType type, ProfileAdapter::PermissionState reply) +void PermissionManagerQt::setPermission(const QUrl &url, QWebEnginePermission::Feature feature, QWebEnginePermission::State state) { // Normalize the QUrl to Chromium origin form. const GURL gorigin = toGurl(url).DeprecatedGetOriginAsURL(); const QUrl origin = gorigin.is_empty() ? url : toQt(gorigin); if (origin.isEmpty()) return; - QPair<QUrl, ProfileAdapter::PermissionType> key(origin, type); - if (reply == ProfileAdapter::AskPermission) - m_permissions.remove(key); + if (state == QWebEnginePermission::Ask) + ResetPermission(toBlink(feature), gorigin, gorigin); else - m_permissions[key] = (reply == ProfileAdapter::AllowedPermission); - blink::mojom::PermissionStatus status = toBlink(reply); - if (reply != ProfileAdapter::AskPermission) { + setPermission(toBlink(feature), gorigin, state == QWebEnginePermission::Granted); + blink::mojom::PermissionStatus status = toBlink(state); + if (state != QWebEnginePermission::Ask) { auto it = m_requests.begin(); while (it != m_requests.end()) { - if (it->origin == origin && it->type == type) { + if (it->origin == origin && it->type == feature) { std::move(it->callback).Run(status); it = m_requests.erase(it); } else ++it; } } + for (const auto &it: m_subscribers) { - if (it.second.origin == origin && it.second.type == type) + if (it.second.origin == origin && it.second.type == feature) it.second.callback.Run(status); } - if (reply == ProfileAdapter::AskPermission) + if (state == QWebEnginePermission::Ask) return; auto it = m_multiRequests.begin(); @@ -131,21 +261,23 @@ void PermissionManagerQt::permissionRequestReply(const QUrl &url, ProfileAdapter std::vector<blink::mojom::PermissionStatus> result; result.reserve(it->types.size()); for (blink::PermissionType permission : it->types) { - const ProfileAdapter::PermissionType permissionType = toQt(permission); - if (permissionType == ProfileAdapter::UnsupportedPermission) { + if (toQt(permission) == QWebEnginePermission::Unsupported) { result.push_back(blink::mojom::PermissionStatus::DENIED); continue; } - QPair<QUrl, ProfileAdapter::PermissionType> key(origin, permissionType); - if (!m_permissions.contains(key)) { - answerable = false; - break; + blink::mojom::PermissionStatus permissionStatus = GetPermissionStatus(permission, gorigin, GURL()); + if (permissionStatus == toBlink(state)) { + if (permissionStatus == blink::mojom::PermissionStatus::ASK) { + answerable = false; + break; + } + + result.push_back(permissionStatus); + } else { + // Reached when the PersistentPermissionsPolicy is set to NoPersistentPermissions + result.push_back(toBlink(state)); } - if (m_permissions[key]) - result.push_back(blink::mojom::PermissionStatus::GRANTED); - else - result.push_back(blink::mojom::PermissionStatus::DENIED); } if (answerable) { std::move(it->callback).Run(result); @@ -157,55 +289,65 @@ void PermissionManagerQt::permissionRequestReply(const QUrl &url, ProfileAdapter } } -bool PermissionManagerQt::checkPermission(const QUrl &origin, ProfileAdapter::PermissionType type) +QWebEnginePermission::State PermissionManagerQt::getPermissionState(const QUrl &origin, QWebEnginePermission::Feature feature) { - QPair<QUrl, ProfileAdapter::PermissionType> key(origin, type); - return m_permissions.contains(key) && m_permissions[key]; + return toQt(GetPermissionStatus(toBlink(feature), toGurl(origin), GURL())); } -void PermissionManagerQt::RequestPermission(blink::PermissionType permission, - content::RenderFrameHost *frameHost, - const GURL& requesting_origin, - bool /*user_gesture*/, - base::OnceCallback<void(blink::mojom::PermissionStatus)> callback) +QList<QWebEnginePermission> PermissionManagerQt::listPermissions(const QUrl &origin, QWebEnginePermission::Feature feature) { - if (requesting_origin.is_empty()) { - std::move(callback).Run(blink::mojom::PermissionStatus::DENIED); - return; - } + Q_ASSERT(origin.isEmpty() || feature == QWebEnginePermission::Unsupported); + QList<QWebEnginePermission> returnList; + GURL gorigin = toGurl(origin).DeprecatedGetOriginAsURL(); + std::string originSpec = gorigin.spec(); - WebContentsDelegateQt *contentsDelegate = static_cast<WebContentsDelegateQt *>( - content::WebContents::FromRenderFrameHost(frameHost)->GetDelegate()); - Q_ASSERT(contentsDelegate); + if (!origin.isEmpty() && !gorigin.is_valid()) + return returnList; - ProfileAdapter::PermissionType permissionType = toQt(permission); - if (permissionType == ProfileAdapter::ClipboardRead) { - WebEngineSettings *settings = contentsDelegate->webEngineSettings(); - if (settings->testAttribute(QWebEngineSettings::JavascriptCanAccessClipboard) - && settings->testAttribute(QWebEngineSettings::JavascriptCanPaste)) - std::move(callback).Run(blink::mojom::PermissionStatus::GRANTED); - else - std::move(callback).Run(blink::mojom::PermissionStatus::DENIED); - return; - } else if (!canRequestPermissionFor(permissionType)) { - std::move(callback).Run(blink::mojom::PermissionStatus::DENIED); - return; + std::vector<QWebEnginePermission::Feature> types; + if (feature == QWebEnginePermission::Unsupported) + types = m_featureTypes; + else + types.push_back(feature); + + for (auto &type : types) { + // Transient types may end up in the permission store as an implementation detail, + // but we do not want to expose them to callers. + if (QWebEnginePermission::isTransient(type)) + continue; + + auto *pref = m_prefService->FindPreference(featureString(type)); + if (!pref) + continue; + + auto *prefDict = pref->GetValue()->GetIfDict(); + Q_ASSERT(prefDict); + + for (const auto &entry : *prefDict) { + if (!originSpec.empty() && entry.first != originSpec) + continue; + + auto *pvt = new QWebEnginePermissionPrivate(toQt(GURL(std::string_view(entry.first))), type, nullptr, m_profileAdapter.get()); + returnList.push_back(QWebEnginePermission(pvt)); + } } - int request_id = ++m_requestIdCount; - auto requestOrigin = toQt(requesting_origin); - m_requests.push_back({ request_id, permissionType, requestOrigin, std::move(callback) }); - contentsDelegate->requestFeaturePermission(permissionType, requestOrigin); + return returnList; +} + +void PermissionManagerQt::commit() +{ + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + // Make sure modified permissions are written to disk + m_prefService->CommitPendingWrite(); } -void PermissionManagerQt::RequestPermissions(const std::vector<blink::PermissionType> &permissions, - content::RenderFrameHost *frameHost, - const GURL &requesting_origin, - bool /*user_gesture*/, - base::OnceCallback<void(const std::vector<blink::mojom::PermissionStatus> &)> callback) +void PermissionManagerQt::RequestPermissions(content::RenderFrameHost *frameHost, + const content::PermissionRequestDescription &requestDescription, + base::OnceCallback<void(const std::vector<blink::mojom::PermissionStatus>&)> callback) { - if (requesting_origin.is_empty()) { - std::move(callback).Run(std::vector<blink::mojom::PermissionStatus>(permissions.size(), blink::mojom::PermissionStatus::DENIED)); + if (requestDescription.requesting_origin.is_empty()) { + std::move(callback).Run(std::vector<content::PermissionStatus>(requestDescription.permissions.size(), blink::mojom::PermissionStatus::DENIED)); return; } @@ -214,45 +356,51 @@ void PermissionManagerQt::RequestPermissions(const std::vector<blink::Permission Q_ASSERT(contentsDelegate); bool answerable = true; - std::vector<blink::mojom::PermissionStatus> result; - result.reserve(permissions.size()); - for (blink::PermissionType permission : permissions) { - const ProfileAdapter::PermissionType permissionType = toQt(permission); - if (permissionType == ProfileAdapter::UnsupportedPermission) + std::vector<content::PermissionStatus> result; + result.reserve(requestDescription.permissions.size()); + for (blink::PermissionType permission : requestDescription.permissions) { + const QWebEnginePermission::Feature feature = toQt(permission); + if (feature == QWebEnginePermission::Unsupported) { result.push_back(blink::mojom::PermissionStatus::DENIED); - else if (permissionType == ProfileAdapter::ClipboardRead) { - WebEngineSettings *settings = contentsDelegate->webEngineSettings(); - if (settings->testAttribute(QWebEngineSettings::JavascriptCanAccessClipboard) - && settings->testAttribute(QWebEngineSettings::JavascriptCanPaste)) - result.push_back(blink::mojom::PermissionStatus::GRANTED); - else - result.push_back(blink::mojom::PermissionStatus::DENIED); + continue; + } + + blink::mojom::PermissionStatus permissionStatus = getStatusFromSettings(permission, contentsDelegate->webEngineSettings()); + if (permissionStatus == blink::mojom::PermissionStatus::ASK) { + permissionStatus = GetPermissionStatus(permission, requestDescription.requesting_origin, GURL()); + if (m_persistence && permissionStatus != blink::mojom::PermissionStatus::ASK) { + // Automatically grant/deny without prompt if already asked once + result.push_back(permissionStatus); + } else { + answerable = false; + break; + } } else { - answerable = false; - break; + // Reached when clipboard settings have been set + result.push_back(permissionStatus); } } + if (answerable) { std::move(callback).Run(result); return; } int request_id = ++m_requestIdCount; - auto requestOrigin = toQt(requesting_origin); - m_multiRequests.push_back({ request_id, permissions, requestOrigin, std::move(callback) }); - for (blink::PermissionType permission : permissions) { - const ProfileAdapter::PermissionType permissionType = toQt(permission); - if (canRequestPermissionFor(permissionType)) - contentsDelegate->requestFeaturePermission(permissionType, requestOrigin); + auto requestOrigin = toQt(requestDescription.requesting_origin); + m_multiRequests.push_back({ request_id, requestDescription.permissions, requestOrigin, std::move(callback) }); + for (blink::PermissionType permission : requestDescription.permissions) { + const QWebEnginePermission::Feature feature = toQt(permission); + if (!QWebEnginePermission::isTransient(feature)) + contentsDelegate->requestFeaturePermission(feature, requestOrigin); } } -void PermissionManagerQt::RequestPermissionsFromCurrentDocument(const std::vector<blink::PermissionType> &permissions, - content::RenderFrameHost *frameHost, - bool user_gesture, +void PermissionManagerQt::RequestPermissionsFromCurrentDocument(content::RenderFrameHost *frameHost, + const content::PermissionRequestDescription &requestDescription, base::OnceCallback<void(const std::vector<blink::mojom::PermissionStatus>&)> callback) { - RequestPermissions(permissions, frameHost, frameHost->GetLastCommittedOrigin().GetURL(), user_gesture, std::move(callback)); + RequestPermissions(frameHost, requestDescription, std::move(callback)); } blink::mojom::PermissionStatus PermissionManagerQt::GetPermissionStatus( @@ -260,14 +408,30 @@ blink::mojom::PermissionStatus PermissionManagerQt::GetPermissionStatus( const GURL& requesting_origin, const GURL& /*embedding_origin*/) { - const ProfileAdapter::PermissionType permissionType = toQt(permission); - if (permissionType == ProfileAdapter::UnsupportedPermission) + const QWebEnginePermission::Feature feature = toQt(permission); + if (feature == QWebEnginePermission::Unsupported) return blink::mojom::PermissionStatus::DENIED; - QPair<QUrl, ProfileAdapter::PermissionType> key(toQt(requesting_origin), permissionType); - if (!m_permissions.contains(key)) + permission = toBlink(toQt(permission)); // Filter out merged/unsupported permissions (e.g. clipboard) + auto *pref = m_prefService->FindPreference(featureString(toQt(permission))); + if (!pref) + return blink::mojom::PermissionStatus::ASK; // Permission type not in database + + const auto *permissions = pref->GetValue()->GetIfDict(); + Q_ASSERT(permissions); + + auto requestedPermission = permissions->FindBool(requesting_origin.DeprecatedGetOriginAsURL().spec()); + if (!requestedPermission) + return blink::mojom::PermissionStatus::ASK; // Origin is not in the current permission type's database + + // Workaround: local fonts are entirely managed by Chromium, which only calls RequestPermission() _after_ + // it's checked whether the permission has been granted. By always returning ASK, we force the request to + // come through every time. + if (permission == blink::PermissionType::LOCAL_FONTS + && m_profileAdapter->persistentPermissionsPolicy() == ProfileAdapter::NoPersistentPermissions) return blink::mojom::PermissionStatus::ASK; - if (m_permissions[key]) + + if (requestedPermission.value()) return blink::mojom::PermissionStatus::GRANTED; return blink::mojom::PermissionStatus::DENIED; } @@ -280,14 +444,10 @@ blink::mojom::PermissionStatus PermissionManagerQt::GetPermissionStatusForCurren permission == blink::PermissionType::CLIPBOARD_SANITIZED_WRITE) { WebContentsDelegateQt *delegate = static_cast<WebContentsDelegateQt *>( content::WebContents::FromRenderFrameHost(render_frame_host)->GetDelegate()); - if (!delegate->webEngineSettings()->testAttribute( - QWebEngineSettings::JavascriptCanAccessClipboard)) - return blink::mojom::PermissionStatus::DENIED; - if (permission == blink::PermissionType::CLIPBOARD_READ_WRITE - && !delegate->webEngineSettings()->testAttribute( - QWebEngineSettings::JavascriptCanPaste)) - return blink::mojom::PermissionStatus::DENIED; - return blink::mojom::PermissionStatus::GRANTED; + Q_ASSERT(delegate); + auto status = getStatusFromSettings(permission, delegate->webEngineSettings()); + if (status != blink::mojom::PermissionStatus::ASK) + return status; } return GetPermissionStatus( @@ -304,12 +464,22 @@ blink::mojom::PermissionStatus PermissionManagerQt::GetPermissionStatusForWorker return GetPermissionStatus(permission, url, url); } +blink::mojom::PermissionStatus PermissionManagerQt::GetPermissionStatusForEmbeddedRequester( + blink::PermissionType permission, + content::RenderFrameHost *render_frame_host, + const url::Origin &requesting_origin) +{ + return GetPermissionStatus(permission, requesting_origin.GetURL(), + render_frame_host->GetLastCommittedOrigin().GetURL()); +} + content::PermissionResult PermissionManagerQt::GetPermissionResultForOriginWithoutContext( blink::PermissionType permission, - const url::Origin &origin) + const url::Origin &requesting_origin, + const url::Origin &embedding_origin) { blink::mojom::PermissionStatus status = - GetPermissionStatus(permission, origin.GetURL(), origin.GetURL()); + GetPermissionStatus(permission, requesting_origin.GetURL(), embedding_origin.GetURL()); return content::PermissionResult(status, content::PermissionStatusSource::UNSPECIFIED); } @@ -319,20 +489,19 @@ void PermissionManagerQt::ResetPermission( const GURL& requesting_origin, const GURL& /*embedding_origin*/) { - const ProfileAdapter::PermissionType permissionType = toQt(permission); - if (permissionType == ProfileAdapter::UnsupportedPermission) + const QWebEnginePermission::Feature feature = toQt(permission); + if (feature == QWebEnginePermission::Unsupported) return; - QPair<QUrl, ProfileAdapter::PermissionType> key(toQt(requesting_origin), permissionType); - m_permissions.remove(key); + ScopedDictPrefUpdate updater(m_prefService.get(), featureString(feature)); + updater.Get().Remove(requesting_origin.spec()); } -content::PermissionControllerDelegate::SubscriptionId PermissionManagerQt::SubscribePermissionStatusChange( - blink::PermissionType permission, - content::RenderProcessHost * /*render_process_host*/, - content::RenderFrameHost * /* render_frame_host */, - const GURL& requesting_origin, - base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) +content::PermissionControllerDelegate::SubscriptionId +PermissionManagerQt::SubscribeToPermissionStatusChange( + blink::PermissionType permission, content::RenderProcessHost * /*render_process_host*/, + content::RenderFrameHost * /* render_frame_host */, const GURL &requesting_origin, + base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) { auto subscriber_id = subscription_id_generator_.GenerateNextId(); m_subscribers.insert( { subscriber_id, @@ -340,10 +509,27 @@ content::PermissionControllerDelegate::SubscriptionId PermissionManagerQt::Subsc return subscriber_id; } -void PermissionManagerQt::UnsubscribePermissionStatusChange(content::PermissionControllerDelegate::SubscriptionId subscription_id) +void PermissionManagerQt::UnsubscribeFromPermissionStatusChange( + content::PermissionControllerDelegate::SubscriptionId subscription_id) { if (!m_subscribers.erase(subscription_id)) LOG(WARNING) << "PermissionManagerQt::UnsubscribePermissionStatusChange called on unknown subscription id" << subscription_id; } +void PermissionManagerQt::setPermission( + blink::PermissionType permission, + const GURL& requesting_origin, + bool granted) +{ + const QWebEnginePermission::Feature feature = toQt(permission); + if (feature == QWebEnginePermission::Unsupported) + return; + + if (!m_prefService->FindPreference(featureString(feature))) + return; + + ScopedDictPrefUpdate updater(m_prefService.get(), featureString(feature)); + updater.Get().Set(requesting_origin.spec(), granted); +} + } // namespace QtWebEngineCore |