1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/views/extensions/extension_install_dialog_view.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/utf_string_conversions.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/extension_browsertest.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/extension_icon_manager.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/extension_install_prompt.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/extension_install_prompt_experiment.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/browser.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/tabs/tab_strip_model.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/views/constrained_window_views.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/webui/extensions/extension_settings_handler.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/common/extensions/extension_test_util.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/browser_thread.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_utils.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/extension.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/permissions/permissions_data.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/test_util.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/controls/scroll_view.h"
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/view.h"
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/widget/widget.h"
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// A simple delegate implementation that counts the number of times
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// |InstallUIProceed| and |InstallUIAbort| are called.
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass MockExtensionInstallPromptDelegate
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : public ExtensionInstallPrompt::Delegate {
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockExtensionInstallPromptDelegate()
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : proceed_count_(0),
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        abort_count_(0) {}
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // ExtensionInstallPrompt::Delegate overrides.
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void InstallUIProceed() OVERRIDE;
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void InstallUIAbort(bool user_initiated) OVERRIDE;
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int proceed_count() { return proceed_count_; }
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int abort_count() { return abort_count_; }
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int proceed_count_;
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int abort_count_;
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MockExtensionInstallPromptDelegate::InstallUIProceed() {
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ++proceed_count_;
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MockExtensionInstallPromptDelegate::InstallUIAbort(bool user_initiated) {
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ++abort_count_;
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This lets us construct the parent for the prompt we're constructing in our
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// tests.
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass MockExtensionInstallPrompt : public ExtensionInstallPrompt {
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit MockExtensionInstallPrompt(content::WebContents* web_contents)
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : ExtensionInstallPrompt(web_contents), prompt_(NULL) {}
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~MockExtensionInstallPrompt() {}
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void set_prompt(ExtensionInstallPrompt::Prompt* prompt) {
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    prompt_ = prompt;
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionInstallPrompt::Prompt* get_prompt() {
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return prompt_;
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionInstallPrompt::Prompt* prompt_;
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ExtensionInstallDialogViewTestBase : public ExtensionBrowserTest {
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit ExtensionInstallDialogViewTestBase(
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ExtensionInstallPrompt::PromptType prompt_type);
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~ExtensionInstallDialogViewTestBase() {}
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetUpOnMainThread() OVERRIDE;
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtensionInstallPrompt::Prompt* prompt() { return prompt_.get(); }
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::WebContents* web_contents() { return web_contents_; }
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MockExtensionInstallPromptDelegate* delegate() { return &delegate_; }
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void SetPromptPermissions(std::vector<base::string16> permissions);
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void SetPromptDetails(std::vector<base::string16> details);
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void SetPromptRetainedFiles(std::vector<base::FilePath> files);
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const extensions::Extension* extension_;
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockExtensionInstallPrompt* install_prompt_;
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<ExtensionInstallPrompt::Prompt> prompt_;
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::WebContents* web_contents_;
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MockExtensionInstallPromptDelegate delegate_;
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(ExtensionInstallDialogViewTestBase);
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciExtensionInstallDialogViewTestBase::ExtensionInstallDialogViewTestBase(
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ExtensionInstallPrompt::PromptType prompt_type)
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : extension_(NULL),
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      install_prompt_(NULL),
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      prompt_(new ExtensionInstallPrompt::Prompt(prompt_type)),
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      web_contents_(NULL) {
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ExtensionInstallDialogViewTestBase::SetUpOnMainThread() {
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionBrowserTest::SetUpOnMainThread();
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extension_ = ExtensionBrowserTest::LoadExtension(test_data_dir_.AppendASCII(
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "install_prompt/permissions_scrollbar_regression"));
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  web_contents_ = browser()->tab_strip_model()->GetWebContentsAt(0);
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  install_prompt_ = new MockExtensionInstallPrompt(web_contents_);
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  install_prompt_->set_prompt(prompt_.get());
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  prompt_->set_experiment(ExtensionInstallPromptExperiment::ControlGroup());
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  prompt_->set_extension(extension_);
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<ExtensionIconManager> icon_manager(new ExtensionIconManager());
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const SkBitmap icon_bitmap = icon_manager->GetIcon(extension_->id());
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::Image icon = gfx::Image::CreateFrom1xBitmap(icon_bitmap);
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  prompt_->set_icon(icon);
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  this->SetPromptPermissions(std::vector<base::string16>());
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  this->SetPromptDetails(std::vector<base::string16>());
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  this->SetPromptRetainedFiles(std::vector<base::FilePath>());
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ExtensionInstallDialogViewTestBase::SetPromptPermissions(
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::vector<base::string16> permissions) {
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  prompt_->SetPermissions(permissions,
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          ExtensionInstallPrompt::REGULAR_PERMISSIONS);
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ExtensionInstallDialogViewTestBase::SetPromptDetails(
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::vector<base::string16> details) {
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  prompt_->SetPermissionsDetails(details,
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 ExtensionInstallPrompt::REGULAR_PERMISSIONS);
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ExtensionInstallDialogViewTestBase::SetPromptRetainedFiles(
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::vector<base::FilePath> files) {
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  prompt_->set_retained_files(files);
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ScrollbarTest : public ExtensionInstallDialogViewTestBase {
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ScrollbarTest();
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~ScrollbarTest() {}
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool IsScrollbarVisible();
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(ScrollbarTest);
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciScrollbarTest::ScrollbarTest()
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : ExtensionInstallDialogViewTestBase(
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ExtensionInstallPrompt::PERMISSIONS_PROMPT) {
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ScrollbarTest::IsScrollbarVisible() {
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtensionInstallPrompt::ShowParams show_params(web_contents());
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtensionInstallDialogView* dialog = new ExtensionInstallDialogView(
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      show_params.navigator, delegate(), prompt());
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Create the modal view around the install dialog view.
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::Widget* modal =
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateBrowserModalDialogViews(dialog, show_params.parent_window);
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  modal->Show();
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::RunAllBlockingPoolTasksUntilIdle();
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Check if the vertical scrollbar is visible.
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return dialog->scroll_view()->vertical_scroll_bar()->visible();
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that a scrollbar _is_ shown for an excessively long extension
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// install prompt.
180116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(ScrollbarTest, LongPromptScrollbar) {
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::string16 permission_string(base::ASCIIToUTF16("Test"));
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<base::string16> permissions;
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<base::string16> details;
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (int i = 0; i < 20; i++) {
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    permissions.push_back(permission_string);
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    details.push_back(base::string16());
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  this->SetPromptPermissions(permissions);
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  this->SetPromptDetails(details);
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(IsScrollbarVisible()) << "Scrollbar is not visible";
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that a scrollbar isn't shown for this regression case.
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// See crbug.com/385570 for details.
195116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(ScrollbarTest, ScrollbarRegression) {
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::string16 permission_string(base::ASCIIToUTF16(
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "Read and modify your data on *.facebook.com"));
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<base::string16> permissions;
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  permissions.push_back(permission_string);
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  this->SetPromptPermissions(permissions);
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<base::string16> details;
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  details.push_back(base::string16());
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  this->SetPromptDetails(details);
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_FALSE(IsScrollbarVisible()) << "Scrollbar is visible";
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ExtensionInstallDialogViewTest
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : public ExtensionInstallDialogViewTestBase {
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtensionInstallDialogViewTest()
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : ExtensionInstallDialogViewTestBase(
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ExtensionInstallPrompt::INSTALL_PROMPT) {}
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~ExtensionInstallDialogViewTest() {}
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(ExtensionInstallDialogViewTest);
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies that the delegate is notified when the user selects to accept or
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// cancel the install.
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(ExtensionInstallDialogViewTest, NotifyDelegate) {
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // The user confirms the install.
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    MockExtensionInstallPromptDelegate delegate;
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<ExtensionInstallDialogView> dialog(
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new ExtensionInstallDialogView(web_contents(), &delegate, prompt()));
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    views::DialogDelegateView* delegate_view = dialog.get();
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_view->Accept();
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_view->OnClosed();
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dialog.reset();
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(0, delegate.abort_count());
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(1, delegate.proceed_count());
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // The user cancels the install.
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    MockExtensionInstallPromptDelegate delegate;
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<ExtensionInstallDialogView> dialog(
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new ExtensionInstallDialogView(web_contents(), &delegate, prompt()));
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    views::DialogDelegateView* delegate_view = dialog.get();
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_view->Cancel();
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_view->OnClosed();
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dialog.reset();
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(1, delegate.abort_count());
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(0, delegate.proceed_count());
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Corner case: Dialog is closed without the user explicitly choosing to
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // proceed or cancel.
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    MockExtensionInstallPromptDelegate delegate;
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<ExtensionInstallDialogView> dialog(
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new ExtensionInstallDialogView(web_contents(), &delegate, prompt()));
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dialog.reset();
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(1, delegate.abort_count());
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(0, delegate.proceed_count());
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
264