Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / views / toolbar / browser_actions_container_browsertest.cc
index 76191e9..fc611ff 100644 (file)
@@ -4,18 +4,16 @@
 
 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h"
 
-#include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
 #include "chrome/browser/extensions/browser_action_test_util.h"
-#include "chrome/browser/extensions/extension_browsertest.h"
 #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/toolbar/browser_actions_bar_browsertest.h"
 #include "chrome/browser/ui/views/extensions/browser_action_drag_data.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_action_view.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
-#include "content/public/test/test_utils.h"
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/common/extension.h"
 #include "ui/base/dragdrop/drop_target_event.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/views/view.h"
 
-using extensions::Extension;
-
-class BrowserActionsContainerTest : public ExtensionBrowserTest {
- public:
-  BrowserActionsContainerTest() {
-  }
-  virtual ~BrowserActionsContainerTest() {}
-
-  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE {
-    BrowserActionsContainer::disable_animations_during_testing_ = true;
-    ExtensionBrowserTest::SetUpCommandLine(command_line);
-  }
-
-  virtual void SetUpOnMainThread() OVERRIDE {
-    ExtensionBrowserTest::SetUpOnMainThread();
-    browser_actions_bar_.reset(new BrowserActionTestUtil(browser()));
-  }
-
-  virtual void TearDownOnMainThread() OVERRIDE {
-    BrowserActionsContainer::disable_animations_during_testing_ = false;
-  }
-
-  BrowserActionTestUtil* browser_actions_bar() {
-    return browser_actions_bar_.get();
-  }
-
- private:
-  scoped_ptr<BrowserActionTestUtil> browser_actions_bar_;
-};
-
-// Test the basic functionality.
-// http://crbug.com/120770
-#if defined(OS_WIN)
-IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, DISABLED_Basic) {
-#else
-IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, Basic) {
-#endif
-  // 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());
-  EXPECT_TRUE(browser_actions_bar()->HasIcon(0));
-
-
-  // Unload the extension.
-  std::string id = browser_actions_bar()->GetExtensionId(0);
-  UnloadExtension(id);
-  EXPECT_EQ(0, browser_actions_bar()->NumberOfBrowserActions());
-}
-
-// Test moving various browser actions. This is not to check the logic of the
-// move (that's in the toolbar model tests), but just to check our ui.
-IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest,
-                       MoveBrowserActions) {
-  base::FilePath data_dir =
-      test_data_dir_.AppendASCII("api_test").AppendASCII("browser_action");
-  // Load three extensions with browser actions.
-  const extensions::Extension* extension_a =
-      LoadExtension(data_dir.AppendASCII("basics"));
-  ASSERT_TRUE(extension_a);
-  const extensions::Extension* extension_b =
-      LoadExtension(data_dir.AppendASCII("add_popup"));
-  ASSERT_TRUE(extension_b);
-  const extensions::Extension* extension_c =
-      LoadExtension(data_dir.AppendASCII("remove_popup"));
-  ASSERT_TRUE(extension_c);
-
-  EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions());
-  EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions());
-
-  extensions::ExtensionToolbarModel* model =
-      extensions::ExtensionToolbarModel::Get(profile());
-  ASSERT_TRUE(model);
-
-  // Order is now A B C.
-  EXPECT_EQ(extension_a->id(), browser_actions_bar()->GetExtensionId(0));
-  EXPECT_EQ(extension_b->id(), browser_actions_bar()->GetExtensionId(1));
-  EXPECT_EQ(extension_c->id(), browser_actions_bar()->GetExtensionId(2));
-
-  // Move C to first position. Order is C A B.
-  model->MoveExtensionIcon(extension_c, 0);
-  EXPECT_EQ(extension_c->id(), browser_actions_bar()->GetExtensionId(0));
-  EXPECT_EQ(extension_a->id(), browser_actions_bar()->GetExtensionId(1));
-  EXPECT_EQ(extension_b->id(), browser_actions_bar()->GetExtensionId(2));
-
-  // Move B to third position. Order is still C A B.
-  model->MoveExtensionIcon(extension_b, 2);
-  EXPECT_EQ(extension_c->id(), browser_actions_bar()->GetExtensionId(0));
-  EXPECT_EQ(extension_a->id(), browser_actions_bar()->GetExtensionId(1));
-  EXPECT_EQ(extension_b->id(), browser_actions_bar()->GetExtensionId(2));
-
-  // Move B to middle position. Order is C B A.
-  model->MoveExtensionIcon(extension_b, 1);
-  EXPECT_EQ(extension_c->id(), browser_actions_bar()->GetExtensionId(0));
-  EXPECT_EQ(extension_b->id(), browser_actions_bar()->GetExtensionId(1));
-  EXPECT_EQ(extension_a->id(), browser_actions_bar()->GetExtensionId(2));
-}
+// TODO(devlin): Continue moving any tests that should be platform independent
+// from this file to the crossplatform tests in
+// chrome/browser/ui/toolbar/browser_actions_bar_browsertest.cc.
 
 // Test that dragging browser actions works, and that dragging a browser action
 // from the overflow menu results in it "popping" out (growing the container
 // size by 1), rather than just reordering the extensions.
-IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, DragBrowserActions) {
-  base::FilePath data_dir =
-      test_data_dir_.AppendASCII("api_test").AppendASCII("browser_action");
-  // Load three extensions with browser actions.
-  const extensions::Extension* extension_a =
-      LoadExtension(data_dir.AppendASCII("basics"));
-  ASSERT_TRUE(extension_a);
-  const extensions::Extension* extension_b =
-      LoadExtension(data_dir.AppendASCII("add_popup"));
-  ASSERT_TRUE(extension_b);
-  const extensions::Extension* extension_c =
-      LoadExtension(data_dir.AppendASCII("remove_popup"));
-  ASSERT_TRUE(extension_c);
+IN_PROC_BROWSER_TEST_F(BrowserActionsBarBrowserTest, DragBrowserActions) {
+  LoadExtensions();
 
   // Sanity check: All extensions showing; order is A B C.
   EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions());
   EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions());
-  EXPECT_EQ(extension_a->id(), browser_actions_bar()->GetExtensionId(0));
-  EXPECT_EQ(extension_b->id(), browser_actions_bar()->GetExtensionId(1));
-  EXPECT_EQ(extension_c->id(), browser_actions_bar()->GetExtensionId(2));
+  EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(0));
+  EXPECT_EQ(extension_b()->id(), browser_actions_bar()->GetExtensionId(1));
+  EXPECT_EQ(extension_c()->id(), browser_actions_bar()->GetExtensionId(2));
 
   BrowserActionsContainer* container =
       BrowserView::GetBrowserViewForBrowser(browser())
@@ -160,9 +45,9 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, DragBrowserActions) {
   // Simulate a drag and drop to the right.
   ui::OSExchangeData drop_data;
   // Drag extension A from index 0...
-  BrowserActionDragData browser_action_drag_data(extension_a->id(), 0u);
+  BrowserActionDragData browser_action_drag_data(extension_a()->id(), 0u);
   browser_action_drag_data.Write(profile(), &drop_data);
-  BrowserActionView* view = container->GetViewForExtension(extension_b);
+  ToolbarActionView* view = container->GetViewForExtension(extension_b());
   // ...to the right of extension B.
   gfx::Point location(view->x() + view->width(), view->y());
   ui::DropTargetEvent target_event(
@@ -173,21 +58,21 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, DragBrowserActions) {
   container->OnPerformDrop(target_event);
 
   // The order should now be B A C, since A was dragged to the right of B.
-  EXPECT_EQ(extension_b->id(), browser_actions_bar()->GetExtensionId(0));
-  EXPECT_EQ(extension_a->id(), browser_actions_bar()->GetExtensionId(1));
-  EXPECT_EQ(extension_c->id(), browser_actions_bar()->GetExtensionId(2));
+  EXPECT_EQ(extension_b()->id(), browser_actions_bar()->GetExtensionId(0));
+  EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(1));
+  EXPECT_EQ(extension_c()->id(), browser_actions_bar()->GetExtensionId(2));
 
   // This order should be reflected in the underlying model.
   extensions::ExtensionToolbarModel* model =
       extensions::ExtensionToolbarModel::Get(profile());
-  EXPECT_EQ(extension_b, model->toolbar_items()[0].get());
-  EXPECT_EQ(extension_a, model->toolbar_items()[1].get());
-  EXPECT_EQ(extension_c, model->toolbar_items()[2].get());
+  EXPECT_EQ(extension_b(), model->toolbar_items()[0].get());
+  EXPECT_EQ(extension_a(), model->toolbar_items()[1].get());
+  EXPECT_EQ(extension_c(), model->toolbar_items()[2].get());
 
   // Simulate a drag and drop to the left.
   ui::OSExchangeData drop_data2;
   // Drag extension A from index 1...
-  BrowserActionDragData browser_action_drag_data2(extension_a->id(), 1u);
+  BrowserActionDragData browser_action_drag_data2(extension_a()->id(), 1u);
   browser_action_drag_data2.Write(profile(), &drop_data2);
   // ...to the left of extension B (which is now at index 0).
   location = gfx::Point(view->x(), view->y());
@@ -199,12 +84,12 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, DragBrowserActions) {
   container->OnPerformDrop(target_event2);
 
   // Order should be restored to A B C.
-  EXPECT_EQ(extension_a->id(), browser_actions_bar()->GetExtensionId(0));
-  EXPECT_EQ(extension_b->id(), browser_actions_bar()->GetExtensionId(1));
-  EXPECT_EQ(extension_c->id(), browser_actions_bar()->GetExtensionId(2));
+  EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(0));
+  EXPECT_EQ(extension_b()->id(), browser_actions_bar()->GetExtensionId(1));
+  EXPECT_EQ(extension_c()->id(), browser_actions_bar()->GetExtensionId(2));
 
   // Shrink the size of the container so we have an overflow menu.
