| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 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 "chrome/browser/ui/views/browser_actions_container.h" | |
| 6 | |
| 7 #include "chrome/browser/chrome_notification_types.h" | |
| 8 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h" | |
| 9 #include "chrome/browser/extensions/browser_action_test_util.h" | |
| 10 #include "chrome/browser/extensions/extension_browsertest.h" | |
| 11 #include "chrome/browser/extensions/extension_service.h" | |
| 12 #include "content/public/test/test_utils.h" | |
| 13 | |
| 14 using extensions::Extension; | |
| 15 | |
| 16 class BrowserActionsContainerTest : public ExtensionBrowserTest { | |
| 17 public: | |
| 18 BrowserActionsContainerTest() { | |
| 19 } | |
| 20 virtual ~BrowserActionsContainerTest() {} | |
| 21 | |
| 22 virtual void SetUpOnMainThread() OVERRIDE { | |
| 23 browser_actions_bar_.reset(new BrowserActionTestUtil(browser())); | |
| 24 } | |
| 25 | |
| 26 BrowserActionTestUtil* browser_actions_bar() { | |
| 27 return browser_actions_bar_.get(); | |
| 28 } | |
| 29 | |
| 30 // Make sure extension with index |extension_index| has an icon. | |
| 31 void EnsureExtensionHasIcon(int extension_index) { | |
| 32 if (!browser_actions_bar_->HasIcon(extension_index)) { | |
| 33 // The icon is loaded asynchronously and a notification is then sent to | |
| 34 // observers. So we wait on it. | |
| 35 ExtensionAction* browser_action = | |
| 36 browser_actions_bar_->GetExtensionAction(extension_index); | |
| 37 | |
| 38 content::WindowedNotificationObserver observer( | |
| 39 chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED, | |
| 40 content::Source<ExtensionAction>(browser_action)); | |
| 41 observer.Wait(); | |
| 42 } | |
| 43 EXPECT_TRUE(browser_actions_bar()->HasIcon(extension_index)); | |
| 44 } | |
| 45 | |
| 46 private: | |
| 47 scoped_ptr<BrowserActionTestUtil> browser_actions_bar_; | |
| 48 }; | |
| 49 | |
| 50 // Test the basic functionality. | |
| 51 // http://crbug.com/120770 | |
| 52 #if defined(OS_WIN) | |
| 53 IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, DISABLED_Basic) { | |
| 54 #else | |
| 55 IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, Basic) { | |
| 56 #endif | |
| 57 BrowserActionsContainer::disable_animations_during_testing_ = true; | |
| 58 | |
| 59 // Load an extension with no browser action. | |
| 60 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test") | |
| 61 .AppendASCII("browser_action") | |
| 62 .AppendASCII("none"))); | |
| 63 // This extension should not be in the model (has no browser action). | |
| 64 EXPECT_EQ(0, browser_actions_bar()->NumberOfBrowserActions()); | |
| 65 | |
| 66 // Load an extension with a browser action. | |
| 67 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test") | |
| 68 .AppendASCII("browser_action") | |
| 69 .AppendASCII("basics"))); | |
| 70 EXPECT_EQ(1, browser_actions_bar()->NumberOfBrowserActions()); | |
| 71 EnsureExtensionHasIcon(0); | |
| 72 | |
| 73 // Unload the extension. | |
| 74 std::string id = browser_actions_bar()->GetExtensionId(0); | |
| 75 UnloadExtension(id); | |
| 76 EXPECT_EQ(0, browser_actions_bar()->NumberOfBrowserActions()); | |
| 77 } | |
| 78 | |
| 79 IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, Visibility) { | |
| 80 BrowserActionsContainer::disable_animations_during_testing_ = true; | |
| 81 | |
| 82 // Load extension A (contains browser action). | |
| 83 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test") | |
| 84 .AppendASCII("browser_action") | |
| 85 .AppendASCII("basics"))); | |
| 86 EXPECT_EQ(1, browser_actions_bar()->NumberOfBrowserActions()); | |
| 87 EnsureExtensionHasIcon(0); | |
| 88 EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions()); | |
| 89 std::string idA = browser_actions_bar()->GetExtensionId(0); | |
| 90 | |
| 91 // Load extension B (contains browser action). | |
| 92 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test") | |
| 93 .AppendASCII("browser_action") | |
| 94 .AppendASCII("add_popup"))); | |
| 95 EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions()); | |
| 96 EnsureExtensionHasIcon(0); | |
| 97 EXPECT_EQ(2, browser_actions_bar()->VisibleBrowserActions()); | |
| 98 std::string idB = browser_actions_bar()->GetExtensionId(1); | |
| 99 | |
| 100 EXPECT_NE(idA, idB); | |
| 101 | |
| 102 // Load extension C (contains browser action). | |
| 103 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test") | |
| 104 .AppendASCII("browser_action") | |
| 105 .AppendASCII("remove_popup"))); | |
| 106 EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions()); | |
| 107 EnsureExtensionHasIcon(2); | |
| 108 EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions()); | |
| 109 std::string idC = browser_actions_bar()->GetExtensionId(2); | |
| 110 | |
| 111 // Change container to show only one action, rest in overflow: A, [B, C]. | |
| 112 browser_actions_bar()->SetIconVisibilityCount(1); | |
| 113 EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions()); | |
| 114 | |
| 115 // Disable extension A (should disappear). State becomes: B [C]. | |
| 116 DisableExtension(idA); | |
| 117 EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions()); | |
| 118 EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions()); | |
| 119 EXPECT_EQ(idB, browser_actions_bar()->GetExtensionId(0)); | |
| 120 | |
| 121 // Enable A again. A should get its spot in the same location and the bar | |
| 122 // should not grow (chevron is showing). For details: http://crbug.com/35349. | |
| 123 // State becomes: A, [B, C]. | |
| 124 EnableExtension(idA); | |
| 125 EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions()); | |
| 126 EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions()); | |
| 127 EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0)); | |
| 128 | |
| 129 // Disable C (in overflow). State becomes: A, [B]. | |
| 130 DisableExtension(idC); | |
| 131 EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions()); | |
| 132 EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions()); | |
| 133 EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0)); | |
| 134 | |
| 135 // Enable C again. State becomes: A, [B, C]. | |
| 136 EnableExtension(idC); | |
| 137 EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions()); | |
| 138 EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions()); | |
| 139 EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0)); | |
| 140 | |
| 141 // Now we have 3 extensions. Make sure they are all visible. State: A, B, C. | |
| 142 browser_actions_bar()->SetIconVisibilityCount(3); | |
| 143 EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions()); | |
| 144 | |
| 145 // Disable extension A (should disappear). State becomes: B, C. | |
| 146 DisableExtension(idA); | |
| 147 EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions()); | |
| 148 EXPECT_EQ(2, browser_actions_bar()->VisibleBrowserActions()); | |
| 149 EXPECT_EQ(idB, browser_actions_bar()->GetExtensionId(0)); | |
| 150 | |
| 151 // Disable extension B (should disappear). State becomes: C. | |
| 152 DisableExtension(idB); | |
| 153 EXPECT_EQ(1, browser_actions_bar()->NumberOfBrowserActions()); | |
| 154 EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions()); | |
| 155 EXPECT_EQ(idC, browser_actions_bar()->GetExtensionId(0)); | |
| 156 | |
| 157 // Enable B. State becomes: B, C. | |
| 158 EnableExtension(idB); | |
| 159 EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions()); | |
| 160 EXPECT_EQ(2, browser_actions_bar()->VisibleBrowserActions()); | |
| 161 EXPECT_EQ(idB, browser_actions_bar()->GetExtensionId(0)); | |
| 162 | |
| 163 // Enable A. State becomes: A, B, C. | |
| 164 EnableExtension(idA); | |
| 165 EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions()); | |
| 166 EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions()); | |
| 167 EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0)); | |
| 168 } | |
| 169 | |
| 170 IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, ForceHide) { | |
| 171 BrowserActionsContainer::disable_animations_during_testing_ = true; | |
| 172 | |
| 173 // Load extension A (contains browser action). | |
| 174 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test") | |
| 175 .AppendASCII("browser_action") | |
| 176 .AppendASCII("basics"))); | |
| 177 EXPECT_EQ(1, browser_actions_bar()->NumberOfBrowserActions()); | |
| 178 EnsureExtensionHasIcon(0); | |
| 179 EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions()); | |
| 180 std::string idA = browser_actions_bar()->GetExtensionId(0); | |
| 181 | |
| 182 // Force hide this browser action. | |
| 183 extensions::ExtensionActionAPI::SetBrowserActionVisibility( | |
| 184 extensions::ExtensionSystem::Get(browser()->profile())-> | |
| 185 extension_service()->extension_prefs(), | |
| 186 idA, | |
| 187 false); | |
| 188 EXPECT_EQ(0, browser_actions_bar()->VisibleBrowserActions()); | |
| 189 } | |
| OLD | NEW |