Index: chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc |
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc b/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2d5bf67a0a5acecea2cb48e01b1f679aabf57c69 |
--- /dev/null |
+++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc |
@@ -0,0 +1,180 @@ |
+// 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. |
+ |
+#include "base/run_loop.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "chrome/browser/extensions/extension_browsertest.h" |
+#include "chrome/browser/extensions/extension_icon_manager.h" |
+#include "chrome/browser/extensions/extension_install_prompt.h" |
+#include "chrome/browser/extensions/extension_install_prompt_experiment.h" |
+#include "chrome/browser/ui/browser.h" |
+#include "chrome/browser/ui/tabs/tab_strip_model.h" |
+#include "chrome/browser/ui/views/constrained_window_views.h" |
+#include "chrome/browser/ui/views/extensions/extension_install_dialog_view.h" |
+#include "chrome/browser/ui/webui/extensions/extension_settings_handler.h" |
+#include "chrome/common/extensions/extension_test_util.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "extensions/common/extension.h" |
+#include "extensions/common/permissions/permissions_data.h" |
+#include "extensions/common/test_util.h" |
+#include "ui/views/controls/scroll_view.h" |
+#include "ui/views/view.h" |
+#include "ui/views/widget/widget.h" |
+ |
+// A simple delegate implementation that counts the number of times |
+// |InstallUIProceed| and |InstallUIAbort| are called. |
+class MockExtensionInstallPromptDelegate |
+ : public ExtensionInstallPrompt::Delegate { |
+ public: |
+ MockExtensionInstallPromptDelegate() |
+ : proceed_count_(0), |
+ abort_count_(0) {} |
+ |
+ // ExtensionInstallPrompt::Delegate overrides. |
+ virtual void InstallUIProceed() OVERRIDE; |
+ virtual void InstallUIAbort(bool user_initiated) OVERRIDE; |
+ |
+ int proceed_count() { return proceed_count_; } |
+ int abort_count() { return abort_count_; } |
+ |
+ protected: |
+ int proceed_count_; |
+ int abort_count_; |
+}; |
+ |
+void MockExtensionInstallPromptDelegate::InstallUIProceed() { |
+ ++proceed_count_; |
+} |
+ |
+void MockExtensionInstallPromptDelegate::InstallUIAbort(bool user_initiated) { |
+ ++abort_count_; |
+} |
+ |
+// This lets us construct the parent for the prompt we're constructing in our |
+// tests. |
+class MockExtensionInstallPrompt : public ExtensionInstallPrompt { |
+ public: |
+ explicit MockExtensionInstallPrompt(content::WebContents* web_contents) |
+ : ExtensionInstallPrompt(web_contents), prompt_(NULL) {} |
+ virtual ~MockExtensionInstallPrompt() {} |
+ void set_prompt(ExtensionInstallPrompt::Prompt* prompt) { |
+ prompt_ = prompt; |
+ } |
+ ExtensionInstallPrompt::Prompt* get_prompt() { |
+ return prompt_; |
+ } |
+ |
+ private: |
+ ExtensionInstallPrompt::Prompt* prompt_; |
+}; |
+ |
+class ScrollbarTest : public ExtensionBrowserTest { |
+ protected: |
+ ScrollbarTest(); |
+ virtual ~ScrollbarTest() {} |
+ |
+ virtual void SetUpOnMainThread() OVERRIDE; |
+ |
+ void SetPromptPermissions(std::vector<base::string16> permissions); |
+ void SetPromptDetails(std::vector<base::string16> details); |
+ void SetPromptRetainedFiles(std::vector<base::FilePath> files); |
+ |
+ bool IsScrollbarVisible(); |
+ |
+ private: |
+ const extensions::Extension* extension_; |
+ MockExtensionInstallPrompt* install_prompt_; |
+ scoped_refptr<ExtensionInstallPrompt::Prompt> prompt_; |
+ content::WebContents* web_contents_; |
+}; |
+ |
+ScrollbarTest::ScrollbarTest() : |
+ extension_(NULL), |
+ install_prompt_(NULL), |
+ prompt_(new ExtensionInstallPrompt::Prompt( |
+ ExtensionInstallPrompt::PERMISSIONS_PROMPT)), |
+ web_contents_(NULL) {} |
+ |
+void ScrollbarTest::SetUpOnMainThread() { |
+ ExtensionBrowserTest::SetUpOnMainThread(); |
+ extension_ = ExtensionBrowserTest::LoadExtension(test_data_dir_.AppendASCII( |
+ "install_prompt/permissions_scrollbar_regression")); |
+ |
+ web_contents_ = browser()->tab_strip_model()->GetWebContentsAt(0); |
+ |
+ install_prompt_ = new MockExtensionInstallPrompt(web_contents_); |
+ install_prompt_->set_prompt(prompt_); |
+ prompt_->set_experiment(ExtensionInstallPromptExperiment::ControlGroup()); |
+ prompt_->set_extension(extension_); |
+ |
+ scoped_ptr<ExtensionIconManager> icon_manager(new ExtensionIconManager()); |
+ const SkBitmap icon_bitmap = icon_manager->GetIcon(extension_->id()); |
+ gfx::Image icon = gfx::Image::CreateFrom1xBitmap(icon_bitmap); |
+ prompt_->set_icon(icon); |
+ |
+ this->SetPromptPermissions(std::vector<base::string16>()); |
+ this->SetPromptDetails(std::vector<base::string16>()); |
+ this->SetPromptRetainedFiles(std::vector<base::FilePath>()); |
+} |
+ |
+void ScrollbarTest::SetPromptPermissions( |
+ std::vector<base::string16> permissions) { |
+ prompt_->SetPermissions(permissions); |
+} |
+ |
+void ScrollbarTest::SetPromptDetails( |
+ std::vector<base::string16> details) { |
+ prompt_->SetPermissionsDetails(details); |
+} |
+ |
+void ScrollbarTest::SetPromptRetainedFiles( |
+ std::vector<base::FilePath> files) { |
+ prompt_->set_retained_files(files); |
+} |
+ |
+bool ScrollbarTest::IsScrollbarVisible() { |
+ ExtensionInstallPrompt::ShowParams show_params(web_contents_); |
+ MockExtensionInstallPromptDelegate delegate; |
+ ExtensionInstallDialogView* dialog = |
+ new ExtensionInstallDialogView(show_params.navigator, &delegate, prompt_); |
+ |
+ // Create the modal view around the install dialog view. |
+ views::Widget* modal = |
+ CreateBrowserModalDialogViews(dialog, show_params.parent_window); |
+ modal->Show(); |
+ content::BrowserThread::GetBlockingPool()->FlushForTesting(); |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ // Check if the vertical scrollbar is visible. |
+ return dialog->scroll_view()->vertical_scroll_bar()->visible(); |
+} |
+ |
+// Tests that a scrollbar _is_ shown for an excessively long extension |
+// install prompt. |
+IN_PROC_BROWSER_TEST_F(ScrollbarTest, LongPromptScrollbar) { |
+ base::string16 permission_string(base::ASCIIToUTF16("Test")); |
+ std::vector<base::string16> permissions; |
+ std::vector<base::string16> details; |
+ for (int i = 0; i < 20; i++) { |
+ permissions.push_back(permission_string); |
+ details.push_back(base::string16()); |
+ } |
+ this->SetPromptPermissions(permissions); |
+ this->SetPromptDetails(details); |
+ ASSERT_TRUE(IsScrollbarVisible()) << "Scrollbar is not visible"; |
+} |
+ |
+// Tests that a scrollbar isn't shown for this regression case. |
+// See crbug.com/385570 for details. |
+IN_PROC_BROWSER_TEST_F(ScrollbarTest, ScrollbarRegression) { |
+ base::string16 permission_string(base::ASCIIToUTF16( |
+ "Read and modify your data on *.facebook.com")); |
+ std::vector<base::string16> permissions; |
+ permissions.push_back(permission_string); |
+ this->SetPromptPermissions(permissions); |
+ std::vector<base::string16> details; |
+ details.push_back(base::string16()); |
+ this->SetPromptDetails(details); |
+ ASSERT_FALSE(IsScrollbarVisible()) << "Scrollbar is visible"; |
+} |