| Index: chrome/browser/permissions/permission_manager.cc
|
| diff --git a/chrome/browser/permissions/permission_manager.cc b/chrome/browser/permissions/permission_manager.cc
|
| index 8758ef7f6bf8fab9bbe6f92cbb8e9c745b85f76b..dc2d554cc7c4e1c4125c4f9be46452fba9f5d7ab 100644
|
| --- a/chrome/browser/permissions/permission_manager.cc
|
| +++ b/chrome/browser/permissions/permission_manager.cc
|
| @@ -18,6 +18,7 @@
|
| #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/permissions/permission_result.h"
|
| #include "chrome/browser/permissions/permission_uma_util.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/storage/durable_storage_permission_context.h"
|
| @@ -54,12 +55,12 @@ namespace {
|
| PermissionStatus ContentSettingToPermissionStatus(ContentSetting setting) {
|
| switch (setting) {
|
| case CONTENT_SETTING_ALLOW:
|
| - case CONTENT_SETTING_SESSION_ONLY:
|
| return PermissionStatus::GRANTED;
|
| case CONTENT_SETTING_BLOCK:
|
| return PermissionStatus::DENIED;
|
| case CONTENT_SETTING_ASK:
|
| return PermissionStatus::ASK;
|
| + case CONTENT_SETTING_SESSION_ONLY:
|
| case CONTENT_SETTING_DETECT_IMPORTANT_CONTENT:
|
| case CONTENT_SETTING_DEFAULT:
|
| case CONTENT_SETTING_NUM_SETTINGS:
|
| @@ -70,14 +71,6 @@ PermissionStatus ContentSettingToPermissionStatus(ContentSetting setting) {
|
| return PermissionStatus::DENIED;
|
| }
|
|
|
| -// Wrap a callback taking a PermissionStatus to pass it as a callback taking a
|
| -// ContentSetting.
|
| -void ContentSettingToPermissionStatusCallbackWrapper(
|
| - const base::Callback<void(PermissionStatus)>& callback,
|
| - ContentSetting setting) {
|
| - callback.Run(ContentSettingToPermissionStatus(setting));
|
| -}
|
| -
|
| // Helper method to convert PermissionType to ContentSettingType.
|
| ContentSettingsType PermissionTypeToContentSetting(PermissionType permission) {
|
| switch (permission) {
|
| @@ -118,7 +111,7 @@ ContentSettingsType PermissionTypeToContentSetting(PermissionType permission) {
|
| return CONTENT_SETTINGS_TYPE_DEFAULT;
|
| }
|
|
|
| -// Returns whether the permission has a constant PermissionStatus value (i.e.
|
| +// Returns whether the permission has a constant ContentSetting value (i.e.
|
| // always approved or always denied)
|
| // The ContentSettingsTypes for which true is returned will also return nullptr
|
| // in PermissionManager::GetPermissionContext since they don't have a context.
|
| @@ -126,10 +119,33 @@ bool IsConstantPermission(ContentSettingsType type) {
|
| return type == CONTENT_SETTINGS_TYPE_MIDI;
|
| }
|
|
|
| -void PermissionRequestResponseCallbackWrapper(
|
| +void SubscriptionCallbackWrapper(
|
| const base::Callback<void(PermissionStatus)>& callback,
|
| - const std::vector<PermissionStatus>& vector) {
|
| - DCHECK_EQ(vector.size(), 1ul);
|
| + ContentSetting content_setting) {
|
| + callback.Run(ContentSettingToPermissionStatus(content_setting));
|
| +}
|
| +
|
| +void PermissionStatusCallbackWrapper(
|
| + const base::Callback<void(PermissionStatus)>& callback,
|
| + const std::vector<ContentSetting>& vector) {
|
| + DCHECK_EQ(1ul, vector.size());
|
| + callback.Run(ContentSettingToPermissionStatus(vector[0]));
|
| +}
|
| +
|
| +void PermissionStatusVectorCallbackWrapper(
|
| + const base::Callback<void(const std::vector<PermissionStatus>&)>& callback,
|
| + const std::vector<ContentSetting>& content_settings) {
|
| + std::vector<PermissionStatus> permission_statuses;
|
| + std::transform(content_settings.begin(), content_settings.end(),
|
| + back_inserter(permission_statuses),
|
| + ContentSettingToPermissionStatus);
|
| + callback.Run(permission_statuses);
|
| +}
|
| +
|
| +void ContentSettingCallbackWraper(
|
| + const base::Callback<void(ContentSetting)>& callback,
|
| + const std::vector<ContentSetting>& vector) {
|
| + DCHECK_EQ(1ul, vector.size());
|
| callback.Run(vector[0]);
|
| }
|
|
|
| @@ -138,14 +154,14 @@ void PermissionRequestResponseCallbackWrapper(
|
| // CONTENT_SETTING_DEFAULT is returned if the permission needs further handling.
|
| // This function should only be called when IsConstantPermission has returned
|
| // true for the PermissionType.
|
| -blink::mojom::PermissionStatus GetPermissionStatusForConstantPermission(
|
| +ContentSetting GetContentSettingForConstantPermission(
|
| ContentSettingsType type) {
|
| DCHECK(IsConstantPermission(type));
|
| switch (type) {
|
| case CONTENT_SETTINGS_TYPE_MIDI:
|
| - return PermissionStatus::GRANTED;
|
| + return CONTENT_SETTING_ALLOW;
|
| default:
|
| - return PermissionStatus::DENIED;
|
| + return CONTENT_SETTING_BLOCK;
|
| }
|
| }
|
|
|
| @@ -156,19 +172,18 @@ class PermissionManager::PendingRequest {
|
| PendingRequest(
|
| content::RenderFrameHost* render_frame_host,
|
| const std::vector<ContentSettingsType>& permissions,
|
| - const base::Callback<void(const std::vector<PermissionStatus>&)>&
|
| - callback)
|
| + const base::Callback<void(const std::vector<ContentSetting>&)>& callback)
|
| : render_process_id_(render_frame_host->GetProcess()->GetID()),
|
| render_frame_id_(render_frame_host->GetRoutingID()),
|
| callback_(callback),
|
| permissions_(permissions),
|
| - results_(permissions.size(), PermissionStatus::DENIED),
|
| + results_(permissions.size(), CONTENT_SETTING_BLOCK),
|
| remaining_results_(permissions.size()) {}
|
|
|
| - void SetPermissionStatus(int permission_id, PermissionStatus status) {
|
| + void SetContentSetting(int permission_id, ContentSetting content_setting) {
|
| DCHECK(!IsComplete());
|
|
|
| - results_[permission_id] = status;
|
| + results_[permission_id] = content_setting;
|
| --remaining_results_;
|
| }
|
|
|
| @@ -179,8 +194,8 @@ class PermissionManager::PendingRequest {
|
| int render_process_id() const { return render_process_id_; }
|
| int render_frame_id() const { return render_frame_id_; }
|
|
|
| - const base::Callback<void(const std::vector<PermissionStatus>&)>
|
| - callback() const {
|
| + const base::Callback<void(const std::vector<ContentSetting>&)> callback()
|
| + const {
|
| return callback_;
|
| }
|
|
|
| @@ -188,16 +203,14 @@ class PermissionManager::PendingRequest {
|
| return permissions_;
|
| }
|
|
|
| - std::vector<PermissionStatus> results() const {
|
| - return results_;
|
| - }
|
| + std::vector<ContentSetting> results() const { return results_; }
|
|
|
| private:
|
| int render_process_id_;
|
| int render_frame_id_;
|
| - const base::Callback<void(const std::vector<PermissionStatus>&)> callback_;
|
| + const base::Callback<void(const std::vector<ContentSetting>&)> callback_;
|
| std::vector<ContentSettingsType> permissions_;
|
| - std::vector<PermissionStatus> results_;
|
| + std::vector<ContentSetting> results_;
|
| size_t remaining_results_;
|
| };
|
|
|
| @@ -205,8 +218,8 @@ struct PermissionManager::Subscription {
|
| ContentSettingsType permission;
|
| GURL requesting_origin;
|
| GURL embedding_origin;
|
| - base::Callback<void(PermissionStatus)> callback;
|
| - PermissionStatus current_value;
|
| + base::Callback<void(ContentSetting)> callback;
|
| + ContentSetting current_value;
|
| };
|
|
|
| // static
|
| @@ -263,11 +276,11 @@ int PermissionManager::RequestPermission(
|
| content::RenderFrameHost* render_frame_host,
|
| const GURL& requesting_origin,
|
| bool user_gesture,
|
| - const base::Callback<void(PermissionStatus)>& callback) {
|
| + const base::Callback<void(ContentSetting)>& callback) {
|
| return RequestPermissions(
|
| std::vector<ContentSettingsType>(1, content_settings_type),
|
| render_frame_host, requesting_origin, user_gesture,
|
| - base::Bind(&PermissionRequestResponseCallbackWrapper, callback));
|
| + base::Bind(&ContentSettingCallbackWraper, callback));
|
| }
|
|
|
| int PermissionManager::RequestPermissions(
|
| @@ -275,11 +288,10 @@ int PermissionManager::RequestPermissions(
|
| content::RenderFrameHost* render_frame_host,
|
| const GURL& requesting_origin,
|
| bool user_gesture,
|
| - const base::Callback<void(const std::vector<PermissionStatus>&)>&
|
| - callback) {
|
| + const base::Callback<void(const std::vector<ContentSetting>&)>& callback) {
|
| DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| if (permissions.empty()) {
|
| - callback.Run(std::vector<PermissionStatus>());
|
| + callback.Run(std::vector<ContentSetting>());
|
| return kNoPendingOperation;
|
| }
|
|
|
| @@ -300,16 +312,15 @@ int PermissionManager::RequestPermissions(
|
| PermissionUmaUtil::PermissionRequested(permission, requesting_origin,
|
| embedding_origin, profile_);
|
| OnPermissionsRequestResponseStatus(
|
| - request_id, i, GetPermissionStatusForConstantPermission(permission));
|
| + request_id, i, GetContentSettingForConstantPermission(permission));
|
| continue;
|
| }
|
|
|
| PermissionContextBase* context = GetPermissionContext(permission);
|
| context->RequestPermission(
|
| web_contents, request, requesting_origin, user_gesture,
|
| - base::Bind(&ContentSettingToPermissionStatusCallbackWrapper,
|
| - base::Bind(&PermissionManager::OnPermissionsRequestResponseStatus,
|
| - weak_ptr_factory_.GetWeakPtr(), request_id, i)));
|
| + base::Bind(&PermissionManager::OnPermissionsRequestResponseStatus,
|
| + weak_ptr_factory_.GetWeakPtr(), request_id, i));
|
| }
|
|
|
| // The request might have been resolved already.
|
| @@ -319,18 +330,21 @@ int PermissionManager::RequestPermissions(
|
| return request_id;
|
| }
|
|
|
| -PermissionStatus PermissionManager::GetPermissionStatus(
|
| +PermissionResult PermissionManager::GetPermissionStatus(
|
| ContentSettingsType permission,
|
| const GURL& requesting_origin,
|
| const GURL& embedding_origin) {
|
| - if (IsConstantPermission(permission))
|
| - return GetPermissionStatusForConstantPermission(permission);
|
| + if (IsConstantPermission(permission)) {
|
| + return PermissionResult(GetContentSettingForConstantPermission(permission),
|
| + PermissionStatusSource::UNSPECIFIED);
|
| + }
|
| PermissionContextBase* context = GetPermissionContext(permission);
|
| - return ContentSettingToPermissionStatus(
|
| - context
|
| - ->GetPermissionStatus(requesting_origin.GetOrigin(),
|
| - embedding_origin.GetOrigin())
|
| - .content_setting);
|
| + PermissionResult result = context->GetPermissionStatus(
|
| + requesting_origin.GetOrigin(), embedding_origin.GetOrigin());
|
| + DCHECK(result.content_setting == CONTENT_SETTING_ALLOW ||
|
| + result.content_setting == CONTENT_SETTING_ASK ||
|
| + result.content_setting == CONTENT_SETTING_BLOCK);
|
| + return result;
|
| }
|
|
|
| int PermissionManager::RequestPermission(
|
| @@ -344,7 +358,7 @@ int PermissionManager::RequestPermission(
|
| return RequestPermissions(
|
| std::vector<ContentSettingsType>(1, content_settings_type),
|
| render_frame_host, requesting_origin, user_gesture,
|
| - base::Bind(&PermissionRequestResponseCallbackWrapper, callback));
|
| + base::Bind(&PermissionStatusCallbackWrapper, callback));
|
| }
|
|
|
| int PermissionManager::RequestPermissions(
|
| @@ -358,8 +372,10 @@ int PermissionManager::RequestPermissions(
|
| std::transform(permissions.begin(), permissions.end(),
|
| back_inserter(content_settings_types),
|
| PermissionTypeToContentSetting);
|
| - return RequestPermissions(content_settings_types, render_frame_host,
|
| - requesting_origin, user_gesture, callback);
|
| + return RequestPermissions(
|
| + content_settings_types, render_frame_host, requesting_origin,
|
| + user_gesture,
|
| + base::Bind(&PermissionStatusVectorCallbackWrapper, callback));
|
| }
|
|
|
| PermissionContextBase* PermissionManager::GetPermissionContext(
|
| @@ -371,9 +387,9 @@ PermissionContextBase* PermissionManager::GetPermissionContext(
|
| void PermissionManager::OnPermissionsRequestResponseStatus(
|
| int request_id,
|
| int permission_id,
|
| - PermissionStatus status) {
|
| + ContentSetting content_setting) {
|
| PendingRequest* pending_request = pending_requests_.Lookup(request_id);
|
| - pending_request->SetPermissionStatus(permission_id, status);
|
| + pending_request->SetContentSetting(permission_id, content_setting);
|
|
|
| if (!pending_request->IsComplete())
|
| return;
|
| @@ -422,8 +438,10 @@ PermissionStatus PermissionManager::GetPermissionStatus(
|
| const GURL& requesting_origin,
|
| const GURL& embedding_origin) {
|
| DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| - return GetPermissionStatus(PermissionTypeToContentSetting(permission),
|
| - requesting_origin, embedding_origin);
|
| + return ContentSettingToPermissionStatus(
|
| + GetPermissionStatus(PermissionTypeToContentSetting(permission),
|
| + requesting_origin, embedding_origin)
|
| + .content_setting);
|
| }
|
|
|
| int PermissionManager::SubscribePermissionStatusChange(
|
| @@ -440,10 +458,11 @@ int PermissionManager::SubscribePermissionStatusChange(
|
| subscription->permission = content_type;
|
| subscription->requesting_origin = requesting_origin;
|
| subscription->embedding_origin = embedding_origin;
|
| - subscription->callback = callback;
|
| + subscription->callback = base::Bind(&SubscriptionCallbackWrapper, callback);
|
|
|
| subscription->current_value =
|
| - GetPermissionStatus(content_type, requesting_origin, embedding_origin);
|
| + GetPermissionStatus(content_type, requesting_origin, embedding_origin)
|
| + .content_setting;
|
|
|
| return subscriptions_.Add(std::move(subscription));
|
| }
|
| @@ -487,9 +506,11 @@ void PermissionManager::OnContentSettingChanged(
|
| !secondary_pattern.Matches(subscription->embedding_origin))
|
| continue;
|
|
|
| - PermissionStatus new_value = GetPermissionStatus(
|
| - subscription->permission, subscription->requesting_origin,
|
| - subscription->embedding_origin);
|
| + ContentSetting new_value =
|
| + GetPermissionStatus(subscription->permission,
|
| + subscription->requesting_origin,
|
| + subscription->embedding_origin)
|
| + .content_setting;
|
| if (subscription->current_value == new_value)
|
| continue;
|
|
|
|
|