-  model->SetVisibleIconCountForTest(2u);
+  model->SetVisibleIconCount(2u);
   EXPECT_EQ(2u, container->VisibleBrowserActions());
   ASSERT_TRUE(container->chevron());
   EXPECT_TRUE(container->chevron()->visible());
@@ -212,7 +97,7 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, DragBrowserActions) {
   // Simulate a drag and drop from the overflow menu.
   ui::OSExchangeData drop_data3;
   // Drag extension C from index 2 (in the overflow menu)...
-  BrowserActionDragData browser_action_drag_data3(extension_c->id(), 2u);
+  BrowserActionDragData browser_action_drag_data3(extension_c()->id(), 2u);
   browser_action_drag_data3.Write(profile(), &drop_data3);
   // ...to the left of extension B (which is back in index 1 on the main bar).
   location = gfx::Point(view->x(), view->y());
@@ -226,12 +111,12 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, DragBrowserActions) {
   // The order should have changed *and* the container should have grown to
   // accommodate extension C. The new order should be A C B, and all three
   // extensions should be visible, with no overflow menu.
-  EXPECT_EQ(extension_a->id(), browser_actions_bar()->GetExtensionId(0));
-  EXPECT_EQ(extension_c->id(), browser_actions_bar()->GetExtensionId(1));
-  EXPECT_EQ(extension_b->id(), browser_actions_bar()->GetExtensionId(2));
+  EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(0));
+  EXPECT_EQ(extension_c()->id(), browser_actions_bar()->GetExtensionId(1));
+  EXPECT_EQ(extension_b()->id(), browser_actions_bar()->GetExtensionId(2));
   EXPECT_EQ(3u, container->VisibleBrowserActions());
   EXPECT_FALSE(container->chevron()->visible());
-  EXPECT_EQ(-1, model->GetVisibleIconCount());
+  EXPECT_TRUE(model->all_icons_visible());
 
   // TODO(devlin): Ideally, we'd also have tests for dragging from the legacy
   // overflow menu (i.e., chevron) to the main bar, but this requires either
@@ -239,93 +124,66 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, DragBrowserActions) {
   // mock up the BrowserActionOverflowMenuController.
 }
 
-IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, Visibility) {
-  // 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());
-  EXPECT_TRUE(browser_actions_bar()->HasIcon(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());
-  EXPECT_TRUE(browser_actions_bar()->HasIcon(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());
-  EXPECT_TRUE(browser_actions_bar()->HasIcon(2));
-  EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions());
-  std::string idC = browser_actions_bar()->GetExtensionId(2);
+IN_PROC_BROWSER_TEST_F(BrowserActionsBarBrowserTest, Visibility) {
+  LoadExtensions();
 
   // 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);
+  DisableExtension(extension_a()->id());
   EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions());
   EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions());
-  EXPECT_EQ(idB, browser_actions_bar()->GetExtensionId(0));
+  EXPECT_EQ(extension_b()->id(), 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);
+  EnableExtension(extension_a()->id());
   EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions());
   EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions());
