Commit ef44665f authored by Balazs Engedy's avatar Balazs Engedy Committed by Commit Bot

Front-elide origins in chooser bubbles.

Bug: 987465
Change-Id: Id1d4d881f051f5efe0a1ed0e8bfa568813187be2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1718368Reviewed-by: default avatarDana Fried <dfried@chromium.org>
Reviewed-by: default avatarChristopher Thompson <cthomp@chromium.org>
Commit-Queue: Balazs Engedy <engedy@chromium.org>
Cr-Commit-Position: refs/heads/master@{#682920}
parent ac49c006
...@@ -2960,6 +2960,8 @@ jumbo_split_static_library("ui") { ...@@ -2960,6 +2960,8 @@ jumbo_split_static_library("ui") {
"views/permission_bubble/chooser_bubble_ui.cc", "views/permission_bubble/chooser_bubble_ui.cc",
"views/permission_bubble/chooser_bubble_ui.h", "views/permission_bubble/chooser_bubble_ui.h",
"views/permission_bubble/chooser_bubble_ui_views.cc", "views/permission_bubble/chooser_bubble_ui_views.cc",
"views/permission_bubble/front_eliding_title_label.cc",
"views/permission_bubble/front_eliding_title_label.h",
"views/permission_bubble/permission_prompt_impl.cc", "views/permission_bubble/permission_prompt_impl.cc",
"views/permission_bubble/permission_prompt_impl.h", "views/permission_bubble/permission_prompt_impl.h",
"views/permission_bubble/permission_prompt_impl_views.cc", "views/permission_bubble/permission_prompt_impl_views.cc",
......
...@@ -10,11 +10,14 @@ ...@@ -10,11 +10,14 @@
#include "chrome/browser/ui/permission_bubble/chooser_bubble_delegate.h" #include "chrome/browser/ui/permission_bubble/chooser_bubble_delegate.h"
#include "chrome/browser/ui/views/bubble_anchor_util_views.h" #include "chrome/browser/ui/views/bubble_anchor_util_views.h"
#include "chrome/browser/ui/views/device_chooser_content_view.h" #include "chrome/browser/ui/views/device_chooser_content_view.h"
#include "chrome/browser/ui/views/permission_bubble/front_eliding_title_label.h"
#include "components/bubble/bubble_controller.h" #include "components/bubble/bubble_controller.h"
#include "ui/views/bubble/bubble_dialog_delegate_view.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h"
#include "ui/views/bubble/bubble_frame_view.h"
#include "ui/views/controls/button/label_button.h" #include "ui/views/controls/button/label_button.h"
#include "ui/views/controls/styled_label.h" #include "ui/views/controls/styled_label.h"
#include "ui/views/controls/table/table_view_observer.h" #include "ui/views/controls/table/table_view_observer.h"
#include "ui/views/layout/fill_layout.h"
#include "ui/views/window/dialog_client_view.h" #include "ui/views/window/dialog_client_view.h"
using bubble_anchor_util::AnchorConfiguration; using bubble_anchor_util::AnchorConfiguration;
...@@ -41,6 +44,9 @@ class ChooserBubbleUiViewDelegate : public views::BubbleDialogDelegateView, ...@@ -41,6 +44,9 @@ class ChooserBubbleUiViewDelegate : public views::BubbleDialogDelegateView,
std::unique_ptr<ChooserController> chooser_controller); std::unique_ptr<ChooserController> chooser_controller);
~ChooserBubbleUiViewDelegate() override; ~ChooserBubbleUiViewDelegate() override;
// views::View:
void AddedToWidget() override;
// views::WidgetDelegate: // views::WidgetDelegate:
base::string16 GetWindowTitle() const override; base::string16 GetWindowTitle() const override;
...@@ -53,11 +59,6 @@ class ChooserBubbleUiViewDelegate : public views::BubbleDialogDelegateView, ...@@ -53,11 +59,6 @@ class ChooserBubbleUiViewDelegate : public views::BubbleDialogDelegateView,
bool Cancel() override; bool Cancel() override;
bool Close() override; bool Close() override;
// views::DialogDelegateView:
views::View* GetContentsView() override;
views::Widget* GetWidget() override;
const views::Widget* GetWidget() const override;
// views::TableViewObserver: // views::TableViewObserver:
void OnSelectionChanged() override; void OnSelectionChanged() override;
...@@ -94,14 +95,22 @@ ChooserBubbleUiViewDelegate::ChooserBubbleUiViewDelegate( ...@@ -94,14 +95,22 @@ ChooserBubbleUiViewDelegate::ChooserBubbleUiViewDelegate(
// | Get help | // | Get help |
// ------------------------------------ // ------------------------------------
SetLayoutManager(std::make_unique<views::FillLayout>());
device_chooser_content_view_ = device_chooser_content_view_ =
new DeviceChooserContentView(this, std::move(chooser_controller)); new DeviceChooserContentView(this, std::move(chooser_controller));
AddChildView(device_chooser_content_view_);
UpdateAnchor(browser); UpdateAnchor(browser);
chrome::RecordDialogCreation(chrome::DialogIdentifier::CHOOSER_UI); chrome::RecordDialogCreation(chrome::DialogIdentifier::CHOOSER_UI);
} }
ChooserBubbleUiViewDelegate::~ChooserBubbleUiViewDelegate() {} ChooserBubbleUiViewDelegate::~ChooserBubbleUiViewDelegate() {}
void ChooserBubbleUiViewDelegate::AddedToWidget() {
GetBubbleFrameView()->SetTitleView(
ConstructFrontElidingTitleLabel(GetWindowTitle()));
}
base::string16 ChooserBubbleUiViewDelegate::GetWindowTitle() const { base::string16 ChooserBubbleUiViewDelegate::GetWindowTitle() const {
return device_chooser_content_view_->GetWindowTitle(); return device_chooser_content_view_->GetWindowTitle();
} }
...@@ -144,18 +153,6 @@ bool ChooserBubbleUiViewDelegate::Close() { ...@@ -144,18 +153,6 @@ bool ChooserBubbleUiViewDelegate::Close() {
return true; return true;
} }
views::View* ChooserBubbleUiViewDelegate::GetContentsView() {
return device_chooser_content_view_;
}
views::Widget* ChooserBubbleUiViewDelegate::GetWidget() {
return device_chooser_content_view_->GetWidget();
}
const views::Widget* ChooserBubbleUiViewDelegate::GetWidget() const {
return device_chooser_content_view_->GetWidget();
}
void ChooserBubbleUiViewDelegate::OnSelectionChanged() { void ChooserBubbleUiViewDelegate::OnSelectionChanged() {
DialogModelChanged(); DialogModelChanged();
} }
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// 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/permission_bubble/front_eliding_title_label.h"
#include "ui/views/accessibility/view_accessibility.h"
std::unique_ptr<views::Label> ConstructFrontElidingTitleLabel(
const base::string16& text) {
auto label =
std::make_unique<views::Label>(text, views::style::CONTEXT_DIALOG_TITLE);
label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
label->SetCollapseWhenHidden(true);
label->GetViewAccessibility().OverrideRole(ax::mojom::Role::kIgnored);
// Elide from head in order to keep the most significant part of the origin
// and avoid spoofing. Note that in English, GetWindowTitle() returns a
// string
// "$ORIGIN wants to", so the "wants to" will not be elided. In other
// languages, the non-origin part may appear fully or partly before the
// origin (e.g., in Filipino, "Gusto ng $ORIGIN na"), which means it may be
// elided. This is not optimal, but it is necessary to avoid origin
// spoofing. See crbug.com/774438.
label->SetElideBehavior(gfx::ELIDE_HEAD);
// Multiline breaks elision, which would mean a very long origin gets
// truncated from the least significant side. Explicitly disable multiline.
label->SetMultiLine(false);
return label;
}
// Copyright 2019 The Chromium Authors. All rights reserved.
// 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_PERMISSION_BUBBLE_FRONT_ELIDING_TITLE_LABEL_H_
#define CHROME_BROWSER_UI_VIEWS_PERMISSION_BUBBLE_FRONT_ELIDING_TITLE_LABEL_H_
#include <memory>
#include "ui/views/controls/label.h"
// Constructs a custom title label for permission and chooser bubbles that takes
// care of eliding the origin from the left, and configures itself to be
// ignored by screen readers (since the bubbles handle the context).
std::unique_ptr<views::Label> ConstructFrontElidingTitleLabel(
const base::string16& text);
#endif // CHROME_BROWSER_UI_VIEWS_PERMISSION_BUBBLE_FRONT_ELIDING_TITLE_LABEL_H_
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "chrome/browser/ui/views/page_info/permission_selector_row.h" #include "chrome/browser/ui/views/page_info/permission_selector_row.h"
#include "chrome/browser/ui/views/page_info/permission_selector_row_observer.h" #include "chrome/browser/ui/views/page_info/permission_selector_row_observer.h"
#include "chrome/browser/ui/views/permission_bubble/front_eliding_title_label.h"
#include "chrome/grit/generated_resources.h" #include "chrome/grit/generated_resources.h"
#include "components/strings/grit/components_strings.h" #include "components/strings/grit/components_strings.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
...@@ -59,23 +60,6 @@ gfx::Rect GetPermissionAnchorRect(Browser* browser) { ...@@ -59,23 +60,6 @@ gfx::Rect GetPermissionAnchorRect(Browser* browser) {
} // namespace } // namespace
// A custom view for the title label that will be ignored by screen readers
// (since the PermissionsBubble handles the context).
class PermissionsLabel : public views::Label {
public:
explicit PermissionsLabel(const base::string16& text)
: views::Label(text, views::style::CONTEXT_DIALOG_TITLE) {}
~PermissionsLabel() override {}
// views::Label:
void GetAccessibleNodeData(ui::AXNodeData* node_data) override {
node_data->role = ax::mojom::Role::kIgnored;
}
private:
DISALLOW_COPY_AND_ASSIGN(PermissionsLabel);
};
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// View implementation for the permissions bubble. // View implementation for the permissions bubble.
class PermissionsBubbleDialogDelegateView class PermissionsBubbleDialogDelegateView
...@@ -166,25 +150,8 @@ void PermissionsBubbleDialogDelegateView::AddedToWidget() { ...@@ -166,25 +150,8 @@ void PermissionsBubbleDialogDelegateView::AddedToWidget() {
if (!name_or_origin_.is_origin) if (!name_or_origin_.is_origin)
return; return;
std::unique_ptr<views::Label> title = GetBubbleFrameView()->SetTitleView(
std::make_unique<PermissionsLabel>(GetWindowTitle()); ConstructFrontElidingTitleLabel(GetWindowTitle()));
title->SetHorizontalAlignment(gfx::ALIGN_LEFT);
title->SetCollapseWhenHidden(true);
title->SetMultiLine(true);
// Elide from head in order to keep the most significant part of the origin
// and avoid spoofing. Note that in English, GetWindowTitle() returns a string
// "$ORIGIN wants to", so the "wants to" will not be elided. In other
// languages, the non-origin part may appear fully or partly before the origin
// (e.g., in Filipino, "Gusto ng $ORIGIN na"), which means it may be elided.
// This is not optimal, but it is necessary to avoid origin spoofing. See
// crbug.com/774438.
title->SetElideBehavior(gfx::ELIDE_HEAD);
// Multiline breaks elision, which would mean a very long origin gets
// truncated from the least significant side. Explicitly disable multiline.
title->SetMultiLine(false);
GetBubbleFrameView()->SetTitleView(std::move(title));
} }
bool PermissionsBubbleDialogDelegateView::ShouldShowCloseButton() const { bool PermissionsBubbleDialogDelegateView::ShouldShowCloseButton() const {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment