Skip to content

Commit

Permalink
[PEPC] Save setting without finalizing request and allow switching sc…
Browse files Browse the repository at this point in the history
…reens

Change-Id: Id2834a1638186a0f515bd7b3cefa30f321aed46b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4941771
Reviewed-by: Thomas Nguyen <tungnh@chromium.org>
Commit-Queue: Andy Paicu <andypaicu@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1216898}
  • Loading branch information
andypaicu authored and Chromium LUCI CQ committed Oct 30, 2023
1 parent 754e352 commit 5d8e293
Show file tree
Hide file tree
Showing 32 changed files with 284 additions and 126 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class TestPermissionBubbleViewDelegate
void Deny() override {}
void Dismiss() override {}
void Ignore() override {}
void FinalizeCurrentRequests() override {}
void OpenHelpCenterLink(const ui::Event& event) override {}
void PreIgnoreQuietPrompt() override {}
void SetManageClicked() override {}
Expand Down
142 changes: 100 additions & 42 deletions chrome/browser/ui/views/permissions/embedded_permission_prompt.cc
Original file line number Diff line number Diff line change
Expand Up @@ -42,53 +42,101 @@ bool IsPermissionSetByAdministator(ContentSetting setting,
EmbeddedPermissionPrompt::EmbeddedPermissionPrompt(
Browser* browser,
content::WebContents* web_contents,
Delegate* delegate)
permissions::PermissionPrompt::Delegate* delegate)
: PermissionPromptDesktop(browser, web_contents, delegate),
delegate_(delegate) {
raw_ptr<HostContentSettingsMap> map =
HostContentSettingsMapFactory::GetForProfile(
Profile::FromBrowserContext(web_contents->GetBrowserContext()));
CloseCurrentViewAndMaybeShowNext(/*first_prompt=*/true);
}

EmbeddedPermissionPrompt::~EmbeddedPermissionPrompt() {
CloseView();
}

base::WeakPtr<permissions::PermissionPrompt::Delegate>
EmbeddedPermissionPrompt::GetPermissionPromptDelegate() const {
return delegate_->GetWeakPtr();
}

// static
EmbeddedPermissionPrompt::Variant
EmbeddedPermissionPrompt::DeterminePromptVariant(
ContentSetting setting,
const content_settings::SettingInfo& info) {
if (IsPermissionSetByAdministator(setting, info)) {
return setting == CONTENT_SETTING_ALLOW ? Variant::kAdministratorGranted
: Variant::kAdministratorDenied;
}

switch (setting) {
case CONTENT_SETTING_ASK:
return Variant::kAsk;
case CONTENT_SETTING_ALLOW:
return Variant::kPreviouslyGranted;
case CONTENT_SETTING_BLOCK:
return Variant::kPreviouslyDenied;
default:
break;
}

return Variant::kUninitialized;
}

