Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1339)

Unified Diff: chrome/browser/resources/chromeos/login/screen_gaia_signin.js

Issue 8564008: [cros,login] Restore the focus after hidden auth extension has grabbed it. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: nits Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 {
« no previous file with comments | « no previous file | chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698