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 { |