Index: chrome/browser/resources/gaia_auth_host/authenticator.js |
diff --git a/chrome/browser/resources/gaia_auth_host/authenticator.js b/chrome/browser/resources/gaia_auth_host/authenticator.js |
index 2407ffa35822773b9212cfb3091c74cb18eeb99d..4159df30217fb4a29688f9a6a3651a135242e753 100644 |
--- a/chrome/browser/resources/gaia_auth_host/authenticator.js |
+++ b/chrome/browser/resources/gaia_auth_host/authenticator.js |
@@ -31,6 +31,7 @@ cr.define('cr.login', function() { |
var GAPS_COOKIE = 'GAPS'; |
var SERVICE_ID = 'chromeoslogin'; |
var EMBEDDED_SETUP_CHROMEOS_ENDPOINT = 'embedded/setup/chromeos'; |
+ var SAML_REDIRECTION_PATH = 'samlredirect'; |
/** |
* The source URL parameter for the constrained signin flow. |
@@ -138,6 +139,7 @@ cr.define('cr.login', function() { |
this.gapsCookie_ = null; |
this.gapsCookieSent_ = false; |
this.newGapsCookie_ = null; |
+ this.readyFired_ = false; |
this.useEafe_ = false; |
this.clientId_ = null; |
@@ -189,7 +191,7 @@ cr.define('cr.login', function() { |
* Reinitializes authentication parameters so that a failed login attempt |
* would not result in an infinite loop. |
*/ |
- Authenticator.prototype.clearCredentials_ = function() { |
+ Authenticator.prototype.resetStates_ = function() { |
this.email_ = null; |
this.gaiaId_ = null; |
this.password_ = null; |
@@ -197,6 +199,7 @@ cr.define('cr.login', function() { |
this.gapsCookie_ = null; |
this.gapsCookieSent_ = false; |
this.newGapsCookie_ = null; |
+ this.readyFired_ = false; |
this.chooseWhatToSync_ = false; |
this.skipForNow_ = false; |
this.sessionIndex_ = null; |
@@ -212,7 +215,7 @@ cr.define('cr.login', function() { |
*/ |
Authenticator.prototype.load = function(authMode, data) { |
this.authMode = authMode; |
- this.clearCredentials_(); |
+ this.resetStates_(); |
// gaiaUrl parameter is used for testing. Once defined, it is never changed. |
this.idpOrigin_ = data.gaiaUrl || IDP_ORIGIN; |
this.continueUrl_ = data.continueUrl || CONTINUE_URL; |
@@ -259,11 +262,23 @@ cr.define('cr.login', function() { |
* Reloads the authenticator component. |
*/ |
Authenticator.prototype.reload = function() { |
- this.clearCredentials_(); |
+ this.resetStates_(); |
this.webview_.src = this.reloadUrl_; |
}; |
Authenticator.prototype.constructInitialFrameUrl_ = function(data) { |
+ if (data.doSamlRedirect) { |
+ var url = this.idpOrigin_ + SAML_REDIRECTION_PATH; |
+ url = appendParam(url, 'domain', data.enterpriseDomain); |
+ url = appendParam(url, 'continue', data.gaiaUrl + |
+ 'o/oauth2/programmatic_auth?hl=' + data.hl + |
+ '&scope=https%3A%2F%2Fwww.google.com%2Faccounts%2FOAuthLogin&' + |
+ 'client_id=' + encodeURIComponent(data.clientId) + |
+ '&access_type=offline'); |
+ |
+ return url; |
+ } |
+ |
var path = data.gaiaPath; |
if (!path && this.isNewGaiaFlow) |
path = EMBEDDED_SETUP_CHROMEOS_ENDPOINT; |
@@ -311,6 +326,18 @@ cr.define('cr.login', function() { |
}; |
/** |
+ * Dispatches the 'ready' event if it hasn't been dispatched already for the |
+ * current content. |
+ * @private |
+ */ |
+ Authenticator.prototype.fireReadyEvent_ = function() { |
+ if (!this.readyFired_) { |
+ this.dispatchEvent(new Event('ready')); |
+ this.readyFired_ = true; |
+ } |
+ }; |
+ |
+ /** |
* Invoked when a main frame request in the webview has completed. |
* @private |
*/ |
@@ -659,7 +686,7 @@ cr.define('cr.login', function() { |
gapsCookie: this.newGapsCookie_ || this.gapsCookie_ || '', |
} |
})); |
- this.clearCredentials_(); |
+ this.resetStates_(); |
}; |
/** |
@@ -684,6 +711,8 @@ cr.define('cr.login', function() { |
this.authDomain = this.samlHandler_.authDomain; |
this.authFlow = AuthFlow.SAML; |
+ |
+ this.fireReadyEvent_(); |
}; |
/** |
@@ -724,7 +753,7 @@ cr.define('cr.login', function() { |
this.webview_.contentWindow.postMessage(msg, currentUrl); |
- this.dispatchEvent(new Event('ready')); |
+ this.fireReadyEvent_(); |
// Focus webview after dispatching event when webview is already visible. |
this.webview_.focus(); |
} |