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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/views/extensions/extension_install_dialog_view.h"
6
5 #include <vector> 7 #include <vector>
6 8
7 #include "base/basictypes.h" 9 #include "base/basictypes.h"
8 #include "base/command_line.h" 10 #include "base/command_line.h"
9 #include "base/compiler_specific.h" 11 #include "base/compiler_specific.h"
10 #include "base/i18n/rtl.h" 12 #include "base/i18n/rtl.h"
11 #include "base/metrics/histogram.h" 13 #include "base/metrics/histogram.h"
12 #include "base/strings/string_util.h" 14 #include "base/strings/string_util.h"
13 #include "base/strings/utf_string_conversions.h" 15 #include "base/strings/utf_string_conversions.h"
14 #include "chrome/browser/extensions/bundle_installer.h" 16 #include "chrome/browser/extensions/bundle_installer.h"
15 #include "chrome/browser/extensions/extension_install_prompt.h"
16 #include "chrome/browser/extensions/extension_install_prompt_experiment.h" 17 #include "chrome/browser/extensions/extension_install_prompt_experiment.h"
17 #include "chrome/browser/profiles/profile.h" 18 #include "chrome/browser/profiles/profile.h"
18 #include "chrome/browser/ui/views/constrained_window_views.h" 19 #include "chrome/browser/ui/views/constrained_window_views.h"
19 #include "chrome/common/chrome_switches.h" 20 #include "chrome/common/chrome_switches.h"
20 #include "chrome/common/extensions/extension_constants.h" 21 #include "chrome/common/extensions/extension_constants.h"
21 #include "chrome/installer/util/browser_distribution.h" 22 #include "chrome/installer/util/browser_distribution.h"
22 #include "content/public/browser/page_navigator.h" 23 #include "content/public/browser/page_navigator.h"
23 #include "content/public/browser/web_contents.h" 24 #include "content/public/browser/web_contents.h"
24 #include "extensions/common/extension.h" 25 #include "extensions/common/extension.h"
25 #include "grit/chromium_strings.h" 26 #include "grit/chromium_strings.h"
26 #include "grit/generated_resources.h" 27 #include "grit/generated_resources.h"
27 #include "grit/google_chrome_strings.h" 28 #include "grit/google_chrome_strings.h"
28 #include "grit/theme_resources.h" 29 #include "grit/theme_resources.h"
29 #include "ui/base/l10n/l10n_util.h" 30 #include "ui/base/l10n/l10n_util.h"
30 #include "ui/base/resource/resource_bundle.h" 31 #include "ui/base/resource/resource_bundle.h"
31 #include "ui/gfx/animation/animation_delegate.h"
32 #include "ui/gfx/animation/slide_animation.h"
33 #include "ui/gfx/text_utils.h" 32 #include "ui/gfx/text_utils.h"
34 #include "ui/gfx/transform.h"
35 #include "ui/views/background.h" 33 #include "ui/views/background.h"
36 #include "ui/views/border.h" 34 #include "ui/views/border.h"
37 #include "ui/views/controls/button/checkbox.h" 35 #include "ui/views/controls/button/checkbox.h"
38 #include "ui/views/controls/button/image_button.h" 36 #include "ui/views/controls/button/image_button.h"
39 #include "ui/views/controls/button/label_button.h" 37 #include "ui/views/controls/button/label_button.h"
40 #include "ui/views/controls/image_view.h" 38 #include "ui/views/controls/image_view.h"
41 #include "ui/views/controls/label.h" 39 #include "ui/views/controls/label.h"
42 #include "ui/views/controls/link.h" 40 #include "ui/views/controls/link.h"
43 #include "ui/views/controls/link_listener.h"
44 #include "ui/views/controls/scroll_view.h" 41 #include "ui/views/controls/scroll_view.h"
45 #include "ui/views/controls/separator.h" 42 #include "ui/views/controls/separator.h"
46 #include "ui/views/layout/box_layout.h" 43 #include "ui/views/layout/box_layout.h"
47 #include "ui/views/layout/grid_layout.h" 44 #include "ui/views/layout/grid_layout.h"
48 #include "ui/views/layout/layout_constants.h" 45 #include "ui/views/layout/layout_constants.h"
49 #include "ui/views/view.h"
50 #include "ui/views/widget/widget.h" 46 #include "ui/views/widget/widget.h"
51 #include "ui/views/window/dialog_client_view.h" 47 #include "ui/views/window/dialog_client_view.h"
52 #include "ui/views/window/dialog_delegate.h"
53 48
54 using content::OpenURLParams; 49 using content::OpenURLParams;
55 using content::Referrer; 50 using content::Referrer;
56 using extensions::BundleInstaller; 51 using extensions::BundleInstaller;
57 52
58 namespace { 53 namespace {
59 54
55 // Width of the bullet column in BulletedView.
56 const int kBulletWidth = 20;
57
60 // Size of extension icon in top left of dialog. 58 // Size of extension icon in top left of dialog.
61 const int kIconSize = 64; 59 const int kIconSize = 64;
62 60
63 // We offset the icon a little bit from the right edge of the dialog, to make it 61 // We offset the icon a little bit from the right edge of the dialog, to make it
64 // align with the button below it. 62 // align with the button below it.
65 const int kIconOffset = 16; 63 const int kIconOffset = 16;
66 64
67 // The dialog will resize based on its content, but this sets a maximum height 65 // The dialog will resize based on its content, but this sets a maximum height
68 // before overflowing a scrollbar. 66 // before overflowing a scrollbar.
69 const int kDialogMaxHeight = 300; 67 const int kDialogMaxHeight = 300;
(...skipping 21 matching lines...) Expand all
91 // experiment. This is used to group the actions in UMA histograms named 89 // experiment. This is used to group the actions in UMA histograms named
92 // Extensions.InstallPromptExperiment.ShowDetails and 90 // Extensions.InstallPromptExperiment.ShowDetails and
93 // Extensions.InstallPromptExperiment.ShowPermissions. 91 // Extensions.InstallPromptExperiment.ShowPermissions.
94 enum ExperimentLinkAction { 92 enum ExperimentLinkAction {
95 LINK_SHOWN = 0, 93 LINK_SHOWN = 0,
96 LINK_NOT_SHOWN, 94 LINK_NOT_SHOWN,
97 LINK_CLICKED, 95 LINK_CLICKED,
98 NUM_LINK_ACTIONS 96 NUM_LINK_ACTIONS
99 }; 97 };
100 98
101 typedef std::vector<base::string16> PermissionDetails;
102 class ExpandableContainerView;
103
104 void AddResourceIcon(const gfx::ImageSkia* skia_image, void* data) { 99 void AddResourceIcon(const gfx::ImageSkia* skia_image, void* data) {
105 views::View* parent = static_cast<views::View*>(data); 100 views::View* parent = static_cast<views::View*>(data);
106 views::ImageView* image_view = new views::ImageView(); 101 views::ImageView* image_view = new views::ImageView();
107 image_view->SetImage(*skia_image); 102 image_view->SetImage(*skia_image);
108 parent->AddChildView(image_view); 103 parent->AddChildView(image_view);
109 } 104 }
110 105
111 // Creates a string for displaying |message| to the user. If it has to look 106 // Creates a string for displaying |message| to the user. If it has to look
112 // like a entry in a bullet point list, one is added. 107 // like a entry in a bullet point list, one is added.
113 base::string16 PrepareForDisplay(const base::string16& message, 108 base::string16 PrepareForDisplay(const base::string16& message,
114 bool bullet_point) { 109 bool bullet_point) {
115 return bullet_point ? l10n_util::GetStringFUTF16( 110 return bullet_point ? l10n_util::GetStringFUTF16(
116 IDS_EXTENSION_PERMISSION_LINE, 111 IDS_EXTENSION_PERMISSION_LINE,
117 message) : message; 112 message) : message;
118 } 113 }
119 114
120 // A custom scrollable view implementation for the dialog. 115 } // namespace
121 class CustomScrollableView : public views::View {
122 public:
123 CustomScrollableView();
124 virtual ~CustomScrollableView();
125
126 private:
127 virtual void Layout() OVERRIDE;
128
129 DISALLOW_COPY_AND_ASSIGN(CustomScrollableView);
130 };
131
132 // Implements the extension installation dialog for TOOLKIT_VIEWS.
133 class ExtensionInstallDialogView : public views::DialogDelegateView,
134 public views::LinkListener,
135 public views::ButtonListener {
136 public:
137 ExtensionInstallDialogView(
138 content::PageNavigator* navigator,
139 ExtensionInstallPrompt::Delegate* delegate,
140 scoped_refptr<ExtensionInstallPrompt::Prompt> prompt);
141 virtual ~ExtensionInstallDialogView();
142
143 // Called when one of the child elements has expanded/collapsed.
144 void ContentsChanged();
145
146 private:
147 // views::DialogDelegateView:
148 virtual int GetDialogButtons() const OVERRIDE;
149 virtual base::string16 GetDialogButtonLabel(
150 ui::DialogButton button) const OVERRIDE;
151 virtual int GetDefaultDialogButton() const OVERRIDE;
152 virtual bool Cancel() OVERRIDE;
153 virtual bool Accept() OVERRIDE;
154 virtual ui::ModalType GetModalType() const OVERRIDE;
155 virtual base::string16 GetWindowTitle() const OVERRIDE;
156 virtual void Layout() OVERRIDE;
157 virtual gfx::Size GetPreferredSize() const OVERRIDE;
158 virtual void ViewHierarchyChanged(
159 const ViewHierarchyChangedDetails& details) OVERRIDE;
160
161 // views::LinkListener:
162 virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE;
163
164 // views::ButtonListener:
165 virtual void ButtonPressed(views::Button* sender,
166 const ui::Event& event) OVERRIDE;
167
168 // Experimental: Toggles inline permission explanations with an animation.
169 void ToggleInlineExplanations();
170
171 // Creates a layout consisting of dialog header, extension name and icon.
172 views::GridLayout* CreateLayout(
173 views::View* parent,
174 int left_column_width,
175 int column_set_id,
176 bool single_detail_row) const;
177
178 bool is_inline_install() const {
179 return prompt_->type() == ExtensionInstallPrompt::INLINE_INSTALL_PROMPT;
180 }
181
182 bool is_bundle_install() const {
183 return prompt_->type() == ExtensionInstallPrompt::BUNDLE_INSTALL_PROMPT;
184 }
185
186 bool is_external_install() const {
187 return prompt_->type() == ExtensionInstallPrompt::EXTERNAL_INSTALL_PROMPT;
188 }
189
190 // Updates the histogram that holds installation accepted/aborted data.
191 void UpdateInstallResultHistogram(bool accepted) const;
192
193 // Updates the histogram that holds data about whether "Show details" or
194 // "Show permissions" links were shown and/or clicked.
195 void UpdateLinkActionHistogram(int action_type) const;
196
197 content::PageNavigator* navigator_;
198 ExtensionInstallPrompt::Delegate* delegate_;
199 scoped_refptr<ExtensionInstallPrompt::Prompt> prompt_;
200
201 // The scroll view containing all the details for the dialog (including all
202 // collapsible/expandable sections).
203 views::ScrollView* scroll_view_;
204
205 // The container view for the scroll view.
206 CustomScrollableView* scrollable_;
207
208 // The container for the simpler view with only the dialog header and the
209 // extension icon. Used for the experiment where the permissions are
210 // initially hidden when the dialog shows.
211 CustomScrollableView* scrollable_header_only_;
212
213 // The preferred size of the dialog.
214 gfx::Size dialog_size_;
215
216 // Experimental: "Show details" link to expand inline explanations and reveal
217 // permision dialog.
218 views::Link* show_details_link_;
219
220 // Experimental: Label for showing information about the checkboxes.
221 views::Label* checkbox_info_label_;
222
223 // Experimental: Contains pointers to inline explanation views.
224 typedef std::vector<ExpandableContainerView*> InlineExplanations;
225 InlineExplanations inline_explanations_;
226
227 // Experimental: Number of unchecked checkboxes in the permission list.
228 // If this becomes zero, the accept button is enabled, otherwise disabled.
229 int unchecked_boxes_;
230
231 DISALLOW_COPY_AND_ASSIGN(ExtensionInstallDialogView);
232 };
233
234 // A simple view that prepends a view with a bullet with the help of a grid
235 // layout.
236 class BulletedView : public views::View {
237 public:
238 explicit BulletedView(views::View* view);
239 private:
240 DISALLOW_COPY_AND_ASSIGN(BulletedView);
241 };
242 116
243 BulletedView::BulletedView(views::View* view) { 117 BulletedView::BulletedView(views::View* view) {
244 views::GridLayout* layout = new views::GridLayout(this); 118 views::GridLayout* layout = new views::GridLayout(this);
245 SetLayoutManager(layout); 119 SetLayoutManager(layout);
246 views::ColumnSet* column_set = layout->AddColumnSet(0); 120 views::ColumnSet* column_set = layout->AddColumnSet(0);
121 column_set->AddColumn(views::GridLayout::CENTER,
122 views::GridLayout::LEADING,
123 0,
124 views::GridLayout::FIXED,
125 kBulletWidth,
126 0);
247 column_set->AddColumn(views::GridLayout::LEADING, 127 column_set->AddColumn(views::GridLayout::LEADING,
248 views::GridLayout::LEADING, 128 views::GridLayout::LEADING,
249 0, 129 0,
250 views::GridLayout::USE_PREF, 130 views::GridLayout::USE_PREF,
251 0, // no fixed width 131 0, // No fixed width.
252 0); 132 0);
253 column_set->AddColumn(views::GridLayout::LEADING,
254 views::GridLayout::LEADING,
255 0,
256 views::GridLayout::USE_PREF,
257 0, // no fixed width
258 0);
259 layout->StartRow(0, 0); 133 layout->StartRow(0, 0);
260 layout->AddView(new views::Label(PrepareForDisplay(base::string16(), true))); 134 layout->AddView(new views::Label(PrepareForDisplay(base::string16(), true)));
261 layout->AddView(view); 135 layout->AddView(view);
262 } 136 }
263 137
264 // A simple view that prepends a view with a checkbox with the help of a grid
265 // layout. Used for the permission experiment.
266 // TODO(meacer): Remove once the experiment is completed.
267 class CheckboxedView : public views::View {
268 public:
269 CheckboxedView(views::View* view, views::ButtonListener* listener);
270 private:
271 DISALLOW_COPY_AND_ASSIGN(CheckboxedView);
272 };
273
274 CheckboxedView::CheckboxedView(views::View* view, 138 CheckboxedView::CheckboxedView(views::View* view,
275 views::ButtonListener* listener) { 139 views::ButtonListener* listener) {
276 views::GridLayout* layout = new views::GridLayout(this); 140 views::GridLayout* layout = new views::GridLayout(this);
277 SetLayoutManager(layout); 141 SetLayoutManager(layout);
278 views::ColumnSet* column_set = layout->AddColumnSet(0); 142 views::ColumnSet* column_set = layout->AddColumnSet(0);
279 column_set->AddColumn(views::GridLayout::LEADING, 143 column_set->AddColumn(views::GridLayout::LEADING,
280 views::GridLayout::LEADING, 144 views::GridLayout::LEADING,
281 0, 145 0,
282 views::GridLayout::USE_PREF, 146 views::GridLayout::USE_PREF,
283 0, // no fixed width 147 0, // No fixed width.
284 0); 148 0);
285 column_set->AddColumn(views::GridLayout::LEADING, 149 column_set->AddColumn(views::GridLayout::LEADING,
286 views::GridLayout::LEADING, 150 views::GridLayout::LEADING,
287 0, 151 0,
288 views::GridLayout::USE_PREF, 152 views::GridLayout::USE_PREF,
289 0, // no fixed width 153 0, // No fixed width.
290 0); 154 0);
291 layout->StartRow(0, 0); 155 layout->StartRow(0, 0);
292 views::Checkbox* checkbox = new views::Checkbox(base::string16()); 156 views::Checkbox* checkbox = new views::Checkbox(base::string16());
293 checkbox->set_listener(listener); 157 checkbox->set_listener(listener);
294 // Alignment needs to be explicitly set again here, otherwise the views are 158 // Alignment needs to be explicitly set again here, otherwise the views are
295 // not vertically centered. 159 // not vertically centered.
296 layout->AddView(checkbox, 1, 1, 160 layout->AddView(checkbox, 1, 1,
297 views::GridLayout::LEADING, views::GridLayout::CENTER); 161 views::GridLayout::LEADING, views::GridLayout::CENTER);
298 layout->AddView(view, 1, 1, 162 layout->AddView(view, 1, 1,
299 views::GridLayout::LEADING, views::GridLayout::CENTER); 163 views::GridLayout::LEADING, views::GridLayout::CENTER);
300 } 164 }
301 165
302 // A view to display text with an expandable details section.
303 class ExpandableContainerView : public views::View,
304 public views::ButtonListener,
305 public views::LinkListener,
306 public gfx::AnimationDelegate {
307 public:
308 ExpandableContainerView(ExtensionInstallDialogView* owner,
309 const base::string16& description,
310 const PermissionDetails& details,
311 int horizontal_space,
312 bool parent_bulleted,
313 bool show_expand_link,
314 bool lighter_color_details);
315 virtual ~ExpandableContainerView();
316
317 // views::View:
318 virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE;
319
320 // views::ButtonListener:
321 virtual void ButtonPressed(views::Button* sender,
322 const ui::Event& event) OVERRIDE;
323
324 // views::LinkListener:
325 virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE;
326
327 // gfx::AnimationDelegate:
328 virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE;
329 virtual void AnimationEnded(const gfx::Animation* animation) OVERRIDE;
330
331 // Expand/Collapse the detail section for this ExpandableContainerView.
332 void ToggleDetailLevel();
333
334 // Expand the detail section without any animation.
335 // TODO(meacer): Remove once the experiment is completed.
336 void ExpandWithoutAnimation();
337
338 private:
339 // A view which displays all the details of an IssueAdviceInfoEntry.
340 class DetailsView : public views::View {
341 public:
342 explicit DetailsView(int horizontal_space, bool parent_bulleted,
343 bool lighter_color);
344 virtual ~DetailsView() {}
345
346 // views::View:
347 virtual gfx::Size GetPreferredSize() const OVERRIDE;
348
349 void AddDetail(const base::string16& detail);
350
351 // Animates this to be a height proportional to |state|.
352 void AnimateToState(double state);
353
354 private:
355 views::GridLayout* layout_;
356 double state_;
357
358 // Whether the detail text should be shown with a lighter color.
359 bool lighter_color_;
360
361 DISALLOW_COPY_AND_ASSIGN(DetailsView);
362 };
363
364 // The dialog that owns |this|. It's also an ancestor in the View hierarchy.
365 ExtensionInstallDialogView* owner_;
366
367 // A view for showing |issue_advice.details|.
368 DetailsView* details_view_;
369
370 // The 'more details' link shown under the heading (changes to 'hide details'
371 // when the details section is expanded).
372 views::Link* more_details_;
373
374 gfx::SlideAnimation slide_animation_;
375
376 // The up/down arrow next to the 'more detail' link (points up/down depending
377 // on whether the details section is expanded).
378 views::ImageButton* arrow_toggle_;
379
380 // Whether the details section is expanded.
381 bool expanded_;
382
383 DISALLOW_COPY_AND_ASSIGN(ExpandableContainerView);
384 };
385
386 void ShowExtensionInstallDialogImpl( 166 void ShowExtensionInstallDialogImpl(
387 const ExtensionInstallPrompt::ShowParams& show_params, 167 const ExtensionInstallPrompt::ShowParams& show_params,
388 ExtensionInstallPrompt::Delegate* delegate, 168 ExtensionInstallPrompt::Delegate* delegate,
389 scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) { 169 scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) {
390 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 170 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
391 CreateBrowserModalDialogViews( 171 CreateBrowserModalDialogViews(
392 new ExtensionInstallDialogView(show_params.navigator, delegate, prompt), 172 new ExtensionInstallDialogView(show_params.navigator, delegate, prompt),
393 show_params.parent_window)->Show(); 173 show_params.parent_window)->Show();
394 } 174 }
395 175
396 } // namespace
397
398 CustomScrollableView::CustomScrollableView() {} 176 CustomScrollableView::CustomScrollableView() {}
399 CustomScrollableView::~CustomScrollableView() {} 177 CustomScrollableView::~CustomScrollableView() {}
400 178
401 void CustomScrollableView::Layout() { 179 void CustomScrollableView::Layout() {
402 SetBounds(x(), y(), width(), GetHeightForWidth(width())); 180 SetBounds(x(), y(), width(), GetHeightForWidth(width()));
403 views::View::Layout(); 181 views::View::Layout();
404 } 182 }
405 183
406 ExtensionInstallDialogView::ExtensionInstallDialogView( 184 ExtensionInstallDialogView::ExtensionInstallDialogView(
407 content::PageNavigator* navigator, 185 content::PageNavigator* navigator,
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 permission_label->SetEnabledColor(kTextHighlight); 407 permission_label->SetEnabledColor(kTextHighlight);
630 } else if (prompt->experiment()->ShouldHighlightBackground( 408 } else if (prompt->experiment()->ShouldHighlightBackground(
631 prompt->GetPermission(i))) { 409 prompt->GetPermission(i))) {
632 permission_label->SetLineHeight(18); 410 permission_label->SetLineHeight(18);
633 permission_label->set_background( 411 permission_label->set_background(
634 views::Background::CreateSolidBackground(kBackgroundHighlight)); 412 views::Background::CreateSolidBackground(kBackgroundHighlight));
635 } 413 }
636 414
637 permission_label->SetMultiLine(true); 415 permission_label->SetMultiLine(true);
638 permission_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 416 permission_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
639 permission_label->SizeToFit(left_column_width);
640 417
641 if (prompt->experiment()->show_checkboxes()) { 418 if (prompt->experiment()->show_checkboxes()) {
419 permission_label->SizeToFit(left_column_width);
642 layout->AddView(new CheckboxedView(permission_label, this)); 420 layout->AddView(new CheckboxedView(permission_label, this));
643 ++unchecked_boxes_; 421 ++unchecked_boxes_;
644 } else { 422 } else {
423 permission_label->SizeToFit(left_column_width - kBulletWidth);
645 layout->AddView(new BulletedView(permission_label)); 424 layout->AddView(new BulletedView(permission_label));
646 } 425 }
426
647 // If we have more details to provide, show them in collapsed form. 427 // If we have more details to provide, show them in collapsed form.
648 if (!prompt->GetPermissionsDetails(i).empty()) { 428 if (!prompt->GetPermissionsDetails(i).empty()) {
649 layout->StartRow(0, column_set_id); 429 layout->StartRow(0, column_set_id);
650 PermissionDetails details; 430 PermissionDetails details;
651 details.push_back( 431 details.push_back(
652 PrepareForDisplay(prompt->GetPermissionsDetails(i), false)); 432 PrepareForDisplay(prompt->GetPermissionsDetails(i), false));
653 ExpandableContainerView* details_container = 433 ExpandableContainerView* details_container =
654 new ExpandableContainerView( 434 new ExpandableContainerView(
655 this, base::string16(), details, left_column_width, 435 this, base::string16(), details, left_column_width,
656 true, true, false); 436 true, true, false);
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
1057 NUM_LINK_ACTIONS); 837 NUM_LINK_ACTIONS);
1058 } else { 838 } else {
1059 // The clickable link in the UI is "Show Details". 839 // The clickable link in the UI is "Show Details".
1060 UMA_HISTOGRAM_ENUMERATION( 840 UMA_HISTOGRAM_ENUMERATION(
1061 "Extensions.InstallPromptExperiment.ShowDetails", 841 "Extensions.InstallPromptExperiment.ShowDetails",
1062 action_type, 842 action_type,
1063 NUM_LINK_ACTIONS); 843 NUM_LINK_ACTIONS);
1064 } 844 }
1065 } 845 }
1066 846
1067 // static
1068 ExtensionInstallPrompt::ShowDialogCallback
1069 ExtensionInstallPrompt::GetDefaultShowDialogCallback() {
1070 return base::Bind(&ShowExtensionInstallDialogImpl);
1071 }
1072
1073 // ExpandableContainerView::DetailsView ---------------------------------------- 847 // ExpandableContainerView::DetailsView ----------------------------------------
1074 848
1075 ExpandableContainerView::DetailsView::DetailsView(int horizontal_space, 849 ExpandableContainerView::DetailsView::DetailsView(int horizontal_space,
1076 bool parent_bulleted, 850 bool parent_bulleted,
1077 bool lighter_color) 851 bool lighter_color)
1078 : layout_(new views::GridLayout(this)), 852 : layout_(new views::GridLayout(this)),
1079 state_(0), 853 state_(0),
1080 lighter_color_(lighter_color) { 854 lighter_color_(lighter_color) {
1081 SetLayoutManager(layout_); 855 SetLayoutManager(layout_);
1082 views::ColumnSet* column_set = layout_->AddColumnSet(0); 856 views::ColumnSet* column_set = layout_->AddColumnSet(0);
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
1276 if (slide_animation_.IsShowing()) 1050 if (slide_animation_.IsShowing())
1277 slide_animation_.Hide(); 1051 slide_animation_.Hide();
1278 else 1052 else
1279 slide_animation_.Show(); 1053 slide_animation_.Show();
1280 } 1054 }
1281 1055
1282 void ExpandableContainerView::ExpandWithoutAnimation() { 1056 void ExpandableContainerView::ExpandWithoutAnimation() {
1283 expanded_ = true; 1057 expanded_ = true;
1284 details_view_->AnimateToState(1.0); 1058 details_view_->AnimateToState(1.0);
1285 } 1059 }
1060
1061 // static
1062 ExtensionInstallPrompt::ShowDialogCallback
1063 ExtensionInstallPrompt::GetDefaultShowDialogCallback() {
1064 return base::Bind(&ShowExtensionInstallDialogImpl);
1065 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698