Chromium Code Reviews| 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..b4a85206aceab0b765fac5384590d49e885c6501 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, |
| + ContentSetting content_setting) { |
| + callback.Run(ContentSettingToPermissionStatus(content_setting)); |
| +} |
| + |
| +void PermissionStatusCallbackWrapper( |
| const base::Callback<void(PermissionStatus)>& callback, |
| - const std::vector<PermissionStatus>& vector) { |
| - DCHECK_EQ(vector.size(), 1ul); |
| + 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,20 @@ 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)) |
|
raymes
2017/03/01 01:25:03
nit: add {}
Timothy Loh
2017/03/01 04:08:55
Done.
|
| - return GetPermissionStatusForConstantPermission(permission); |
| + return {GetContentSettingForConstantPermission(permission), |
| + PermissionStatusSource::UNSPECIFIED}; |
|
raymes
2017/03/01 01:25:03
nit: Please use the constructor here
Timothy Loh
2017/03/01 04:08:55
Done.
|
| 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 +357,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 +371,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 +386,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 +437,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 +457,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 +505,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; |