Allow the commit message to be edited in the change view

Bug: Issue 4135
Change-Id: I8ccb2f8d9875a277aa8500be183defa0eee37982
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
index d6f4cec..347352a 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
@@ -59,6 +59,15 @@
         type: Object,
         value: function() { return {}; },
       },
+      _editingCommitMessage: {
+        type: Boolean,
+        value: false,
+      },
+      _hideEditCommitMessage: {
+        type: Boolean,
+        computed: '_computeHideEditCommitMessage(_loggedIn, ' +
+            '_editingCommitMessage, _change.*, _patchRange.patchNum)',
+      },
       _patchRange: Object,
       _allPatchSets: {
         type: Array,
@@ -96,6 +105,10 @@
       this.addEventListener('comment-save', this._handleCommentSave.bind(this));
       this.addEventListener('comment-discard',
           this._handleCommentDiscard.bind(this));
+      this.addEventListener('editable-content-save',
+          this._handleCommitMessageSave.bind(this));
+      this.addEventListener('editable-content-cancel',
+          this._handleCommitMessageCancel.bind(this));
       this.listen(window, 'scroll', '_handleBodyScroll');
     },
 
@@ -126,6 +139,59 @@
       el.classList.remove('pinned');
     },
 
+    _handleEditCommitMessage: function(e) {
+      this._editingCommitMessage = true;
+      this.$.commitMessageEditor.focusTextarea();
+    },
+
+    _handleCommitMessageSave: function(e) {
+      var message = e.detail.content;
+
+      this.$.commitMessageEditor.disabled = true;
+      this._saveCommitMessage(message).then(function(resp) {
+        this.$.commitMessageEditor.disabled = false;
+        if (!resp.ok) { return; }
+
+        this.set('_commitInfo.message', message);
+        this._editingCommitMessage = false;
+        this._reloadWindow();
+      }.bind(this)).catch(function(err) {
+        this.$.commitMessageEditor.disabled = false;
+      }.bind(this));
+    },
+
+    _reloadWindow: function() {
+      window.location.reload();
+    },
+
+    _handleCommitMessageCancel: function(e) {
+      this._editingCommitMessage = false;
+    },
+
+    _saveCommitMessage: function(message) {
+      return this.$.restAPI.saveChangeCommitMessageEdit(
+          this._changeNum, message).then(function(resp) {
+            if (!resp.ok) { return resp; }
+
+            return this.$.restAPI.publishChangeEdit(this._changeNum);
+          }.bind(this));
+    },
+
+    _computeHideEditCommitMessage: function(loggedIn, editing, changeRecord,
+        patchNum) {
+      if (!changeRecord || !loggedIn || editing) { return true; }
+
+      patchNum = parseInt(patchNum, 10);
+      if (isNaN(patchNum)) { return true; }
+
+      var change = changeRecord.base;
+      if (change.revisions[change.current_revision]._number !== patchNum) {
+        return true;
+      }
+
+      return false;
+    },
+
     _handleCommentSave: function(e) {
       if (!e.target.comment.__draft) { return; }