extension_install_dialog_view_browsertest.cc revision 116680a4aac90f2aa7413d9095a592090648e557
1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/run_loop.h" 6#include "base/strings/utf_string_conversions.h" 7#include "chrome/browser/extensions/extension_browsertest.h" 8#include "chrome/browser/extensions/extension_icon_manager.h" 9#include "chrome/browser/extensions/extension_install_prompt.h" 10#include "chrome/browser/extensions/extension_install_prompt_experiment.h" 11#include "chrome/browser/ui/browser.h" 12#include "chrome/browser/ui/tabs/tab_strip_model.h" 13#include "chrome/browser/ui/views/constrained_window_views.h" 14#include "chrome/browser/ui/views/extensions/extension_install_dialog_view.h" 15#include "chrome/browser/ui/webui/extensions/extension_settings_handler.h" 16#include "chrome/common/extensions/extension_test_util.h" 17#include "content/public/browser/browser_thread.h" 18#include "extensions/common/extension.h" 19#include "extensions/common/permissions/permissions_data.h" 20#include "extensions/common/test_util.h" 21#include "ui/views/controls/scroll_view.h" 22#include "ui/views/view.h" 23#include "ui/views/widget/widget.h" 24 25// A simple delegate implementation that counts the number of times 26// |InstallUIProceed| and |InstallUIAbort| are called. 27class MockExtensionInstallPromptDelegate 28 : public ExtensionInstallPrompt::Delegate { 29 public: 30 MockExtensionInstallPromptDelegate() 31 : proceed_count_(0), 32 abort_count_(0) {} 33 34 // ExtensionInstallPrompt::Delegate overrides. 35 virtual void InstallUIProceed() OVERRIDE; 36 virtual void InstallUIAbort(bool user_initiated) OVERRIDE; 37 38 int proceed_count() { return proceed_count_; } 39 int abort_count() { return abort_count_; } 40 41 protected: 42 int proceed_count_; 43 int abort_count_; 44}; 45 46void MockExtensionInstallPromptDelegate::InstallUIProceed() { 47 ++proceed_count_; 48} 49 50void MockExtensionInstallPromptDelegate::InstallUIAbort(bool user_initiated) { 51 ++abort_count_; 52} 53 54// This lets us construct the parent for the prompt we're constructing in our 55// tests. 56class MockExtensionInstallPrompt : public ExtensionInstallPrompt { 57 public: 58 explicit MockExtensionInstallPrompt(content::WebContents* web_contents) 59 : ExtensionInstallPrompt(web_contents), prompt_(NULL) {} 60 virtual ~MockExtensionInstallPrompt() {} 61 void set_prompt(ExtensionInstallPrompt::Prompt* prompt) { 62 prompt_ = prompt; 63 } 64 ExtensionInstallPrompt::Prompt* get_prompt() { 65 return prompt_; 66 } 67 68 private: 69 ExtensionInstallPrompt::Prompt* prompt_; 70}; 71 72class ScrollbarTest : public ExtensionBrowserTest { 73 protected: 74 ScrollbarTest(); 75 virtual ~ScrollbarTest() {} 76 77 virtual void SetUpOnMainThread() OVERRIDE; 78 79 void SetPromptPermissions(std::vector<base::string16> permissions); 80 void SetPromptDetails(std::vector<base::string16> details); 81 void SetPromptRetainedFiles(std::vector<base::FilePath> files); 82 83 bool IsScrollbarVisible(); 84 85 private: 86 const extensions::Extension* extension_; 87 MockExtensionInstallPrompt* install_prompt_; 88 scoped_refptr<ExtensionInstallPrompt::Prompt> prompt_; 89 content::WebContents* web_contents_; 90}; 91 92ScrollbarTest::ScrollbarTest() : 93 extension_(NULL), 94 install_prompt_(NULL), 95 prompt_(new ExtensionInstallPrompt::Prompt( 96 ExtensionInstallPrompt::PERMISSIONS_PROMPT)), 97 web_contents_(NULL) {} 98 99void ScrollbarTest::SetUpOnMainThread() { 100 ExtensionBrowserTest::SetUpOnMainThread(); 101 extension_ = ExtensionBrowserTest::LoadExtension(test_data_dir_.AppendASCII( 102 "install_prompt/permissions_scrollbar_regression")); 103 104 web_contents_ = browser()->tab_strip_model()->GetWebContentsAt(0); 105 106 install_prompt_ = new MockExtensionInstallPrompt(web_contents_); 107 install_prompt_->set_prompt(prompt_); 108 prompt_->set_experiment(ExtensionInstallPromptExperiment::ControlGroup()); 109 prompt_->set_extension(extension_); 110 111 scoped_ptr<ExtensionIconManager> icon_manager(new ExtensionIconManager()); 112 const SkBitmap icon_bitmap = icon_manager->GetIcon(extension_->id()); 113 gfx::Image icon = gfx::Image::CreateFrom1xBitmap(icon_bitmap); 114 prompt_->set_icon(icon); 115 116 this->SetPromptPermissions(std::vector<base::string16>()); 117 this->SetPromptDetails(std::vector<base::string16>()); 118 this->SetPromptRetainedFiles(std::vector<base::FilePath>()); 119} 120 121void ScrollbarTest::SetPromptPermissions( 122 std::vector<base::string16> permissions) { 123 prompt_->SetPermissions(permissions); 124} 125 126void ScrollbarTest::SetPromptDetails( 127 std::vector<base::string16> details) { 128 prompt_->SetPermissionsDetails(details); 129} 130 131void ScrollbarTest::SetPromptRetainedFiles( 132 std::vector<base::FilePath> files) { 133 prompt_->set_retained_files(files); 134} 135 136bool ScrollbarTest::IsScrollbarVisible() { 137 ExtensionInstallPrompt::ShowParams show_params(web_contents_); 138 MockExtensionInstallPromptDelegate delegate; 139 ExtensionInstallDialogView* dialog = 140 new ExtensionInstallDialogView(show_params.navigator, &delegate, prompt_); 141 142 // Create the modal view around the install dialog view. 143 views::Widget* modal = 144 CreateBrowserModalDialogViews(dialog, show_params.parent_window); 145 modal->Show(); 146 content::BrowserThread::GetBlockingPool()->FlushForTesting(); 147 base::RunLoop().RunUntilIdle(); 148 149 // Check if the vertical scrollbar is visible. 150 return dialog->scroll_view()->vertical_scroll_bar()->visible(); 151} 152 153// Tests that a scrollbar _is_ shown for an excessively long extension 154// install prompt. 155IN_PROC_BROWSER_TEST_F(ScrollbarTest, LongPromptScrollbar) { 156 base::string16 permission_string(base::ASCIIToUTF16("Test")); 157 std::vector<base::string16> permissions; 158 std::vector<base::string16> details; 159 for (int i = 0; i < 20; i++) { 160 permissions.push_back(permission_string); 161 details.push_back(base::string16()); 162 } 163 this->SetPromptPermissions(permissions); 164 this->SetPromptDetails(details); 165 ASSERT_TRUE(IsScrollbarVisible()) << "Scrollbar is not visible"; 166} 167 168// Tests that a scrollbar isn't shown for this regression case. 169// See crbug.com/385570 for details. 170IN_PROC_BROWSER_TEST_F(ScrollbarTest, ScrollbarRegression) { 171 base::string16 permission_string(base::ASCIIToUTF16( 172 "Read and modify your data on *.facebook.com")); 173 std::vector<base::string16> permissions; 174 permissions.push_back(permission_string); 175 this->SetPromptPermissions(permissions); 176 std::vector<base::string16> details; 177 details.push_back(base::string16()); 178 this->SetPromptDetails(details); 179 ASSERT_FALSE(IsScrollbarVisible()) << "Scrollbar is visible"; 180} 181