polychrome: fix BrowserActionsBarBrowserTest tests

The process of fixing these tests uncovered a real bug in the Cocoa
BrowserActionsContainerView: it was always resizable even when highlighting.
This change:

1) Fixes that bug;
2) Adds an abstract CanBeResized test helper;
3) Implements that test helper for Cocoa and Views windows;
4) Marks the two drag & drop tests as Views-window-only, since the mechanics of
   drag & drop aren't exactly compatible between the two platforms.

Bug: 817408
Change-Id: I3a1316df05ff5aa1b3ae29c815fec6bac8062ad1
Reviewed-on: https://chromium-review.googlesource.com/963289
Commit-Queue: Elly Fong-Jones <[email protected]>
Reviewed-by: Robert Liao <[email protected]>
Cr-Commit-Position: refs/heads/master@{#543398}
diff --git a/chrome/browser/ui/cocoa/extensions/browser_action_test_util_views_cocoa.mm b/chrome/browser/ui/cocoa/extensions/browser_action_test_util_views_cocoa.mm
index bb2101a..c56c265 100644
--- a/chrome/browser/ui/cocoa/extensions/browser_action_test_util_views_cocoa.mm
+++ b/chrome/browser/ui/cocoa/extensions/browser_action_test_util_views_cocoa.mm
@@ -215,6 +215,7 @@
   std::unique_ptr<BrowserActionTestUtil> CreateOverflowBar() override;
   gfx::Size GetMinPopupSize() override;
   gfx::Size GetMaxPopupSize() override;
+  bool CanBeResized() override;
 
  private:
   friend class BrowserActionTestUtil;
@@ -334,6 +335,12 @@
   return GetExtensionPopupTestManager()->GetMaxPopupSize();
 }
 
+bool BrowserActionTestUtilCocoa::CanBeResized() {
+  BrowserActionsContainerView* containerView =
+      [GetController(browser_, test_helper_.get()) containerView];
+  return [containerView canBeResized];
+}
+
 BrowserActionTestUtilCocoa::BrowserActionTestUtilCocoa(
     Browser* browser,
     BrowserActionTestUtilCocoa* main_bar)
diff --git a/chrome/browser/ui/cocoa/extensions/browser_actions_container_view.h b/chrome/browser/ui/cocoa/extensions/browser_actions_container_view.h
index 2890c9a..a673e4d 100644
--- a/chrome/browser/ui/cocoa/extensions/browser_actions_container_view.h
+++ b/chrome/browser/ui/cocoa/extensions/browser_actions_container_view.h
@@ -106,6 +106,9 @@
 // Stops any animation in progress.
 - (void)stopAnimation;
 
+// Returns true if this view is currently resizable.
+- (BOOL)canBeResized;
+
 @property(nonatomic) CGFloat minWidth;
 @property(nonatomic) CGFloat maxWidth;
 @property(nonatomic) BOOL grippyPinned;
diff --git a/chrome/browser/ui/cocoa/extensions/browser_actions_container_view.mm b/chrome/browser/ui/cocoa/extensions/browser_actions_container_view.mm
index 251d337..a72edbc 100644
--- a/chrome/browser/ui/cocoa/extensions/browser_actions_container_view.mm
+++ b/chrome/browser/ui/cocoa/extensions/browser_actions_container_view.mm
@@ -140,7 +140,7 @@
   if (highlight || highlight_) {
     highlight_ = std::move(highlight);
     // We don't allow resizing when the container is highlighting.
-    resizable_ = highlight.get() == nullptr;
+    resizable_ = highlight_.get() == nullptr;
     [self setNeedsDisplay:YES];
   }
 }
@@ -302,6 +302,10 @@
     [resizeAnimation_ stopAnimation];
 }
 
+- (BOOL)canBeResized {
+  return resizable_;
+}
+
 #pragma mark -
 #pragma mark Private Methods
 
diff --git a/chrome/browser/ui/extensions/browser_action_test_util.h b/chrome/browser/ui/extensions/browser_action_test_util.h
index 00c051c..f392ed8 100644
--- a/chrome/browser/ui/extensions/browser_action_test_util.h
+++ b/chrome/browser/ui/extensions/browser_action_test_util.h
@@ -104,6 +104,9 @@
   // Returns the maximum allowed size of an extension popup.
   virtual gfx::Size GetMaxPopupSize() = 0;
 
+  // Returns whether the browser action container can currently be resized.
+  virtual bool CanBeResized() = 0;
+
  protected:
   BrowserActionTestUtil() {}
 
