Replace "attached" with observers

This allows for the functions which rely on the properties to be called when
the properties are set.

Change-Id: I306550a246c4c535ae5f165ce3fbe5282eea25f2
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js
index 1b918db..c34f00f 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js
@@ -57,6 +57,7 @@
         type: Object,
         notify: true,
         value() { return {}; },
+        observer: '_changeViewStatehanged',
       },
 
       _patchRange: Object,
@@ -120,6 +121,7 @@
     observers: [
       '_getProjectConfig(_change.project)',
       '_getFiles(_changeNum, _patchRange.*)',
+      '_setReviewedObserver(_loggedIn, params.*)',
     ],
 
     keyBindings: {
@@ -141,21 +143,7 @@
     attached() {
       this._getLoggedIn().then(loggedIn => {
         this._loggedIn = loggedIn;
-        if (loggedIn) {
-          this._setReviewed(true);
-        }
       });
-      if (this.changeViewState.diffMode === null) {
-        // If screen size is small, always default to unified view.
-        this.$.restAPI.getPreferences().then(prefs => {
-          this.set('changeViewState.diffMode', prefs.default_diff_view);
-        });
-      }
-
-      if (this._path) {
-        this.fire('title-change',
-            {title: this._computeFileDisplayName(this._path)});
-      }
 
       this.$.cursor.push('diffs', this.$.diff);
     },
@@ -476,6 +464,21 @@
       });
     },
 
+    _changeViewStatehanged(changeViewState) {
+      if (changeViewState.diffMode === null) {
+        // If screen size is small, always default to unified view.
+        this.$.restAPI.getPreferences().then(prefs => {
+          this.set('changeViewState.diffMode', prefs.default_diff_view);
+        });
+      }
+    },
+
+    _setReviewedObserver(_loggedIn) {
+      if (_loggedIn) {
+        this._setReviewed(true);
+      }
+    },
+
     /**
      * If the URL hash is a diff address then configure the diff cursor.
      */
@@ -492,14 +495,15 @@
     },
 
     _pathChanged(path) {
+      if (path) {
+        this.fire('title-change',
+            {title: this._computeFileDisplayName(path)});
+      }
+
       if (this._fileList.length == 0) { return; }
 
       this.set('changeViewState.selectedFileIndex',
           this._fileList.indexOf(path));
-
-      if (this._loggedIn) {
-        this._setReviewed(true);
-      }
     },
 
     _getDiffURL(changeNum, patchRange, path) {
@@ -522,6 +526,7 @@
 
     _computeAvailablePatches(revisions) {
       const patchNums = [];
+      if (!revisions) { return patchNums; }
       for (const rev of Object.values(revisions)) {
         patchNums.push(rev._number);
       }
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html
index 13d7140..0a7ed28 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html
@@ -54,6 +54,8 @@
         getDiffChangeDetail() { return Promise.resolve(null); },
         getChangeFiles() { return Promise.resolve({}); },
         saveFileReviewed() { return Promise.resolve(); },
+        getDiffRobotComments() { return Promise.resolve(); },
+        getDiffDrafts() { return Promise.resolve(); },
       });
       element = fixture('basic');
     });
@@ -469,16 +471,21 @@
     });
 
     test('file review status', done => {
-      element._loggedIn = true;
-      element._changeNum = '42';
-      element._patchRange = {
-        basePatchNum: '1',
-        patchNum: '2',
-      };
-      element._fileList = ['/COMMIT_MSG'];
-      element._path = '/COMMIT_MSG';
+      stub('gr-rest-api-interface', {
+        getDiffComments() { return Promise.resolve({}); },
+      });
       const saveReviewedStub = sandbox.stub(element, '_saveReviewedState',
           () => Promise.resolve());
+      sandbox.stub(element.$.diff, 'reload');
+
+      element._loggedIn = true;
+      element.params = {
+        view: 'gr-diff-view',
+        changeNum: '42',
+        patchNum: '2',
+        basePatchNum: '1',
+        path: '/COMMIT_MSG',
+      };
 
       flush(() => {
         const commitMsg = Polymer.dom(element.root).querySelector(
@@ -625,7 +632,6 @@
     suite('_loadCommentMap', () => {
       test('empty', done => {
         stub('gr-rest-api-interface', {
-          getDiffRobotComments() { return Promise.resolve({}); },
           getDiffComments() { return Promise.resolve({}); },
         });
         element._loadCommentMap().then(map => {
@@ -636,7 +642,6 @@
 
       test('paths in patch range', done => {
         stub('gr-rest-api-interface', {
-          getDiffRobotComments() { return Promise.resolve({}); },
           getDiffComments() {
             return Promise.resolve({
               'path/to/file/one.cpp': [{patch_set: 3, message: 'lorem'}],
@@ -658,7 +663,6 @@
 
       test('empty for paths outside patch range', done => {
         stub('gr-rest-api-interface', {
-          getDiffRobotComments() { return Promise.resolve({}); },
           getDiffComments() {
             return Promise.resolve({
               'path/to/file/one.cpp': [{patch_set: 'PARENT', message: 'lorem'}],