| Index: chrome/browser/resources/chromeos/login/screen_gaia_signin.js
|
| diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
|
| index 7dbfb055c7ce8cd2f4a70ddc5efcaac8f63bbb94..0d524abea8993f4a263c33a64521704b4891ad32 100644
|
| --- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
|
| +++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
|
| @@ -30,7 +30,13 @@ cr.define('login', function() {
|
| __proto__: HTMLDivElement.prototype,
|
|
|
| // Authentication extension's start page URL.
|
| - extension_url_: null,
|
| + extensionUrl_: null,
|
| +
|
| + // Whether extension should be loaded silently.
|
| + silentLoad_: false,
|
| +
|
| + // Whether there is focused element.
|
| + hasFocused_: false,
|
|
|
| // Number of times that we reload extension frame.
|
| retryCount_: 0,
|
| @@ -40,6 +46,8 @@ cr.define('login', function() {
|
|
|
| /** @inheritDoc */
|
| decorate: function() {
|
| + this.frame_ = $('signin-frame');
|
| +
|
| $('createAccount').innerHTML = localStrings.getStringF(
|
| 'createAccount',
|
| '<a id="createAccountLink" class="signin-link" href="#">',
|
| @@ -54,6 +62,8 @@ cr.define('login', function() {
|
| $('guestSigninLink').onclick = function() {
|
| chrome.send('launchIncognito');
|
| };
|
| + document.addEventListener(
|
| + 'focusin', this.selfBind_(this.onFocusIn_.bind(this)));
|
| },
|
|
|
| /**
|
| @@ -71,7 +81,7 @@ cr.define('login', function() {
|
| */
|
| showLoadingUI_: function(show) {
|
| $('gaia-loading').hidden = !show;
|
| - $('signin-frame').hidden = show;
|
| + this.frame_.hidden = show;
|
|
|
| // Sign-in right panel is hidden if all its items are hidden.
|
| $('signin-right').hidden = show ||
|
| @@ -107,7 +117,42 @@ cr.define('login', function() {
|
| Oobe.getInstance().headerHidden = false;
|
| },
|
|
|
| - setExtensionUrl_: function(data) {
|
| + /**
|
| + * Returns function which gets an event and passes it and self to listener.
|
| + * @param {!Object} listener Listener to be wrapped.
|
| + */
|
| + selfBind_: function(listener) {
|
| + var selfBinded = function(e) {
|
| + listener(e, selfBinded);
|
| + }
|
| + return selfBinded;
|
| + },
|
| +
|
| + /**
|
| + * Tracks first focus in event.
|
| + * @param {!Object} e Focus in event.
|
| + * @param {!Object} listener Listener which shold be removed from event
|
| + * listeners list.
|
| + */
|
| + onFocusIn_: function(e, listener) {
|
| + this.hasFocused_ = true;
|
| + document.removeEventListener('focusin', listener);
|
| + },
|
| +
|
| + /**
|
| + * Restore focus back to the focused element.
|
| + * @param {!Object} e Focus out event.
|
| + * @param {!Object} listener Listener which shold be removed from event
|
| + * listeners list.
|
| + */
|
| + onFocusOut_: function(e, listener) {
|
| + window.setTimeout(e.target.focus.bind(e.target), 0);
|
| + document.removeEventListener('focusout', listener);
|
| + },
|
| +
|
| + loadAuthExtension_: function(data) {
|
| + this.silentLoad_ = data.silentLoad;
|
| +
|
| $('createAccount').hidden = !data.createAccount;
|
| $('guestSignin').hidden = !data.guestSignin;
|
|
|
| @@ -127,12 +172,12 @@ cr.define('login', function() {
|
| if (params.length)
|
| url += '?' + params.join('&');
|
|
|
| - if (data.forceReload || this.extension_url_ != url) {
|
| + if (data.forceReload || this.extensionUrl_ != url) {
|
| console.log('Opening extension: ' + data.startUrl +
|
| ', opt_email=' + data.email);
|
|
|
| - $('signin-frame').src = url;
|
| - this.extension_url_ = url;
|
| + this.frame_.src = url;
|
| + this.extensionUrl_ = url;
|
|
|
| this.loading = true;
|
| this.clearRetry_();
|
| @@ -148,9 +193,9 @@ cr.define('login', function() {
|
| * @type {bool}
|
| */
|
| isAuthExtMessage_: function(e) {
|
| - return this.extension_url_ != null &&
|
| - this.extension_url_.indexOf(e.origin) == 0 &&
|
| - e.source == $('signin-frame').contentWindow;
|
| + return this.extensionUrl_ != null &&
|
| + this.extensionUrl_.indexOf(e.origin) == 0 &&
|
| + e.source == this.frame_.contentWindow;
|
| },
|
|
|
| /**
|
| @@ -165,6 +210,13 @@ cr.define('login', function() {
|
| // Now that we're in logged in state header should be hidden.
|
| Oobe.getInstance().headerHidden = true;
|
| } else if (msg.method == 'loginUILoaded' && this.isAuthExtMessage_(e)) {
|
| + // TODO(altimofeev): there is no guarantee that next 'focusout' event
|
| + // will be caused by the extension, so better approach is direct asking
|
| + // the extension (and gaia consequently) to not grab the focus.
|
| + if (this.silentLoad_ && this.hasFocused_) {
|
| + document.addEventListener(
|
| + 'focusout', this.selfBind_(this.onFocusOut_.bind(this)));
|
| + }
|
| $('error-message').update();
|
| this.loading = false;
|
| this.clearRetry_();
|
| @@ -199,7 +251,7 @@ cr.define('login', function() {
|
| */
|
| doReload: function() {
|
| console.log('Reload auth extension frame.');
|
| - $('signin-frame').src = this.extension_url_;
|
| + this.frame_.src = this.extensionUrl_;
|
| this.retryTimer_ = undefined;
|
| },
|
|
|
| @@ -222,8 +274,8 @@ cr.define('login', function() {
|
| }
|
| };
|
|
|
| - GaiaSigninScreen.setExtensionUrl = function(data) {
|
| - $('gaia-signin').setExtensionUrl_(data);
|
| + GaiaSigninScreen.loadAuthExtension = function(data) {
|
| + $('gaia-signin').loadAuthExtension_(data);
|
| };
|
|
|
| return {
|
|
|