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 d3b01c735c821300381afdce321ee97e5e895157..14db3359573c474be0b4ecb60fdf40d6cdb9ec58 100644 |
--- a/chrome/browser/resources/gaia_auth/main.js |
+++ b/chrome/browser/resources/gaia_auth/main.js |
@@ -36,7 +36,8 @@ Authenticator.prototype = { |
intputEmail_: undefined, |
isSAMLFlow_: false, |
- samlSupportChannel_: null, |
+ isSAMLEnabled_: false, |
+ supportChannel_: null, |
GAIA_URL: 'https://accounts.google.com/', |
GAIA_PAGE_PATH: 'ServiceLogin?skipvpage=true&sarp=1&rm=hide', |
@@ -54,15 +55,12 @@ Authenticator.prototype = { |
this.inputEmail_ = params.email; |
this.service_ = params.service || this.SERVICE_ID; |
this.continueUrl_ = params.continueUrl || this.CONTINUE_URL; |
- this.continueUrlWithoutParams_ = stripParams(this.continueUrl_); |
- this.inlineMode_ = params.inlineMode == '1'; |
- this.constrained_ = params.constrained == '1'; |
- this.partitionId_ = params.partitionId || ''; |
+ this.desktopMode_ = params.desktopMode == '1'; |
+ this.isConstrainedWindow_ = params.constrained == '1'; |
this.initialFrameUrl_ = params.frameUrl || this.constructInitialFrameUrl_(); |
this.initialFrameUrlWithoutParams_ = stripParams(this.initialFrameUrl_); |
- this.loaded_ = false; |
- document.addEventListener('DOMContentLoaded', this.onPageLoad.bind(this)); |
+ document.addEventListener('DOMContentLoaded', this.onPageLoad_.bind(this)); |
document.addEventListener('enableSAML', this.onEnableSAML_.bind(this)); |
}, |
@@ -89,129 +87,116 @@ Authenticator.prototype = { |
url = appendParam(url, 'hl', this.inputLang_); |
if (this.inputEmail_) |
url = appendParam(url, 'Email', this.inputEmail_); |
- if (this.constrained_) |
+ if (this.isConstrainedWindow_) |
url = appendParam(url, 'source', this.CONSTRAINED_FLOW_SOURCE); |
return url; |
}, |
- /** Callback when all loads in the gaia webview is complete. */ |
- onWebviewLoadstop_: function(gaiaFrame) { |
- if (gaiaFrame.src.lastIndexOf(this.continueUrlWithoutParams_, 0) == 0) { |
- // Detect when login is finished by the load stop event of the continue |
- // URL. Cannot reuse the login complete flow in success.html, because |
- // webview does not support extension pages yet. |
- var skipForNow = false; |
- if (this.inlineMode_ && gaiaFrame.src.indexOf('ntp=1') >= 0) { |
- skipForNow = true; |
- } |
- msg = { |
- 'method': 'completeLogin', |
- 'skipForNow': skipForNow |
- }; |
- window.parent.postMessage(msg, this.parentPage_); |
- // Do no report state to the parent for the continue URL, since it is a |
- // blank page. |
- return; |
+ onPageLoad_: function() { |
+ window.addEventListener('message', this.onMessage.bind(this), false); |
+ |
+ var gaiaFrame = $('gaia-frame'); |
+ gaiaFrame.src = this.initialFrameUrl_; |
+ |
+ if (this.desktopMode_) { |
+ var handler = function() { |
+ this.onLoginUILoaded_(); |
+ gaiaFrame.removeEventListener('load', handler); |
+ |
+ this.initDesktopChannel_(); |
+ }.bind(this); |
+ gaiaFrame.addEventListener('load', handler); |
} |
+ }, |
- // Report the current state to the parent which will then update the |
- // browser history so that later it could respond properly to back/forward. |
- var msg = { |
- 'method': 'reportState', |
- 'src': gaiaFrame.src |
- }; |
- window.parent.postMessage(msg, this.parentPage_); |
+ initDesktopChannel_: function() { |
+ this.supportChannel_ = new Channel(); |
+ this.supportChannel_.connect('authMain'); |
- if (gaiaFrame.src.lastIndexOf(this.gaiaUrl_, 0) == 0) { |
- gaiaFrame.executeScript({file: 'inline_injected.js'}, function() { |
- // Send an initial message to gaia so that it has an JavaScript |
- // reference to the embedder. |
- gaiaFrame.contentWindow.postMessage('', gaiaFrame.src); |
+ var channelConnected = false; |
+ this.supportChannel_.registerMessage('channelConnected', function() { |
+ channelConnected = true; |
+ |
+ this.supportChannel_.send({ |
+ name: 'initDesktopFlow', |
+ gaiaUrl: this.gaiaUrl_, |
+ continueUrl: stripParams(this.continueUrl_), |
+ isConstrainedWindow: this.isConstrainedWindow_ |
}); |
- if (this.constrained_) { |
- var preventContextMenu = 'document.addEventListener("contextmenu", ' + |
- 'function(e) {e.preventDefault();})'; |
- gaiaFrame.executeScript({code: preventContextMenu}); |
+ this.supportChannel_.registerMessage( |
+ 'switchToFullTab', this.switchToFullTab_.bind(this)); |
+ this.supportChannel_.registerMessage( |
+ 'completeLogin', this.completeLogin_.bind(this)); |
+ }.bind(this)); |
+ |
+ window.setTimeout(function() { |
+ if (!channelConnected) { |
+ // Re-initialize the channel if it is not connected properly, e.g. |
+ // connect may be called before background script started running. |
+ this.initDesktopChannel_(); |
} |
- } |
- |
- this.loaded_ || this.onLoginUILoaded(); |
+ }.bind(this), 200); |
}, |
/** |
- * Callback when the gaia webview attempts to open a new window. |
+ * Invoked when the login UI is initialized or reset. |
*/ |
- onWebviewNewWindow_: function(gaiaFrame, e) { |
- window.open(e.targetUrl, '_blank'); |
- e.window.discard(); |
- }, |
- |
- onWebviewRequestCompleted_: function(details) { |
- if (details.url.lastIndexOf(this.continueUrlWithoutParams_, 0) == 0) { |
- return; |
- } |
- |
- var headers = details.responseHeaders; |
- for (var i = 0; headers && i < headers.length; ++i) { |
- if (headers[i].name.toLowerCase() == 'google-accounts-embedded') { |
- return; |
- } |
- } |
+ onLoginUILoaded_: function() { |
var msg = { |
- 'method': 'switchToFullTab', |
- 'url': details.url |
+ 'method': 'loginUILoaded' |
}; |
window.parent.postMessage(msg, this.parentPage_); |
}, |
- loadFrame_: function() { |
- var gaiaFrame = $('gaia-frame'); |
- gaiaFrame.partition = this.partitionId_; |
- gaiaFrame.src = this.initialFrameUrl_; |
- if (this.inlineMode_) { |
- gaiaFrame.addEventListener( |
- 'loadstop', this.onWebviewLoadstop_.bind(this, gaiaFrame)); |
- gaiaFrame.addEventListener( |
- 'newwindow', this.onWebviewNewWindow_.bind(this, gaiaFrame)); |
- } |
- if (this.constrained_) { |
- gaiaFrame.request.onCompleted.addListener( |
- this.onWebviewRequestCompleted_.bind(this), |
- {urls: ['<all_urls>'], types: ['main_frame']}, |
- ['responseHeaders']); |
- } |
+ /** |
+ * Invoked when the background script sends a message to indicate that the |
+ * current content does not fit in a constrained window. |
+ * @param {Object=} opt_extraMsg Optional extra info to send. |
+ */ |
+ switchToFullTab_: function(msg) { |
+ var parentMsg = { |
+ 'method': 'switchToFullTab', |
+ 'url': msg.url |
+ }; |
+ window.parent.postMessage(parentMsg, this.parentPage_); |
}, |
- completeLogin: function() { |
+ /** |
+ * Invoked when the signin flow is complete. |
+ * @param {Object=} opt_extraMsg Optional extra info to send. |
+ */ |
+ completeLogin_: function(opt_extraMsg) { |
var msg = { |
'method': 'completeLogin', |
- 'email': this.email_, |
+ 'email': (opt_extraMsg && opt_extraMsg.email) || this.email_, |
'password': this.password_, |
- 'usingSAML': this.isSAMLFlow_ |
+ 'usingSAML': this.isSAMLFlow_, |
+ 'chooseWhatToSync': this.chooseWhatToSync_ || false, |
+ 'skipForNow': opt_extraMsg && opt_extraMsg.skipForNow, |
+ 'sessionIndex': opt_extraMsg && opt_extraMsg.sessionIndex |
}; |
window.parent.postMessage(msg, this.parentPage_); |
- if (this.samlSupportChannel_) |
- this.samlSupportChannel_.send({name: 'resetAuth'}); |
- }, |
- |
- onPageLoad: function(e) { |
- window.addEventListener('message', this.onMessage.bind(this), false); |
- this.loadFrame_(); |
+ if (this.isSAMLEnabled_) |
+ this.supportChannel_.send({name: 'resetAuth'}); |
}, |
/** |
* Invoked when 'enableSAML' event is received to initialize SAML support. |
*/ |
onEnableSAML_: function() { |
+ this.isSAMLEnabled_ = true; |
this.isSAMLFlow_ = false; |
- this.samlSupportChannel_ = new Channel(); |
- this.samlSupportChannel_.connect('authMain'); |
- this.samlSupportChannel_.registerMessage( |
+ if (!this.supportChannel_) { |
+ this.supportChannel_ = new Channel(); |
+ this.supportChannel_.connect('authMain'); |
+ } |
+ |
+ this.supportChannel_.registerMessage( |
'onAuthPageLoaded', this.onAuthPageLoaded_.bind(this)); |
- this.samlSupportChannel_.registerMessage( |
+ this.supportChannel_.registerMessage( |
'apiCall', this.onAPICall_.bind(this)); |
- this.samlSupportChannel_.send({ |
+ this.supportChannel_.send({ |
name: 'setGaiaUrl', |
gaiaUrl: this.gaiaUrl_ |
}); |
@@ -259,26 +244,9 @@ Authenticator.prototype = { |
} |
}, |
- onLoginUILoaded: function() { |
- var msg = { |
- 'method': 'loginUILoaded' |
- }; |
- window.parent.postMessage(msg, this.parentPage_); |
- if (this.inlineMode_) { |
- // TODO(guohui): temporary workaround until webview team fixes the focus |
- // on their side. |
- var gaiaFrame = $('gaia-frame'); |
- gaiaFrame.focus(); |
- gaiaFrame.onblur = function() { |
- gaiaFrame.focus(); |
- }; |
- } |
- this.loaded_ = true; |
- }, |
- |
onConfirmLogin_: function() { |
if (!this.isSAMLFlow_) { |
- this.completeLogin(); |
+ this.completeLogin_(); |
return; |
} |
@@ -291,7 +259,7 @@ Authenticator.prototype = { |
this.parentPage_); |
if (!apiUsed) { |
- this.samlSupportChannel_.sendWithCallback( |
+ this.supportChannel_.sendWithCallback( |
{name: 'getScrapedPasswords'}, |
function(passwords) { |
if (passwords.length == 0) { |
@@ -312,11 +280,11 @@ Authenticator.prototype = { |
// SAML login is complete when the user's e-mail address has been retrieved |
// from GAIA and the user has successfully confirmed the password. |
if (this.email_ !== null && this.password_ !== null) |
- this.completeLogin(); |
+ this.completeLogin_(); |
}, |
onVerifyConfirmedPassword_: function(password) { |
- this.samlSupportChannel_.sendWithCallback( |
+ this.supportChannel_.sendWithCallback( |
{name: 'getScrapedPasswords'}, |
function(passwords) { |
for (var i = 0; i < passwords.length; ++i) { |
@@ -338,17 +306,18 @@ Authenticator.prototype = { |
this.email_ = msg.email; |
this.password_ = msg.password; |
this.attemptToken_ = msg.attemptToken; |
+ this.chooseWhatToSync_ = msg.chooseWhatToSync; |
this.isSAMLFlow_ = false; |
- if (this.samlSupportChannel_) |
- this.samlSupportChannel_.send({name: 'startAuth'}); |
+ if (this.isSAMLEnabled_) |
+ this.supportChannel_.send({name: 'startAuth'}); |
} else if (msg.method == 'clearOldAttempts' && this.isGaiaMessage_(e)) { |
this.email_ = null; |
this.password_ = null; |
this.attemptToken_ = null; |
this.isSAMLFlow_ = false; |
- this.onLoginUILoaded(); |
- if (this.samlSupportChannel_) |
- this.samlSupportChannel_.send({name: 'resetAuth'}); |
+ this.onLoginUILoaded_(); |
+ if (this.isSAMLEnabled_) |
+ this.supportChannel_.send({name: 'resetAuth'}); |
} else if (msg.method == 'setAuthenticatedUserEmail' && |
this.isParentMessage_(e)) { |
if (this.attemptToken_ == msg.attemptToken) { |