Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1484)

Unified Diff: chrome/browser/resources/gaia_auth_host/authenticator.js

Issue 807503004: While trying to enable webview sign-in by default, I found a bunch of issues (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add comment Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 baf6d8e1a0667a4ea8982565d5d20972e8a03c64..133b0230f101c33769047d4027d28c03a19d961b 100644
--- a/chrome/browser/resources/gaia_auth_host/authenticator.js
+++ b/chrome/browser/resources/gaia_auth_host/authenticator.js
@@ -12,6 +12,9 @@
cr.define('cr.login', function() {
'use strict';
+ // TODO(rogerta): should use gaia URL from GaiaUrls::gaia_url() instead
+ // of hardcoding the prod URL here. As is, this does not work with staging
+ // environments.
var IDP_ORIGIN = 'https://accounts.google.com/';
var IDP_PATH = 'ServiceLogin?skipvpage=true&sarp=1&rm=hide';
var CONTINUE_URL =
@@ -49,17 +52,12 @@ cr.define('cr.login', function() {
* Initializes the authenticator component.
* @param {webview|string} webview The webview element or its ID to host IdP
* web pages.
- * @param {Authenticator.Listener=} opt_listener An optional listener for
- * authentication events.
* @constructor
- * @extends {cr.EventTarget}
*/
- function Authenticator(webview, opt_listener) {
+ function Authenticator(webview) {
this.webview_ = typeof webview == 'string' ? $(webview) : webview;
assert(this.webview_);
- this.listener_ = opt_listener || null;
-
this.email_ = null;
this.password_ = null;
this.gaiaId_ = null,
@@ -73,6 +71,7 @@ cr.define('cr.login', function() {
this.continueUrlWithoutParams_ = null;
this.initialFrameUrl_ = null;
this.reloadUrl_ = null;
+ this.trusted_ = true;
}
// TODO(guohui,xiyuan): no need to inherit EventTarget once we deprecate the
@@ -80,48 +79,6 @@ cr.define('cr.login', function() {
Authenticator.prototype = Object.create(cr.EventTarget.prototype);
/**
- * An interface for receiving notifications upon authentication events.
- * @interface
- */
- Authenticator.Listener = function() {};
-
- /**
- * Invoked when authentication UI is ready.
- */
- Authenticator.Listener.prototype.onReady = function(e) {};
-
- /**
- * Invoked when authentication is completed successfully with credential data.
- * A credential data object looks like this:
- * <pre>
- * {@code
- * {
- * email: 'xx@gmail.com',
- * password: 'xxxx', // May be null or empty.
- * usingSAML: false,
- * chooseWhatToSync: false,
- * skipForNow: false,
- * sessionIndex: '0'
- * }
- * }
- * </pre>
- * @param {Object} credentials A credential data object.
- */
- Authenticator.Listener.prototype.onSuccess = function(credentials) {};
-
- /**
- * Invoked when the requested URL does not fit the container.
- * @param {string} url Request URL.
- */
- Authenticator.Listener.prototype.onResize = function(url) {};
-
- /**
- * Invoked when a new window event is fired.
- * @param {Event} e Event object.
- */
- Authenticator.Listener.prototype.onNewWindow = function(e) {};
-
- /**
* Loads the authenticator component with the given parameters.
* @param {AuthMode} authMode Authorization mode.
* @param {Object} data Parameters for the authorization flow.
@@ -141,6 +98,8 @@ cr.define('cr.login', function() {
this.webview_.src = this.reloadUrl_;
this.webview_.addEventListener(
'newwindow', this.onNewWindow_.bind(this));
+ this.webview_.addEventListener(
+ 'loadstop', this.onLoadStop_.bind(this));
this.webview_.request.onCompleted.addListener(
this.onRequestCompleted_.bind(this),
{urls: ['*://*/*', this.continueUrlWithoutParams_ + '*'],
@@ -151,7 +110,7 @@ cr.define('cr.login', function() {
{urls: [this.idpOrigin_ + '*'], types: ['main_frame']},
['responseHeaders']);
window.addEventListener(
- 'message', this.onMessage_.bind(this), false);
+ 'message', this.onMessageFromWebview_.bind(this), false);
};
/**
@@ -182,6 +141,7 @@ cr.define('cr.login', function() {
*/
Authenticator.prototype.onRequestCompleted_ = function(details) {
var currentUrl = details.url;
+
if (currentUrl.lastIndexOf(this.continueUrlWithoutParams_, 0) == 0) {
if (currentUrl.indexOf('ntp=1') >= 0) {
this.skipForNow_ = true;
@@ -190,6 +150,10 @@ cr.define('cr.login', function() {
return;
}
+ if (currentUrl.indexOf('https') != 0) {
+ this.trusted_ = false;
+ }
+
if (this.isConstrainedWindow_) {
var isEmbeddedPage = false;
if (this.idpOrigin_ && currentUrl.lastIndexOf(this.idpOrigin_) == 0) {
@@ -201,8 +165,8 @@ cr.define('cr.login', function() {
}
}
}
- if (!isEmbeddedPage && this.listener_) {
- this.listener_.onResize(currentUrl);
+ if (!isEmbeddedPage) {
+ this.dispatchEvent(new CustomEvent('resize', {detail: currentUrl}));
return;
}
}
@@ -210,13 +174,6 @@ cr.define('cr.login', function() {
if (currentUrl.lastIndexOf(this.idpOrigin_) == 0) {
this.webview_.contentWindow.postMessage({}, currentUrl);
}
-
- if (!this.loaded_) {
- this.loaded_ = true;
- if (this.listener_) {
- this.listener_.onReady();
- }
- }
};
/**
@@ -254,17 +211,17 @@ cr.define('cr.login', function() {
};
/**
- * Invoked when an HTML5 message is received.
+ * Invoked when an HTML5 message is received from the webview element.
* @param {object} e Payload of the received HTML5 message.
* @private
*/
- Authenticator.prototype.onMessage_ = function(e) {
- if (e.origin != this.idpOrigin_) {
+ Authenticator.prototype.onMessageFromWebview_ = function(e) {
+ // The event origin does not have a trailing slash.
+ if (e.origin != this.idpOrigin_.substring(0, this.idpOrigin_ - 1)) {
return;
}
var msg = e.data;
-
if (msg.method == 'attemptLogin') {
this.email_ = msg.email;
this.password_ = msg.password;
@@ -277,22 +234,21 @@ cr.define('cr.login', function() {
* @private
*/
Authenticator.prototype.onAuthCompleted_ = function() {
- if (!this.listener_) {
- return;
- }
-
if (!this.email_ && !this.skipForNow_) {
this.webview_.src = this.initialFrameUrl_;
return;
}
- this.listener_.onSuccess({email: this.email_,
- gaiaId: this.gaiaId_,
- password: this.password_,
- usingSAML: this.authFlow_ == AuthFlow.SAML,
- chooseWhatToSync: this.chooseWhatToSync_,
- skipForNow: this.skipForNow_,
- sessionIndex: this.sessionIndex_ || ''});
+ this.dispatchEvent(
+ new CustomEvent('authCompleted',
+ {detail: {email: this.email_,
+ gaiaId: this.gaiaId_,
+ password: this.password_,
+ usingSAML: this.authFlow_ == AuthFlow.SAML,
+ chooseWhatToSync: this.chooseWhatToSync_,
+ skipForNow: this.skipForNow_,
+ sessionIndex: this.sessionIndex_ || '',
+ trusted: this.trusted_}}));
};
/**
@@ -300,11 +256,18 @@ cr.define('cr.login', function() {
* @private
*/
Authenticator.prototype.onNewWindow_ = function(e) {
- if (!this.listener_) {
- return;
- }
+ this.dispatchEvent(new CustomEvent('newWindow', {detail: e}));
+ };
- this.listener_.onNewWindow(e);
+ /**
+ * Invoked when the webview finishes loading a page.
+ * @private
+ */
+ Authenticator.prototype.onLoadStop_ = function(e) {
+ if (!this.loaded_) {
+ this.loaded_ = true;
+ this.dispatchEvent(new Event('ready'));
+ }
};
Authenticator.AuthFlow = AuthFlow;
« no previous file with comments | « chrome/browser/profiles/host_zoom_map_browsertest.cc ('k') | chrome/browser/resources/inline_login/inline_login.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698