Chromium Code Reviews| 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..b18eb069f49579c1b7368fd682431a59d3d99e83 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,41 @@ 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); |
| + }, |
|
xiyuan
2011/11/14 17:52:28
nit: insert an empty line after
altimofeev
2011/11/14 20:21:45
Done.
|
| + /** |
| + * 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 +171,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 +192,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 +209,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 +250,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 +273,8 @@ cr.define('login', function() { |
| } |
| }; |
| - GaiaSigninScreen.setExtensionUrl = function(data) { |
| - $('gaia-signin').setExtensionUrl_(data); |
| + GaiaSigninScreen.loadAuthExtension = function(data) { |
| + $('gaia-signin').loadAuthExtension_(data); |
| }; |
| return { |