void EmbeddedPermissionPrompt::CloseCurrentViewAndMaybeShowNext(
bool first_prompt) {
if (!first_prompt) {
CloseView();
}

auto* map = HostContentSettingsMapFactory::GetForProfile(
Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
content_settings::SettingInfo info;

embedded_prompt_variant_ = Variant::kUninitialized;
for (const auto* request : delegate->Requests()) {
for (const auto* request : delegate()->Requests()) {
ContentSettingsType type = request->GetContentSettingsType();
ContentSetting setting =
map->GetContentSetting(delegate->GetRequestingOrigin(),
delegate_->GetEmbeddingOrigin(), type, &info);
map->GetContentSetting(delegate()->GetRequestingOrigin(),
delegate()->GetEmbeddingOrigin(), type, &info);
Variant current_request_variant = DeterminePromptVariant(setting, info);
embedded_prompt_variant_ = HigherPriorityVariant(embedded_prompt_variant_,
current_request_variant);
}

switch (embedded_prompt_variant_) {
case Variant::kAsk:
prompt_view_ =
new EmbeddedPermissionPromptAskView(browser, delegate->GetWeakPtr());
prompt_view_ = new EmbeddedPermissionPromptAskView(
browser(), weak_factory_.GetWeakPtr());
break;
case Variant::kPreviouslyGranted:
prompt_view_ = new EmbeddedPermissionPromptPreviouslyGrantedView(
browser, delegate->GetWeakPtr());
if (first_prompt) {
prompt_view_ = new EmbeddedPermissionPromptPreviouslyGrantedView(
browser(), weak_factory_.GetWeakPtr());
} else {
delegate()->FinalizeCurrentRequests();
return;
}
break;
case Variant::kPreviouslyDenied:
prompt_view_ = new EmbeddedPermissionPromptPreviouslyDeniedView(
browser, delegate->GetWeakPtr());
browser(), weak_factory_.GetWeakPtr());
break;
case Variant::kOsPrompt:
prompt_view_ = new EmbeddedPermissionPromptShowSystemPromptView(
browser, delegate->GetWeakPtr());
browser(), weak_factory_.GetWeakPtr());
break;
case Variant::kOsSystemSettings:
prompt_view_ = new EmbeddedPermissionPromptSystemSettingsView(
browser, delegate->GetWeakPtr());
browser(), weak_factory_.GetWeakPtr());
break;
case Variant::kAdministratorGranted:
prompt_view_ = new EmbeddedPermissionPromptPolicyView(
browser, delegate->GetWeakPtr(), /*is_permission_allowed=*/true);
browser(), weak_factory_.GetWeakPtr(),
/*is_permission_allowed=*/true);
break;
case Variant::kAdministratorDenied:
prompt_view_ = new EmbeddedPermissionPromptPolicyView(
browser, delegate->GetWeakPtr(), /*is_permission_allowed=*/false);
browser(), weak_factory_.GetWeakPtr(),
/*is_permission_allowed=*/false);
break;
case Variant::kUninitialized:
NOTREACHED();
Expand All @@ -99,34 +147,14 @@ EmbeddedPermissionPrompt::EmbeddedPermissionPrompt(
}
}

EmbeddedPermissionPrompt::~EmbeddedPermissionPrompt() {
if (prompt_view_) {
prompt_view_->GetWidget()->Close();
}
}

