0

Use embedded sign in UI for inline sign in flow

BUG=315259

Review URL: https://codereview.chromium.org/66403006

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@234093 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
guohui@chromium.org
2013-11-09 04:41:34 +00:00
parent ed3668b12a
commit e3d89ffff5
7 changed files with 45 additions and 17 deletions
chrome/browser
google_apis/gaia

@ -48,6 +48,7 @@ Authenticator.prototype = {
var params = getUrlSearchParams(location.search);
this.parentPage_ = params.parentPage || this.PARENT_PAGE;
this.gaiaUrl_ = params.gaiaUrl || this.GAIA_URL;
this.gaiaPath_ = params.gaiaPath || this.GAIA_PAGE_PATH;
this.inputLang_ = params.hl;
this.inputEmail_ = params.email;
this.service_ = params.service || this.SERVICE_ID;
@ -77,16 +78,15 @@ Authenticator.prototype = {
},
getFrameUrl_: function() {
var url = this.gaiaUrl_;
url += this.GAIA_PAGE_PATH +
'&service=' + encodeURIComponent(this.service_) +
'&continue=' + encodeURIComponent(this.continueUrl_);
var url = this.gaiaUrl_ + this.gaiaPath_;
url = appendParam(url, 'service', this.service_);
url = appendParam(url, 'continue', this.continueUrl_);
if (this.inputLang_)
url += '&hl=' + encodeURIComponent(this.inputLang_);
url = appendParam(url, 'hl', this.inputLang_);
if (this.inputEmail_)
url += '&Email=' + encodeURIComponent(this.inputEmail_);
url = appendParam(url, 'Email', this.inputEmail_);
return url;
},
@ -101,7 +101,7 @@ Authenticator.prototype = {
window.parent.postMessage(msg, this.parentPage_);
if (gaiaFrame.src.lastIndexOf(
this.gaiaUrl_ + this.GAIA_PAGE_PATH, 0) == 0) {
this.gaiaUrl_ + this.gaiaPath_, 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.

@ -25,3 +25,20 @@ function getUrlSearchParams(search) {
return params;
}
/**
* Creates a new URL which is the old URL with a GET param of key=value.
* Copied from ui/webui/resources/js/util.js.
* @param {string} url The base URL. There is not sanity checking on the URL so
* it must be passed in a proper format.
* @param {string} key The key of the param.
* @param {string} value The value of the param.
* @return {string} The new URL.
*/
function appendParam(url, key, value) {
var param = encodeURIComponent(key) + '=' + encodeURIComponent(value);
if (url.indexOf('?') == -1)
return url + '?' + param;
return url + '&' + param;
}

@ -54,6 +54,7 @@ cr.define('cr.login', function() {
*/
var SUPPORTED_PARAMS = [
'gaiaUrl', // Gaia url to use;
'gaiaPath', // Gaia path to use without a leading slash;
'hl', // Language code for the user interface;
'email', // Pre-fill the email field in Gaia UI;
'service', // Name of Gaia service;

@ -311,7 +311,7 @@ void ProfileChooserView::ShowView(BubbleViewMode view_to_display,
view_to_display == GAIA_ADD_ACCOUNT_VIEW) {
// Minimum size for embedded sign in pages as defined in Gaia.
const int kMinGaiaViewWidth = 320;
const int kMinGaiaViewHeight = 500;
const int kMinGaiaViewHeight = 440;
Profile* profile = browser_->profile();
views::WebView* web_view = new views::WebView(profile);
signin::Source source = (view_to_display == GAIA_SIGNIN_VIEW) ?

@ -151,17 +151,19 @@ class InlineLoginUIHandler : public content::WebUIMessageHandler {
const GURL& current_url = web_ui()->GetWebContents()->GetURL();
signin::Source source = signin::GetSourceForPromoURL(current_url);
// TODO(guohui): switch to the embedded gaia endpoint for avatar flows
// when available.
DCHECK(source != signin::SOURCE_UNKNOWN);
if (source != signin::SOURCE_AVATAR_BUBBLE_ADD_ACCOUNT &&
source != signin::SOURCE_AVATAR_BUBBLE_SIGN_IN) {
params.SetString("service", "chromiumsync");
base::StringAppendF(
&encoded_continue_params, "&%s=%d", "source",
static_cast<int>(source));
if (source == signin::SOURCE_AVATAR_BUBBLE_ADD_ACCOUNT ||
source == signin::SOURCE_AVATAR_BUBBLE_SIGN_IN) {
// Drop the leading slash in the path.
params.SetString("gaiaPath",
gaiaUrls->embedded_signin_url().path().substr(1));
}
params.SetString("service", "chromiumsync");
base::StringAppendF(
&encoded_continue_params, "&%s=%d", "source",
static_cast<int>(source));
params.SetString("continueUrl",
gaiaUrls->client_login_to_oauth2_url().Resolve(
encoded_continue_params).spec());

@ -29,6 +29,7 @@ const char kOAuthWrapBridgeUrlSuffix[] = "OAuthWrapBridge";
const char kOAuth1LoginUrlSuffix[] = "OAuthLogin";
const char kOAuthRevokeTokenUrlSuffix[] = "AuthSubRevokeToken";
const char kListAccountsSuffix[] = "ListAccounts";
const char kEmbeddedSigninSuffix[] = "EmbeddedSignIn";
// OAuth scopes
const char kOAuth1LoginScope[] = "https://www.google.com/accounts/OAuthLogin";
@ -105,6 +106,7 @@ GaiaUrls::GaiaUrls() {
oauth_revoke_token_url_ = gaia_url_.Resolve(kOAuthRevokeTokenUrlSuffix);
oauth1_login_url_ = gaia_url_.Resolve(kOAuth1LoginUrlSuffix);
list_accounts_url_ = gaia_url_.Resolve(kListAccountsSuffix);
embedded_signin_url_ = gaia_url_.Resolve(kEmbeddedSigninSuffix);
// URLs from accounts.google.com (LSO).
get_oauth_token_url_ = lso_origin_url_.Resolve(kGetOAuthTokenUrlSuffix);
@ -204,6 +206,10 @@ const GURL& GaiaUrls::list_accounts_url() const {
return list_accounts_url_;
}
const GURL& GaiaUrls::embedded_signin_url() const {
return embedded_signin_url_;
}
const std::string& GaiaUrls::oauth1_login_scope() const {
return oauth1_login_scope_;
}

@ -33,6 +33,7 @@ class GaiaUrls {
const GURL& oauth_revoke_token_url() const;
const GURL& oauth1_login_url() const;
const GURL& list_accounts_url() const;
const GURL& embedded_signin_url() const;
const std::string& oauth1_login_scope() const;
const std::string& oauth_wrap_bridge_user_info_scope() const;
@ -75,6 +76,7 @@ class GaiaUrls {
GURL oauth_revoke_token_url_;
GURL oauth1_login_url_;
GURL list_accounts_url_;
GURL embedded_signin_url_;
std::string oauth1_login_scope_;
std::string oauth_wrap_bridge_user_info_scope_;