diff --git a/chrome/browser/ui/views/toolbar/browser_action_test_util_views.cc b/chrome/browser/ui/views/toolbar/browser_action_test_util_views.cc
index e3edd35..fc5eb8af 100644
--- a/chrome/browser/ui/views/toolbar/browser_action_test_util_views.cc
+++ b/chrome/browser/ui/views/toolbar/browser_action_test_util_views.cc
@@ -198,6 +198,19 @@
   return gfx::Size(ExtensionPopup::kMaxWidth, ExtensionPopup::kMaxHeight);
 }
 
+bool BrowserActionTestUtilViews::CanBeResized() {
+  BrowserActionsContainer* container =
+      BrowserView::GetBrowserViewForBrowser(browser_)
+          ->toolbar()
+          ->browser_actions();
+
+  // The container can only be resized if we can start a drag for the view.
+  DCHECK_LE(1u, container->num_toolbar_actions());
+  ToolbarActionView* action_view = container->GetToolbarActionViewAt(0);
+  gfx::Point point(action_view->x(), action_view->y());
+  return container->CanStartDragForView(action_view, point, point);
+}
+
 BrowserActionTestUtilViews::BrowserActionTestUtilViews(
     Browser* browser,
     BrowserActionTestUtilViews* main_bar)
diff --git a/chrome/browser/ui/views/toolbar/browser_action_test_util_views.h b/chrome/browser/ui/views/toolbar/browser_action_test_util_views.h
index 0a67b46..908a3cc6 100644
--- a/chrome/browser/ui/views/toolbar/browser_action_test_util_views.h
+++ b/chrome/browser/ui/views/toolbar/browser_action_test_util_views.h
@@ -32,6 +32,7 @@
   std::unique_ptr<BrowserActionTestUtil> CreateOverflowBar() override;
   gfx::Size GetMinPopupSize() override;
   gfx::Size GetMaxPopupSize() override;
+  bool CanBeResized() override;
 
  private:
   friend class BrowserActionTestUtil;
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 9a9d0f4..c67312c 100644
--- a/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc
+++ b/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_action_view.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
+#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/common/extension.h"
@@ -27,6 +28,8 @@
 #include "ui/views/test/test_views.h"
 #include "ui/views/view.h"
 
+namespace {
+
 // 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.
@@ -34,7 +37,16 @@
 // 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(BrowserActionsBarBrowserTest, DragBrowserActions) {
+
+// The two drag & drop tests are currently restricted to Views browsers in the
+// absence of a good way to abstract drag & drop actions.
+class BrowserActionsBarViewsBrowserTest : public BrowserActionsBarBrowserTest {
+ private:
+  test::ScopedMacViewsBrowserMode views_mode_{true};
+};
+}  // namespace
+
+IN_PROC_BROWSER_TEST_F(BrowserActionsBarViewsBrowserTest, DragBrowserActions) {
   LoadExtensions();
 
   // Sanity check: All extensions showing; order is A B C.
@@ -147,7 +159,7 @@
 
 // Test that changes performed in one container affect containers in other
 // windows so that it is consistent.
-IN_PROC_BROWSER_TEST_F(BrowserActionsBarBrowserTest, MultipleWindows) {
+IN_PROC_BROWSER_TEST_F(BrowserActionsBarViewsBrowserTest, MultipleWindows) {
   LoadExtensions();
   BrowserActionsContainer* first =
       BrowserView::GetBrowserViewForBrowser(browser())->toolbar()->
@@ -214,16 +226,7 @@
 
   EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions());
   EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions());
-
-  BrowserActionsContainer* container =
-      BrowserView::GetBrowserViewForBrowser(browser())
-          ->toolbar()->browser_actions();
-
-  // Currently, dragging should be enabled.
-  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));
+  EXPECT_TRUE(browser_actions_bar()->CanBeResized());
 
   std::vector<std::string> action_ids;
   action_ids.push_back(extension_a()->id());
@@ -236,15 +239,13 @@
   EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions());
 
   // We shouldn't be able to drag in highlight mode.
-  action_view = container->GetToolbarActionViewAt(0);
-  EXPECT_FALSE(container->CanStartDragForView(action_view, point, point));
+  EXPECT_FALSE(browser_actions_bar()->CanBeResized());
 
   // We should go back to normal after leaving highlight mode.
   toolbar_model()->StopHighlighting();
   EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions());
   EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions());
-  action_view = container->GetToolbarActionViewAt(0);
-  EXPECT_TRUE(container->CanStartDragForView(action_view, point, point));
+  EXPECT_TRUE(browser_actions_bar()->CanBeResized());
 }
 
 // Test the behavior of the overflow container for Extension Actions.