Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7210)

Unified Diff: chrome/browser/ui/views/extensions/extension_install_dialog_view.cc

Issue 363523002: Fix extension scrollbar regression bug, and add a regression test to (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixing review comments (cleaned up imports, added back anonymous namespace, cleanup and nitfixes) Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
index a33e9e2121b9dc60f006bbac553a3a3399edf469..e40ddd1c11d8fd1f89b3b7ff973396a420e03115 100644
--- a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
+++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
@@ -2,6 +2,8 @@
// 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_install_dialog_view.h"
+
#include <vector>
#include "base/basictypes.h"
@@ -12,7 +14,6 @@
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/bundle_installer.h"
-#include "chrome/browser/extensions/extension_install_prompt.h"
#include "chrome/browser/extensions/extension_install_prompt_experiment.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/views/constrained_window_views.h"
@@ -28,10 +29,7 @@
#include "grit/theme_resources.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
-#include "ui/gfx/animation/animation_delegate.h"
-#include "ui/gfx/animation/slide_animation.h"
#include "ui/gfx/text_utils.h"
-#include "ui/gfx/transform.h"
#include "ui/views/background.h"
#include "ui/views/border.h"
#include "ui/views/controls/button/checkbox.h"
@@ -40,16 +38,13 @@
#include "ui/views/controls/image_view.h"
#include "ui/views/controls/label.h"
#include "ui/views/controls/link.h"
-#include "ui/views/controls/link_listener.h"
#include "ui/views/controls/scroll_view.h"
#include "ui/views/controls/separator.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/layout/grid_layout.h"
#include "ui/views/layout/layout_constants.h"
-#include "ui/views/view.h"
#include "ui/views/widget/widget.h"
#include "ui/views/window/dialog_client_view.h"
-#include "ui/views/window/dialog_delegate.h"
using content::OpenURLParams;
using content::Referrer;
@@ -57,6 +52,9 @@ using extensions::BundleInstaller;
namespace {
+// Width of the bullet column in BulletedView.
+const int kBulletWidth = 20;
+
// Size of extension icon in top left of dialog.
const int kIconSize = 64;
@@ -98,9 +96,6 @@ enum ExperimentLinkAction {
NUM_LINK_ACTIONS
};
-typedef std::vector<base::string16> PermissionDetails;
-class ExpandableContainerView;
-
void AddResourceIcon(const gfx::ImageSkia* skia_image, void* data) {
views::View* parent = static_cast<views::View*>(data);
views::ImageView* image_view = new views::ImageView();
@@ -117,160 +112,29 @@ base::string16 PrepareForDisplay(const base::string16& message,
message) : message;
}
-// A custom scrollable view implementation for the dialog.
-class CustomScrollableView : public views::View {
- public:
- CustomScrollableView();
- virtual ~CustomScrollableView();
-
- private:
- virtual void Layout() OVERRIDE;
-
- DISALLOW_COPY_AND_ASSIGN(CustomScrollableView);
-};
-
-// Implements the extension installation dialog for TOOLKIT_VIEWS.
-class ExtensionInstallDialogView : public views::DialogDelegateView,
- public views::LinkListener,
- public views::ButtonListener {
- public:
- ExtensionInstallDialogView(
- content::PageNavigator* navigator,
- ExtensionInstallPrompt::Delegate* delegate,
- scoped_refptr<ExtensionInstallPrompt::Prompt> prompt);
- virtual ~ExtensionInstallDialogView();
-
- // Called when one of the child elements has expanded/collapsed.
- void ContentsChanged();
-
- private:
- // views::DialogDelegateView:
- virtual int GetDialogButtons() const OVERRIDE;
- virtual base::string16 GetDialogButtonLabel(
- ui::DialogButton button) const OVERRIDE;
- virtual int GetDefaultDialogButton() const OVERRIDE;
- virtual bool Cancel() OVERRIDE;
- virtual bool Accept() OVERRIDE;
- virtual ui::ModalType GetModalType() const OVERRIDE;
- virtual base::string16 GetWindowTitle() const OVERRIDE;
- virtual void Layout() OVERRIDE;
- virtual gfx::Size GetPreferredSize() const OVERRIDE;
- virtual void ViewHierarchyChanged(
- const ViewHierarchyChangedDetails& details) OVERRIDE;
-
- // views::LinkListener:
- virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE;
-
- // views::ButtonListener:
- virtual void ButtonPressed(views::Button* sender,
- const ui::Event& event) OVERRIDE;
-
- // Experimental: Toggles inline permission explanations with an animation.
- void ToggleInlineExplanations();
-
- // Creates a layout consisting of dialog header, extension name and icon.
- views::GridLayout* CreateLayout(
- views::View* parent,
- int left_column_width,
- int column_set_id,
- bool single_detail_row) const;
-
- bool is_inline_install() const {
- return prompt_->type() == ExtensionInstallPrompt::INLINE_INSTALL_PROMPT;
- }
-
- bool is_bundle_install() const {
- return prompt_->type() == ExtensionInstallPrompt::BUNDLE_INSTALL_PROMPT;
- }
-
- bool is_external_install() const {
- return prompt_->type() == ExtensionInstallPrompt::EXTERNAL_INSTALL_PROMPT;
- }
-
- // Updates the histogram that holds installation accepted/aborted data.
- void UpdateInstallResultHistogram(bool accepted) const;
-
- // Updates the histogram that holds data about whether "Show details" or
- // "Show permissions" links were shown and/or clicked.
- void UpdateLinkActionHistogram(int action_type) const;
-
- content::PageNavigator* navigator_;
- ExtensionInstallPrompt::Delegate* delegate_;
- scoped_refptr<ExtensionInstallPrompt::Prompt> prompt_;
-
- // The scroll view containing all the details for the dialog (including all
- // collapsible/expandable sections).
- views::ScrollView* scroll_view_;
-
- // The container view for the scroll view.
- CustomScrollableView* scrollable_;
-
- // The container for the simpler view with only the dialog header and the
- // extension icon. Used for the experiment where the permissions are
- // initially hidden when the dialog shows.
- CustomScrollableView* scrollable_header_only_;
-
- // The preferred size of the dialog.
- gfx::Size dialog_size_;
-
- // Experimental: "Show details" link to expand inline explanations and reveal
- // permision dialog.
- views::Link* show_details_link_;
-
- // Experimental: Label for showing information about the checkboxes.
- views::Label* checkbox_info_label_;
-
- // Experimental: Contains pointers to inline explanation views.
- typedef std::vector<ExpandableContainerView*> InlineExplanations;
- InlineExplanations inline_explanations_;
-
- // Experimental: Number of unchecked checkboxes in the permission list.
- // If this becomes zero, the accept button is enabled, otherwise disabled.
- int unchecked_boxes_;
-
- DISALLOW_COPY_AND_ASSIGN(ExtensionInstallDialogView);
-};
-
-// A simple view that prepends a view with a bullet with the help of a grid
-// layout.
-class BulletedView : public views::View {
- public:
- explicit BulletedView(views::View* view);
- private:
- DISALLOW_COPY_AND_ASSIGN(BulletedView);
-};
+} // namespace
BulletedView::BulletedView(views::View* view) {
views::GridLayout* layout = new views::GridLayout(this);
SetLayoutManager(layout);
views::ColumnSet* column_set = layout->AddColumnSet(0);
+ column_set->AddColumn(views::GridLayout::CENTER,
+ views::GridLayout::LEADING,
+ 0,
+ views::GridLayout::FIXED,
+ kBulletWidth,
+ 0);
column_set->AddColumn(views::GridLayout::LEADING,
views::GridLayout::LEADING,
0,
views::GridLayout::USE_PREF,
- 0, // no fixed width
+ 0, // No fixed width.
0);
- column_set->AddColumn(views::GridLayout::LEADING,
- views::GridLayout::LEADING,
- 0,
- views::GridLayout::USE_PREF,
- 0, // no fixed width
- 0);
layout->StartRow(0, 0);
layout->AddView(new views::Label(PrepareForDisplay(base::string16(), true)));
layout->AddView(view);
}
-// A simple view that prepends a view with a checkbox with the help of a grid
-// layout. Used for the permission experiment.
-// TODO(meacer): Remove once the experiment is completed.
-class CheckboxedView : public views::View {
- public:
- CheckboxedView(views::View* view, views::ButtonListener* listener);
- private:
- DISALLOW_COPY_AND_ASSIGN(CheckboxedView);
-};
-
CheckboxedView::CheckboxedView(views::View* view,
views::ButtonListener* listener) {
views::GridLayout* layout = new views::GridLayout(this);
@@ -280,13 +144,13 @@ CheckboxedView::CheckboxedView(views::View* view,
views::GridLayout::LEADING,
0,
views::GridLayout::USE_PREF,
- 0, // no fixed width
+ 0, // No fixed width.
0);
column_set->AddColumn(views::GridLayout::LEADING,
views::GridLayout::LEADING,
0,
views::GridLayout::USE_PREF,
- 0, // no fixed width
+ 0, // No fixed width.
0);
layout->StartRow(0, 0);
views::Checkbox* checkbox = new views::Checkbox(base::string16());
@@ -299,90 +163,6 @@ CheckboxedView::CheckboxedView(views::View* view,
views::GridLayout::LEADING, views::GridLayout::CENTER);
}
-// A view to display text with an expandable details section.
-class ExpandableContainerView : public views::View,
- public views::ButtonListener,
- public views::LinkListener,
- public gfx::AnimationDelegate {
- public:
- ExpandableContainerView(ExtensionInstallDialogView* owner,
- const base::string16& description,
- const PermissionDetails& details,
- int horizontal_space,
- bool parent_bulleted,
- bool show_expand_link,
- bool lighter_color_details);
- virtual ~ExpandableContainerView();
-
- // views::View:
- virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE;
-
- // views::ButtonListener:
- virtual void ButtonPressed(views::Button* sender,
- const ui::Event& event) OVERRIDE;
-
- // views::LinkListener:
- virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE;
-
- // gfx::AnimationDelegate:
- virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE;
- virtual void AnimationEnded(const gfx::Animation* animation) OVERRIDE;
-
- // Expand/Collapse the detail section for this ExpandableContainerView.
- void ToggleDetailLevel();
-
- // Expand the detail section without any animation.
- // TODO(meacer): Remove once the experiment is completed.
- void ExpandWithoutAnimation();
-
- private:
- // A view which displays all the details of an IssueAdviceInfoEntry.
- class DetailsView : public views::View {
- public:
- explicit DetailsView(int horizontal_space, bool parent_bulleted,
- bool lighter_color);
- virtual ~DetailsView() {}
-
- // views::View:
- virtual gfx::Size GetPreferredSize() const OVERRIDE;
-
- void AddDetail(const base::string16& detail);
-
- // Animates this to be a height proportional to |state|.
- void AnimateToState(double state);
-
- private:
- views::GridLayout* layout_;
- double state_;
-
- // Whether the detail text should be shown with a lighter color.
- bool lighter_color_;
-
- DISALLOW_COPY_AND_ASSIGN(DetailsView);
- };
-
- // The dialog that owns |this|. It's also an ancestor in the View hierarchy.
- ExtensionInstallDialogView* owner_;
-
- // A view for showing |issue_advice.details|.
- DetailsView* details_view_;
-
- // The 'more details' link shown under the heading (changes to 'hide details'
- // when the details section is expanded).
- views::Link* more_details_;
-
- gfx::SlideAnimation slide_animation_;
-
- // The up/down arrow next to the 'more detail' link (points up/down depending
- // on whether the details section is expanded).
- views::ImageButton* arrow_toggle_;
-
- // Whether the details section is expanded.
- bool expanded_;
-
- DISALLOW_COPY_AND_ASSIGN(ExpandableContainerView);
-};
-
void ShowExtensionInstallDialogImpl(
const ExtensionInstallPrompt::ShowParams& show_params,
ExtensionInstallPrompt::Delegate* delegate,
@@ -393,8 +173,6 @@ void ShowExtensionInstallDialogImpl(
show_params.parent_window)->Show();
}
-} // namespace
-
CustomScrollableView::CustomScrollableView() {}
CustomScrollableView::~CustomScrollableView() {}
@@ -636,14 +414,16 @@ ExtensionInstallDialogView::ExtensionInstallDialogView(
permission_label->SetMultiLine(true);
permission_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- permission_label->SizeToFit(left_column_width);
if (prompt->experiment()->show_checkboxes()) {
+ permission_label->SizeToFit(left_column_width);
layout->AddView(new CheckboxedView(permission_label, this));
++unchecked_boxes_;
} else {
+ permission_label->SizeToFit(left_column_width - kBulletWidth);
layout->AddView(new BulletedView(permission_label));
}
+
// If we have more details to provide, show them in collapsed form.
if (!prompt->GetPermissionsDetails(i).empty()) {
layout->StartRow(0, column_set_id);
@@ -1064,12 +844,6 @@ void ExtensionInstallDialogView::UpdateLinkActionHistogram(int action_type)
}
}
-// static
-ExtensionInstallPrompt::ShowDialogCallback
-ExtensionInstallPrompt::GetDefaultShowDialogCallback() {
- return base::Bind(&ShowExtensionInstallDialogImpl);
-}
-
// ExpandableContainerView::DetailsView ----------------------------------------
ExpandableContainerView::DetailsView::DetailsView(int horizontal_space,
@@ -1283,3 +1057,9 @@ void ExpandableContainerView::ExpandWithoutAnimation() {
expanded_ = true;
details_view_->AnimateToState(1.0);
}
+
+// static
+ExtensionInstallPrompt::ShowDialogCallback
+ExtensionInstallPrompt::GetDefaultShowDialogCallback() {
+ return base::Bind(&ShowExtensionInstallDialogImpl);
+}

Powered by Google App Engine
This is Rietveld 408576698