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

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

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
« no previous file with comments | « no previous file | chrome/browser/ui/views/extensions/extension_install_dialog_view.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/views/extensions/extension_install_dialog_view.h
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view.h b/chrome/browser/ui/views/extensions/extension_install_dialog_view.h
new file mode 100644
index 0000000000000000000000000000000000000000..48612fbe36eb28bee2202c2e2899b7c962952248
--- /dev/null
+++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view.h
@@ -0,0 +1,256 @@
+// Copyright 2014 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_INSTALL_DIALOG_VIEW_H_
+#define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_INSTALL_DIALOG_VIEW_H_
+
+#include "chrome/browser/extensions/extension_install_prompt.h"
+#include "ui/gfx/animation/animation_delegate.h"
+#include "ui/gfx/animation/slide_animation.h"
+#include "ui/views/controls/button/button.h"
+#include "ui/views/controls/link_listener.h"
+#include "ui/views/view.h"
+#include "ui/views/window/dialog_delegate.h"
+
+typedef std::vector<base::string16> PermissionDetails;
+class ExpandableContainerView;
+
+namespace content {
+class PageNavigator;
+}
+
+namespace views {
+class GridLayout;
+class ImageButton;
+class Label;
+class Link;
+}
+
+// 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();
+
+ // Returns the interior ScrollView of the dialog. This allows us to inspect
+ // the contents of the DialogView.
+ const views::ScrollView* scroll_view() const { return scroll_view_; }
+
+ // 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);
+};
+
+// 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);
+};
+
+// 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,
+ scoped_refptr<ExtensionInstallPrompt::Prompt> prompt);
+
+#endif // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_INSTALL_DIALOG_VIEW_H_
« no previous file with comments | « no previous file | chrome/browser/ui/views/extensions/extension_install_dialog_view.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698