Commit d413c169 authored by Danan S's avatar Danan S Committed by Commit Bot

Refactor ExtensionInstallDialogView::PermissionsView into separate file

This is needed in order to include the view of extension permissions in
other dialogs, for example the upcoming parent-permission dialog for
child extension installation.

Bug: 1019908
Change-Id: I82bbf76cb8622fa555c968fd2e6a1f473033c534
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1952525
Commit-Queue: Dan S <danan@chromium.org>
Reviewed-by: default avatarDevlin <rdevlin.cronin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#723514}
parent 7d4ccc02
...@@ -2789,6 +2789,8 @@ jumbo_static_library("ui") { ...@@ -2789,6 +2789,8 @@ jumbo_static_library("ui") {
"views/extensions/bookmark_app_confirmation_view.h", "views/extensions/bookmark_app_confirmation_view.h",
"views/extensions/chooser_dialog_view.cc", "views/extensions/chooser_dialog_view.cc",
"views/extensions/chooser_dialog_view.h", "views/extensions/chooser_dialog_view.h",
"views/extensions/expandable_container_view.cc",
"views/extensions/expandable_container_view.h",
"views/extensions/extension_context_menu_controller.cc", "views/extensions/extension_context_menu_controller.cc",
"views/extensions/extension_context_menu_controller.h", "views/extensions/extension_context_menu_controller.h",
"views/extensions/extension_install_dialog_view.cc", "views/extensions/extension_install_dialog_view.cc",
...@@ -2797,6 +2799,8 @@ jumbo_static_library("ui") { ...@@ -2797,6 +2799,8 @@ jumbo_static_library("ui") {
"views/extensions/extension_installed_bubble_view.h", "views/extensions/extension_installed_bubble_view.h",
"views/extensions/extension_keybinding_registry_views.cc", "views/extensions/extension_keybinding_registry_views.cc",
"views/extensions/extension_keybinding_registry_views.h", "views/extensions/extension_keybinding_registry_views.h",
"views/extensions/extension_permissions_view.cc",
"views/extensions/extension_permissions_view.h",
"views/extensions/extension_uninstall_dialog_view.cc", "views/extensions/extension_uninstall_dialog_view.cc",
"views/extensions/extensions_menu_button.cc", "views/extensions/extensions_menu_button.cc",
"views/extensions/extensions_menu_button.h", "views/extensions/extensions_menu_button.h",
......
// 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/extensions/expandable_container_view.h"
#include <string>
#include <utility>
#include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "chrome/browser/ui/views/chrome_typography.h"
#include "chrome/grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/views/controls/label.h"
#include "ui/views/controls/link.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/layout/grid_layout.h"
// ExpandableContainerView::DetailsView ----------------------------------------
ExpandableContainerView::DetailsView::~DetailsView() = default;
ExpandableContainerView::DetailsView::DetailsView(
const std::vector<base::string16>& details) {
// Spacing between this and the "Hide Details" link.
const int bottom_padding = ChromeLayoutProvider::Get()->GetDistanceMetric(
views::DISTANCE_RELATED_CONTROL_VERTICAL);
SetLayoutManager(std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kVertical,
gfx::Insets(0, 0, bottom_padding, 0),
ChromeLayoutProvider::Get()->GetDistanceMetric(
DISTANCE_RELATED_CONTROL_VERTICAL_SMALL)));
for (const auto& detail : details) {
auto detail_label = std::make_unique<views::Label>(
detail, CONTEXT_BODY_TEXT_LARGE, views::style::STYLE_SECONDARY);
detail_label->SetMultiLine(true);
detail_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
AddChildView(std::move(detail_label));
}
}
gfx::Size ExpandableContainerView::DetailsView::CalculatePreferredSize() const {
return expanded_ ? views::View::CalculatePreferredSize() : gfx::Size();
}
void ExpandableContainerView::DetailsView::ToggleExpanded() {
expanded_ = !expanded_;
PreferredSizeChanged();
}
// ExpandableContainerView -----------------------------------------------------
ExpandableContainerView::ExpandableContainerView(
const std::vector<base::string16>& details,
int available_width)
: details_view_(nullptr), details_link_(nullptr) {
DCHECK(!details.empty());
views::GridLayout* layout =
SetLayoutManager(std::make_unique<views::GridLayout>());
constexpr int kColumnSetId = 0;
views::ColumnSet* column_set = layout->AddColumnSet(kColumnSetId);
// Even though we only have one column, using a GridLayout here will
// properly handle a 0 height row when |details_view_| is collapsed.
column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::LEADING,
views::GridLayout::kFixedSize, views::GridLayout::FIXED,
available_width, 0);
layout->StartRow(views::GridLayout::kFixedSize, kColumnSetId);
details_view_ = layout->AddView(std::make_unique<DetailsView>(details));
layout->StartRow(views::GridLayout::kFixedSize, kColumnSetId);
auto details_link = std::make_unique<views::Link>(
l10n_util::GetStringUTF16(IDS_EXTENSIONS_SHOW_DETAILS));
details_link->set_listener(this);
details_link->SetHorizontalAlignment(gfx::ALIGN_LEFT);
details_link_ = layout->AddView(std::move(details_link));
}
ExpandableContainerView::~ExpandableContainerView() {}
void ExpandableContainerView::LinkClicked(views::Link* source,
int event_flags) {
ToggleDetailLevel();
}
void ExpandableContainerView::ChildPreferredSizeChanged(views::View* child) {
PreferredSizeChanged();
}
void ExpandableContainerView::ToggleDetailLevel() {
details_view_->ToggleExpanded();
details_link_->SetText(l10n_util::GetStringUTF16(
details_view_->expanded() ? IDS_EXTENSIONS_HIDE_DETAILS
: IDS_EXTENSIONS_SHOW_DETAILS));
}
// 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_EXTENSIONS_EXPANDABLE_CONTAINER_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXPANDABLE_CONTAINER_VIEW_H_
#include <vector>
#include "base/strings/string16.h"
#include "ui/views/controls/link_listener.h"
#include "ui/views/view.h"
// A view that displays a list of details, along with a link that expands and
// collapses those details.
class ExpandableContainerView : public views::View, public views::LinkListener {
public:
ExpandableContainerView(const std::vector<base::string16>& details,
int available_width);
~ExpandableContainerView() override;
// views::View:
void ChildPreferredSizeChanged(views::View* child) override;
// views::LinkListener:
void LinkClicked(views::Link* source, int event_flags) override;
ExpandableContainerView(const ExpandableContainerView&) = delete;
ExpandableContainerView& operator=(const ExpandableContainerView&) = delete;
private:
// Helper class representing the list of details, that can hide itself.
class DetailsView : public views::View {
public:
explicit DetailsView(const std::vector<base::string16>& details);
~DetailsView() override;
// views::View:
gfx::Size CalculatePreferredSize() const override;
// Expands or collapses this view.
void ToggleExpanded();
bool expanded() { return expanded_; }
private:
// Whether this details section is expanded.
bool expanded_ = false;
DetailsView(const DetailsView&) = delete;
DetailsView& operator=(const DetailsView&) = delete;
};
// Expands or collapses |details_view_|.
void ToggleDetailLevel();
// The view that expands or collapses when |details_link_| is clicked.
DetailsView* details_view_;
// The 'Show Details' link, which changes to 'Hide Details' when the details
// section is expanded.
views::Link* details_link_;
};
#endif // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXPANDABLE_CONTAINER_VIEW_H_
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
#include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "chrome/browser/ui/views/chrome_typography.h" #include "chrome/browser/ui/views/chrome_typography.h"
#include "chrome/browser/ui/views/extensions/expandable_container_view.h"
#include "chrome/browser/ui/views/extensions/extension_permissions_view.h"
#include "chrome/common/extensions/extension_constants.h" #include "chrome/common/extensions/extension_constants.h"
#include "chrome/grit/generated_resources.h" #include "chrome/grit/generated_resources.h"
#include "components/constrained_window/constrained_window_views.h" #include "components/constrained_window/constrained_window_views.h"
...@@ -120,48 +122,6 @@ class RatingLabel : public views::Label { ...@@ -120,48 +122,6 @@ class RatingLabel : public views::Label {
DISALLOW_COPY_AND_ASSIGN(RatingLabel); DISALLOW_COPY_AND_ASSIGN(RatingLabel);
}; };
// A custom view for the permissions section of the extension info. It contains
// the labels for each permission and the views for their associated details, if
// there are any.
class PermissionsView : public views::View {
public:
explicit PermissionsView(int available_width)
: available_width_(available_width) {
SetLayoutManager(std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kVertical, gfx::Insets(),
ChromeLayoutProvider::Get()->GetDistanceMetric(
views::DISTANCE_RELATED_CONTROL_VERTICAL)));
}
void AddItem(const base::string16& permission_text,
const base::string16& permission_details) {
auto permission_label =
std::make_unique<views::Label>(permission_text, CONTEXT_BODY_TEXT_LARGE,
views::style::STYLE_SECONDARY);
permission_label->SetMultiLine(true);
permission_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
permission_label->SizeToFit(available_width_);
AddChildView(permission_label.release());
if (!permission_details.empty()) {
// If we have more details to provide, show them in collapsed form.
std::vector<base::string16> details_container;
details_container.push_back(permission_details);
AddChildView(
new ExpandableContainerView(details_container, available_width_));
}
}
// views::View:
void ChildPreferredSizeChanged(views::View* child) override {
PreferredSizeChanged();
}
private:
int available_width_;
DISALLOW_COPY_AND_ASSIGN(PermissionsView);
};
void AddResourceIcon(const gfx::ImageSkia* skia_image, void* data) { void AddResourceIcon(const gfx::ImageSkia* skia_image, void* data) {
views::View* parent = static_cast<views::View*>(data); views::View* parent = static_cast<views::View*>(data);
parent->AddChildView(new RatingStar(*skia_image)); parent->AddChildView(new RatingStar(*skia_image));
...@@ -214,7 +174,8 @@ void AddPermissions(ExtensionInstallPrompt::Prompt* prompt, ...@@ -214,7 +174,8 @@ void AddPermissions(ExtensionInstallPrompt::Prompt* prompt,
int available_width) { int available_width) {
DCHECK_GT(prompt->GetPermissionCount(), 0u); DCHECK_GT(prompt->GetPermissionCount(), 0u);
auto permissions_view = std::make_unique<PermissionsView>(available_width); auto permissions_view =
std::make_unique<ExtensionPermissionsView>(available_width);
for (size_t i = 0; i < prompt->GetPermissionCount(); ++i) { for (size_t i = 0; i < prompt->GetPermissionCount(); ++i) {
permissions_view->AddItem(prompt->GetPermission(i), permissions_view->AddItem(prompt->GetPermission(i),
...@@ -550,87 +511,6 @@ void ExtensionInstallDialogView::UpdateInstallResultHistogram(bool accepted) ...@@ -550,87 +511,6 @@ void ExtensionInstallDialogView::UpdateInstallResultHistogram(bool accepted)
} }
} }
// ExpandableContainerView::DetailsView ----------------------------------------
ExpandableContainerView::DetailsView::DetailsView(
const std::vector<base::string16>& details) {
// Spacing between this and the "Hide Details" link.
const int bottom_padding = ChromeLayoutProvider::Get()->GetDistanceMetric(
views::DISTANCE_RELATED_CONTROL_VERTICAL);
SetLayoutManager(std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kVertical,
gfx::Insets(0, 0, bottom_padding, 0),
ChromeLayoutProvider::Get()->GetDistanceMetric(
DISTANCE_RELATED_CONTROL_VERTICAL_SMALL)));
for (auto& detail : details) {
auto detail_label = std::make_unique<views::Label>(
detail, CONTEXT_BODY_TEXT_LARGE, views::style::STYLE_SECONDARY);
detail_label->SetMultiLine(true);
detail_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
AddChildView(detail_label.release());
}
}
gfx::Size ExpandableContainerView::DetailsView::CalculatePreferredSize() const {
return expanded_ ? views::View::CalculatePreferredSize() : gfx::Size();
}
void ExpandableContainerView::DetailsView::ToggleExpanded() {
expanded_ = !expanded_;
PreferredSizeChanged();
}
// ExpandableContainerView -----------------------------------------------------
ExpandableContainerView::ExpandableContainerView(
const std::vector<base::string16>& details,
int available_width)
: details_view_(nullptr), details_link_(nullptr) {
DCHECK(!details.empty());
views::GridLayout* layout =
SetLayoutManager(std::make_unique<views::GridLayout>());
constexpr int kColumnSetId = 0;
views::ColumnSet* column_set = layout->AddColumnSet(kColumnSetId);
// Even though we only have one column, using a GridLayout here will
// properly handle a 0 height row when |details_view_| is collapsed.
column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::LEADING,
views::GridLayout::kFixedSize, views::GridLayout::FIXED,
available_width, 0);
layout->StartRow(views::GridLayout::kFixedSize, kColumnSetId);
details_view_ = layout->AddView(std::make_unique<DetailsView>(details));
layout->StartRow(views::GridLayout::kFixedSize, kColumnSetId);
auto details_link = std::make_unique<views::Link>(
l10n_util::GetStringUTF16(IDS_EXTENSIONS_SHOW_DETAILS));
details_link->set_listener(this);
details_link->SetHorizontalAlignment(gfx::ALIGN_LEFT);
details_link_ = layout->AddView(std::move(details_link));
}
ExpandableContainerView::~ExpandableContainerView() {
}
void ExpandableContainerView::LinkClicked(
views::Link* source, int event_flags) {
ToggleDetailLevel();
}
void ExpandableContainerView::ChildPreferredSizeChanged(views::View* child) {
PreferredSizeChanged();
}
void ExpandableContainerView::ToggleDetailLevel() {
details_view_->ToggleExpanded();
details_link_->SetText(l10n_util::GetStringUTF16(
details_view_->expanded() ? IDS_EXTENSIONS_HIDE_DETAILS
: IDS_EXTENSIONS_SHOW_DETAILS));
}
// static // static
ExtensionInstallPrompt::ShowDialogCallback ExtensionInstallPrompt::ShowDialogCallback
ExtensionInstallPrompt::GetDefaultShowDialogCallback() { ExtensionInstallPrompt::GetDefaultShowDialogCallback() {
......
...@@ -112,53 +112,4 @@ class ExtensionInstallDialogView : public views::BubbleDialogDelegateView, ...@@ -112,53 +112,4 @@ class ExtensionInstallDialogView : public views::BubbleDialogDelegateView,
DISALLOW_COPY_AND_ASSIGN(ExtensionInstallDialogView); DISALLOW_COPY_AND_ASSIGN(ExtensionInstallDialogView);
}; };
// A view that displays a list of details, along with a link that expands and
// collapses those details.
class ExpandableContainerView : public views::View, public views::LinkListener {
public:
ExpandableContainerView(const std::vector<base::string16>& details,
int available_width);
~ExpandableContainerView() override;
// views::View:
void ChildPreferredSizeChanged(views::View* child) override;
// views::LinkListener:
void LinkClicked(views::Link* source, int event_flags) override;
private:
// Helper class representing the list of details, that can hide itself.
class DetailsView : public views::View {
public:
explicit DetailsView(const std::vector<base::string16>& details);
~DetailsView() override {}
// views::View:
gfx::Size CalculatePreferredSize() const override;
// Expands or collapses this view.
void ToggleExpanded();
bool expanded() { return expanded_; }
private:
// Whether this details section is expanded.
bool expanded_ = false;
DISALLOW_COPY_AND_ASSIGN(DetailsView);
};
// Expands or collapses |details_view_|.
void ToggleDetailLevel();
// The view that expands or collapses when |details_link_| is clicked.
DetailsView* details_view_;
// The 'Show Details' link, which changes to 'Hide Details' when the details
// section is expanded.
views::Link* details_link_;
DISALLOW_COPY_AND_ASSIGN(ExpandableContainerView);
};
#endif // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_INSTALL_DIALOG_VIEW_H_ #endif // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_INSTALL_DIALOG_VIEW_H_
// 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/extensions/extension_permissions_view.h"
#include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "chrome/browser/ui/views/chrome_typography.h"
#include "chrome/browser/ui/views/extensions/expandable_container_view.h"
#include "ui/views/controls/label.h"
#include "ui/views/layout/box_layout.h"
ExtensionPermissionsView::ExtensionPermissionsView(int available_width)
: available_width_(available_width) {
SetLayoutManager(std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kVertical, gfx::Insets(),
ChromeLayoutProvider::Get()->GetDistanceMetric(
views::DISTANCE_RELATED_CONTROL_VERTICAL)));
}
void ExtensionPermissionsView::AddItem(
const base::string16& permission_text,
const base::string16& permission_details) {
auto permission_label = std::make_unique<views::Label>(
permission_text, CONTEXT_BODY_TEXT_LARGE, views::style::STYLE_SECONDARY);
permission_label->SetMultiLine(true);
permission_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
permission_label->SizeToFit(available_width_);
AddChildView(std::move(permission_label));
if (!permission_details.empty()) {
// If we have more details to provide, show them in collapsed form.
std::vector<base::string16> details_container;
details_container.push_back(permission_details);
AddChildView(std::make_unique<ExpandableContainerView>(details_container,
available_width_));
}
}
void ExtensionPermissionsView::ChildPreferredSizeChanged(views::View* child) {
PreferredSizeChanged();
}
// 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_EXTENSIONS_EXTENSION_PERMISSIONS_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_PERMISSIONS_VIEW_H_
#include <vector>
#include "ui/views/view.h"
// A custom view for the permissions section of the extension info. It contains
// the labels for each permission and the views for their associated details, if
// there are any.
class ExtensionPermissionsView : public views::View {
public:
explicit ExtensionPermissionsView(int available_width);
void AddItem(const base::string16& permission_text,
const base::string16& permission_details);
// views::View:
void ChildPreferredSizeChanged(views::View* child) override;
ExtensionPermissionsView(const ExtensionPermissionsView&) = delete;
ExtensionPermissionsView& operator=(const ExtensionPermissionsView&) = delete;
private:
int available_width_;
};
#endif // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_PERMISSIONS_VIEW_H_
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