[cr138] Incorporate changes to PermissionRequest/PermissionRequestData
PermissionRequestData is now used to pass various permission parameters around and several functions/constructors were modified to accomodate that change. Chromium change: https://source.chromium.org/chromium/chromium/src/+/7f3e3ca1b6ceddc2e18a4fe86d2ce3ac936e68ba commit 7f3e3ca1b6ceddc2e18a4fe86d2ce3ac936e68ba Author: Florian Jacky <fjacky@google.com> Date: Mon May 5 09:19:20 2025 -0700 [PermissionOptions] Simplify request path, provide resolvers, pass back request information This CL is part of a larger change to support permissions with options. A summary of changes in this CL can be found below, the full de> - Simplify interfaces to rely on PermissionRequestData wrapper and refactor PermissionContextBase and its subclasses accordingly. - Update PermissionRequestData to rely on permission resolvers. - Refactor PermissionRequest to rely on unique PermissionRequestData object and pass it to permission decided callbacks. Let Permission> Full design doc: http://go/multi-state-permissions-dd Change-Id: I81df3cbcedb9c7ef2340a0d79734adf77f336aae Bug: 394547183, 393053278
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
#include "components/permissions/permission_request_id.h"
|
||||
#include "components/permissions/permission_request_manager.h"
|
||||
#include "components/permissions/test/mock_permission_prompt_factory.h"
|
||||
#include "content/public/browser/permission_descriptor_util.h"
|
||||
#include "content/public/browser/permission_result.h"
|
||||
#include "content/public/browser/render_frame_host.h"
|
||||
#include "content/public/browser/web_contents.h"
|
||||
@@ -40,8 +41,8 @@ class BraveOpenAIChatPermissionContextTest
|
||||
ContentSetting setting = ContentSetting::CONTENT_SETTING_DEFAULT;
|
||||
base::RunLoop run_loop;
|
||||
permission_context->RequestPermission(
|
||||
PermissionRequestData(permission_context, id, /*user_gesture=*/true,
|
||||
url),
|
||||
std::make_unique<PermissionRequestData>(permission_context, id,
|
||||
/*user_gesture=*/true, url),
|
||||
base::BindLambdaForTesting([&](ContentSetting result) {
|
||||
setting = result;
|
||||
run_loop.Quit();
|
||||
@@ -95,20 +96,29 @@ TEST_F(BraveOpenAIChatPermissionContextTest, NotAllowedInInsecureOrigins) {
|
||||
|
||||
EXPECT_EQ(content::PermissionStatus::DENIED,
|
||||
permission_context
|
||||
.GetPermissionStatus(nullptr /* render_frame_host */,
|
||||
insecure_url, insecure_url)
|
||||
.GetPermissionStatus(
|
||||
content::PermissionDescriptorUtil::
|
||||
CreatePermissionDescriptorForPermissionType(
|
||||
blink::PermissionType::NOTIFICATIONS),
|
||||
nullptr /* render_frame_host */, insecure_url, insecure_url)
|
||||
.status);
|
||||
|
||||
EXPECT_EQ(content::PermissionStatus::DENIED,
|
||||
permission_context
|
||||
.GetPermissionStatus(nullptr /* render_frame_host */,
|
||||
insecure_url, secure_url)
|
||||
.GetPermissionStatus(
|
||||
content::PermissionDescriptorUtil::
|
||||
CreatePermissionDescriptorForPermissionType(
|
||||
blink::PermissionType::NOTIFICATIONS),
|
||||
nullptr /* render_frame_host */, insecure_url, secure_url)
|
||||
.status);
|
||||
|
||||
EXPECT_EQ(content::PermissionStatus::ASK,
|
||||
permission_context
|
||||
.GetPermissionStatus(nullptr /* render_frame_host */,
|
||||
secure_url, secure_url)
|
||||
.GetPermissionStatus(
|
||||
content::PermissionDescriptorUtil::
|
||||
CreatePermissionDescriptorForPermissionType(
|
||||
blink::PermissionType::NOTIFICATIONS),
|
||||
nullptr /* render_frame_host */, secure_url, secure_url)
|
||||
.status);
|
||||
}
|
||||
|
||||
|
||||
@@ -23,9 +23,7 @@ BraveGeolocationPermissionContextDelegate::
|
||||
~BraveGeolocationPermissionContextDelegate() = default;
|
||||
|
||||
bool BraveGeolocationPermissionContextDelegate::DecidePermission(
|
||||
const permissions::PermissionRequestID& id,
|
||||
const GURL& requesting_origin,
|
||||
bool user_gesture,
|
||||
const std::unique_ptr<permissions::PermissionRequestData>& request_data,
|
||||
permissions::BrowserPermissionCallback* callback,
|
||||
permissions::GeolocationPermissionContext* context) {
|
||||
if (profile_->IsTor()) {
|
||||
@@ -34,5 +32,5 @@ bool BraveGeolocationPermissionContextDelegate::DecidePermission(
|
||||
}
|
||||
|
||||
return GeolocationPermissionContextDelegate::DecidePermission(
|
||||
id, requesting_origin, user_gesture, callback, context);
|
||||
std::move(request_data), callback, context);
|
||||
}
|
||||
|
||||
@@ -23,9 +23,7 @@ class BraveGeolocationPermissionContextDelegate
|
||||
~BraveGeolocationPermissionContextDelegate() override;
|
||||
|
||||
bool DecidePermission(
|
||||
const permissions::PermissionRequestID& id,
|
||||
const GURL& requesting_origin,
|
||||
bool user_gesture,
|
||||
const std::unique_ptr<permissions::PermissionRequestData>& request_data,
|
||||
permissions::BrowserPermissionCallback* callback,
|
||||
permissions::GeolocationPermissionContext* context) override;
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "components/content_settings/core/browser/website_settings_registry.h"
|
||||
#include "components/permissions/permission_request.h"
|
||||
#include "components/permissions/request_type.h"
|
||||
#include "components/permissions/resolvers/content_setting_permission_resolver.h"
|
||||
#include "components/pref_registry/pref_registry_syncable.h"
|
||||
#include "components/prefs/pref_service.h"
|
||||
#include "components/sync_preferences/testing_pref_service_syncable.h"
|
||||
@@ -178,7 +179,10 @@ class PermissionLifetimeManagerTest : public testing::Test {
|
||||
ExpectContentSetting(FROM_HERE, origin, content_type, content_setting);
|
||||
|
||||
auto request = std::make_unique<PermissionRequest>(
|
||||
origin, ContentSettingsTypeToRequestType(content_type), true,
|
||||
std::make_unique<permissions::PermissionRequestData>(
|
||||
std::make_unique<permissions::ContentSettingPermissionResolver>(
|
||||
ContentSettingsTypeToRequestType(content_type)),
|
||||
/*user_gesture=*/true, origin),
|
||||
PermissionDecidedCallback(), base::OnceClosure());
|
||||
request->SetLifetime(lifetime);
|
||||
return request;
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include "chrome/browser/lifetime/application_lifetime.h"
|
||||
#include "chrome/browser/profiles/profile.h"
|
||||
#include "components/permissions/request_type.h"
|
||||
#include "components/permissions/resolvers/content_setting_permission_resolver.h"
|
||||
#include "components/prefs/pref_service.h"
|
||||
#include "components/url_formatter/elide_url.h"
|
||||
#include "components/vector_icons/vector_icons.h"
|
||||
@@ -27,9 +28,11 @@ WidevinePermissionRequest::WidevinePermissionRequest(
|
||||
content::WebContents* web_contents,
|
||||
bool for_restart)
|
||||
: PermissionRequest(
|
||||
web_contents->GetVisibleURL(),
|
||||
permissions::RequestType::kWidevine,
|
||||
/*has_gesture=*/false,
|
||||
std::make_unique<permissions::PermissionRequestData>(
|
||||
std::make_unique<permissions::ContentSettingPermissionResolver>(
|
||||
permissions::RequestType::kWidevine),
|
||||
false,
|
||||
web_contents->GetVisibleURL()),
|
||||
base::BindRepeating(&WidevinePermissionRequest::PermissionDecided,
|
||||
base::Unretained(this)),
|
||||
base::BindOnce(&WidevinePermissionRequest::DeleteRequest,
|
||||
@@ -58,9 +61,11 @@ std::u16string WidevinePermissionRequest::GetMessageTextFragment() const {
|
||||
}
|
||||
#endif
|
||||
|
||||
void WidevinePermissionRequest::PermissionDecided(ContentSetting result,
|
||||
bool is_one_time,
|
||||
bool is_final_decision) {
|
||||
void WidevinePermissionRequest::PermissionDecided(
|
||||
ContentSetting result,
|
||||
bool is_one_time,
|
||||
bool is_final_decision,
|
||||
const std::unique_ptr<permissions::PermissionRequestData>& request_data) {
|
||||
// Permission granted
|
||||
if (result == ContentSetting::CONTENT_SETTING_ALLOW) {
|
||||
if (!for_restart_) {
|
||||
|
||||
@@ -41,9 +41,11 @@ class WidevinePermissionRequest : public permissions::PermissionRequest {
|
||||
#else
|
||||
std::u16string GetMessageTextFragment() const override;
|
||||
#endif
|
||||
void PermissionDecided(ContentSetting result,
|
||||
bool is_one_time,
|
||||
bool is_final_decision);
|
||||
void PermissionDecided(
|
||||
ContentSetting result,
|
||||
bool is_one_time,
|
||||
bool is_final_decision,
|
||||
const std::unique_ptr<permissions::PermissionRequestData>& request_data);
|
||||
void DeleteRequest();
|
||||
|
||||
// It's safe to use this raw |web_contents_| because this request is deleted
|
||||
|
||||
+3
-4
@@ -4,10 +4,9 @@
|
||||
* You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#define BRAVE_STORAGE_ACCESS_GRANT_PERMISSION_CONTEXT_CHECK_FOR_AUTO_GRANT_OR_AUTO_DENIAL \
|
||||
NotifyPermissionSetInternal( \
|
||||
request_data.id, request_data.requesting_origin, \
|
||||
request_data.embedding_origin, std::move(callback), /*persist=*/true, \
|
||||
CONTENT_SETTING_BLOCK, RequestOutcome::kDeniedByPrerequisites); \
|
||||
NotifyPermissionSetInternal(std::move(request_data), std::move(callback), \
|
||||
/*persist=*/true, CONTENT_SETTING_BLOCK, \
|
||||
RequestOutcome::kDeniedByPrerequisites); \
|
||||
return;
|
||||
|
||||
#include "src/chrome/browser/storage_access_api/storage_access_grant_permission_context.cc"
|
||||
|
||||
@@ -44,14 +44,13 @@ void PermissionContextBase::SetPermissionLifetimeManagerFactory(
|
||||
permission_lifetime_manager_factory_ = factory;
|
||||
}
|
||||
|
||||
void PermissionContextBase::PermissionDecided(const PermissionRequestID& id,
|
||||
const GURL& requesting_origin,
|
||||
const GURL& embedding_origin,
|
||||
ContentSetting content_setting,
|
||||
bool is_one_time,
|
||||
bool is_final_decision) {
|
||||
void PermissionContextBase::PermissionDecided(
|
||||
ContentSetting content_setting,
|
||||
bool is_one_time,
|
||||
bool is_final_decision,
|
||||
const std::unique_ptr<PermissionRequestData>& request_data) {
|
||||
if (permission_lifetime_manager_factory_) {
|
||||
const auto request_it = pending_requests_.find(id.ToString());
|
||||
const auto request_it = pending_requests_.find(request_data->id.ToString());
|
||||
if (request_it != pending_requests_.end()) {
|
||||
const PermissionRequest* permission_request =
|
||||
request_it->second.first.get();
|
||||
@@ -59,11 +58,12 @@ void PermissionContextBase::PermissionDecided(const PermissionRequestID& id,
|
||||
if (auto* permission_lifetime_manager =
|
||||
permission_lifetime_manager_factory_.Run(browser_context_)) {
|
||||
permission_lifetime_manager->PermissionDecided(
|
||||
*permission_request, requesting_origin, embedding_origin,
|
||||
content_setting, is_one_time);
|
||||
*permission_request, request_data->requesting_origin,
|
||||
request_data->embedding_origin, content_setting, is_one_time);
|
||||
}
|
||||
}
|
||||
const auto group_request_it = pending_grouped_requests_.find(id.ToString());
|
||||
const auto group_request_it =
|
||||
pending_grouped_requests_.find(request_data->id.ToString());
|
||||
if (group_request_it != pending_grouped_requests_.end()) {
|
||||
for (const auto& request : group_request_it->second->Requests()) {
|
||||
const PermissionRequest* permission_request = request.first.get();
|
||||
@@ -71,8 +71,8 @@ void PermissionContextBase::PermissionDecided(const PermissionRequestID& id,
|
||||
if (auto* permission_lifetime_manager =
|
||||
permission_lifetime_manager_factory_.Run(browser_context_)) {
|
||||
permission_lifetime_manager->PermissionDecided(
|
||||
*permission_request, requesting_origin, embedding_origin,
|
||||
content_setting, is_one_time);
|
||||
*permission_request, request_data->requesting_origin,
|
||||
request_data->embedding_origin, content_setting, is_one_time);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -80,20 +80,21 @@ void PermissionContextBase::PermissionDecided(const PermissionRequestID& id,
|
||||
|
||||
if (!IsGroupedPermissionType(content_settings_type())) {
|
||||
PermissionContextBase_ChromiumImpl::PermissionDecided(
|
||||
id, requesting_origin, embedding_origin, content_setting, is_one_time,
|
||||
is_final_decision);
|
||||
content_setting, is_one_time, is_final_decision,
|
||||
std::move(request_data));
|
||||
return;
|
||||
}
|
||||
|
||||
DCHECK(content_setting == CONTENT_SETTING_ALLOW ||
|
||||
content_setting == CONTENT_SETTING_BLOCK ||
|
||||
content_setting == CONTENT_SETTING_DEFAULT);
|
||||
UserMadePermissionDecision(id, requesting_origin, embedding_origin,
|
||||
content_setting);
|
||||
UserMadePermissionDecision(request_data->id, request_data->requesting_origin,
|
||||
request_data->embedding_origin, content_setting);
|
||||
|
||||
bool persist = content_setting != CONTENT_SETTING_DEFAULT;
|
||||
|
||||
auto grouped_request = pending_grouped_requests_.find(id.ToString());
|
||||
auto grouped_request =
|
||||
pending_grouped_requests_.find(request_data->id.ToString());
|
||||
DCHECK(grouped_request != pending_grouped_requests_.end());
|
||||
DCHECK(grouped_request->second);
|
||||
|
||||
@@ -103,16 +104,15 @@ void PermissionContextBase::PermissionDecided(const PermissionRequestID& id,
|
||||
|
||||
auto callback = grouped_request->second->GetNextCallback();
|
||||
if (callback) {
|
||||
NotifyPermissionSet(id, requesting_origin, embedding_origin,
|
||||
std::move(callback), persist, content_setting,
|
||||
is_one_time, is_final_decision);
|
||||
NotifyPermissionSet(request_data, std::move(callback), persist,
|
||||
content_setting, is_one_time, is_final_decision);
|
||||
}
|
||||
}
|
||||
|
||||
void PermissionContextBase::DecidePermission(
|
||||
permissions::PermissionRequestData request_data,
|
||||
std::unique_ptr<permissions::PermissionRequestData> request_data,
|
||||
BrowserPermissionCallback callback) {
|
||||
auto id = request_data.id;
|
||||
auto id = request_data->id;
|
||||
PermissionContextBase_ChromiumImpl::DecidePermission(std::move(request_data),
|
||||
std::move(callback));
|
||||
|
||||
|
||||
@@ -49,8 +49,9 @@ class PermissionContextBase : public PermissionContextBase_ChromiumImpl {
|
||||
const base::RepeatingCallback<
|
||||
PermissionLifetimeManager*(content::BrowserContext*)>& factory);
|
||||
|
||||
void DecidePermission(permissions::PermissionRequestData request_data,
|
||||
BrowserPermissionCallback callback) override;
|
||||
void DecidePermission(
|
||||
std::unique_ptr<permissions::PermissionRequestData> request_data,
|
||||
BrowserPermissionCallback callback) override;
|
||||
|
||||
bool IsPendingGroupedRequestsEmptyForTesting();
|
||||
|
||||
@@ -87,12 +88,11 @@ class PermissionContextBase : public PermissionContextBase_ChromiumImpl {
|
||||
size_t next_callback_index_ = 0;
|
||||
};
|
||||
|
||||
void PermissionDecided(const PermissionRequestID& id,
|
||||
const GURL& requesting_origin,
|
||||
const GURL& embedding_origin,
|
||||
ContentSetting content_setting,
|
||||
bool is_one_time,
|
||||
bool is_final_decision) override;
|
||||
void PermissionDecided(
|
||||
ContentSetting content_setting,
|
||||
bool is_one_time,
|
||||
bool is_final_decision,
|
||||
const std::unique_ptr<PermissionRequestData>& request_data) override;
|
||||
void CleanUpRequest(content::WebContents* web_contents,
|
||||
const PermissionRequestID& id,
|
||||
bool embedded_permission_element_initiated) override;
|
||||
|
||||
@@ -99,19 +99,7 @@ const unsigned int IDS_VR_PERMISSION_FRAGMENT_OVERRIDE =
|
||||
namespace permissions {
|
||||
|
||||
PermissionRequest::PermissionRequest(
|
||||
const GURL& requesting_origin,
|
||||
RequestType request_type,
|
||||
bool has_gesture,
|
||||
PermissionDecidedCallback permission_decided_callback,
|
||||
base::OnceClosure delete_callback)
|
||||
: PermissionRequest_ChromiumImpl(requesting_origin,
|
||||
request_type,
|
||||
has_gesture,
|
||||
std::move(permission_decided_callback),
|
||||
std::move(delete_callback)) {}
|
||||
|
||||
PermissionRequest::PermissionRequest(
|
||||
PermissionRequestData request_data,
|
||||
std::unique_ptr<PermissionRequestData> request_data,
|
||||
PermissionDecidedCallback permission_decided_callback,
|
||||
base::OnceClosure delete_callback,
|
||||
bool uses_automatic_embargo)
|
||||
|
||||
@@ -29,16 +29,10 @@ namespace permissions {
|
||||
|
||||
class PermissionRequest : public PermissionRequest_ChromiumImpl {
|
||||
public:
|
||||
PermissionRequest(const GURL& requesting_origin,
|
||||
RequestType request_type,
|
||||
bool has_gesture,
|
||||
PermissionDecidedCallback permission_decided_callback,
|
||||
base::OnceClosure delete_callback);
|
||||
|
||||
PermissionRequest(PermissionRequestData request_data,
|
||||
PermissionRequest(std::unique_ptr<PermissionRequestData> request_data,
|
||||
PermissionDecidedCallback permission_decided_callback,
|
||||
base::OnceClosure delete_callback,
|
||||
bool uses_automatic_embargo);
|
||||
bool uses_automatic_embargo = true);
|
||||
|
||||
PermissionRequest(const PermissionRequest&) = delete;
|
||||
PermissionRequest& operator=(const PermissionRequest&) = delete;
|
||||
|
||||
@@ -65,11 +65,11 @@ bool BraveWalletPermissionContext::IsRestrictedToSecureOrigins() const {
|
||||
}
|
||||
|
||||
void BraveWalletPermissionContext::RequestPermission(
|
||||
PermissionRequestData request_data,
|
||||
std::unique_ptr<PermissionRequestData> request_data,
|
||||
BrowserPermissionCallback callback) {
|
||||
const std::string id_str = request_data.id.ToString();
|
||||
const std::string id_str = request_data->id.ToString();
|
||||
url::Origin requesting_origin =
|
||||
url::Origin::Create(request_data.requesting_origin);
|
||||
url::Origin::Create(request_data->requesting_origin);
|
||||
url::Origin origin;
|
||||
permissions::RequestType type =
|
||||
ContentSettingsTypeToRequestType(content_settings_type());
|
||||
@@ -83,13 +83,12 @@ void BraveWalletPermissionContext::RequestPermission(
|
||||
type, requesting_origin, &origin,
|
||||
is_new_id ? &address_queue : nullptr)) {
|
||||
content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(
|
||||
request_data.id.global_render_frame_host_id());
|
||||
request_data->id.global_render_frame_host_id());
|
||||
content::WebContents* web_contents =
|
||||
content::WebContents::FromRenderFrameHost(rfh);
|
||||
GURL embedding_origin =
|
||||
url::Origin::Create(web_contents->GetLastCommittedURL()).GetURL();
|
||||
NotifyPermissionSet(request_data.id, requesting_origin.GetURL(),
|
||||
embedding_origin, std::move(callback),
|
||||
NotifyPermissionSet(std::move(request_data), std::move(callback),
|
||||
/*persist=*/false, CONTENT_SETTING_BLOCK,
|
||||
/*is_one_time=*/false,
|
||||
/*is_final_decision=*/true);
|
||||
@@ -114,12 +113,13 @@ void BraveWalletPermissionContext::RequestPermission(
|
||||
if (addr_queue.empty()) {
|
||||
request_address_queues_.erase(addr_queue_it);
|
||||
}
|
||||
auto data =
|
||||
PermissionRequestData(this, request_data.id, request_data.user_gesture,
|
||||
sub_request_origin->GetURL());
|
||||
std::unique_ptr<PermissionRequestData> data =
|
||||
std::make_unique<PermissionRequestData>(this, request_data->id,
|
||||
request_data->user_gesture,
|
||||
sub_request_origin->GetURL());
|
||||
// This will prevent PermissionRequestManager from reprioritize the request
|
||||
// queue.
|
||||
data.embedded_permission_element_initiated = true;
|
||||
data->embedded_permission_element_initiated = true;
|
||||
PermissionContextBase::RequestPermission(std::move(data),
|
||||
std::move(callback));
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ class BraveWalletPermissionContext : public PermissionContextBase {
|
||||
* will then consume one address from the saved list and call
|
||||
* PermissionContextBase::RequestPermission with it.
|
||||
*/
|
||||
void RequestPermission(PermissionRequestData request_data,
|
||||
void RequestPermission(std::unique_ptr<PermissionRequestData> request_data,
|
||||
BrowserPermissionCallback callback) override;
|
||||
|
||||
static void RequestPermissions(
|
||||
|
||||
Reference in New Issue
Block a user