Move some change actions into an overflow menu

Uncommonly-used (and destructive) change actions are moved into an
overflow menu implemented with a GR-DROPDOWN.

Feature: Issue 5315
Change-Id: I2731fd1baadf5ef598fd7c1ab0ba6d021df1f326
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.html b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.html
index 27a4c12..dbdf00f 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.html
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.html
@@ -133,11 +133,10 @@
       });
     });
 
-    test('hide change action', function(done) {
+    test('hide menu action', function(done) {
       flush(function() {
-        var buttonEl = element.$$('[data-action-key="/"]');
+        var buttonEl = element.$.moreActions.$$('span[data-id="delete"]');
         assert.isOk(buttonEl);
-        assert.isFalse(buttonEl.hasAttribute('hidden'));
         assert.throws(element.setActionHidden.bind(element, 'invalid type'));
         element.setActionHidden(element.ActionType.CHANGE,
             element.ChangeActions.DELETE, true);
@@ -146,16 +145,14 @@
             element.ChangeActions.DELETE, true);
         assert.lengthOf(element._hiddenActions, 1);
         flush(function() {
-          var buttonEl = element.$$('[data-action-key="/"]');
-          assert.isOk(buttonEl);
-          assert.isTrue(buttonEl.hasAttribute('hidden'));
+          var buttonEl = element.$.moreActions.$$('span[data-id="delete"]');
+          assert.isNotOk(buttonEl);
 
           element.setActionHidden(element.ActionType.CHANGE,
             element.RevisionActions.DELETE, false);
           flush(function() {
-            var buttonEl = element.$$('[data-action-key="/"]');
+            var buttonEl = element.$.moreActions.$$('span[data-id="delete"]');
             assert.isOk(buttonEl);
-            assert.isFalse(buttonEl.hasAttribute('hidden'));
             done();
           });
         });
@@ -167,7 +164,8 @@
       flush(function() {
         var buttonEls = Polymer.dom(element.root)
             .querySelectorAll('gr-button');
-        assert.equal(buttonEls.length, 6);
+        var menuItems = element.$.moreActions.items;
+        assert.equal(buttonEls.length + menuItems.length, 6);
         assert.isFalse(element.hidden);
         done();
       });
@@ -175,18 +173,18 @@
 
     test('delete buttons have explicit labels', function(done) {
       flush(function() {
-        var buttonEls =
-            Polymer.dom(element.root).querySelectorAll('[data-action-key="/"]');
-        assert.equal(buttonEls.length, 2);
-        assert.notEqual(buttonEls[0].getAttribute('data-label'),
-            buttonEls[1].getAttribute['data-label']);
+        var deleteItems = element.$.moreActions.items.filter(function(item) {
+          return item.id === 'delete';
+        });
+        assert.equal(deleteItems.length, 2);
+        assert.notEqual(deleteItems[0].name, deleteItems[1].name)
         assert.isTrue(
-            buttonEls[0].getAttribute('data-label') === 'Delete Revision' ||
-            buttonEls[0].getAttribute('data-label') === 'Delete Change'
+            deleteItems[0].name === 'Delete Revision' ||
+            deleteItems[0].name === 'Delete Change'
         );
         assert.isTrue(
-            buttonEls[1].getAttribute('data-label') === 'Delete Revision' ||
-            buttonEls[1].getAttribute('data-label') === 'Delete Change'
+            deleteItems[1].name === 'Delete Revision' ||
+            deleteItems[1].name === 'Delete Change'
         );
         done();
       });
@@ -295,10 +293,7 @@
         flushAsynchronousOperations();
         assert.isFalse(element.$.confirmRebase.hidden);
 
-        var cherryPickButton =
-            element.$$('gr-button[data-action-key="cherrypick"]');
-        assert.ok(cherryPickButton);
-        MockInteractions.tap(cherryPickButton);
+        element._handleCherrypickTap();
         flushAsynchronousOperations();
         assert.isTrue(element.$.confirmRebase.hidden);
         assert.isFalse(element.$.confirmCherrypick.hidden);
@@ -321,9 +316,7 @@
       });
 
       test('works', function() {
-        var cherryPickButton =
-            element.$$('gr-button[data-action-key="cherrypick"]');
-        MockInteractions.tap(cherryPickButton);
+        element._handleCherrypickTap();
         var action = {
           __key: 'cherrypick',
           __type: 'revision',
@@ -360,12 +353,10 @@
       });
 
       test('branch name cleared when re-open cherrypick', function() {
-        var cherryPickButton =
-            element.$$('gr-button[data-action-key="cherrypick"]');
         var emptyBranchName = '';
         element.$.confirmCherrypick.branch = 'master';
 
-        MockInteractions.tap(cherryPickButton);
+        element._handleCherrypickTap();
         assert.equal(element.$.confirmCherrypick.branch, emptyBranchName);
       });
     });
@@ -467,12 +458,6 @@
       var fireActionStub;
       var deleteAction;
 
-      var tapDeleteAction = function() {
-        var deleteButton = element.$$('gr-button[data-action-key=\'/\']');
-        MockInteractions.tap(deleteButton);
-        flushAsynchronousOperations();
-      };
-
       setup(function() {
         fireActionStub = sinon.stub(element, '_fireAction');
         element.change = {
@@ -494,12 +479,12 @@
       });
 
       test('does not delete on action', function() {
-        tapDeleteAction();
+        element._handleDeleteTap();
         assert.isFalse(fireActionStub.called);
       });
 
       test('shows confirm dialog', function() {
-        tapDeleteAction();
+        element._handleDeleteTap();
         assert.isFalse(element.$$('#confirmDeleteDialog').hidden);
         MockInteractions.tap(
             element.$$('#confirmDeleteDialog').$$('gr-button[primary]'));
@@ -508,7 +493,7 @@
       });
 
       test('hides delete confirm on cancel', function() {
-        tapDeleteAction();
+        element._handleDeleteTap();
         MockInteractions.tap(
             element.$$('#confirmDeleteDialog').$$('gr-button:not([primary])'));
         flushAsynchronousOperations();