diff options
author | guohui@chromium.org <guohui@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-20 19:12:57 +0000 |
---|---|---|
committer | guohui@chromium.org <guohui@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-20 19:12:57 +0000 |
commit | 29125cfe3e83e71d7c9bbb920415dee4f470d833 (patch) | |
tree | 6d52ccedfb94270ca98adfba0fbd91a8f72770e9 | |
parent | c7db8a3a48452c3e5af31a2ffff1fbc1a256bd29 (diff) | |
download | chromium_src-29125cfe3e83e71d7c9bbb920415dee4f470d833.zip chromium_src-29125cfe3e83e71d7c9bbb920415dee4f470d833.tar.gz chromium_src-29125cfe3e83e71d7c9bbb920415dee4f470d833.tar.bz2 |
Refactor inline_login_ui
BUG=
Review URL: https://codereview.chromium.org/118343003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@242134 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc | 2 | ||||
-rw-r--r-- | chrome/browser/ui/webui/chromeos/login/inline_login_handler_chromeos.cc | 60 | ||||
-rw-r--r-- | chrome/browser/ui/webui/chromeos/login/inline_login_handler_chromeos.h | 35 | ||||
-rw-r--r-- | chrome/browser/ui/webui/signin/OWNERS | 5 | ||||
-rw-r--r-- | chrome/browser/ui/webui/signin/inline_login_handler.cc | 43 | ||||
-rw-r--r-- | chrome/browser/ui/webui/signin/inline_login_handler.h | 42 | ||||
-rw-r--r-- | chrome/browser/ui/webui/signin/inline_login_handler_impl.cc | 270 | ||||
-rw-r--r-- | chrome/browser/ui/webui/signin/inline_login_handler_impl.h | 53 | ||||
-rw-r--r-- | chrome/browser/ui/webui/signin/inline_login_ui.cc | 53 | ||||
-rw-r--r-- | chrome/browser/ui/webui/signin/inline_login_ui.h (renamed from chrome/browser/ui/webui/inline_login_ui.h) | 6 | ||||
-rw-r--r-- | chrome/chrome_browser_ui.gypi | 12 |
11 files changed, 575 insertions, 6 deletions
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc index 9ce190d..a1b6baf 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc @@ -32,7 +32,6 @@ #include "chrome/browser/ui/webui/help/help_ui.h" #include "chrome/browser/ui/webui/history_ui.h" #include "chrome/browser/ui/webui/identity_internals_ui.h" -#include "chrome/browser/ui/webui/inline_login_ui.h" #include "chrome/browser/ui/webui/inspect_ui.h" #include "chrome/browser/ui/webui/instant_ui.h" #include "chrome/browser/ui/webui/memory_internals/memory_internals_ui.h" @@ -45,6 +44,7 @@ #include "chrome/browser/ui/webui/predictors/predictors_ui.h" #include "chrome/browser/ui/webui/profiler_ui.h" #include "chrome/browser/ui/webui/quota_internals/quota_internals_ui.h" +#include "chrome/browser/ui/webui/signin/inline_login_ui.h" #include "chrome/browser/ui/webui/signin/profile_signin_confirmation_ui.h" #include "chrome/browser/ui/webui/signin/user_manager_ui.h" #include "chrome/browser/ui/webui/signin_internals_ui.h" diff --git a/chrome/browser/ui/webui/chromeos/login/inline_login_handler_chromeos.cc b/chrome/browser/ui/webui/chromeos/login/inline_login_handler_chromeos.cc new file mode 100644 index 0000000..95fbf4e --- /dev/null +++ b/chrome/browser/ui/webui/chromeos/login/inline_login_handler_chromeos.cc @@ -0,0 +1,60 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/chromeos/login/inline_login_handler_chromeos.h" + +#include "chrome/browser/chromeos/login/oauth2_token_fetcher.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/signin/profile_oauth2_token_service.h" +#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" +#include "content/public/browser/web_ui.h" + +namespace chromeos { + +class InlineLoginHandlerChromeOS::InlineLoginUIOAuth2Delegate + : public OAuth2TokenFetcher::Delegate { + public: + explicit InlineLoginUIOAuth2Delegate(content::WebUI* web_ui) + : web_ui_(web_ui) {} + virtual ~InlineLoginUIOAuth2Delegate() {} + + // OAuth2TokenFetcher::Delegate overrides: + virtual void OnOAuth2TokensAvailable( + const GaiaAuthConsumer::ClientOAuthResult& oauth2_tokens) OVERRIDE { + // Closes sign-in dialog before update token service. Token service update + // might trigger a permission dialog and if this dialog does not close, + // a DCHECK would be triggered because attempting to activate a window + // while there is a modal dialog. + web_ui_->CallJavascriptFunction("inline.login.closeDialog"); + + Profile* profile = Profile::FromWebUI(web_ui_); + ProfileOAuth2TokenService* token_service = + ProfileOAuth2TokenServiceFactory::GetForProfile(profile); + token_service->UpdateCredentials(token_service->GetPrimaryAccountId(), + oauth2_tokens.refresh_token); + } + + virtual void OnOAuth2TokensFetchFailed() OVERRIDE { + LOG(ERROR) << "Failed to fetch oauth2 token with inline login."; + web_ui_->CallJavascriptFunction("inline.login.handleOAuth2TokenFailure"); + } + + private: + content::WebUI* web_ui_; +}; + +InlineLoginHandlerChromeOS::InlineLoginHandlerChromeOS() {} + +InlineLoginHandlerChromeOS::~InlineLoginHandlerChromeOS() {} + +void InlineLoginHandlerChromeOS::CompleteLogin(const base::ListValue* args) { + Profile* profile = Profile::FromWebUI(web_ui()); + + oauth2_delegate_.reset(new InlineLoginUIOAuth2Delegate(web_ui())); + oauth2_token_fetcher_.reset(new OAuth2TokenFetcher( + oauth2_delegate_.get(), profile->GetRequestContext())); + oauth2_token_fetcher_->StartExchangeFromCookies(); +} + +} // namespace chromeos diff --git a/chrome/browser/ui/webui/chromeos/login/inline_login_handler_chromeos.h b/chrome/browser/ui/webui/chromeos/login/inline_login_handler_chromeos.h new file mode 100644 index 0000000..5bdd7cd --- /dev/null +++ b/chrome/browser/ui/webui/chromeos/login/inline_login_handler_chromeos.h @@ -0,0 +1,35 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_INLINE_LOGIN_HANDLER_CHROMEOS_H_ +#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_INLINE_LOGIN_HANDLER_CHROMEOS_H_ + +#include "base/memory/scoped_ptr.h" +#include "chrome/browser/ui/webui/signin/inline_login_handler.h" + +namespace chromeos { + +class OAuth2TokenFetcher; + +// Implementation for the inline login WebUI handler on ChromeOS. +class InlineLoginHandlerChromeOS : public ::InlineLoginHandler { + public: + InlineLoginHandlerChromeOS(); + virtual ~InlineLoginHandlerChromeOS(); + + private: + class InlineLoginUIOAuth2Delegate; + + // InlineLoginHandler overrides: + virtual void CompleteLogin(const base::ListValue* args) OVERRIDE; + + scoped_ptr<InlineLoginUIOAuth2Delegate> oauth2_delegate_; + scoped_ptr<chromeos::OAuth2TokenFetcher> oauth2_token_fetcher_; + + DISALLOW_COPY_AND_ASSIGN(InlineLoginHandlerChromeOS); +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_INLINE_LOGIN_HANDLER_CHROMEOS_H_ diff --git a/chrome/browser/ui/webui/signin/OWNERS b/chrome/browser/ui/webui/signin/OWNERS new file mode 100644 index 0000000..b714c7e --- /dev/null +++ b/chrome/browser/ui/webui/signin/OWNERS @@ -0,0 +1,5 @@ +bcwhite@chromium.org +guohui@chromium.org +noms@chromium.org +rogerta@chromium.org +xiyuan@chromium.org diff --git a/chrome/browser/ui/webui/signin/inline_login_handler.cc b/chrome/browser/ui/webui/signin/inline_login_handler.cc new file mode 100644 index 0000000..6c6e911 --- /dev/null +++ b/chrome/browser/ui/webui/signin/inline_login_handler.cc @@ -0,0 +1,43 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/signin/inline_login_handler.h" + +#include "base/bind.h" +#include "base/values.h" +#include "chrome/browser/browser_process.h" +#include "content/public/browser/web_ui.h" +#include "google_apis/gaia/gaia_urls.h" + +InlineLoginHandler::InlineLoginHandler() {} + +InlineLoginHandler::~InlineLoginHandler() {} + +void InlineLoginHandler::RegisterMessages() { + web_ui()->RegisterMessageCallback("initialize", + base::Bind(&InlineLoginHandler::HandleInitializeMessage, + base::Unretained(this))); + web_ui()->RegisterMessageCallback("completeLogin", + base::Bind(&InlineLoginHandler::HandleCompleteLoginMessage, + base::Unretained(this))); +} + +void InlineLoginHandler::HandleInitializeMessage(const base::ListValue* args) { + base::DictionaryValue params; + + const std::string& app_locale = g_browser_process->GetApplicationLocale(); + params.SetString("hl", app_locale); + GaiaUrls* gaiaUrls = GaiaUrls::GetInstance(); + params.SetString("gaiaUrl", gaiaUrls->gaia_url().spec()); + params.SetInteger("authMode", kDefaultAuthMode); + + SetExtraInitParams(params); + + web_ui()->CallJavascriptFunction("inline.login.loadAuthExtension", params); +} + +void InlineLoginHandler::HandleCompleteLoginMessage( + const base::ListValue* args) { + CompleteLogin(args); +} diff --git a/chrome/browser/ui/webui/signin/inline_login_handler.h b/chrome/browser/ui/webui/signin/inline_login_handler.h new file mode 100644 index 0000000..b3650fb --- /dev/null +++ b/chrome/browser/ui/webui/signin/inline_login_handler.h @@ -0,0 +1,42 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_HANDLER_H_ +#define CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_HANDLER_H_ + +#include "content/public/browser/web_ui_message_handler.h" + +// The base class handler for the inline login WebUI. +class InlineLoginHandler : public content::WebUIMessageHandler { + public: + InlineLoginHandler(); + virtual ~InlineLoginHandler(); + + // content::WebUIMessageHandler overrides: + virtual void RegisterMessages() OVERRIDE; + + protected: + // Enum for gaia auth mode, must match AuthMode defined in + // chrome/browser/resources/gaia_auth_host/gaia_auth_host.js. + enum AuthMode { + kDefaultAuthMode = 0, + kOfflineAuthMode = 1, + kInlineAuthMode = 2 + }; + + private: + // JS callback to initialize the gaia auth extension. It calls + // |SetExtraInitParams| to set extra init params. + void HandleInitializeMessage(const base::ListValue* args); + // JS callback to complete login. It calls |CompleteLogin| to do the real + // work. + void HandleCompleteLoginMessage(const base::ListValue* args); + + virtual void SetExtraInitParams(base::DictionaryValue& params) {} + virtual void CompleteLogin(const base::ListValue* args) = 0; + + DISALLOW_COPY_AND_ASSIGN(InlineLoginHandler); +}; + +#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_HANDLER_H_ diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc new file mode 100644 index 0000000..64bdb2c --- /dev/null +++ b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc @@ -0,0 +1,270 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/signin/inline_login_handler_impl.h" + +#include "base/atomic_sequence_num.h" +#include "base/bind.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" +#include "base/values.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/signin/signin_global_error.h" +#include "chrome/browser/signin/signin_oauth_helper.h" +#include "chrome/browser/signin/signin_promo.h" +#include "chrome/browser/sync/profile_sync_service.h" +#include "chrome/browser/sync/profile_sync_service_factory.h" +#include "chrome/browser/ui/browser_finder.h" +#include "chrome/browser/ui/sync/one_click_signin_helper.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "content/public/browser/storage_partition.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_ui.h" +#include "google_apis/gaia/gaia_auth_fetcher.h" +#include "google_apis/gaia/gaia_constants.h" +#include "google_apis/gaia/gaia_urls.h" +#include "net/base/url_util.h" + +namespace { + +// Global SequenceNumber used for generating unique webview partition IDs. +base::StaticAtomicSequenceNumber next_partition_id; + +} // empty namespace + +InlineLoginHandlerImpl::InlineLoginHandlerImpl() + : weak_factory_(this), choose_what_to_sync_(false), partition_id_("") { +} + +InlineLoginHandlerImpl::~InlineLoginHandlerImpl() {} + +void InlineLoginHandlerImpl::RegisterMessages() { + InlineLoginHandler::RegisterMessages(); + + web_ui()->RegisterMessageCallback("switchToFullTab", + base::Bind(&InlineLoginHandlerImpl::HandleSwitchToFullTabMessage, + base::Unretained(this))); +} + +void InlineLoginHandlerImpl::SetExtraInitParams(base::DictionaryValue& params) { + params.SetInteger("authMode", InlineLoginHandler::kInlineAuthMode); + + const GURL& current_url = web_ui()->GetWebContents()->GetURL(); + signin::Source source = signin::GetSourceForPromoURL(current_url); + DCHECK(source != signin::SOURCE_UNKNOWN); + 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::GetInstance()->embedded_signin_url().path().substr(1)); + } + + params.SetString("service", "chromiumsync"); + params.SetString("continueUrl", + signin::GetLandingURL("source", static_cast<int>(source)).spec()); + + std::string email; + net::GetValueForKeyInQuery(current_url, "Email", &email); + if (!email.empty()) + params.SetString("email", email); + + std::string frame_url; + net::GetValueForKeyInQuery(current_url, "frameUrl", &frame_url); + if (!frame_url.empty()) + params.SetString("frameUrl", frame_url); + + std::string is_constrained; + net::GetValueForKeyInQuery(current_url, "constrained", &is_constrained); + if (!is_constrained.empty()) + params.SetString("constrained", is_constrained); + + net::GetValueForKeyInQuery(current_url, "partitionId", &partition_id_); + if (partition_id_.empty()) { + partition_id_ = + "gaia-webview-" + base::IntToString(next_partition_id.GetNext()); + } + params.SetString("partitionId", partition_id_); +} + + +void InlineLoginHandlerImpl::HandleSwitchToFullTabMessage( + const base::ListValue* args) { + base::string16 url_str; + CHECK(args->GetString(0, &url_str)); + + content::WebContents* web_contents = web_ui()->GetWebContents(); + GURL main_frame_url(web_contents->GetURL()); + main_frame_url = net::AppendOrReplaceQueryParameter( + main_frame_url, "frameUrl", UTF16ToASCII(url_str)); + main_frame_url = net::AppendOrReplaceQueryParameter( + main_frame_url, "partitionId", partition_id_); + chrome::NavigateParams params( + Profile::FromWebUI(web_ui()), + net::AppendOrReplaceQueryParameter(main_frame_url, "constrained", "0"), + content::PAGE_TRANSITION_AUTO_TOPLEVEL); + chrome::Navigate(¶ms); + + web_ui()->CallJavascriptFunction("inline.login.closeDialog"); +} + +void InlineLoginHandlerImpl::CompleteLogin(const base::ListValue* args) { + DCHECK(email_.empty() && password_.empty()); + + const base::DictionaryValue* dict = NULL; + base::string16 email; + if (!args->GetDictionary(0, &dict) || !dict || + !dict->GetString("email", &email)) { + // User cancelled the signin by clicking 'skip for now'. + bool skip_for_now = false; + DCHECK(dict->GetBoolean("skipForNow", &skip_for_now) && skip_for_now); + + signin::SetUserSkippedPromo(Profile::FromWebUI(web_ui())); + SyncStarterCallback(OneClickSigninSyncStarter::SYNC_SETUP_FAILURE); + return; + } + + email_ = UTF16ToASCII(email); + base::string16 password; + dict->GetString("password", &password); + password_ = UTF16ToASCII(password); + + dict->GetBoolean("chooseWhatToSync", &choose_what_to_sync_); + + content::WebContents* contents = web_ui()->GetWebContents(); + signin::Source source = signin::GetSourceForPromoURL(contents->GetURL()); + OneClickSigninHelper::CanOfferFor can_offer = + source == signin::SOURCE_AVATAR_BUBBLE_ADD_ACCOUNT ? + OneClickSigninHelper::CAN_OFFER_FOR_SECONDARY_ACCOUNT : + OneClickSigninHelper::CAN_OFFER_FOR_ALL; + std::string error_msg; + OneClickSigninHelper::CanOffer( + contents, can_offer, email_, &error_msg); + if (!error_msg.empty()) { + HandleLoginError(error_msg); + return; + } + + content::StoragePartition* partition = + content::BrowserContext::GetStoragePartitionForSite( + contents->GetBrowserContext(), + GURL("chrome-guest://mfffpogegjflfpflabcdkioaeobkgjik/?" + + partition_id_)); + + auth_fetcher_.reset(new GaiaAuthFetcher(this, + GaiaConstants::kChromeSource, + partition->GetURLRequestContext())); + auth_fetcher_->StartCookieForOAuthCodeExchange("0"); +} + +void InlineLoginHandlerImpl::OnClientOAuthCodeSuccess( + const std::string& oauth_code) { + DCHECK(!oauth_code.empty()); + + content::WebContents* contents = web_ui()->GetWebContents(); + Profile* profile = Profile::FromWebUI(web_ui()); + ProfileSyncService* sync_service = + ProfileSyncServiceFactory::GetForProfile(profile); + const GURL& current_url = contents->GetURL(); + signin::Source source = signin::GetSourceForPromoURL(current_url); + + if (source == signin::SOURCE_AVATAR_BUBBLE_ADD_ACCOUNT) { + // SigninOAuthHelper will delete itself. + SigninOAuthHelper* helper = new SigninOAuthHelper(profile); + helper->StartAddingAccount(oauth_code); + } else { + OneClickSigninSyncStarter::StartSyncMode start_mode = + source == signin::SOURCE_SETTINGS || choose_what_to_sync_ ? + (SigninGlobalError::GetForProfile(profile)->HasMenuItem() && + sync_service && sync_service->HasSyncSetupCompleted()) ? + OneClickSigninSyncStarter::SHOW_SETTINGS_WITHOUT_CONFIGURE : + OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST : + OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS; + OneClickSigninSyncStarter::ConfirmationRequired confirmation_required = + source == signin::SOURCE_SETTINGS || + source == signin::SOURCE_WEBSTORE_INSTALL || + choose_what_to_sync_? + OneClickSigninSyncStarter::NO_CONFIRMATION : + OneClickSigninSyncStarter::CONFIRM_AFTER_SIGNIN; + OneClickSigninSyncStarter::Callback sync_callback = base::Bind( + &InlineLoginHandlerImpl::SyncStarterCallback, + weak_factory_.GetWeakPtr()); + + bool cross_account_error_handled = + OneClickSigninHelper::HandleCrossAccountError( + contents, "" /* session_index, not used */, + email_, password_, oauth_code, + OneClickSigninHelper::AUTO_ACCEPT_EXPLICIT, + source, start_mode, sync_callback); + + if (!cross_account_error_handled) { + // Call OneClickSigninSyncStarter to exchange oauth code for tokens. + // OneClickSigninSyncStarter will delete itself once the job is done. + new OneClickSigninSyncStarter( + profile, NULL, "" /* session_index, not used */, + email_, password_, oauth_code, + start_mode, + contents, + confirmation_required, + sync_callback); + } + } + + email_.clear(); + password_.clear(); + web_ui()->CallJavascriptFunction("inline.login.closeDialog"); +} + +void InlineLoginHandlerImpl::OnClientOAuthCodeFailure( + const GoogleServiceAuthError& error) { + LOG(ERROR) << "InlineLoginUI::OnClientOAuthCodeFailure"; + HandleLoginError(error.ToString()); +} + +void InlineLoginHandlerImpl::HandleLoginError(const std::string& error_msg) { + SyncStarterCallback(OneClickSigninSyncStarter::SYNC_SETUP_FAILURE); + + Browser* browser = chrome::FindBrowserWithWebContents( + web_ui()->GetWebContents()); + if (!browser) { + browser = chrome::FindLastActiveWithProfile( + Profile::FromWebUI(web_ui()), chrome::GetActiveDesktop()); + } + if (browser) + OneClickSigninHelper::ShowSigninErrorBubble(browser, error_msg); + + email_.clear(); + password_.clear(); +} + +void InlineLoginHandlerImpl::SyncStarterCallback( + OneClickSigninSyncStarter::SyncSetupResult result) { + content::WebContents* contents = web_ui()->GetWebContents(); + const GURL& current_url = contents->GetURL(); + bool auto_close = signin::IsAutoCloseEnabledInURL(current_url); + if (auto_close) { + base::MessageLoop::current()->PostTask( + FROM_HERE, + base::Bind(&InlineLoginHandlerImpl::CloseTab, + weak_factory_.GetWeakPtr())); + } else { + signin::Source source = signin::GetSourceForPromoURL(current_url); + DCHECK(source != signin::SOURCE_UNKNOWN); + OneClickSigninHelper::RedirectToNtpOrAppsPageIfNecessary(contents, source); + } +} + +void InlineLoginHandlerImpl::CloseTab() { + content::WebContents* tab = web_ui()->GetWebContents(); + Browser* browser = chrome::FindBrowserWithWebContents(tab); + if (browser) { + TabStripModel* tab_strip_model = browser->tab_strip_model(); + if (tab_strip_model) { + int index = tab_strip_model->GetIndexOfWebContents(tab); + if (index != TabStripModel::kNoTab) { + tab_strip_model->ExecuteContextMenuCommand( + index, TabStripModel::CommandCloseTab); + } + } + } +} diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_impl.h b/chrome/browser/ui/webui/signin/inline_login_handler_impl.h new file mode 100644 index 0000000..9193d34 --- /dev/null +++ b/chrome/browser/ui/webui/signin/inline_login_handler_impl.h @@ -0,0 +1,53 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_HANDLER_IMPL_H_ +#define CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_HANDLER_IMPL_H_ + +#include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" +#include "chrome/browser/ui/sync/one_click_signin_sync_starter.h" +#include "chrome/browser/ui/webui/signin/inline_login_handler.h" +#include "google_apis/gaia/gaia_auth_consumer.h" + +class GaiaAuthFetcher; + +// Implementation for the inline login WebUI handler on desktop Chrome. Once +// CrOS migrates to the same webview approach as desktop Chrome, much of the +// code in this class should move to its base class |InlineLoginHandler|. +class InlineLoginHandlerImpl : public GaiaAuthConsumer, + public InlineLoginHandler { + public: + InlineLoginHandlerImpl(); + virtual ~InlineLoginHandlerImpl(); + + private: + // InlineLoginHandler overrides: + virtual void RegisterMessages() OVERRIDE; + virtual void SetExtraInitParams(base::DictionaryValue& params) OVERRIDE; + virtual void CompleteLogin(const base::ListValue* args) OVERRIDE; + + // GaiaAuthConsumer override. + virtual void OnClientOAuthCodeSuccess(const std::string& oauth_code) OVERRIDE; + virtual void OnClientOAuthCodeFailure( + const GoogleServiceAuthError& error) OVERRIDE; + + // JS callback to switch the UI from a constrainted dialog to a full tab. + void HandleSwitchToFullTabMessage(const base::ListValue* args); + void HandleLoginError(const std::string& error_msg); + void SyncStarterCallback(OneClickSigninSyncStarter::SyncSetupResult result); + void CloseTab(); + + base::WeakPtrFactory<InlineLoginHandlerImpl> weak_factory_; + scoped_ptr<GaiaAuthFetcher> auth_fetcher_; + std::string email_; + std::string password_; + bool choose_what_to_sync_; + // Partition id for the gaia webview; + std::string partition_id_; + + DISALLOW_COPY_AND_ASSIGN(InlineLoginHandlerImpl); +}; + +#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_HANDLER_IMPL_H_ diff --git a/chrome/browser/ui/webui/signin/inline_login_ui.cc b/chrome/browser/ui/webui/signin/inline_login_ui.cc new file mode 100644 index 0000000..e46dc16 --- /dev/null +++ b/chrome/browser/ui/webui/signin/inline_login_ui.cc @@ -0,0 +1,53 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/signin/inline_login_ui.h" + +#include "chrome/browser/profiles/profile.h" +#include "chrome/common/url_constants.h" +#include "content/public/browser/web_ui.h" +#include "content/public/browser/web_ui_data_source.h" +#include "grit/browser_resources.h" + +#if defined(OS_CHROMEOS) +#include "chrome/browser/ui/webui/chromeos/login/inline_login_handler_chromeos.h" +#else +#include "chrome/browser/extensions/tab_helper.h" +#include "chrome/browser/ui/webui/signin/inline_login_handler_impl.h" +#endif + +namespace { + +content::WebUIDataSource* CreateWebUIDataSource() { + content::WebUIDataSource* source = + content::WebUIDataSource::Create(chrome::kChromeUIChromeSigninHost); + source->SetUseJsonJSFormatV2(); + source->SetJsonPath("strings.js"); + + source->SetDefaultResource(IDR_INLINE_LOGIN_HTML); + source->AddResourcePath("inline_login.css", IDR_INLINE_LOGIN_CSS); + source->AddResourcePath("inline_login.js", IDR_INLINE_LOGIN_JS); + return source; +}; + +} // empty namespace + +InlineLoginUI::InlineLoginUI(content::WebUI* web_ui) + : WebDialogUI(web_ui), + auth_extension_(Profile::FromWebUI(web_ui)) { + Profile* profile = Profile::FromWebUI(web_ui); + content::WebUIDataSource::Add(profile, CreateWebUIDataSource()); + +#if defined(OS_CHROMEOS) + web_ui->AddMessageHandler(new chromeos::InlineLoginHandlerChromeOS()); +#else + web_ui->AddMessageHandler(new InlineLoginHandlerImpl()); + // Required for intercepting extension function calls when the page is loaded + // in a bubble (not a full tab, thus tab helpers are not registered + // automatically). + extensions::TabHelper::CreateForWebContents(web_ui->GetWebContents()); +#endif +} + +InlineLoginUI::~InlineLoginUI() {} diff --git a/chrome/browser/ui/webui/inline_login_ui.h b/chrome/browser/ui/webui/signin/inline_login_ui.h index fc8e22d..32a45c3 100644 --- a/chrome/browser/ui/webui/inline_login_ui.h +++ b/chrome/browser/ui/webui/signin/inline_login_ui.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_UI_WEBUI_INLINE_LOGIN_UI_H_ -#define CHROME_BROWSER_UI_WEBUI_INLINE_LOGIN_UI_H_ +#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_UI_H_ +#define CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_UI_H_ #include "chrome/browser/extensions/signin/scoped_gaia_auth_extension.h" #include "ui/web_dialogs/web_dialog_ui.h" @@ -23,4 +23,4 @@ class InlineLoginUI : public ui::WebDialogUI { DISALLOW_COPY_AND_ASSIGN(InlineLoginUI); }; -#endif // CHROME_BROWSER_UI_WEBUI_INLINE_LOGIN_UI_H_ +#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_UI_H_ diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi index 258c1f2..b16dcbe 100644 --- a/chrome/chrome_browser_ui.gypi +++ b/chrome/chrome_browser_ui.gypi @@ -2221,6 +2221,8 @@ 'browser/ui/webui/chromeos/login/eula_screen_handler.h', 'browser/ui/webui/chromeos/login/gaia_screen_handler.cc', 'browser/ui/webui/chromeos/login/gaia_screen_handler.h', + 'browser/ui/webui/chromeos/login/inline_login_handler_chromeos.cc', + 'browser/ui/webui/chromeos/login/inline_login_handler_chromeos.h', 'browser/ui/webui/chromeos/login/kiosk_app_menu_handler.cc', 'browser/ui/webui/chromeos/login/kiosk_app_menu_handler.h', 'browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.cc', @@ -2339,8 +2341,6 @@ 'browser/ui/webui/history_ui.h', 'browser/ui/webui/identity_internals_ui.cc', 'browser/ui/webui/identity_internals_ui.h', - 'browser/ui/webui/inline_login_ui.cc', - 'browser/ui/webui/inline_login_ui.h', 'browser/ui/webui/inspect_ui.cc', 'browser/ui/webui/inspect_ui.h', 'browser/ui/webui/instant_ui.cc', @@ -2535,6 +2535,12 @@ 'browser/ui/webui/quota_internals/quota_internals_ui.h', 'browser/ui/webui/set_as_default_browser_ui.cc', 'browser/ui/webui/set_as_default_browser_ui.h', + 'browser/ui/webui/signin/inline_login_handler.cc', + 'browser/ui/webui/signin/inline_login_handler.h', + 'browser/ui/webui/signin/inline_login_handler_impl.cc', + 'browser/ui/webui/signin/inline_login_handler_impl.h', + 'browser/ui/webui/signin/inline_login_ui.cc', + 'browser/ui/webui/signin/inline_login_ui.h', 'browser/ui/webui/signin/login_ui_service.cc', 'browser/ui/webui/signin/login_ui_service.h', 'browser/ui/webui/signin/login_ui_service_factory.cc', @@ -2805,6 +2811,8 @@ 'browser/ui/views/screen_capture_notification_ui_views.cc', 'browser/ui/webui/help/version_updater_basic.cc', 'browser/ui/webui/help/version_updater_basic.h', + 'browser/ui/webui/signin/inline_login_handler_impl.cc', + 'browser/ui/webui/signin/inline_login_handler_impl.h', 'browser/ui/webui/signin/user_manager_screen_handler.h', 'browser/ui/webui/signin/user_manager_screen_handler.cc', 'browser/ui/webui/signin/user_manager_ui.h', |