[cros,login] Restore the focus after hidden auth extension has grabbed it.

BUG=chromium-os:22862
TEST=manual

Review URL: http://codereview.chromium.org/8564008

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@109944 0039d316-1c4b-4281-b951-d872f2087c98
parent 5dde1490
...@@ -30,7 +30,13 @@ cr.define('login', function() { ...@@ -30,7 +30,13 @@ cr.define('login', function() {
__proto__: HTMLDivElement.prototype, __proto__: HTMLDivElement.prototype,
// Authentication extension's start page URL. // 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. // Number of times that we reload extension frame.
retryCount_: 0, retryCount_: 0,
...@@ -40,6 +46,8 @@ cr.define('login', function() { ...@@ -40,6 +46,8 @@ cr.define('login', function() {
/** @inheritDoc */ /** @inheritDoc */
decorate: function() { decorate: function() {
this.frame_ = $('signin-frame');
$('createAccount').innerHTML = localStrings.getStringF( $('createAccount').innerHTML = localStrings.getStringF(
'createAccount', 'createAccount',
'<a id="createAccountLink" class="signin-link" href="#">', '<a id="createAccountLink" class="signin-link" href="#">',
...@@ -54,6 +62,8 @@ cr.define('login', function() { ...@@ -54,6 +62,8 @@ cr.define('login', function() {
$('guestSigninLink').onclick = function() { $('guestSigninLink').onclick = function() {
chrome.send('launchIncognito'); chrome.send('launchIncognito');
}; };
document.addEventListener(
'focusin', this.selfBind_(this.onFocusIn_.bind(this)));
}, },
/** /**
...@@ -71,7 +81,7 @@ cr.define('login', function() { ...@@ -71,7 +81,7 @@ cr.define('login', function() {
*/ */
showLoadingUI_: function(show) { showLoadingUI_: function(show) {
$('gaia-loading').hidden = !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. // Sign-in right panel is hidden if all its items are hidden.
$('signin-right').hidden = show || $('signin-right').hidden = show ||
...@@ -107,7 +117,42 @@ cr.define('login', function() { ...@@ -107,7 +117,42 @@ cr.define('login', function() {
Oobe.getInstance().headerHidden = false; 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; $('createAccount').hidden = !data.createAccount;
$('guestSignin').hidden = !data.guestSignin; $('guestSignin').hidden = !data.guestSignin;
...@@ -127,12 +172,12 @@ cr.define('login', function() { ...@@ -127,12 +172,12 @@ cr.define('login', function() {
if (params.length) if (params.length)
url += '?' + params.join('&'); url += '?' + params.join('&');
if (data.forceReload || this.extension_url_ != url) { if (data.forceReload || this.extensionUrl_ != url) {
console.log('Opening extension: ' + data.startUrl + console.log('Opening extension: ' + data.startUrl +
', opt_email=' + data.email); ', opt_email=' + data.email);
$('signin-frame').src = url; this.frame_.src = url;
this.extension_url_ = url; this.extensionUrl_ = url;
this.loading = true; this.loading = true;
this.clearRetry_(); this.clearRetry_();
...@@ -148,9 +193,9 @@ cr.define('login', function() { ...@@ -148,9 +193,9 @@ cr.define('login', function() {
* @type {bool} * @type {bool}
*/ */
isAuthExtMessage_: function(e) { isAuthExtMessage_: function(e) {
return this.extension_url_ != null && return this.extensionUrl_ != null &&
this.extension_url_.indexOf(e.origin) == 0 && this.extensionUrl_.indexOf(e.origin) == 0 &&
e.source == $('signin-frame').contentWindow; e.source == this.frame_.contentWindow;
}, },
/** /**
...@@ -165,6 +210,13 @@ cr.define('login', function() { ...@@ -165,6 +210,13 @@ cr.define('login', function() {
// Now that we're in logged in state header should be hidden. // Now that we're in logged in state header should be hidden.
Oobe.getInstance().headerHidden = true; Oobe.getInstance().headerHidden = true;
} else if (msg.method == 'loginUILoaded' && this.isAuthExtMessage_(e)) { } 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(); $('error-message').update();
this.loading = false; this.loading = false;
this.clearRetry_(); this.clearRetry_();
...@@ -199,7 +251,7 @@ cr.define('login', function() { ...@@ -199,7 +251,7 @@ cr.define('login', function() {
*/ */
doReload: function() { doReload: function() {
console.log('Reload auth extension frame.'); console.log('Reload auth extension frame.');
$('signin-frame').src = this.extension_url_; this.frame_.src = this.extensionUrl_;
this.retryTimer_ = undefined; this.retryTimer_ = undefined;
}, },
...@@ -222,8 +274,8 @@ cr.define('login', function() { ...@@ -222,8 +274,8 @@ cr.define('login', function() {
} }
}; };
GaiaSigninScreen.setExtensionUrl = function(data) { GaiaSigninScreen.loadAuthExtension = function(data) {
$('gaia-signin').setExtensionUrl_(data); $('gaia-signin').loadAuthExtension_(data);
}; };
return { return {
......
...@@ -452,7 +452,7 @@ void SigninScreenHandler::ShowSigninScreenIfReady() { ...@@ -452,7 +452,7 @@ void SigninScreenHandler::ShowSigninScreenIfReady() {
if (!dns_cleared_ || !cookies_cleared_) if (!dns_cleared_ || !cookies_cleared_)
return; return;
LoadAuthExtension(!is_first_attempt_); LoadAuthExtension(!is_first_attempt_, false);
ShowScreen(kGaiaSigninScreen, NULL); ShowScreen(kGaiaSigninScreen, NULL);
if (is_first_attempt_) { if (is_first_attempt_) {
...@@ -462,10 +462,11 @@ void SigninScreenHandler::ShowSigninScreenIfReady() { ...@@ -462,10 +462,11 @@ void SigninScreenHandler::ShowSigninScreenIfReady() {
} }
} }
void SigninScreenHandler::LoadAuthExtension(bool force) { void SigninScreenHandler::LoadAuthExtension(bool force, bool silent_load) {
DictionaryValue params; DictionaryValue params;
params.SetBoolean("forceReload", force); params.SetBoolean("forceReload", force);
params.SetBoolean("silentLoad", silent_load);
params.SetString("startUrl", kGaiaExtStartPage); params.SetString("startUrl", kGaiaExtStartPage);
params.SetString("email", email_); params.SetString("email", email_);
email_.clear(); email_.clear();
...@@ -493,7 +494,7 @@ void SigninScreenHandler::LoadAuthExtension(bool force) { ...@@ -493,7 +494,7 @@ void SigninScreenHandler::LoadAuthExtension(bool force) {
test_pass_.clear(); test_pass_.clear();
} }
} }
web_ui_->CallJavascriptFunction("login.GaiaSigninScreen.setExtensionUrl", web_ui_->CallJavascriptFunction("login.GaiaSigninScreen.loadAuthExtension",
params); params);
} }
...@@ -649,7 +650,7 @@ void SigninScreenHandler::HandleAccountPickerReady( ...@@ -649,7 +650,7 @@ void SigninScreenHandler::HandleAccountPickerReady(
// Fetching of the extension is not started before account picker page is // Fetching of the extension is not started before account picker page is
// loaded because it can affect the loading speed. // loaded because it can affect the loading speed.
if (is_first_attempt_ && !cookie_remover_ && !dns_clear_task_running_) if (is_first_attempt_ && !cookie_remover_ && !dns_clear_task_running_)
LoadAuthExtension(true); LoadAuthExtension(true, true);
} }
void SigninScreenHandler::HandleLoginWebuiReady(const base::ListValue* args) { void SigninScreenHandler::HandleLoginWebuiReady(const base::ListValue* args) {
......
...@@ -143,8 +143,10 @@ class SigninScreenHandler : public BaseScreenHandler, ...@@ -143,8 +143,10 @@ class SigninScreenHandler : public BaseScreenHandler,
void ShowSigninScreenIfReady(); void ShowSigninScreenIfReady();
// Tells webui to load authentication extension. |force| is used to force the // Tells webui to load authentication extension. |force| is used to force the
// extension reloading, if it has already been loaded. // extension reloading, if it has already been loaded. |silent_load| is true
void LoadAuthExtension(bool force); // for cases when extension should be loaded in the background and it
// shouldn't grab the focus.
void LoadAuthExtension(bool force, bool silent_load);
// Handles confirmation message of user authentication that was performed by // Handles confirmation message of user authentication that was performed by
// the authentication extension. // the authentication extension.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment