Index: chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc |
diff --git a/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc b/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc |
index 4b943c79b6de404011ab7878fc0d028aad24b59a..bc94ac0e782344f6465bf6162c886f458041809d 100644 |
--- a/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc |
+++ b/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc |
@@ -11,6 +11,7 @@ |
#include "chrome/browser/extensions/extension_toolbar_model.h" |
#include "chrome/browser/ui/browser_window.h" |
#include "chrome/browser/ui/browser_window_testing_views.h" |
+#include "chrome/browser/ui/views/frame/browser_view.h" |
#include "chrome/browser/ui/views/toolbar/browser_action_view.h" |
#include "chrome/browser/ui/views/toolbar/toolbar_view.h" |
#include "content/public/test/test_utils.h" |
@@ -82,17 +83,17 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, Basic) { |
IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, |
MoveBrowserActions) { |
// Load three extensions with browser actions. |
- const Extension* extension_a = |
+ const extensions::Extension* extension_a = |
LoadExtension(test_data_dir_.AppendASCII("api_test") |
.AppendASCII("browser_action") |
.AppendASCII("basics")); |
ASSERT_TRUE(extension_a); |
- const Extension* extension_b = |
+ const extensions::Extension* extension_b = |
LoadExtension(test_data_dir_.AppendASCII("api_test") |
.AppendASCII("browser_action") |
.AppendASCII("add_popup")); |
ASSERT_TRUE(extension_b); |
- const Extension* extension_c = |
+ const extensions::Extension* extension_c = |
LoadExtension(test_data_dir_.AppendASCII("api_test") |
.AppendASCII("browser_action") |
.AppendASCII("remove_popup")); |
@@ -290,3 +291,172 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, HighlightMode) { |
action_view = container->GetBrowserActionViewAt(0); |
EXPECT_TRUE(container->CanStartDragForView(action_view, point, point)); |
} |
+ |
+// Test the behavior of the overflow container for Extension Actions. |
+class BrowserActionsContainerOverflowTest : public BrowserActionsContainerTest { |
+ public: |
+ BrowserActionsContainerOverflowTest() : main_bar_(NULL), model_(NULL) { |
+ } |
+ virtual ~BrowserActionsContainerOverflowTest() { |
+ } |
+ |
+ protected: |
+ // Returns true if the order of the BrowserActionViews in |main_bar_| |
+ // and |overflow_bar_| match. |
+ bool ViewOrdersMatch(); |
+ |
+ // Returns Success if the visible count matches |expected_visible|. This means |
+ // that the number of visible browser actions in |main_bar_| is |
+ // |expected_visible| and shows the first icons, and that the overflow bar |
+ // shows all (and only) the remainder. |
+ testing::AssertionResult VerifyVisibleCount(size_t expected_visible); |
+ |
+ // Accessors. |
+ BrowserActionsContainer* main_bar() { return main_bar_; } |
+ BrowserActionsContainer* overflow_bar() { return overflow_bar_.get(); } |
+ extensions::ExtensionToolbarModel* model() { return model_; } |
+ |
+ private: |
+ virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE; |
+ virtual void SetUpOnMainThread() OVERRIDE; |
+ virtual void TearDownOnMainThread() OVERRIDE; |
+ |
+ // The main BrowserActionsContainer (owned by the browser view). |
+ BrowserActionsContainer* main_bar_; |
+ |
+ // The overflow BrowserActionsContainer. We manufacture this so that we don't |
+ // have to open the wrench menu. |
+ scoped_ptr<BrowserActionsContainer> overflow_bar_; |
+ |
+ // The associated toolbar model. |
+ extensions::ExtensionToolbarModel* model_; |
+ |
+ // Enable the feature redesign switch. |
+ scoped_ptr<extensions::FeatureSwitch::ScopedOverride> enable_redesign_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BrowserActionsContainerOverflowTest); |
+}; |
+ |
+void BrowserActionsContainerOverflowTest::SetUpCommandLine( |
+ base::CommandLine* command_line) { |
+ BrowserActionsContainerTest::SetUpCommandLine(command_line); |
+ enable_redesign_.reset(new extensions::FeatureSwitch::ScopedOverride( |
+ extensions::FeatureSwitch::extension_action_redesign(), |
+ true)); |
+} |
+ |
+void BrowserActionsContainerOverflowTest::SetUpOnMainThread() { |
+ BrowserActionsContainerTest::SetUpOnMainThread(); |
+ main_bar_ = BrowserView::GetBrowserViewForBrowser(browser()) |
+ ->toolbar()->browser_actions(); |
+ overflow_bar_.reset(new BrowserActionsContainer(browser(), NULL, main_bar_)); |
+ overflow_bar_->set_owned_by_client(); |
+ model_ = extensions::ExtensionToolbarModel::Get(profile()); |
+} |
+ |
+void BrowserActionsContainerOverflowTest::TearDownOnMainThread() { |
+ overflow_bar_.reset(); |
+ enable_redesign_.reset(); |
+ BrowserActionsContainerTest::TearDownOnMainThread(); |
+} |
+ |
+bool BrowserActionsContainerOverflowTest::ViewOrdersMatch() { |
+ if (main_bar_->num_browser_actions() != |
+ overflow_bar_->num_browser_actions()) |
+ return false; |
+ for (size_t i = 0; i < main_bar_->num_browser_actions(); ++i) { |
+ if (main_bar_->GetBrowserActionViewAt(i)->extension() != |
+ overflow_bar_->GetBrowserActionViewAt(i)->extension()) |
+ return false; |
+ } |
+ return true; |
+} |
+ |
+testing::AssertionResult |
+BrowserActionsContainerOverflowTest::VerifyVisibleCount( |
+ size_t expected_visible) { |
+ // Views order should always match (as it is based directly off the model). |
+ if (!ViewOrdersMatch()) |
+ return testing::AssertionFailure() << "View orders don't match"; |
+ |
+ // Loop through and check each browser action for proper visibility (which |
+ // implicitly also guarantees that the proper number are visible). |
+ for (size_t i = 0; i < overflow_bar_->num_browser_actions(); ++i) { |
+ bool visible = i < expected_visible; |
+ if (main_bar_->GetBrowserActionViewAt(i)->visible() != visible) { |
+ return testing::AssertionFailure() << "Index " << i << |
+ " has improper visibility in main: " << !visible; |
+ } |
+ if (overflow_bar_->GetBrowserActionViewAt(i)->visible() == visible) { |
+ return testing::AssertionFailure() << "Index " << i << |
+ " has improper visibility in overflow: " << visible; |
+ } |
+ } |
+ return testing::AssertionSuccess(); |
+} |
+ |
+// Test the basic functionality of the BrowserActionsContainer in overflow mode. |
+IN_PROC_BROWSER_TEST_F(BrowserActionsContainerOverflowTest, |
+ TestBasicActionOverflow) { |
+ // Load three extensions with browser actions. |
+ // TODO(devlin): Make a method to load these, and generate them rather than |
+ // using files. |
+ base::FilePath test_data_path = |
+ test_data_dir_.AppendASCII("api_test").AppendASCII("browser_action"); |
+ const extensions::Extension* extension_a = |
+ LoadExtension(test_data_path.AppendASCII("basics")); |
+ const extensions::Extension* extension_b = |
+ LoadExtension(test_data_path.AppendASCII("add_popup")); |
+ const extensions::Extension* extension_c = |
+ LoadExtension(test_data_path.AppendASCII("remove_popup")); |
+ |
+ // Since the overflow bar isn't attached to a view, we have to kick it in |
+ // order to retrigger layout each time we change the number of icons in the |
+ // bar. |
+ overflow_bar()->Layout(); |
+ |
+ // Sanity checks: |
+ // All extensions loaded. |
+ ASSERT_TRUE(extension_a); |
+ ASSERT_TRUE(extension_b); |
+ ASSERT_TRUE(extension_c); |
+ |
+ // All actions are showing, and are in the installation order. |
+ EXPECT_EQ(-1, model()->GetVisibleIconCount()); |
+ ASSERT_EQ(3u, main_bar()->num_browser_actions()); |
+ EXPECT_EQ(extension_a, main_bar()->GetBrowserActionViewAt(0)->extension()); |
+ EXPECT_EQ(extension_b, main_bar()->GetBrowserActionViewAt(1)->extension()); |
+ EXPECT_EQ(extension_c, main_bar()->GetBrowserActionViewAt(2)->extension()); |
+ EXPECT_TRUE(VerifyVisibleCount(3u)); |
+ |
+ // Reduce the visible count to 2. Order should be unchanged (A B C), but |
+ // only A and B should be visible on the main bar. |
+ model()->SetVisibleIconCountForTest(2u); |
+ overflow_bar()->Layout(); // Kick. |
+ EXPECT_EQ(extension_a, main_bar()->GetBrowserActionViewAt(0)->extension()); |
+ EXPECT_EQ(extension_b, main_bar()->GetBrowserActionViewAt(1)->extension()); |
+ EXPECT_EQ(extension_c, main_bar()->GetBrowserActionViewAt(2)->extension()); |
+ EXPECT_TRUE(VerifyVisibleCount(2u)); |
+ |
+ // Move extension C to the first position. Order should now be C A B, with |
+ // C and A visible in the main bar. |
+ model()->MoveExtensionIcon(extension_c, 0); |
+ overflow_bar()->Layout(); // Kick. |
+ EXPECT_EQ(extension_c, main_bar()->GetBrowserActionViewAt(0)->extension()); |
+ EXPECT_EQ(extension_a, main_bar()->GetBrowserActionViewAt(1)->extension()); |
+ EXPECT_EQ(extension_b, main_bar()->GetBrowserActionViewAt(2)->extension()); |
+ EXPECT_TRUE(VerifyVisibleCount(2u)); |
+ |
+ // Hide action A. This results in it being sent to overflow, and reducing the |
+ // visible size to 1, so the order should be C A B, with only C visible in the |
+ // main bar. |
+ extensions::ExtensionActionAPI::SetBrowserActionVisibility( |
+ extensions::ExtensionPrefs::Get(profile()), |
+ extension_a->id(), |
+ false); |
+ overflow_bar()->Layout(); // Kick. |
+ EXPECT_EQ(extension_c, main_bar()->GetBrowserActionViewAt(0)->extension()); |
+ EXPECT_EQ(extension_a, main_bar()->GetBrowserActionViewAt(1)->extension()); |
+ EXPECT_EQ(extension_b, main_bar()->GetBrowserActionViewAt(2)->extension()); |
+ EXPECT_TRUE(VerifyVisibleCount(1u)); |
+} |