diff options
author | mpcomplete@google.com <mpcomplete@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-11 00:05:34 +0000 |
---|---|---|
committer | mpcomplete@google.com <mpcomplete@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-11 00:05:34 +0000 |
commit | 1bd5413c93779467e15c402e5bb1c866792bcac6 (patch) | |
tree | 19615d0f974d67abadd8464d188c5a8a02b84fe0 /chrome/browser/extensions/extension_browsertest.cc | |
parent | d9fac60990a817c7ef7f1a7beef90dc319bf299b (diff) | |
download | chromium_src-1bd5413c93779467e15c402e5bb1c866792bcac6.zip chromium_src-1bd5413c93779467e15c402e5bb1c866792bcac6.tar.gz chromium_src-1bd5413c93779467e15c402e5bb1c866792bcac6.tar.bz2 |
Disable extensions in incognito mode.
Add a browsertest to make sure we don't crash with an incognito window open.
Had to finagle utility_process_host to make it work in a browsertest.
BUG=12326
TEST=none
Review URL: http://codereview.chromium.org/118476
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18116 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/extension_browsertest.cc')
-rw-r--r-- | chrome/browser/extensions/extension_browsertest.cc | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/chrome/browser/extensions/extension_browsertest.cc b/chrome/browser/extensions/extension_browsertest.cc new file mode 100644 index 0000000..c61c59d --- /dev/null +++ b/chrome/browser/extensions/extension_browsertest.cc @@ -0,0 +1,173 @@ +// Copyright (c) 2006-2008 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/ref_counted.h" +#include "chrome/browser/browser.h" +#include "chrome/browser/browser_list.h" +#include "chrome/browser/renderer_host/render_view_host.h" +#include "chrome/browser/extensions/extension_shelf.h" +#include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" +#include "chrome/browser/extensions/extensions_service.h" +#include "chrome/browser/extensions/test_extension_loader.h" +#include "chrome/browser/profile.h" +#include "chrome/browser/tab_contents/site_instance.h" +#include "chrome/common/chrome_paths.h" +#include "chrome/common/chrome_switches.h" +#include "chrome/common/extensions/extension_error_reporter.h" +#include "chrome/common/url_constants.h" +#include "chrome/test/in_process_browser_test.h" +#include "chrome/test/ui_test_utils.h" + +namespace { + +// How long to wait for the extension to put up a javascript alert before giving +// up. +const int kAlertTimeoutMs = 20000; + +// The extensions we're using as our test case. +const char* kGoodExtension1Id = "00123456789abcdef0123456789abcdef0123456"; +const char* kGoodCrxId = "00123456789abcdef0123456789abcdef0123456"; + +}; // namespace + +// This class starts up an extension process and waits until it tries to put +// up a javascript alert. +class MockExtensionHost : public ExtensionHost { + public: + MockExtensionHost(Extension* extension, const GURL& url, + SiteInstance* instance) + : ExtensionHost(extension, instance, url, NULL), + got_message_(false) { + CreateRenderView(NULL); + MessageLoop::current()->PostDelayedTask(FROM_HERE, + new MessageLoop::QuitTask, kAlertTimeoutMs); + ui_test_utils::RunMessageLoop(); + } + + virtual ExtensionFunctionDispatcher* CreateExtensionFunctionDispatcher( + RenderViewHost* render_view_host) { + NOTREACHED(); + return NULL; + } + + bool got_message() { return got_message_; } + private: + virtual void RunJavaScriptMessage( + const std::wstring& message, + const std::wstring& default_prompt, + const GURL& frame_url, + const int flags, + IPC::Message* reply_msg, + bool* did_suppress_message) { + got_message_ = true; + MessageLoopForUI::current()->Quit(); + + // Call super, otherwise we'll leak reply_msg. + ExtensionHost::RunJavaScriptMessage( + message, default_prompt, frame_url, flags, + reply_msg, did_suppress_message); + } + + bool got_message_; +}; + +class ExtensionViewTest : public InProcessBrowserTest { + public: + virtual void SetUp() { + // Initialize the error reporter here, otherwise BrowserMain will create it + // with the wrong MessageLoop. + ExtensionErrorReporter::Init(false); + + // Use single-process in an attempt to speed it up and make it less flaky. + //EnableSingleProcess(); + + InProcessBrowserTest::SetUp(); + } + virtual void SetUpCommandLine(CommandLine* command_line) { + command_line->AppendSwitch(switches::kEnableExtensions); + } +}; + +// Tests that ExtensionView starts an extension process and runs the script +// contained in the extension's toolstrip. +IN_PROC_BROWSER_TEST_F(ExtensionViewTest, Toolstrip) { + // Get the path to our extension. + FilePath path; + ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &path)); + path = path.AppendASCII("extensions"). + AppendASCII("good").AppendASCII("extension1").AppendASCII("1"); + ASSERT_TRUE(file_util::DirectoryExists(path)); // sanity check + + // Wait for the extension to load and grab a pointer to it. + TestExtensionLoader loader(browser()->profile()); + Extension* extension = loader.Load(kGoodExtension1Id, path); + ASSERT_TRUE(extension); + GURL url = Extension::GetResourceURL(extension->url(), "toolstrip1.html"); + + // Start the extension process and wait for it to show a javascript alert. + MockExtensionHost host(extension, url, + browser()->profile()->GetExtensionProcessManager()-> + GetSiteInstanceForURL(url)); + EXPECT_TRUE(host.got_message()); +} + +// Tests that the ExtensionShelf initializes properly, notices that +// an extension loaded and has a view available, and then sets that up +// properly. +IN_PROC_BROWSER_TEST_F(ExtensionViewTest, Shelf) { + // When initialized, there are no extension views and the preferred height + // should be zero. + scoped_ptr<ExtensionShelf> shelf(new ExtensionShelf(browser())); + EXPECT_EQ(shelf->GetChildViewCount(), 0); + EXPECT_EQ(shelf->GetPreferredSize().height(), 0); + + // Get the path to our extension. + FilePath path; + ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &path)); + path = path.AppendASCII("extensions"). + AppendASCII("good").AppendASCII("extension1").AppendASCII("1"); + ASSERT_TRUE(file_util::DirectoryExists(path)); // sanity check + + // Wait for the extension to load and grab a pointer to it. + TestExtensionLoader loader(browser()->profile()); + Extension* extension = loader.Load(kGoodExtension1Id, path); + ASSERT_TRUE(extension); + + // There should now be two extension views and preferred height of the view + // should be non-zero. + EXPECT_EQ(shelf->GetChildViewCount(), 2); + EXPECT_NE(shelf->GetPreferredSize().height(), 0); +} + +// Tests that installing and uninstalling extensions don't crash with an +// incognito window open. +IN_PROC_BROWSER_TEST_F(ExtensionViewTest, Incognito) { + // Open an incognito window to the extensions management page. We just + // want to make sure that we don't crash while playing with extensions when + // this guy is around. + Browser::OpenURLOffTheRecord(browser()->profile(), + GURL(chrome::kChromeUIExtensionsURL)); + + // Get the path to our extension. + FilePath path; + ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &path)); + path = path.AppendASCII("extensions").AppendASCII("good.crx"); + ASSERT_TRUE(file_util::PathExists(path)); // sanity check + + // Wait for the extension to load and grab a pointer to it. + TestExtensionLoader loader(browser()->profile()); + Extension* extension = loader.Install(kGoodCrxId, path); + ASSERT_TRUE(extension); + + // TODO(mpcomplete): wait for uninstall to complete? + browser()->profile()->GetExtensionsService()->UninstallExtension(kGoodCrxId); + + // Close our incognito window. + Browser* otr_browser = BrowserList::FindBrowserWithType( + browser()->profile()->GetOffTheRecordProfile(), + Browser::TYPE_NORMAL); + if (otr_browser) + otr_browser->CloseAllTabs(); +} |