Index: chrome/browser/resources/gaia_auth/main.js |
diff --git a/chrome/browser/resources/gaia_auth/main.js b/chrome/browser/resources/gaia_auth/main.js |
index 41f5116fff64978fe281fe376a4ffc93902131c3..1c61a2448150e9d110e5aa9ae4682331e695b599 100644 |
--- a/chrome/browser/resources/gaia_auth/main.js |
+++ b/chrome/browser/resources/gaia_auth/main.js |
@@ -63,7 +63,7 @@ Authenticator.prototype = { |
intputEmail_: undefined, |
isSAMLFlow_: false, |
- isSAMLEnabled_: false, |
+ gaiaLoaded_: false, |
supportChannel_: null, |
GAIA_URL: 'https://accounts.google.com/', |
@@ -87,12 +87,15 @@ Authenticator.prototype = { |
this.initialFrameUrl_ = params.frameUrl || this.constructInitialFrameUrl_(); |
this.initialFrameUrlWithoutParams_ = stripParams(this.initialFrameUrl_); |
+ // For CrOS 'ServiceLogin' we assume that Gaia is loaded if we recieved |
+ // 'clearOldAttempts' message. For other scenarios Gaia doesn't send this |
+ // message so we have to rely on 'load' event. |
+ // TODO(dzhioev): Do not rely on 'load' event after b/16313327 is fixed. |
+ this.assumeLoadedOnLoadEvent_ = |
+ this.gaiaPath_.indexOf('ServiceLogin') !== 0 || |
+ this.service_ !== 'chromeoslogin'; |
+ |
document.addEventListener('DOMContentLoaded', this.onPageLoad_.bind(this)); |
- if (!this.desktopMode_) { |
- // SAML is always enabled in desktop mode, thus no need to listen for |
- // enableSAML event. |
- document.addEventListener('enableSAML', this.onEnableSAML_.bind(this)); |
- } |
}, |
isGaiaMessage_: function(msg) { |
@@ -125,56 +128,67 @@ Authenticator.prototype = { |
onPageLoad_: function() { |
window.addEventListener('message', this.onMessage.bind(this), false); |
+ this.initSupportChannel_(); |
var gaiaFrame = $('gaia-frame'); |
gaiaFrame.src = this.initialFrameUrl_; |
- if (this.desktopMode_) { |
+ if (this.assumeLoadedOnLoadEvent_) { |
var handler = function() { |
- this.onLoginUILoaded_(); |
gaiaFrame.removeEventListener('load', handler); |
- |
- this.initDesktopChannel_(); |
+ if (!this.gaiaLoaded_) { |
+ this.gaiaLoaded_ = true; |
+ this.maybeInitialized_(); |
+ } |
}.bind(this); |
gaiaFrame.addEventListener('load', handler); |
} |
}, |
- initDesktopChannel_: function() { |
- this.supportChannel_ = new Channel(); |
- this.supportChannel_.connect('authMain'); |
- |
- var channelConnected = false; |
- this.supportChannel_.registerMessage('channelConnected', function() { |
- channelConnected = true; |
+ initSupportChannel_: function() { |
+ var supportChannel = new Channel(); |
+ supportChannel.connect('authMain'); |
- this.supportChannel_.send({ |
- name: 'initDesktopFlow', |
- gaiaUrl: this.gaiaUrl_, |
- continueUrl: stripParams(this.continueUrl_), |
- isConstrainedWindow: this.isConstrainedWindow_ |
- }); |
- this.supportChannel_.registerMessage( |
- 'switchToFullTab', this.switchToFullTab_.bind(this)); |
- this.supportChannel_.registerMessage( |
- 'completeLogin', this.completeLogin_.bind(this)); |
- |
- this.onEnableSAML_(); |
+ supportChannel.registerMessage('channelConnected', function() { |
+ if (this.supportChannel_) { |
+ console.error('Support channel is already initialized.'); |
+ return; |
+ } |
+ this.supportChannel_ = supportChannel; |
+ |
+ if (this.desktopMode_) { |
+ this.supportChannel_.send({ |
+ name: 'initDesktopFlow', |
+ gaiaUrl: this.gaiaUrl_, |
+ continueUrl: stripParams(this.continueUrl_), |
+ isConstrainedWindow: this.isConstrainedWindow_ |
+ }); |
+ this.supportChannel_.registerMessage( |
+ 'switchToFullTab', this.switchToFullTab_.bind(this)); |
+ this.supportChannel_.registerMessage( |
+ 'completeLogin', this.completeLogin_.bind(this)); |
+ } |
+ this.initSAML_(); |
+ this.maybeInitialized_(); |
}.bind(this)); |
window.setTimeout(function() { |
- if (!channelConnected) { |
+ if (!this.supportChannel_) { |
// Re-initialize the channel if it is not connected properly, e.g. |
// connect may be called before background script started running. |
- this.initDesktopChannel_(); |
+ this.initSupportChannel_(); |
bartfab (slow)
2014/07/16 11:32:13
What happens if the initialization of a support ch
dzhioev (left Google)
2014/07/16 13:25:18
Yes, it can. 'chrome.runtime.connect' is a strange
|
} |
}.bind(this), 200); |
}, |
/** |
- * Invoked when the login UI is initialized or reset. |
+ * Called when one of the initialization stages has finished. If all the |
+ * needed parts are initialized, notifies parent about successfull |
+ * initialization. |
*/ |
- onLoginUILoaded_: function() { |
+ maybeInitialized_: function() { |
+ if (!this.gaiaLoaded_ || !this.supportChannel_) |
+ return; |
var msg = { |
'method': 'loginUILoaded' |
}; |
@@ -210,23 +224,15 @@ Authenticator.prototype = { |
'sessionIndex': opt_extraMsg && opt_extraMsg.sessionIndex |
}; |
window.parent.postMessage(msg, this.parentPage_); |
- if (this.isSAMLEnabled_) |
- this.supportChannel_.send({name: 'resetAuth'}); |
+ this.supportChannel_.send({name: 'resetAuth'}); |
}, |
/** |
- * Invoked when 'enableSAML' event is received to initialize SAML support on |
- * Chrome OS, or when initDesktopChannel_ is called on desktop. |
+ * Invoked when support channel is connected. |
*/ |
- onEnableSAML_: function() { |
- this.isSAMLEnabled_ = true; |
+ initSAML_: function() { |
this.isSAMLFlow_ = false; |
- if (!this.supportChannel_) { |
- this.supportChannel_ = new Channel(); |
- this.supportChannel_.connect('authMain'); |
- } |
- |
this.supportChannel_.registerMessage( |
'onAuthPageLoaded', this.onAuthPageLoaded_.bind(this)); |
this.supportChannel_.registerMessage( |
@@ -400,15 +406,20 @@ Authenticator.prototype = { |
this.attemptToken_ = msg.attemptToken; |
this.chooseWhatToSync_ = msg.chooseWhatToSync; |
this.isSAMLFlow_ = false; |
- if (this.isSAMLEnabled_) |
+ if (this.supportChannel_) |
this.supportChannel_.send({name: 'startAuth'}); |
+ else |
+ console.error('Support channel is not initialized.'); |
} else if (msg.method == 'clearOldAttempts' && this.isGaiaMessage_(e)) { |
+ if (!this.gaiaLoaded_) { |
+ this.gaiaLoaded_ = true; |
+ this.maybeInitialized_(); |
+ } |
this.email_ = null; |
this.passwordBytes_ = null; |
this.attemptToken_ = null; |
this.isSAMLFlow_ = false; |
- this.onLoginUILoaded_(); |
- if (this.isSAMLEnabled_) |
+ if (this.supportChannel_) |
this.supportChannel_.send({name: 'resetAuth'}); |
} else if (msg.method == 'setAuthenticatedUserEmail' && |
this.isParentMessage_(e)) { |