Some cleanup on the use of Soy index: * The canonical-path property of GR-APP is removed because it did not initialize at the right time and a top-level global is used instead. * Only set a top-level global for canonical path if it is not the empty string. In this way, the index document does not include an inline script when it is not needed. * Give the index Soy template a more descriptive name. index.html.soy was too generic, and the intermediate period would cause problems with some internal build tooling. Bug: Issue 5919 Change-Id: I0bf5964b17cb4f4f9df150b0c6abe8ae1e49f22b
		
			
				
	
	
		
			237 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// Copyright (C) 2016 The Android Open Source Project
 | 
						|
//
 | 
						|
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
// you may not use this file except in compliance with the License.
 | 
						|
// You may obtain a copy of the License at
 | 
						|
//
 | 
						|
// http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
//
 | 
						|
// Unless required by applicable law or agreed to in writing, software
 | 
						|
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
// See the License for the specific language governing permissions and
 | 
						|
// limitations under the License.
 | 
						|
(function() {
 | 
						|
  'use strict';
 | 
						|
 | 
						|
  // Eagerly render Polymer components when backgrounded. (Skips
 | 
						|
  // requestAnimationFrame.)
 | 
						|
  // @see https://github.com/Polymer/polymer/issues/3851
 | 
						|
  // TODO: Reassess after Polymer 2.0 upgrade.
 | 
						|
  // @see Issue 4699
 | 
						|
  Polymer.RenderStatus._makeReady();
 | 
						|
 | 
						|
  Polymer({
 | 
						|
    is: 'gr-app',
 | 
						|
 | 
						|
    /**
 | 
						|
     * Fired when the URL location changes.
 | 
						|
     *
 | 
						|
     * @event location-change
 | 
						|
     */
 | 
						|
 | 
						|
    properties: {
 | 
						|
      params: Object,
 | 
						|
      keyEventTarget: {
 | 
						|
        type: Object,
 | 
						|
        value: function() { return document.body; },
 | 
						|
      },
 | 
						|
 | 
						|
      _account: {
 | 
						|
        type: Object,
 | 
						|
        observer: '_accountChanged',
 | 
						|
      },
 | 
						|
      _serverConfig: Object,
 | 
						|
      _version: String,
 | 
						|
      _showChangeListView: Boolean,
 | 
						|
      _showDashboardView: Boolean,
 | 
						|
      _showChangeView: Boolean,
 | 
						|
      _showDiffView: Boolean,
 | 
						|
      _showSettingsView: Boolean,
 | 
						|
      _viewState: Object,
 | 
						|
      _lastError: Object,
 | 
						|
      _lastSearchPage: String,
 | 
						|
      _path: String,
 | 
						|
    },
 | 
						|
 | 
						|
    listeners: {
 | 
						|
      'page-error': '_handlePageError',
 | 
						|
      'title-change': '_handleTitleChange',
 | 
						|
      'location-change': '_handleLocationChange',
 | 
						|
    },
 | 
						|
 | 
						|
    observers: [
 | 
						|
      '_viewChanged(params.view)',
 | 
						|
      '_loadPlugins(_serverConfig.plugin.js_resource_paths)',
 | 
						|
    ],
 | 
						|
 | 
						|
    behaviors: [
 | 
						|
      Gerrit.BaseUrlBehavior,
 | 
						|
      Gerrit.KeyboardShortcutBehavior,
 | 
						|
    ],
 | 
						|
 | 
						|
    keyBindings: {
 | 
						|
      '?': '_showKeyboardShortcuts',
 | 
						|
    },
 | 
						|
 | 
						|
    ready: function() {
 | 
						|
      this.$.router.start();
 | 
						|
 | 
						|
      this.$.restAPI.getAccount().then(function(account) {
 | 
						|
        this._account = account;
 | 
						|
      }.bind(this));
 | 
						|
      this.$.restAPI.getConfig().then(function(config) {
 | 
						|
        this._serverConfig = config;
 | 
						|
      }.bind(this));
 | 
						|
      this.$.restAPI.getVersion().then(function(version) {
 | 
						|
        this._version = version;
 | 
						|
      }.bind(this));
 | 
						|
 | 
						|
      this.$.reporting.appStarted();
 | 
						|
      this._viewState = {
 | 
						|
        changeView: {
 | 
						|
          changeNum: null,
 | 
						|
          patchRange: null,
 | 
						|
          selectedFileIndex: 0,
 | 
						|
          showReplyDialog: false,
 | 
						|
          diffMode: null,
 | 
						|
        },
 | 
						|
        changeListView: {
 | 
						|
          query: null,
 | 
						|
          offset: 0,
 | 
						|
          selectedChangeIndex: 0,
 | 
						|
        },
 | 
						|
        dashboardView: {
 | 
						|
          selectedChangeIndex: 0,
 | 
						|
        },
 | 
						|
      };
 | 
						|
    },
 | 
						|
 | 
						|
    _accountChanged: function(account) {
 | 
						|
      if (!account) { return; }
 | 
						|
 | 
						|
      // Preferences are cached when a user is logged in; warm them.
 | 
						|
      this.$.restAPI.getPreferences();
 | 
						|
      this.$.restAPI.getDiffPreferences();
 | 
						|
      this.$.errorManager.knownAccountId =
 | 
						|
        this._account && this._account._account_id || null;
 | 
						|
    },
 | 
						|
 | 
						|
    _viewChanged: function(view) {
 | 
						|
      this.$.errorView.hidden = true;
 | 
						|
      this.set('_showChangeListView', view === 'gr-change-list-view');
 | 
						|
      this.set('_showDashboardView', view === 'gr-dashboard-view');
 | 
						|
      this.set('_showChangeView', view === 'gr-change-view');
 | 
						|
      this.set('_showDiffView', view === 'gr-diff-view');
 | 
						|
      this.set('_showSettingsView', view === 'gr-settings-view');
 | 
						|
      this.set('_showAdminView', view === 'gr-admin-view');
 | 
						|
      this.set('_showCLAView', view === 'gr-cla-view');
 | 
						|
      if (this.params.justRegistered) {
 | 
						|
        this.$.registration.open();
 | 
						|
      }
 | 
						|
    },
 | 
						|
 | 
						|
    _loadPlugins: function(plugins) {
 | 
						|
      Gerrit._setPluginsCount(plugins.length);
 | 
						|
      for (var i = 0; i < plugins.length; i++) {
 | 
						|
        var scriptEl = document.createElement('script');
 | 
						|
        scriptEl.defer = true;
 | 
						|
        scriptEl.src = '/' + plugins[i];
 | 
						|
        scriptEl.onerror = Gerrit._pluginInstalled;
 | 
						|
        document.body.appendChild(scriptEl);
 | 
						|
      }
 | 
						|
    },
 | 
						|
 | 
						|
    _loginTapHandler: function(e) {
 | 
						|
      e.preventDefault();
 | 
						|
      page.show('/login/' + encodeURIComponent(
 | 
						|
          window.location.pathname + window.location.hash));
 | 
						|
    },
 | 
						|
 | 
						|
    // Argument used for binding update only.
 | 
						|
    _computeLoggedIn: function(account) {
 | 
						|
      return !!(account && Object.keys(account).length > 0);
 | 
						|
    },
 | 
						|
 | 
						|
    _computeShowGwtUiLink: function(config) {
 | 
						|
      return config.gerrit.web_uis &&
 | 
						|
          config.gerrit.web_uis.indexOf('GWT') !== -1;
 | 
						|
    },
 | 
						|
 | 
						|
    _handlePageError: function(e) {
 | 
						|
      [
 | 
						|
        '_showChangeListView',
 | 
						|
        '_showDashboardView',
 | 
						|
        '_showChangeView',
 | 
						|
        '_showDiffView',
 | 
						|
        '_showSettingsView',
 | 
						|
      ].forEach(function(showProp) {
 | 
						|
        this.set(showProp, false);
 | 
						|
      }.bind(this));
 | 
						|
 | 
						|
      this.$.errorView.hidden = false;
 | 
						|
      var response = e.detail.response;
 | 
						|
      var err = {text: [response.status, response.statusText].join(' ')};
 | 
						|
      if (response.status === 404) {
 | 
						|
        err.emoji = '¯\\_(ツ)_/¯';
 | 
						|
        this._lastError = err;
 | 
						|
      } else {
 | 
						|
        err.emoji = 'o_O';
 | 
						|
        response.text().then(function(text) {
 | 
						|
          err.moreInfo = text;
 | 
						|
          this._lastError = err;
 | 
						|
        }.bind(this));
 | 
						|
      }
 | 
						|
    },
 | 
						|
 | 
						|
    _handleLocationChange: function(e) {
 | 
						|
      var hash = e.detail.hash.substring(1);
 | 
						|
      var pathname = e.detail.pathname;
 | 
						|
      if (pathname.indexOf('/c/') === 0 && parseInt(hash, 10) > 0) {
 | 
						|
        pathname += '@' + hash;
 | 
						|
      }
 | 
						|
      this.set('_path', pathname);
 | 
						|
      this._handleSearchPageChange();
 | 
						|
    },
 | 
						|
 | 
						|
    _handleSearchPageChange: function() {
 | 
						|
      if (!this.params) {
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      var viewsToCheck = ['gr-change-list-view', 'gr-dashboard-view'];
 | 
						|
      if (viewsToCheck.indexOf(this.params.view) !== -1) {
 | 
						|
        this.set('_lastSearchPage', location.pathname);
 | 
						|
      }
 | 
						|
    },
 | 
						|
 | 
						|
    _handleTitleChange: function(e) {
 | 
						|
      if (e.detail.title) {
 | 
						|
        document.title = e.detail.title + ' · Gerrit Code Review';
 | 
						|
      } else {
 | 
						|
        document.title = '';
 | 
						|
      }
 | 
						|
    },
 | 
						|
 | 
						|
    _showKeyboardShortcuts: function(e) {
 | 
						|
      if (this.shouldSuppressKeyboardShortcut(e)) { return; }
 | 
						|
      this.$.keyboardShortcuts.open();
 | 
						|
    },
 | 
						|
 | 
						|
    _handleKeyboardShortcutDialogClose: function() {
 | 
						|
      this.$.keyboardShortcuts.close();
 | 
						|
    },
 | 
						|
 | 
						|
    _handleAccountDetailUpdate: function(e) {
 | 
						|
      this.$.mainHeader.reload();
 | 
						|
      if (this.params.view === 'gr-settings-view') {
 | 
						|
        this.$$('gr-settings-view').reloadAccountDetail();
 | 
						|
      }
 | 
						|
    },
 | 
						|
 | 
						|
    _handleRegistrationDialogClose: function(e) {
 | 
						|
      this.params.justRegistered = false;
 | 
						|
      this.$.registration.close();
 | 
						|
    },
 | 
						|
  });
 | 
						|
})();
 |