Chromium Code Reviews| 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..ce4b6b10b232b6ba561a23b87c2e6b3547e13a73 |
| --- /dev/null |
| +++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc |
| @@ -0,0 +1,181 @@ |
| +// 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/view.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), |
|
Finnur
2014/07/16 10:36:12
Weird indentation (also colon should be at the beg
Chris Thompson
2014/07/16 20:13:29
Done.
|
| + 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 { |
|
Finnur
2014/07/16 10:36:12
Thank you so much for adding a test for this...
Chris Thompson
2014/07/16 20:13:29
Acknowledged. If I had more time I'd want to try p
Finnur
2014/07/17 10:12:14
That would be fantastic!
|
| + 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("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. |
| + const views::ScrollBar* scrollbar = |
| + dialog->scroll_view()->vertical_scroll_bar(); |
| + return scrollbar->visible(); |
|
Finnur
2014/07/16 10:36:12
Just...
return dialog->scroll_view()->vertical_scr
Chris Thompson
2014/07/16 20:13:29
Missed this when I changed it to return the boolea
|
| +} |
| + |
| +// 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 was not visible"; |
|
Finnur
2014/07/16 10:36:12
nit: s/was/is/
Chris Thompson
2014/07/16 20:13:29
Done.
|
| +} |
| + |
| +// 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 was visible"; |
|
Finnur
2014/07/16 10:36:12
nit: s/was/is/
Chris Thompson
2014/07/16 20:13:29
Done.
|
| +} |