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 6704a7b39c44877cd866a962eb3742aa4df31379..1961fb53e15783dcccf285852d668ed49eeae069 100644 |
--- a/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc |
+++ b/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc |
@@ -11,12 +11,15 @@ |
#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/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_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/base/dragdrop/os_exchange_data.h" |
#include "ui/gfx/geometry/point.h" |
#include "ui/views/view.h" |
@@ -82,21 +85,17 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, Basic) { |
// 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(test_data_dir_.AppendASCII("api_test") |
- .AppendASCII("browser_action") |
- .AppendASCII("basics")); |
+ LoadExtension(data_dir.AppendASCII("basics")); |
ASSERT_TRUE(extension_a); |
const extensions::Extension* extension_b = |
- LoadExtension(test_data_dir_.AppendASCII("api_test") |
- .AppendASCII("browser_action") |
- .AppendASCII("add_popup")); |
+ LoadExtension(data_dir.AppendASCII("add_popup")); |
ASSERT_TRUE(extension_b); |
const extensions::Extension* extension_c = |
- LoadExtension(test_data_dir_.AppendASCII("api_test") |
- .AppendASCII("browser_action") |
- .AppendASCII("remove_popup")); |
+ LoadExtension(data_dir.AppendASCII("remove_popup")); |
ASSERT_TRUE(extension_c); |
EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions()); |
@@ -130,6 +129,117 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, |
EXPECT_EQ(extension_a->id(), browser_actions_bar()->GetExtensionId(2)); |
} |
+// 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); |
+ |
+ // 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)); |
+ |
+ BrowserActionsContainer* container = |
+ BrowserView::GetBrowserViewForBrowser(browser()) |
+ ->toolbar()->browser_actions(); |
+ |
+ // 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); |
+ BrowserActionView* view = container->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. |
+ container->OnDragUpdated(target_event); |
+ 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)); |
+ |
+ // This order should be reflected in the underlying model. |
+ extensions::ExtensionToolbarModel* model = |
+ extensions::ExtensionToolbarModel::Get(profile()); |
+ EXPECT_EQ(extension_b, model->toolbar_items()[0]); |
+ EXPECT_EQ(extension_a, model->toolbar_items()[1]); |
+ EXPECT_EQ(extension_c, model->toolbar_items()[2]); |
+ |
+ // 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); |
+ 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()); |
+ ui::DropTargetEvent target_event2( |
+ drop_data2, location, location, ui::DragDropTypes::DRAG_MOVE); |
+ |
+ // Drag and drop. |
+ container->OnDragUpdated(target_event2); |
+ 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)); |
+ |
+ |
Finnur
2014/09/10 09:48:01
nit: Extra line.
Devlin
2014/09/10 15:58:30
Whoops, removed.
|
+ // Shrink the size of the container so we have an overflow menu. |
+ model->SetVisibleIconCountForTest(2u); |
+ EXPECT_EQ(2u, container->VisibleBrowserActions()); |
+ ASSERT_TRUE(container->chevron()); |
+ EXPECT_TRUE(container->chevron()->visible()); |
+ |
+ // 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); |
+ 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()); |
+ ui::DropTargetEvent target_event3( |
+ drop_data3, location, location, ui::DragDropTypes::DRAG_MOVE); |
+ |
+ // Drag and drop. |
+ container->OnDragUpdated(target_event3); |
+ container->OnPerformDrop(target_event3); |
+ |
+ // 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(3u, container->VisibleBrowserActions()); |
+ EXPECT_FALSE(container->chevron()->visible()); |
+ EXPECT_EQ(-1, model->GetVisibleIconCount()); |
+ |
+ // TODO(devlin): Ideally, we'd also have tests for dragging from overflow to |
+ // the main bar, but this requires either having a fairly complicated |
+ // interactive UI test or finding a good way to mock up the |
+ // BrowserActionOverflowMenuController. |
Finnur
2014/09/10 09:48:01
Umm... the comment for the newly added test at the
Devlin
2014/09/10 15:58:30
Should have been more clear - the legacy overflow
Finnur
2014/09/11 09:23:47
Well, the chevron is going away anyway.
|
+} |
+ |
IN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, Visibility) { |
// Load extension A (contains browser action). |
ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test") |
@@ -496,3 +606,65 @@ IN_PROC_BROWSER_TEST_F(BrowserActionsContainerOverflowTest, |
EXPECT_EQ(extension_b, main_bar()->GetBrowserActionViewAt(2)->extension()); |
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")); |
+ |
+ // Start with one extension in overflow. |
+ model()->SetVisibleIconCountForTest(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()); |
+ 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); |
+ browser_action_drag_data.Write(profile(), &drop_data); |
+ BrowserActionView* 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); |
+ |
+ overflow_bar()->OnDragUpdated(target_event); |
+ overflow_bar()->OnPerformDrop(target_event); |
+ overflow_bar()->Layout(); |
+ |
+ // Order should now b B [A C]. |
Finnur
2014/09/10 09:48:01
nit: Missing e in be.
Devlin
2014/09/10 15:58:30
u r right. :P Fixed.
|
+ 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()); |
+ 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); |
+ browser_action_drag_data2.Write(profile(), &drop_data2); |
+ 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); |
+ |
+ main_bar()->OnDragUpdated(target_event2); |
+ 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()); |
+ VerifyVisibleCount(2u); |
Finnur
2014/09/10 09:48:01
Want to drag C to the main bar as well (verify no
Devlin
2014/09/10 15:58:30
Sure, can't hurt.
|
+} |