React to content change event dispatched by plugin

The editor view must listen for the content-change event in order to
react to changes made by the codemirror-editor plugin. Updating the
value of _newContent in the view-level component is used for:
- Enabling/disabling the save button
- Caching edits to localStorage (TODO)
- Probably many more things

Bug: Issue 4437
Change-Id: I81b7db5dea9a40ddaeee9924428ffcd78f4abf4a
diff --git a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.html b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.html
index 1dade20..10da09b 100644
--- a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.html
+++ b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.html
@@ -83,7 +83,7 @@
       </header>
     </gr-fixed-panel>
     <div class="textareaWrapper">
-      <gr-endpoint-decorator name="editor">
+      <gr-endpoint-decorator id="editorEndpoint" name="editor">
         <gr-endpoint-param name="fileContent" value="[[_newContent]]"></gr-endpoint-param>
         <gr-endpoint-param name="prefs" value="[[_prefs]]"></gr-endpoint-param>
         <gr-endpoint-param name="fileType" value="[[_type]]"></gr-endpoint-param>
diff --git a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.js b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.js
index f31608d..447c258 100644
--- a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.js
+++ b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.js
@@ -53,6 +53,10 @@
       Gerrit.PathListBehavior,
     ],
 
+    listeners: {
+      'content-change': '_handleContentChange',
+    },
+
     attached() {
       this._getEditPrefs().then(prefs => { this._prefs = prefs; });
     },
@@ -132,5 +136,9 @@
       // TODO(kaspern): Add a confirm dialog if there are unsaved changes.
       this._viewEditInChangeView();
     },
+
+    _handleContentChange(e) {
+      if (e.detail.value) { this.set('_newContent', e.detail.value); }
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view_test.html b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view_test.html
index 32ab15c..fa9bcec 100644
--- a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view_test.html
+++ b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view_test.html
@@ -114,6 +114,17 @@
     });
   });
 
+  test('reacts to content-change event', () => {
+    element._newContent = 'test';
+    element.$.editorEndpoint.dispatchEvent(new CustomEvent('content-change', {
+      bubbles: true,
+      detail: {value: 'new content value'},
+    }));
+    flushAsynchronousOperations();
+
+    assert.equal(element._newContent, 'new content value');
+  });
+
   suite('edit file content', () => {
     const originalText = 'file text';
     const newText = 'file text changed';