Merge "Add API event callback for 'revert'."
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
index 65dbb3a..fc87084 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
@@ -59,6 +59,7 @@
      */
 
     properties: {
+      change: Object,
       actions: {
         type: Object,
         value: function() { return {}; },
@@ -256,6 +257,11 @@
       return this.$.jsAPI.canSubmitChange();
     },
 
+    _modifyRevertMsg: function() {
+      return this.$.jsAPI.modifyRevertMsg(this.change,
+                                          this.$.confirmRevertDialog.message);
+    },
+
     _handleActionTap: function(e) {
       e.preventDefault();
       var el = Polymer.dom(e).rootTarget;
@@ -268,6 +274,7 @@
       if (type === ActionType.REVISION) {
         this._handleRevisionAction(key);
       } else if (key === ChangeActions.REVERT) {
+        this.$.confirmRevertDialog.message = this._modifyRevertMsg();
         this._showActionDialog(this.$.confirmRevertDialog);
       } else if (key === ChangeActions.ABANDON) {
         this._showActionDialog(this.$.confirmAbandonDialog);
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 462b01b..906f596 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
@@ -240,6 +240,21 @@
         fireActionStub.restore();
       });
 
+      test('revert change with plugin hook', function(done) {
+        var newRevertMsg = 'Modified revert msg';
+        var modifyRevertMsgStub = sinon.stub(element, '_modifyRevertMsg',
+            function() { return newRevertMsg; });
+        flush(function() {
+          var revertButton = element.$$('gr-button[data-action-key="revert"]');
+          MockInteractions.tap(revertButton);
+
+          assert.equal(element.$.confirmRevertDialog.message, newRevertMsg);
+
+          modifyRevertMsgStub.restore();
+          done();
+        });
+      });
+
       test('works', function() {
         var revertButton = element.$$('gr-button[data-action-key="revert"]');
         MockInteractions.tap(revertButton);
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
index b90bed8..08bfe77 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
@@ -255,6 +255,7 @@
               on-show-reply-dialog="_handleShowReplyDialog">
           </gr-change-metadata>
           <gr-change-actions id="actions"
+              change="[[_change]]"
               actions="[[_change.actions]]"
               change-num="[[_changeNum]]"
               patch-num="[[_patchRange.patchNum]]"
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.js
index bb37085..4dfcf48 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.js
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.js
@@ -20,6 +20,7 @@
     SHOW_CHANGE: 'showchange',
     SUBMIT_CHANGE: 'submitchange',
     COMMENT: 'comment',
+    REVERT: 'revert',
   };
 
   var Element = {
@@ -148,6 +149,17 @@
       });
     },
 
+    modifyRevertMsg: function(change, msg) {
+      this._getEventCallbacks(EventType.REVERT).forEach(function(callback) {
+        try {
+          msg = callback(change, msg);
+        } catch (err) {
+          console.error(err);
+        }
+      });
+      return msg;
+    },
+
     _getEventCallbacks: function(type) {
       return this._eventCallbacks[type] || [];
     },
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.html b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.html
index c12d653..46a555a 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.html
@@ -102,6 +102,25 @@
       element.handleEvent(element.EventType.COMMENT, {node: testCommentNode});
     });
 
+    test('revert event', function(done) {
+      function appendToRevertMsg(c, msg) {
+        return msg + '\ninfo';
+      }
+      done();
+
+      assert.equal(element.modifyRevertMsg(null, 'test'), 'test');
+      assert.equal(errorStub.callCount, 0);
+
+      plugin.on(element.EventType.REVERT, throwErrFn);
+      plugin.on(element.EventType.REVERT, appendToRevertMsg);
+      assert.equal(element.modifyRevertMsg(null, 'test'), 'test\ninfo');
+      assert.isTrue(errorStub.calledOnce);
+
+      plugin.on(element.EventType.REVERT, appendToRevertMsg);
+      assert.equal(element.modifyRevertMsg(null, 'test'), 'test\ninfo\ninfo');
+      assert.isTrue(errorStub.calledTwice);
+    });
+
     test('labelchange event', function(done) {
       var testChange = {_number: 42};
       plugin.on(element.EventType.LABEL_CHANGE, throwErrFn);