// static
EmbeddedPermissionPrompt::Variant
EmbeddedPermissionPrompt::DeterminePromptVariant(
ContentSetting setting,
const content_settings::SettingInfo& info) {
if (IsPermissionSetByAdministator(setting, info)) {
return setting == CONTENT_SETTING_ALLOW ? Variant::kAdministratorGranted
: Variant::kAdministratorDenied;
void EmbeddedPermissionPrompt::CloseView() {
if (!prompt_view_) {
return;
}

switch (setting) {
case CONTENT_SETTING_ASK:
return Variant::kAsk;
case CONTENT_SETTING_ALLOW:
return Variant::kPreviouslyGranted;
case CONTENT_SETTING_BLOCK:
return Variant::kPreviouslyDenied;
default:
break;
}

return Variant::kUninitialized;
prompt_view_->PrepareToClose();
prompt_view_->GetWidget()->Close();
prompt_view_ = nullptr;
}

EmbeddedPermissionPrompt::TabSwitchingBehavior
Expand All @@ -138,3 +166,33 @@ permissions::PermissionPromptDisposition
EmbeddedPermissionPrompt::GetPromptDisposition() const {
return permissions::PermissionPromptDisposition::ELEMENT_ANCHORED_BUBBLE;
}

bool EmbeddedPermissionPrompt::ShouldFinalizeRequestAfterDecided() const {
return false;
}

void EmbeddedPermissionPrompt::Allow() {
delegate_->Accept();
CloseCurrentViewAndMaybeShowNext(/*first_prompt=*/false);
}

void EmbeddedPermissionPrompt::AllowThisTime() {
delegate_->AcceptThisTime();
CloseCurrentViewAndMaybeShowNext(/*first_prompt=*/false);
}

void EmbeddedPermissionPrompt::Dismiss() {
delegate_->Dismiss();
delegate_->FinalizeCurrentRequests();
}

void EmbeddedPermissionPrompt::Acknowledge() {
// TOOO(crbug.com/1462930): Find how to distinguish between a dismiss and an
// acknowledge.
delegate_->FinalizeCurrentRequests();
}

void EmbeddedPermissionPrompt::StopAllowing() {
// TODO(crbug.com/1462930): Implement.
NOTREACHED();
}
26 changes: 23 additions & 3 deletions chrome/browser/ui/views/permissions/embedded_permission_prompt.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,24 @@
#ifndef CHROME_BROWSER_UI_VIEWS_PERMISSIONS_EMBEDDED_PERMISSION_PROMPT_H_
#define CHROME_BROWSER_UI_VIEWS_PERMISSIONS_EMBEDDED_PERMISSION_PROMPT_H_

#include "base/memory/weak_ptr.h"
#include "chrome/browser/ui/views/permissions/embedded_permission_prompt_base_view.h"
#include "chrome/browser/ui/views/permissions/permission_prompt_desktop.h"
#include "components/permissions/permission_prompt.h"

class Browser;

namespace content {
class WebContents;
}

class EmbeddedPermissionPrompt : public PermissionPromptDesktop {
class EmbeddedPermissionPrompt
: public PermissionPromptDesktop,
public EmbeddedPermissionPromptBaseView::Delegate {
public:
EmbeddedPermissionPrompt(Browser* browser,
content::WebContents* web_contents,
Delegate* delegate);
permissions::PermissionPrompt::Delegate* delegate);
~EmbeddedPermissionPrompt() override;
EmbeddedPermissionPrompt(const EmbeddedPermissionPrompt&) = delete;
EmbeddedPermissionPrompt& operator=(const EmbeddedPermissionPrompt&) = delete;
Expand Down Expand Up @@ -50,20 +54,36 @@ class EmbeddedPermissionPrompt : public PermissionPromptDesktop {
kAdministratorDenied = 7,
};

void CloseCurrentViewAndMaybeShowNext(bool first_prompt);

void CloseView();

// permissions::PermissionPrompt:
TabSwitchingBehavior GetTabSwitchingBehavior() override;
permissions::PermissionPromptDisposition GetPromptDisposition()
const override;
bool ShouldFinalizeRequestAfterDecided() const override;

// EmbeddedPermissionPromptBaseView::Delegate
void Allow() override;
void AllowThisTime() override;
void Dismiss() override;
void Acknowledge() override;
void StopAllowing() override;
base::WeakPtr<permissions::PermissionPrompt::Delegate>
GetPermissionPromptDelegate() const override;

private:
static Variant DeterminePromptVariant(
ContentSetting setting,
const content_settings::SettingInfo& info);

Variant embedded_prompt_variant_;
Variant embedded_prompt_variant_ = Variant::kUninitialized;
raw_ptr<EmbeddedPermissionPromptBaseView> prompt_view_;

raw_ptr<permissions::PermissionPrompt::Delegate> delegate_;

base::WeakPtrFactory<EmbeddedPermissionPrompt> weak_factory_{this};
};

#endif // CHROME_BROWSER_UI_VIEWS_PERMISSIONS_EMBEDDED_PERMISSION_PROMPT_H_
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

EmbeddedPermissionPromptAskView::EmbeddedPermissionPromptAskView(
Browser* browser,
base::WeakPtr<permissions::PermissionPrompt::Delegate> delegate)
base::WeakPtr<Delegate> delegate)
: EmbeddedPermissionPromptBaseView(browser, delegate) {}

EmbeddedPermissionPromptAskView::~EmbeddedPermissionPromptAskView() = default;
Expand All @@ -33,9 +33,9 @@ void EmbeddedPermissionPromptAskView::RunButtonCallback(int button_id) {

if (delegate()) {
if (button == ButtonType::kAllowThisTime) {
delegate()->AcceptThisTime();
delegate()->AllowThisTime();
} else if (button == ButtonType::kAllow) {
delegate()->Accept();
delegate()->Allow();
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,8 @@ class Browser;
class EmbeddedPermissionPromptAskView
: public EmbeddedPermissionPromptBaseView {
public:
EmbeddedPermissionPromptAskView(
Browser* browser,
base::WeakPtr<permissions::PermissionPrompt::Delegate> delegate);
EmbeddedPermissionPromptAskView(Browser* browser,
base::WeakPtr<Delegate> delegate);
EmbeddedPermissionPromptAskView(const EmbeddedPermissionPromptAskView&) =
delete;
EmbeddedPermissionPromptAskView& operator=(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include "chrome/browser/ui/views/permissions/embedded_permission_prompt_base_view.h"

#include "base/functional/callback_helpers.h"
#include "chrome/browser/platform_util.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
Expand All @@ -28,10 +29,21 @@ constexpr int DISTANCE_BUTTON_VERTICAL = 8;

} // namespace

const std::vector<permissions::PermissionRequest*>&
EmbeddedPermissionPromptBaseView::Delegate::Requests() const {
if (auto permission_prompt_delegate = GetPermissionPromptDelegate()) {
return permission_prompt_delegate->Requests();
}
NOTREACHED();
static const std::vector<permissions::PermissionRequest*> empty_requests;
return empty_requests;
}

EmbeddedPermissionPromptBaseView::EmbeddedPermissionPromptBaseView(
Browser* browser,
base::WeakPtr<permissions::PermissionPrompt::Delegate> delegate)
: PermissionPromptBaseView(browser, delegate),
base::WeakPtr<Delegate> delegate)
: PermissionPromptBaseView(browser,
delegate->GetPermissionPromptDelegate()),
browser_(browser),
delegate_(delegate) {}

Expand Down Expand Up @@ -60,6 +72,10 @@ void EmbeddedPermissionPromptBaseView::ClosingPermission() {
}
}

void EmbeddedPermissionPromptBaseView::PrepareToClose() {
DialogDelegate::SetCloseCallback(base::DoNothing());
}

void EmbeddedPermissionPromptBaseView::ShowWidget() {
GetWidget()->Show();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,20 @@ class Browser;

class EmbeddedPermissionPromptBaseView : public PermissionPromptBaseView {
public:
EmbeddedPermissionPromptBaseView(
Browser* browser,
base::WeakPtr<permissions::PermissionPrompt::Delegate> delegate);
class Delegate {
public:
virtual void Allow() = 0;
virtual void AllowThisTime() = 0;
virtual void Dismiss() = 0;
virtual void Acknowledge() = 0;
virtual void StopAllowing() = 0;
virtual base::WeakPtr<permissions::PermissionPrompt::Delegate>
GetPermissionPromptDelegate() const = 0;
const std::vector<permissions::PermissionRequest*>& Requests() const;
};

EmbeddedPermissionPromptBaseView(Browser* browser,
base::WeakPtr<Delegate> delegate);
EmbeddedPermissionPromptBaseView(const EmbeddedPermissionPromptBaseView&) =
delete;
EmbeddedPermissionPromptBaseView& operator=(
Expand All @@ -54,6 +65,7 @@ class EmbeddedPermissionPromptBaseView : public PermissionPromptBaseView {
void UpdateAnchorPosition();
void ShowWidget();
void ClosingPermission();
void PrepareToClose();

// views::BubbleDialogDelegateView:
bool ShouldShowCloseButton() const override;
Expand Down Expand Up @@ -92,13 +104,8 @@ class EmbeddedPermissionPromptBaseView : public PermissionPromptBaseView {
const = 0;
virtual std::vector<ButtonConfiguration> GetButtonsConfiguration() const = 0;

base::WeakPtr<permissions::PermissionPrompt::Delegate>& delegate() {
return delegate_;
}
const base::WeakPtr<permissions::PermissionPrompt::Delegate>& delegate()
const {
return delegate_;
}
base::WeakPtr<Delegate>& delegate() { return delegate_; }
const base::WeakPtr<Delegate>& delegate() const { return delegate_; }

private:
void CreateWidget();
Expand All @@ -107,7 +114,7 @@ class EmbeddedPermissionPromptBaseView : public PermissionPromptBaseView {
const ButtonConfiguration& button);

const raw_ptr<Browser> browser_;
base::WeakPtr<permissions::PermissionPrompt::Delegate> delegate_;
base::WeakPtr<Delegate> delegate_;
};

#endif // CHROME_BROWSER_UI_VIEWS_PERMISSIONS_EMBEDDED_PERMISSION_PROMPT_BASE_VIEW_H_

0 comments on commit 5d8e293

Please sign in to comment.