diff options
Diffstat (limited to 'chrome/browser/ui/views/browser_actions_container_browsertest.cc')
-rw-r--r-- | chrome/browser/ui/views/browser_actions_container_browsertest.cc | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/chrome/browser/ui/views/browser_actions_container_browsertest.cc b/chrome/browser/ui/views/browser_actions_container_browsertest.cc new file mode 100644 index 0000000..de1a218 --- /dev/null +++ b/chrome/browser/ui/views/browser_actions_container_browsertest.cc @@ -0,0 +1,200 @@ +// Copyright (c) 2010 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 "chrome/browser/extensions/browser_action_test_util.h" +#include "chrome/browser/extensions/extension_browsertest.h" +#include "chrome/browser/extensions/extensions_service.h" +#include "chrome/browser/profile.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/views/browser_actions_container.h" +#include "chrome/common/chrome_switches.h" +#include "chrome/common/extensions/extension_action.h" +#include "chrome/common/extensions/extension_resource.h" + +class BrowserActionsContainerTest : public ExtensionBrowserTest { + public: + BrowserActionsContainerTest() { + } + virtual ~BrowserActionsContainerTest() {} + + virtual Browser* CreateBrowser(Profile* profile) { + Browser* b = InProcessBrowserTest::CreateBrowser(profile); + browser_actions_bar_.reset(new BrowserActionTestUtil(b)); + return b; + } + + BrowserActionTestUtil* browser_actions_bar() { + return browser_actions_bar_.get(); + } + + // Make sure extension with index |extension_index| has an icon. + void EnsureExtensionHasIcon(int extension_index) { + if (!browser_actions_bar_->HasIcon(extension_index)) { + // The icon is loaded asynchronously and a notification is then sent to + // observers. So we wait on it. + browser_actions_bar_->WaitForBrowserActionUpdated(extension_index); + } + EXPECT_TRUE(browser_actions_bar()->HasIcon(extension_index)); + } + + private: + scoped_ptr<BrowserActionTestUtil> browser_actions_bar_; +}; + +// Test the basic functionality. +IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, Basic) { + BrowserActionsContainer::disable_animations_during_testing_ = true; + + // Load an extension with no browser action. + ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test") + .AppendASCII("browser_action") + .AppendASCII("none"))); + // This extension should not be in the model (has no browser action). + EXPECT_EQ(0, browser_actions_bar()->NumberOfBrowserActions()); + + // Load an extension with a browser action. + ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test") + .AppendASCII("browser_action") + .AppendASCII("basics"))); + EXPECT_EQ(1, browser_actions_bar()->NumberOfBrowserActions()); + EnsureExtensionHasIcon(0); + + // Unload the extension. + std::string id = browser_actions_bar()->GetExtensionId(0); + UnloadExtension(id); + EXPECT_EQ(0, browser_actions_bar()->NumberOfBrowserActions()); +} + +// TODO(mpcomplete): http://code.google.com/p/chromium/issues/detail?id=38992 +// Disabled, http://crbug.com/38992. +IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, DISABLED_Visibility) { + BrowserActionsContainer::disable_animations_during_testing_ = true; + + // Load extension A (contains browser action). + ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test") + .AppendASCII("browser_action") + .AppendASCII("basics"))); + EXPECT_EQ(1, browser_actions_bar()->NumberOfBrowserActions()); + EnsureExtensionHasIcon(0); + EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions()); + std::string idA = browser_actions_bar()->GetExtensionId(0); + + // Load extension B (contains browser action). + ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test") + .AppendASCII("browser_action") + .AppendASCII("add_popup"))); + EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions()); + EnsureExtensionHasIcon(0); + EXPECT_EQ(2, browser_actions_bar()->VisibleBrowserActions()); + std::string idB = browser_actions_bar()->GetExtensionId(1); + + EXPECT_NE(idA, idB); + + // Load extension C (contains browser action). + ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test") + .AppendASCII("browser_action") + .AppendASCII("remove_popup"))); + EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions()); + EnsureExtensionHasIcon(2); + EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions()); + std::string idC = browser_actions_bar()->GetExtensionId(2); + + // Change container to show only one action, rest in overflow: A, [B, C]. + browser_actions_bar()->SetIconVisibilityCount(1); + EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions()); + + // Disable extension A (should disappear). State becomes: B [C]. + DisableExtension(idA); + EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions()); + EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions()); + EXPECT_EQ(idB, browser_actions_bar()->GetExtensionId(0)); + + // Enable A again. A should get its spot in the same location and the bar + // should not grow (chevron is showing). For details: http://crbug.com/35349. + // State becomes: A, [B, C]. + EnableExtension(idA); + EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions()); + EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions()); + EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0)); + + // Disable C (in overflow). State becomes: A, [B]. + DisableExtension(idC); + EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions()); + EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions()); + EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0)); + + // Enable C again. State becomes: A, [B, C]. + EnableExtension(idC); + EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions()); + EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions()); + EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0)); + + // Now we have 3 extensions. Make sure they are all visible. State: A, B, C. + browser_actions_bar()->SetIconVisibilityCount(3); + EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions()); + + // Disable extension A (should disappear). State becomes: B, C. + DisableExtension(idA); + EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions()); + EXPECT_EQ(2, browser_actions_bar()->VisibleBrowserActions()); + EXPECT_EQ(idB, browser_actions_bar()->GetExtensionId(0)); + + // Disable extension B (should disappear). State becomes: C. + DisableExtension(idB); + EXPECT_EQ(1, browser_actions_bar()->NumberOfBrowserActions()); + EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions()); + EXPECT_EQ(idC, browser_actions_bar()->GetExtensionId(0)); + + // Enable B (makes B and C showing now). State becomes: B, C. + EnableExtension(idB); + EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions()); + EXPECT_EQ(2, browser_actions_bar()->VisibleBrowserActions()); + EXPECT_EQ(idB, browser_actions_bar()->GetExtensionId(0)); + + // Enable A (makes A, B and C showing now). State becomes: B, C, A. + EnableExtension(idA); + EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions()); + EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions()); + EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(2)); +} + +IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, TestCrash57536) { + std::cout << "Test starting\n" << std::flush; + + ExtensionsService* service = browser()->profile()->GetExtensionsService(); + const size_t size_before = service->extensions()->size(); + + std::cout << "Loading extension\n" << std::flush; + + // Load extension A (contains browser action). + ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test") + .AppendASCII("browser_action") + .AppendASCII("crash_57536"))); + + const Extension* extension = service->extensions()->at(size_before); + + std::cout << "Creating bitmap\n" << std::flush; + + // Create and cache and empty bitmap. + SkBitmap bitmap; + bitmap.setConfig(SkBitmap::kARGB_8888_Config, + Extension::kBrowserActionIconMaxSize, + Extension::kBrowserActionIconMaxSize); + bitmap.allocPixels(); + + std::cout << "Set as cached image\n" << std::flush; + + gfx::Size size(Extension::kBrowserActionIconMaxSize, + Extension::kBrowserActionIconMaxSize); + extension->SetCachedImage( + extension->GetResource(extension->browser_action()->default_icon_path()), + bitmap, + size); + + std::cout << "Disabling extension\n" << std::flush; + DisableExtension(extension->id()); + std::cout << "Enabling extension\n" << std::flush; + EnableExtension(extension->id()); + std::cout << "Test ending\n" << std::flush; +} |