-  EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0));
+  EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(0));
 
   // Disable C (in overflow). State becomes: A, [B].
-  DisableExtension(idC);
+  DisableExtension(extension_c()->id());
   EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions());
   EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions());
-  EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0));
+  EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(0));
 
   // Enable C again. State becomes: A, [B, C].
-  EnableExtension(idC);
+  EnableExtension(extension_c()->id());
   EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions());
   EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions());
-  EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0));
+  EXPECT_EQ(extension_a()->id(), 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);
+  DisableExtension(extension_a()->id());
   EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions());
   EXPECT_EQ(2, browser_actions_bar()->VisibleBrowserActions());
-  EXPECT_EQ(idB, browser_actions_bar()->GetExtensionId(0));
+  EXPECT_EQ(extension_b()->id(), browser_actions_bar()->GetExtensionId(0));
 
   // Disable extension B (should disappear). State becomes: C.
-  DisableExtension(idB);
+  DisableExtension(extension_b()->id());
   EXPECT_EQ(1, browser_actions_bar()->NumberOfBrowserActions());
   EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions());
-  EXPECT_EQ(idC, browser_actions_bar()->GetExtensionId(0));
+  EXPECT_EQ(extension_c()->id(), browser_actions_bar()->GetExtensionId(0));
 
   // Enable B. State becomes: B, C.
-  EnableExtension(idB);
+  EnableExtension(extension_b()->id());
   EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions());
   EXPECT_EQ(2, browser_actions_bar()->VisibleBrowserActions());
-  EXPECT_EQ(idB, browser_actions_bar()->GetExtensionId(0));
+  EXPECT_EQ(extension_b()->id(), browser_actions_bar()->GetExtensionId(0));
 
   // Enable A. State becomes: A, B, C.
-  EnableExtension(idA);
+  EnableExtension(extension_a()->id());
   EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions());
   EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions());
-  EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0));
+  EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(0));
 
   // Shrink the browser actions bar to zero visible icons.
   // No icons should be visible, but we *should* show the chevron and have a
@@ -343,60 +201,90 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, Visibility) {
   // should be visible.
   browser_actions_bar()->SetIconVisibilityCount(2);
   EXPECT_EQ(2, browser_actions_bar()->VisibleBrowserActions());
-  EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0));
-  EXPECT_EQ(idB, browser_actions_bar()->GetExtensionId(1));
+  EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(0));
+  EXPECT_EQ(extension_b()->id(), browser_actions_bar()->GetExtensionId(1));
   EXPECT_TRUE(container->chevron()->visible());
 
   // Disable C (the overflowed extension). State should now be A, B, and the
   // chevron should be hidden.
-  DisableExtension(idC);
+  DisableExtension(extension_c()->id());
   EXPECT_EQ(2, browser_actions_bar()->VisibleBrowserActions());
-  EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0));
-  EXPECT_EQ(idB, browser_actions_bar()->GetExtensionId(1));
+  EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(0));
+  EXPECT_EQ(extension_b()->id(), browser_actions_bar()->GetExtensionId(1));
   EXPECT_FALSE(container->chevron()->visible());
 
   // Re-enable C. We should still only have 2 visible icons, and the chevron
   // should be visible.
-  EnableExtension(idC);
+  EnableExtension(extension_c()->id());
   EXPECT_EQ(2, browser_actions_bar()->VisibleBrowserActions());
-  EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0));
-  EXPECT_EQ(idB, browser_actions_bar()->GetExtensionId(1));
+  EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(0));
+  EXPECT_EQ(extension_b()->id(), browser_actions_bar()->GetExtensionId(1));
   EXPECT_TRUE(container->chevron()->visible());
 }
 
-IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, ForceHide) {
-  // 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());
-  EXPECT_TRUE(browser_actions_bar()->HasIcon(0));
-  EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions());
-  std::string idA = browser_actions_bar()->GetExtensionId(0);
+// Test that changes performed in one container affect containers in other
+// windows so that it is consistent.
+IN_PROC_BROWSER_TEST_F(BrowserActionsBarBrowserTest, MultipleWindows) {
+  LoadExtensions();
+  BrowserActionsContainer* first =
+      BrowserView::GetBrowserViewForBrowser(browser())->toolbar()->
+          browser_actions();
+
+  // Create a second browser.
+  Browser* second_browser = new Browser(
+      Browser::CreateParams(profile(), browser()->host_desktop_type()));
+  BrowserActionsContainer* second =
+      BrowserView::GetBrowserViewForBrowser(second_browser)->toolbar()->
+          browser_actions();
+
+  // Both containers should have the same order and visible actions, which
+  // is right now A B C.
+  EXPECT_EQ(3u, first->VisibleBrowserActions());
+  EXPECT_EQ(3u, second->VisibleBrowserActions());
+  EXPECT_EQ(extension_a()->id(), first->GetIdAt(0u));
+  EXPECT_EQ(extension_a()->id(), second->GetIdAt(0u));
+  EXPECT_EQ(extension_b()->id(), first->GetIdAt(1u));
+  EXPECT_EQ(extension_b()->id(), second->GetIdAt(1u));
+  EXPECT_EQ(extension_c()->id(), first->GetIdAt(2u));
+  EXPECT_EQ(extension_c()->id(), second->GetIdAt(2u));
 
-  // Force hide this browser action.
-  extensions::ExtensionActionAPI::SetBrowserActionVisibility(
-      extensions::ExtensionPrefs::Get(browser()->profile()), idA, false);
-  EXPECT_EQ(0, browser_actions_bar()->VisibleBrowserActions());
+  // Simulate a drag and drop to the right.
+  ui::OSExchangeData drop_data;
+  // Drag extension A from index 0...
+  BrowserActionDragData browser_action_drag_data(extension_a()->id(), 0u);
+  browser_action_drag_data.Write(profile(), &drop_data);
+  ToolbarActionView* view = first->GetViewForExtension(extension_b());
+  // ...to the right of extension B.
+  gfx::Point location(view->x() + view->width(), view->y());
+  ui::DropTargetEvent target_event(
+      drop_data, location, location, ui::DragDropTypes::DRAG_MOVE);
+
+  // Drag and drop.
+  first->OnDragUpdated(target_event);
+  first->OnPerformDrop(target_event);
+
+  // The new order, B A C, should be reflected in *both* containers, even
+  // though the drag only happened in the first one.
+  EXPECT_EQ(extension_b()->id(), first->GetIdAt(0u));
+  EXPECT_EQ(extension_b()->id(), second->GetIdAt(0u));
+  EXPECT_EQ(extension_a()->id(), first->GetIdAt(1u));
+  EXPECT_EQ(extension_a()->id(), second->GetIdAt(1u));
+  EXPECT_EQ(extension_c()->id(), first->GetIdAt(2u));
+  EXPECT_EQ(extension_c()->id(), second->GetIdAt(2u));
+
+  // Next, simulate a resize by shrinking the container.
+  first->OnResize(1, true);
+  // The first and second container should each have resized.
+  EXPECT_EQ(2u, first->VisibleBrowserActions());
+  EXPECT_EQ(2u, second->VisibleBrowserActions());
 }
 
 // Test that the BrowserActionsContainer responds correctly when the underlying
 // model enters highlight mode, and that browser actions are undraggable in
 // highlight mode. (Highlight mode itself it tested more thoroughly in the
 // ExtensionToolbarModel browsertests).
-IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, HighlightMode) {
-  // Load three extensions with browser actions.
-  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test")
-                                          .AppendASCII("browser_action")
-                                          .AppendASCII("basics")));
-  std::string id_a = browser_actions_bar()->GetExtensionId(0);
-  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test")
-                                          .AppendASCII("browser_action")
-                                          .AppendASCII("add_popup")));
-  std::string id_b = browser_actions_bar()->GetExtensionId(1);
-  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test")
-                                          .AppendASCII("browser_action")
-                                          .AppendASCII("remove_popup")));
+IN_PROC_BROWSER_TEST_F(BrowserActionsBarBrowserTest, HighlightMode) {
+  LoadExtensions();
 
   EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions());
   EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions());
