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 0fc093e2689b64f806cb411210bdace2771b41e8..6220d95113f622f3fac8f690f0a4253805f95a3f 100644 |
--- a/chrome/browser/resources/gaia_auth_host/authenticator.js |
+++ b/chrome/browser/resources/gaia_auth_host/authenticator.js |
@@ -247,7 +247,7 @@ cr.define('cr.login', function() { |
url = appendParam(url, 'client_id', data.clientId); |
if (data.enterpriseDomain) |
url = appendParam(url, 'manageddomain', data.enterpriseDomain); |
- this.setDeviceId(data.deviceId); |
+ this.deviceId_ = data.deviceId; |
this.sessionIsEphemeral_ = data.sessionIsEphemeral; |
} else { |
url = appendParam(url, 'continue', this.continueUrl_); |
@@ -269,13 +269,6 @@ cr.define('cr.login', function() { |
}; |
/** |
- * Invoked when deviceId is set or updated. |
- */ |
- Authenticator.prototype.setDeviceId = function(deviceId) { |
- this.deviceId_ = deviceId; |
- }; |
- |
- /** |
* Invoked when a main frame request in the webview has completed. |
* @private |
*/ |
@@ -400,11 +393,7 @@ cr.define('cr.login', function() { |
if (this.isNewGaiaFlowChromeOS && this.deviceId_) { |
var headers = details.requestHeaders; |
var found = false; |
- var deviceId; |
- if (this.sessionIsEphemeral_) |
- deviceId = EPHEMERAL_DEVICE_ID_PREFIX + this.deviceId_; |
- else |
- deviceId = this.deviceId_; |
+ var deviceId = this.getGAIADeviceId_(); |
for (var i = 0, l = headers.length; i < l; ++i) { |
if (headers[i].name == X_DEVICE_ID_HEADER) { |
@@ -424,29 +413,44 @@ cr.define('cr.login', function() { |
}; |
/** |
- * Invoked when an HTML5 message is received from the webview element. |
+ * Returns true if given HTML5 message is received from the webview element. |
* @param {object} e Payload of the received HTML5 message. |
- * @private |
*/ |
- Authenticator.prototype.onMessageFromWebview_ = function(e) { |
+ Authenticator.prototype.isGaiaMessage = function(e) { |
if (!this.isWebviewEvent_(e)) |
- return; |
+ return false; |
// The event origin does not have a trailing slash. |
if (e.origin != this.idpOrigin_.substring(0, this.idpOrigin_.length - 1)) { |
- return; |
+ return false; |
} |
// Gaia messages must be an object with 'method' property. |
if (typeof e.data != 'object' || !e.data.hasOwnProperty('method')) { |
- return; |
+ return false; |
} |
+ return true; |
+ }; |
+ |
+ /** |
+ * Invoked when an HTML5 message is received from the webview element. |
+ * @param {object} e Payload of the received HTML5 message. |
+ * @private |
+ */ |
+ Authenticator.prototype.onMessageFromWebview_ = function(e) { |
+ if (!this.isGaiaMessage(e)) |
+ return; |
var msg = e.data; |
if (msg.method == 'attemptLogin') { |
this.email_ = msg.email; |
this.password_ = msg.password; |
this.chooseWhatToSync_ = msg.chooseWhatToSync; |
+ // We need to dispatch only first event, before user enters password. |
+ if (!msg.password) { |
+ this.dispatchEvent( |
+ new CustomEvent('attemptLogin', {detail: msg.email})); |
+ } |
} else if (msg.method == 'dialogShown') { |
this.dispatchEvent(new Event('dialogShown')); |
} else if (msg.method == 'dialogHidden') { |
@@ -612,8 +616,10 @@ cr.define('cr.login', function() { |
var currentUrl = this.webview_.src; |
if (currentUrl.lastIndexOf(this.idpOrigin_) == 0) { |
var msg = { |
- 'method': 'handshake' |
+ 'method': 'handshake', |
+ 'deviceId': this.getGAIADeviceId_(), |
}; |
+ |
this.webview_.contentWindow.postMessage(msg, currentUrl); |
} |
}; |
@@ -665,6 +671,37 @@ cr.define('cr.login', function() { |
}; |
/** |
+ * Format deviceId for GAIA . |
+ * @return {string} deviceId. |
+ * @private |
+ */ |
+ Authenticator.prototype.getGAIADeviceId_ = function() { |
+ // deviceId_ is empty when we do not need to send it. For example, |
+ // in case of device enrollment. |
+ if (!(this.isNewGaiaFlowChromeOS && this.deviceId_)) |
+ return; |
+ |
+ if (this.sessionIsEphemeral_) |
+ return EPHEMERAL_DEVICE_ID_PREFIX + this.deviceId_; |
+ else |
+ return this.deviceId_; |
+ }; |
+ |
+ /** |
+ * Informs Gaia of new deviceId to be used. |
+ */ |
+ Authenticator.prototype.updateDeviceId = function(deviceId) { |
+ this.deviceId_ = deviceId; |
+ var msg = { |
+ 'method': 'updateDeviceId', |
+ 'deviceId': this.getGAIADeviceId_(), |
+ }; |
+ |
+ var currentUrl = this.webview_.src; |
+ this.webview_.contentWindow.postMessage(msg, currentUrl); |
+ }; |
+ |
+ /** |
* The current auth flow of the hosted auth page. |
* @type {AuthFlow} |
*/ |