Skip to content

Commit

Permalink
[PEPC] Add view that informs user they previously denied permission
Browse files Browse the repository at this point in the history
Let the user know that they previously denied permission
to the site. Additionally give them the option to grant
permission or not.

Bug: 1462930
Change-Id: I99b51740345e72acaefcc1090d13ff5521624da8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4876674
Reviewed-by: Thomas Nguyen <tungnh@chromium.org>
Commit-Queue: Thomas Nguyen <tungnh@chromium.org>
Auto-Submit: Kamila Hasanbega <hkamila@google.com>
Cr-Commit-Position: refs/heads/main@{#1210767}
  • Loading branch information
hkamila authored and Chromium LUCI CQ committed Oct 17, 2023
1 parent 1c99b66 commit 1216f92
Show file tree
Hide file tree
Showing 13 changed files with 171 additions and 16 deletions.
2 changes: 2 additions & 0 deletions chrome/browser/ui/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -5463,6 +5463,8 @@ static_library("ui") {
"views/permissions/embedded_permission_prompt_base_view.h",
"views/permissions/embedded_permission_prompt_policy_view.cc",
"views/permissions/embedded_permission_prompt_policy_view.h",
"views/permissions/embedded_permission_prompt_previously_denied_view.cc",
"views/permissions/embedded_permission_prompt_previously_denied_view.h",
"views/permissions/embedded_permission_prompt_previously_granted_view.cc",
"views/permissions/embedded_permission_prompt_previously_granted_view.h",
"views/permissions/permission_prompt_base_view.cc",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ void EmbeddedPermissionPromptAskView::RunButtonCallback(int button_id) {
}

std::vector<EmbeddedPermissionPromptAskView::RequestLineConfiguration>
EmbeddedPermissionPromptAskView::GetRequestLinesConfiguration() {
EmbeddedPermissionPromptAskView::GetRequestLinesConfiguration() const {
std::vector<RequestLineConfiguration> lines;

for (auto* request : delegate()->Requests()) {
Expand All @@ -52,7 +52,7 @@ EmbeddedPermissionPromptAskView::GetRequestLinesConfiguration() {
}

std::vector<EmbeddedPermissionPromptAskView::ButtonConfiguration>
EmbeddedPermissionPromptAskView::GetButtonsConfiguration() {
EmbeddedPermissionPromptAskView::GetButtonsConfiguration() const {
std::vector<ButtonConfiguration> buttons;
if (base::FeatureList::IsEnabled(permissions::features::kOneTimePermission)) {
buttons.emplace_back(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,9 @@ class EmbeddedPermissionPromptAskView
void RunButtonCallback(int type) override;

protected:
std::vector<RequestLineConfiguration> GetRequestLinesConfiguration() override;
std::vector<ButtonConfiguration> GetButtonsConfiguration() override;
std::vector<RequestLineConfiguration> GetRequestLinesConfiguration()
const override;
std::vector<ButtonConfiguration> GetButtonsConfiguration() const override;

private:
std::u16string GetMessageText() const;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ class EmbeddedPermissionPromptBaseView : public PermissionPromptBaseView {
kStopAllowing = 3,
kClose = 4,
kAllowThisTime = 5,
kContinueNotAllowing = 6,
};

struct RequestLineConfiguration {
Expand All @@ -86,9 +87,9 @@ class EmbeddedPermissionPromptBaseView : public PermissionPromptBaseView {
}

// Configuration that needs to be implemented by subclasses
virtual std::vector<RequestLineConfiguration>
GetRequestLinesConfiguration() = 0;
virtual std::vector<ButtonConfiguration> GetButtonsConfiguration() = 0;
virtual std::vector<RequestLineConfiguration> GetRequestLinesConfiguration()
const = 0;
virtual std::vector<ButtonConfiguration> GetButtonsConfiguration() const = 0;

base::WeakPtr<permissions::PermissionPrompt::Delegate>& delegate() {
return delegate_;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,15 @@ void EmbeddedPermissionPromptPolicyView::RunButtonCallback(int button_id) {
}

std::vector<EmbeddedPermissionPromptPolicyView::RequestLineConfiguration>
EmbeddedPermissionPromptPolicyView::GetRequestLinesConfiguration() {
EmbeddedPermissionPromptPolicyView::GetRequestLinesConfiguration() const {
std::vector<RequestLineConfiguration> lines;
lines.emplace_back(&vector_icons::kBusinessIcon, GetMessageText());

return lines;
}

std::vector<EmbeddedPermissionPromptPolicyView::ButtonConfiguration>
EmbeddedPermissionPromptPolicyView::GetButtonsConfiguration() {
EmbeddedPermissionPromptPolicyView::GetButtonsConfiguration() const {
std::vector<ButtonConfiguration> buttons;
buttons.emplace_back(l10n_util::GetStringUTF16(IDS_EMBEDDED_PROMPT_OK_LABEL),
ButtonType::kPolicyOK, ui::ButtonStyle::kTonal);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,9 @@ class EmbeddedPermissionPromptPolicyView
void RunButtonCallback(int type) override;

protected:
std::vector<RequestLineConfiguration> GetRequestLinesConfiguration() override;
std::vector<ButtonConfiguration> GetButtonsConfiguration() override;
std::vector<RequestLineConfiguration> GetRequestLinesConfiguration()
const override;
std::vector<ButtonConfiguration> GetButtonsConfiguration() const override;

private:
std::u16string GetMessageText() const;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

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

#include "base/memory/weak_ptr.h"

#include "chrome/browser/ui/url_identity.h"
#include "components/permissions/features.h"
#include "components/strings/grit/components_strings.h"
#include "components/vector_icons/vector_icons.h"
#include "ui/base/l10n/l10n_util.h"

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

EmbeddedPermissionPromptPreviouslyDeniedView::
~EmbeddedPermissionPromptPreviouslyDeniedView() = default;

std::u16string
EmbeddedPermissionPromptPreviouslyDeniedView::GetAccessibleWindowTitle() const {
return GetMessageText();
}

std::u16string EmbeddedPermissionPromptPreviouslyDeniedView::GetWindowTitle()
const {
return std::u16string();
}

void EmbeddedPermissionPromptPreviouslyDeniedView::RunButtonCallback(
int button_id) {
if (!delegate()) {
return;
}

ButtonType button = GetButtonType(button_id);

if (button == ButtonType::kContinueNotAllowing) {
// The permission is already denied.
return;
}

if (button == ButtonType::kAllowThisTime) {
delegate()->AcceptThisTime();
}

if (button == ButtonType::kAllow) {
delegate()->Accept();
}
}

std::vector<
EmbeddedPermissionPromptPreviouslyDeniedView::RequestLineConfiguration>
EmbeddedPermissionPromptPreviouslyDeniedView::GetRequestLinesConfiguration()
const {
return {{/*icon=*/nullptr, GetMessageText()}};
}

std::vector<EmbeddedPermissionPromptPreviouslyDeniedView::ButtonConfiguration>
EmbeddedPermissionPromptPreviouslyDeniedView::GetButtonsConfiguration() const {
std::vector<ButtonConfiguration> buttons;
buttons.emplace_back(
l10n_util::GetStringUTF16(IDS_EMBEDDED_PROMPT_CONTINUE_NOT_ALLOWING),
ButtonType::kContinueNotAllowing, ui::ButtonStyle::kTonal);

if (base::FeatureList::IsEnabled(permissions::features::kOneTimePermission)) {
buttons.emplace_back(
l10n_util::GetStringUTF16(IDS_PERMISSION_ALLOW_THIS_TIME),
ButtonType::kAllowThisTime, ui::ButtonStyle::kTonal);
} else {
buttons.emplace_back(
l10n_util::GetStringUTF16(IDS_PERMISSION_ALLOW_THIS_TIME),
ButtonType::kAllow, ui::ButtonStyle::kTonal);
}
return buttons;
}

std::u16string EmbeddedPermissionPromptPreviouslyDeniedView::GetMessageText()
const {
const auto& requests = delegate()->Requests();
CHECK_GT(requests.size(), 0U);

std::u16string permission_name;
if (requests.size() == 2) {
permission_name = l10n_util::GetStringUTF16(
IDS_CAMERA_AND_MICROPHONE_PERMISSION_NAME_FRAGMENT);
} else {
permission_name = requests[0]->GetPermissionNameTextFragment();
}

return l10n_util::GetStringFUTF16(IDS_EMBEDDED_PROMPT_PREVIOUSLY_NOT_ALLOWED,
permission_name,
GetUrlIdentityObject().name);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_UI_VIEWS_PERMISSIONS_EMBEDDED_PERMISSION_PROMPT_PREVIOUSLY_DENIED_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_PERMISSIONS_EMBEDDED_PERMISSION_PROMPT_PREVIOUSLY_DENIED_VIEW_H_

#include <string>
#include <vector>

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

class Browser;

// A view used to display information to the user that they previously denied
// permission to a site.
class EmbeddedPermissionPromptPreviouslyDeniedView
: public EmbeddedPermissionPromptBaseView {
public:
EmbeddedPermissionPromptPreviouslyDeniedView(
Browser* browser,
base::WeakPtr<permissions::PermissionPrompt::Delegate> delegate);
EmbeddedPermissionPromptPreviouslyDeniedView(
const EmbeddedPermissionPromptPreviouslyDeniedView&) = delete;
EmbeddedPermissionPromptPreviouslyDeniedView& operator=(
const EmbeddedPermissionPromptPreviouslyDeniedView&) = delete;
~EmbeddedPermissionPromptPreviouslyDeniedView() override;

std::u16string GetAccessibleWindowTitle() const override;
std::u16string GetWindowTitle() const override;
void RunButtonCallback(int type) override;

protected:
std::vector<RequestLineConfiguration> GetRequestLinesConfiguration()
const override;
std::vector<ButtonConfiguration> GetButtonsConfiguration() const override;

private:
std::u16string GetMessageText() const;
};

#endif // CHROME_BROWSER_UI_VIEWS_PERMISSIONS_EMBEDDED_PERMISSION_PROMPT_PREVIOUSLY_DENIED_VIEW_H_
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,13 @@ void EmbeddedPermissionPromptPreviouslyGrantedView::RunButtonCallback(

std::vector<
EmbeddedPermissionPromptPreviouslyGrantedView::RequestLineConfiguration>
EmbeddedPermissionPromptPreviouslyGrantedView::GetRequestLinesConfiguration() {
EmbeddedPermissionPromptPreviouslyGrantedView::GetRequestLinesConfiguration()
const {
return {{/*icon=*/nullptr, GetMessageText()}};
}

std::vector<EmbeddedPermissionPromptPreviouslyGrantedView::ButtonConfiguration>
EmbeddedPermissionPromptPreviouslyGrantedView::GetButtonsConfiguration() {
EmbeddedPermissionPromptPreviouslyGrantedView::GetButtonsConfiguration() const {
std::vector<ButtonConfiguration> buttons;
buttons.emplace_back(
l10n_util::GetStringUTF16(IDS_EMBEDDED_PROMPT_CONTINUE_ALLOWING),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,9 @@ class EmbeddedPermissionPromptPreviouslyGrantedView
void RunButtonCallback(int type) override;

protected:
std::vector<RequestLineConfiguration> GetRequestLinesConfiguration() override;
std::vector<ButtonConfiguration> GetButtonsConfiguration() override;
std::vector<RequestLineConfiguration> GetRequestLinesConfiguration()
const override;
std::vector<ButtonConfiguration> GetButtonsConfiguration() const override;

private:
std::u16string GetMessageText() const;
Expand Down
7 changes: 6 additions & 1 deletion components/permissions_strings.grdp
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,9 @@ This will otherwise be blocked by your privacy settings. This will allow the con
<message name="IDS_EMBEDDED_PROMPT_PREVIOUSLY_ALLOWED" desc="Text informing the user that they already granted permission to the site">
You have allowed <ph name="permission">$1<ex>camera</ex></ph> on <ph name="Origin">$1<ex>www.google.com</ex></ph>
</message>
<!-- Embedded permission prompts: permission name fragments -->
<message name="IDS_EMBEDDED_PROMPT_PREVIOUSLY_NOT_ALLOWED" desc="Text informing the user that they previously denied permission to the site">
You previously didn't allow <ph name="permission">$1<ex>camera</ex></ph> on <ph name="Origin">$1<ex>www.google.com</ex></ph>
</message>
<message name="IDS_CAMERA_PERMISSION_NAME_FRAGMENT" desc="Text fragment identifying the camera permission">
camera
</message>
Expand All @@ -391,4 +393,7 @@ This will otherwise be blocked by your privacy settings. This will allow the con
<message name="IDS_EMBEDDED_PROMPT_STOP_ALLOWING" desc="Label on button to stop allowing a permissions , when the user clicks on the embedded permission element but they have previously granted permission to the site">
Stop allowing <ph name="permission">$1<ex>camera</ex></ph>
</message>
<message name="IDS_EMBEDDED_PROMPT_CONTINUE_NOT_ALLOWING" desc="Label used on a button that to continue not allowing a permission prompt that the user has previously also not allowed for the site.">
Continue not allowing
</message>
</grit-part>
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
23ba382603c7c838ba78dd1216a067593c1df229
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
23ba382603c7c838ba78dd1216a067593c1df229

0 comments on commit 1216f92

Please sign in to comment.