@@ -408,7 +296,7 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, HighlightMode) {
                                            ->browser_actions();
 
   // Currently, dragging should be enabled.
-  BrowserActionView* action_view = container->GetBrowserActionViewAt(0);
+  ToolbarActionView* action_view = container->GetToolbarActionViewAt(0);
   ASSERT_TRUE(action_view);
   gfx::Point point(action_view->x(), action_view->y());
   EXPECT_TRUE(container->CanStartDragForView(action_view, point, point));
@@ -417,8 +305,8 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, HighlightMode) {
       extensions::ExtensionToolbarModel::Get(profile());
 
   extensions::ExtensionIdList extension_ids;
-  extension_ids.push_back(id_a);
-  extension_ids.push_back(id_b);
+  extension_ids.push_back(extension_a()->id());
+  extension_ids.push_back(extension_b()->id());
   model->HighlightExtensions(extension_ids);
 
   // Only two browser actions should be visible.
@@ -426,27 +314,27 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, HighlightMode) {
   EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions());
 
   // We shouldn't be able to drag in highlight mode.
-  action_view = container->GetBrowserActionViewAt(0);
+  action_view = container->GetToolbarActionViewAt(0);
   EXPECT_FALSE(container->CanStartDragForView(action_view, point, point));
 
   // We should go back to normal after leaving highlight mode.
   model->StopHighlighting();
   EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions());
   EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions());
-  action_view = container->GetBrowserActionViewAt(0);
+  action_view = container->GetToolbarActionViewAt(0);
   EXPECT_TRUE(container->CanStartDragForView(action_view, point, point));
 }
 
 // Test the behavior of the overflow container for Extension Actions.
-class BrowserActionsContainerOverflowTest : public BrowserActionsContainerTest {
+class BrowserActionsContainerOverflowTest
+    : public BrowserActionsBarBrowserTest {
  public:
   BrowserActionsContainerOverflowTest() : main_bar_(NULL), model_(NULL) {
   }
-  virtual ~BrowserActionsContainerOverflowTest() {
-  }
+  ~BrowserActionsContainerOverflowTest() override {}
 
  protected:
-  // Returns true if the order of the BrowserActionViews in |main_bar_|
+  // Returns true if the order of the ToolbarActionViews in |main_bar_|
   // and |overflow_bar_| match.
   bool ViewOrdersMatch();
 
@@ -462,9 +350,9 @@ class BrowserActionsContainerOverflowTest : public BrowserActionsContainerTest {
   extensions::ExtensionToolbarModel* model() { return model_; }
 
  private:
-  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
-  virtual void SetUpOnMainThread() OVERRIDE;
-  virtual void TearDownOnMainThread() OVERRIDE;
+  void SetUpCommandLine(base::CommandLine* command_line) override;
+  void SetUpOnMainThread() override;
+  void TearDownOnMainThread() override;
 
   // The main BrowserActionsContainer (owned by the browser view).
   BrowserActionsContainer* main_bar_;
@@ -484,17 +372,17 @@ class BrowserActionsContainerOverflowTest : public BrowserActionsContainerTest {
 
 void BrowserActionsContainerOverflowTest::SetUpCommandLine(
     base::CommandLine* command_line) {
-  BrowserActionsContainerTest::SetUpCommandLine(command_line);
+  BrowserActionsBarBrowserTest::SetUpCommandLine(command_line);
   enable_redesign_.reset(new extensions::FeatureSwitch::ScopedOverride(
       extensions::FeatureSwitch::extension_action_redesign(),
       true));
 }
 
 void BrowserActionsContainerOverflowTest::SetUpOnMainThread() {
-  BrowserActionsContainerTest::SetUpOnMainThread();
+  BrowserActionsBarBrowserTest::SetUpOnMainThread();
   main_bar_ = BrowserView::GetBrowserViewForBrowser(browser())
                   ->toolbar()->browser_actions();
-  overflow_bar_.reset(new BrowserActionsContainer(browser(), NULL, main_bar_));
+  overflow_bar_.reset(new BrowserActionsContainer(browser(), main_bar_));
   overflow_bar_->set_owned_by_client();
   model_ = extensions::ExtensionToolbarModel::Get(profile());
 }
@@ -502,16 +390,15 @@ void BrowserActionsContainerOverflowTest::SetUpOnMainThread() {
 void BrowserActionsContainerOverflowTest::TearDownOnMainThread() {
   overflow_bar_.reset();
   enable_redesign_.reset();
-  BrowserActionsContainerTest::TearDownOnMainThread();
+  BrowserActionsBarBrowserTest::TearDownOnMainThread();
 }
 
 bool BrowserActionsContainerOverflowTest::ViewOrdersMatch() {
-  if (main_bar_->num_browser_actions() !=
-      overflow_bar_->num_browser_actions())
+  if (main_bar_->num_toolbar_actions() !=
+      overflow_bar_->num_toolbar_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())
+  for (size_t i = 0; i < main_bar_->num_toolbar_actions(); ++i) {
+    if (main_bar_->GetIdAt(i) != overflow_bar_->GetIdAt(i))
       return false;
   }
   return true;
@@ -526,13 +413,13 @@ BrowserActionsContainerOverflowTest::VerifyVisibleCount(
 
   // 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) {
+  for (size_t i = 0; i < overflow_bar_->num_toolbar_actions(); ++i) {
     bool visible = i < expected_visible;
-    if (main_bar_->GetBrowserActionViewAt(i)->visible() != visible) {
+    if (main_bar_->GetToolbarActionViewAt(i)->visible() != visible) {
       return testing::AssertionFailure() << "Index " << i <<
           " has improper visibility in main: " << !visible;
     }
-    if (overflow_bar_->GetBrowserActionViewAt(i)->visible() == visible) {
+    if (overflow_bar_->GetToolbarActionViewAt(i)->visible() == visible) {
       return testing::AssertionFailure() << "Index " << i <<
           " has improper visibility in overflow: " << visible;
     }
@@ -543,53 +430,38 @@ BrowserActionsContainerOverflowTest::VerifyVisibleCount(
 // 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"));
+  LoadExtensions();
 
   // 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(model()->all_icons_visible());
+  EXPECT_EQ(3u, model()->visible_icon_count());
+  ASSERT_EQ(3u, main_bar()->num_toolbar_actions());
+  EXPECT_EQ(extension_a()->id(), main_bar()->GetIdAt(0u));
+  EXPECT_EQ(extension_b()->id(), main_bar()->GetIdAt(1u));
+  EXPECT_EQ(extension_c()->id(), main_bar()->GetIdAt(2u));
   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);
+  model()->SetVisibleIconCount(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_EQ(extension_a()->id(), main_bar()->GetIdAt(0u));
+  EXPECT_EQ(extension_b()->id(), main_bar()->GetIdAt(1u));
+  EXPECT_EQ(extension_c()->id(), main_bar()->GetIdAt(2u));
   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);
+  model()->MoveExtensionIcon(extension_c()->id(), 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_EQ(extension_c()->id(), main_bar()->GetIdAt(0u));
+  EXPECT_EQ(extension_a()->id(), main_bar()->GetIdAt(1u));
+  EXPECT_EQ(extension_b()->id(), main_bar()->GetIdAt(2u));
   EXPECT_TRUE(VerifyVisibleCount(2u));
 
   // Hide action A. This results in it being sent to overflow, and reducing the
@@ -597,44 +469,37 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerOverflowTest,
   // main bar.
   extensions::ExtensionActionAPI::SetBrowserActionVisibility(
       extensions::ExtensionPrefs::Get(profile()),
-      extension_a->id(),
+      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_EQ(extension_c()->id(), main_bar()->GetIdAt(0u));
+  EXPECT_EQ(extension_a()->id(), main_bar()->GetIdAt(1u));
+  EXPECT_EQ(extension_b()->id(), main_bar()->GetIdAt(2u));
   EXPECT_TRUE(VerifyVisibleCount(1u));
 }
 
 // Test drag and drop between the overflow container and the main container.
 IN_PROC_BROWSER_TEST_F(BrowserActionsContainerOverflowTest,
                        TestOverflowDragging) {
-  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"));
+  LoadExtensions();
 
   // Start with one extension in overflow.
-  model()->SetVisibleIconCountForTest(2u);
+  model()->SetVisibleIconCount(2u);
   overflow_bar()->Layout();
 
   // Verify starting state is A B [C].
-  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());
+  ASSERT_EQ(3u, main_bar()->num_toolbar_actions());
+  EXPECT_EQ(extension_a()->id(), main_bar()->GetIdAt(0u));
+  EXPECT_EQ(extension_b()->id(), main_bar()->GetIdAt(1u));
+  EXPECT_EQ(extension_c()->id(), main_bar()->GetIdAt(2u));
   EXPECT_TRUE(VerifyVisibleCount(2u));
 
   // Drag extension A (on the main bar) to the left of extension C (in
   // overflow).
   ui::OSExchangeData drop_data;
-  BrowserActionDragData browser_action_drag_data(extension_a->id(), 0u);
+  BrowserActionDragData browser_action_drag_data(extension_a()->id(), 0u);
   browser_action_drag_data.Write(profile(), &drop_data);
-  BrowserActionView* view = overflow_bar()->GetViewForExtension(extension_c);
+  ToolbarActionView* view = overflow_bar()->GetViewForExtension(extension_c());
   gfx::Point location(view->x(), view->y());
   ui::DropTargetEvent target_event(
       drop_data, location, location, ui::DragDropTypes::DRAG_MOVE);
@@ -644,16 +509,16 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerOverflowTest,
   overflow_bar()->Layout();
 
   // Order should now be B [A C].
-  EXPECT_EQ(extension_b, main_bar()->GetBrowserActionViewAt(0)->extension());
-  EXPECT_EQ(extension_a, main_bar()->GetBrowserActionViewAt(1)->extension());
-  EXPECT_EQ(extension_c, main_bar()->GetBrowserActionViewAt(2)->extension());
+  EXPECT_EQ(extension_b()->id(), main_bar()->GetIdAt(0u));
+  EXPECT_EQ(extension_a()->id(), main_bar()->GetIdAt(1u));
+  EXPECT_EQ(extension_c()->id(), main_bar()->GetIdAt(2u));
   VerifyVisibleCount(1u);
 
   // Drag extension A back from overflow to the main bar.
   ui::OSExchangeData drop_data2;
-  BrowserActionDragData browser_action_drag_data2(extension_a->id(), 1u);
+  BrowserActionDragData browser_action_drag_data2(extension_a()->id(), 1u);
   browser_action_drag_data2.Write(profile(), &drop_data2);
-  view = main_bar()->GetViewForExtension(extension_b);
+  view = main_bar()->GetViewForExtension(extension_b());
   location = gfx::Point(view->x(), view->y());
   ui::DropTargetEvent target_event2(
       drop_data2, location, location, ui::DragDropTypes::DRAG_MOVE);
@@ -662,14 +527,14 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerOverflowTest,
   main_bar()->OnPerformDrop(target_event2);
 
   // Order should be A B [C] again.
-  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_EQ(extension_a()->id(), main_bar()->GetIdAt(0u));
+  EXPECT_EQ(extension_b()->id(), main_bar()->GetIdAt(1u));
+  EXPECT_EQ(extension_c()->id(), main_bar()->GetIdAt(2u));
   VerifyVisibleCount(2u);
 
   // Drag extension C from overflow to the main bar (before extension B).
   ui::OSExchangeData drop_data3;
-  BrowserActionDragData browser_action_drag_data3(extension_c->id(), 2u);
+  BrowserActionDragData browser_action_drag_data3(extension_c()->id(), 2u);
   browser_action_drag_data3.Write(profile(), &drop_data3);
   location = gfx::Point(view->x(), view->y());
   ui::DropTargetEvent target_event3(
@@ -679,8 +544,8 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerOverflowTest,
   main_bar()->OnPerformDrop(target_event3);
 
   // Order should be A C B, and there should be no extensions in overflow.
-  EXPECT_EQ(extension_a, main_bar()->GetBrowserActionViewAt(0)->extension());
-  EXPECT_EQ(extension_c, main_bar()->GetBrowserActionViewAt(1)->extension());
-  EXPECT_EQ(extension_b, main_bar()->GetBrowserActionViewAt(2)->extension());
+  EXPECT_EQ(extension_a()->id(), main_bar()->GetIdAt(0u));
+  EXPECT_EQ(extension_c()->id(), main_bar()->GetIdAt(1u));
+  EXPECT_EQ(extension_b()->id(), main_bar()->GetIdAt(2u));
   VerifyVisibleCount(3u);
 }