diff options
author | Kristian Monsen <kristianm@google.com> | 2011-05-24 16:24:13 +0100 |
---|---|---|
committer | Kristian Monsen <kristianm@google.com> | 2011-05-25 14:13:32 +0100 |
commit | 3f50c38dc070f4bb515c1b64450dae14f316474e (patch) | |
tree | 29f309f9534e05c47244eedb438fc612578d133b /chrome/browser/remoting/remoting_setup_flow.cc | |
parent | e23bef148f7be2bdf9c3cb2cd3aa5ceebf1190fb (diff) | |
download | external_chromium-3f50c38dc070f4bb515c1b64450dae14f316474e.zip external_chromium-3f50c38dc070f4bb515c1b64450dae14f316474e.tar.gz external_chromium-3f50c38dc070f4bb515c1b64450dae14f316474e.tar.bz2 |
Merge Chromium at r10.0.634.0: Initial merge by git.
Change-Id: Iac2af492818d119bcc2562eb5fdabf5ab0b6df9c
Diffstat (limited to 'chrome/browser/remoting/remoting_setup_flow.cc')
-rw-r--r-- | chrome/browser/remoting/remoting_setup_flow.cc | 318 |
1 files changed, 0 insertions, 318 deletions
diff --git a/chrome/browser/remoting/remoting_setup_flow.cc b/chrome/browser/remoting/remoting_setup_flow.cc deleted file mode 100644 index 05c7590..0000000 --- a/chrome/browser/remoting/remoting_setup_flow.cc +++ /dev/null @@ -1,318 +0,0 @@ -// Copyright (c) 2010 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/remoting/remoting_setup_flow.h" - -#include "app/gfx/font_util.h" -#include "base/json/json_writer.h" -#include "base/singleton.h" -#include "base/string_util.h" -#include "base/utf_string_conversions.h" -#include "base/values.h" -#include "chrome/browser/browser_thread.h" -#include "chrome/browser/dom_ui/chrome_url_data_manager.h" -#include "chrome/browser/dom_ui/dom_ui_util.h" -#include "chrome/browser/platform_util.h" -#include "chrome/browser/prefs/pref_service.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/remoting/remoting_resources_source.h" -#include "chrome/browser/remoting/remoting_setup_message_handler.h" -#include "chrome/browser/renderer_host/render_view_host.h" -#include "chrome/browser/service/service_process_control.h" -#include "chrome/browser/service/service_process_control_manager.h" -#include "chrome/browser/tab_contents/tab_contents.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_list.h" -#include "chrome/common/net/gaia/gaia_auth_fetcher.h" -#include "chrome/common/net/gaia/gaia_constants.h" -#include "chrome/common/net/gaia/google_service_auth_error.h" -#include "chrome/common/pref_names.h" -#include "gfx/font.h" -#include "grit/locale_settings.h" - -static const wchar_t kLoginIFrameXPath[] = L"//iframe[@id='login']"; -static const wchar_t kDoneIframeXPath[] = L"//iframe[@id='done']"; - -//////////////////////////////////////////////////////////////////////////////// -// RemotingServiceProcessHelper -// -// This is a helper class to perform actions when the service process -// is connected or launched. The events are sent back to RemotingSetupFlow -// when the dialog is still active. RemotingSetupFlow can detach from this -// helper class when the dialog is closed. -class RemotingServiceProcessHelper - : public base::RefCountedThreadSafe<RemotingServiceProcessHelper> { - public: - explicit RemotingServiceProcessHelper(RemotingSetupFlow* flow) - : flow_(flow) { - } - - void Detach() { - flow_ = NULL; - } - - void OnProcessLaunched() { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - // If the flow is detached then show the done page. - if (!flow_) - return; - - flow_->OnProcessLaunched(); - } - - private: - RemotingSetupFlow* flow_; - - DISALLOW_COPY_AND_ASSIGN(RemotingServiceProcessHelper); -}; - -//////////////////////////////////////////////////////////////////////////////// -// RemotingSetupFlow implementation. -// static -RemotingSetupFlow* RemotingSetupFlow::OpenDialog(Profile* profile) { - // Set the arguments for showing the gaia login page. - DictionaryValue args; - args.SetString("iframeToShow", "login"); - args.SetString("user", ""); - args.SetInteger("error", 0); - args.SetBoolean("editable_user", true); - - if (profile->GetPrefs()->GetBoolean(prefs::kRemotingHasSetupCompleted)) { - args.SetString("iframeToShow", "done"); - } - - std::string json_args; - base::JSONWriter::Write(&args, false, &json_args); - - Browser* b = BrowserList::GetLastActive(); - if (!b) - return NULL; - - RemotingSetupFlow* flow = new RemotingSetupFlow(json_args, profile); - b->BrowserShowHtmlDialog(flow, NULL); - return flow; -} - -RemotingSetupFlow::RemotingSetupFlow(const std::string& args, Profile* profile) - : dom_ui_(NULL), - dialog_start_args_(args), - profile_(profile), - process_control_(NULL) { - // TODO(hclam): The data source should be added once. - BrowserThread::PostTask( - BrowserThread::IO, FROM_HERE, - NewRunnableMethod(ChromeURLDataManager::GetInstance(), - &ChromeURLDataManager::AddDataSource, - make_scoped_refptr(new RemotingResourcesSource()))); -} - -RemotingSetupFlow::~RemotingSetupFlow() { -} - -void RemotingSetupFlow::Focus() { - // TODO(pranavk): implement this method. - NOTIMPLEMENTED(); -} - -/////////////////////////////////////////////////////////////////////////////// -// HtmlDialogUIDelegate implementation. -GURL RemotingSetupFlow::GetDialogContentURL() const { - return GURL("chrome://remotingresources/setup"); -} - -void RemotingSetupFlow::GetDOMMessageHandlers( - std::vector<DOMMessageHandler*>* handlers) const { - // Create the message handler only after we are asked, the caller is - // responsible for deleting the objects. - handlers->push_back( - new RemotingSetupMessageHandler(const_cast<RemotingSetupFlow*>(this))); -} - -void RemotingSetupFlow::GetDialogSize(gfx::Size* size) const { - PrefService* prefs = profile_->GetPrefs(); - gfx::Font approximate_web_font( - UTF8ToWide(prefs->GetString(prefs::kWebKitSansSerifFontFamily)), - prefs->GetInteger(prefs::kWebKitDefaultFontSize)); - - // TODO(pranavk) Replace the following SYNC resources with REMOTING Resources. - *size = gfx::GetLocalizedContentsSizeForFont( - IDS_SYNC_SETUP_WIZARD_WIDTH_CHARS, - IDS_SYNC_SETUP_WIZARD_HEIGHT_LINES, - approximate_web_font); -} - -// A callback to notify the delegate that the dialog closed. -void RemotingSetupFlow::OnDialogClosed(const std::string& json_retval) { - // If we are fetching the token then cancel the request. - if (authenticator_.get()) - authenticator_->CancelRequest(); - - // If the service process helper is still active then detach outself from it. - // This is because the dialog is closing and this object is going to be - // deleted but the service process launch is still in progress so we don't - // the service process helper to call us when the process is launched. - if (service_process_helper_.get()) - service_process_helper_->Detach(); - delete this; -} - -std::string RemotingSetupFlow::GetDialogArgs() const { - return dialog_start_args_; -} - -void RemotingSetupFlow::OnCloseContents(TabContents* source, - bool* out_close_dialog) { -} - -std::wstring RemotingSetupFlow::GetDialogTitle() const { - return l10n_util::GetString(IDS_REMOTING_SETUP_DIALOG_TITLE); -} - -bool RemotingSetupFlow::IsDialogModal() const { - return true; -} - -bool RemotingSetupFlow::ShouldShowDialogTitle() const { - return true; -} - -/////////////////////////////////////////////////////////////////////////////// -// GaiaAuthConsumer implementation. -void RemotingSetupFlow::OnClientLoginFailure( - const GoogleServiceAuthError& error) { - ShowGaiaFailed(error); - authenticator_.reset(); -} - -void RemotingSetupFlow::OnClientLoginSuccess( - const GaiaAuthConsumer::ClientLoginResult& credentials) { - // Save the token for remoting. - remoting_token_ = credentials.token; - - // After login has succeeded try to fetch the token for sync. - // We need the token for sync to connect to the talk network. - authenticator_->StartIssueAuthToken(credentials.sid, credentials.lsid, - GaiaConstants::kSyncService); -} - -void RemotingSetupFlow::OnIssueAuthTokenSuccess(const std::string& service, - const std::string& auth_token) { - // Show that Gaia login has succeeded. - ShowGaiaSuccessAndSettingUp(); - - // Save the sync token. - sync_token_ = auth_token; - authenticator_.reset(); - - // And then launch the service process if it has not started yet. - // If we have already connected to the service process then submit the tokens - // to it to register the host. - process_control_ = - ServiceProcessControlManager::GetInstance()->GetProcessControl(profile_); - - if (process_control_->is_connected()) { - // TODO(hclam): Need to figure out what to do when the service process is - // already connected. - } else { -#if defined(OS_WIN) - // TODO(hclam): This call only works on Windows. I need to make it work - // on other platforms. - service_process_helper_ = new RemotingServiceProcessHelper(this); - Task* process_launched_task = - NewRunnableMethod(service_process_helper_.get(), - &RemotingServiceProcessHelper::OnProcessLaunched); - process_control_->Launch(process_launched_task, process_launched_task); -#else - ShowSetupDone(); -#endif - } -} - -void RemotingSetupFlow::OnIssueAuthTokenFailure(const std::string& service, - const GoogleServiceAuthError& error) { - ShowGaiaFailed(error); - authenticator_.reset(); -} - -/////////////////////////////////////////////////////////////////////////////// -// Methods called by RemotingSetupMessageHandler -void RemotingSetupFlow::Attach(DOMUI* dom_ui) { - dom_ui_ = dom_ui; -} - -void RemotingSetupFlow::OnUserSubmittedAuth(const std::string& user, - const std::string& password, - const std::string& captcha) { - // Save the login name only. - login_ = user; - - // Start the authenticator. - authenticator_.reset( - new GaiaAuthFetcher(this, GaiaConstants::kChromeSource, - profile_->GetRequestContext())); - authenticator_->StartClientLogin(user, password, - GaiaConstants::kRemotingService, - "", captcha, - GaiaAuthFetcher::HostedAccountsAllowed); -} - -/////////////////////////////////////////////////////////////////////////////// -// Method called by RemotingServicePRocessHelper -void RemotingSetupFlow::OnProcessLaunched() { - DCHECK(process_control_->is_connected()); - // TODO(hclam): Need to wait for an ACK to be sure that it is actually active. - process_control_->SetRemotingHostCredentials(login_, sync_token_); - process_control_->EnableRemotingHost(); - - // Save the preference that we have completed the setup of remoting. - profile_->GetPrefs()->SetBoolean(prefs::kRemotingHasSetupCompleted, true); - ShowSetupDone(); -} - -/////////////////////////////////////////////////////////////////////////////// -// Helper methods for showing contents of the DOM UI -void RemotingSetupFlow::ShowGaiaLogin(const DictionaryValue& args) { - if (dom_ui_) - dom_ui_->CallJavascriptFunction(L"showGaiaLoginIframe"); - - std::string json; - base::JSONWriter::Write(&args, false, &json); - std::wstring javascript = std::wstring(L"showGaiaLogin") + - L"(" + UTF8ToWide(json) + L");"; - ExecuteJavascriptInIFrame(kLoginIFrameXPath, javascript); -} - -void RemotingSetupFlow::ShowGaiaSuccessAndSettingUp() { - ExecuteJavascriptInIFrame(kLoginIFrameXPath, - L"showGaiaSuccessAndSettingUp();"); -} - -void RemotingSetupFlow::ShowGaiaFailed(const GoogleServiceAuthError& error) { - DictionaryValue args; - args.SetString("iframeToShow", "login"); - args.SetString("user", ""); - args.SetInteger("error", error.state()); - args.SetBoolean("editable_user", true); - args.SetString("captchaUrl", error.captcha().image_url.spec()); - ShowGaiaLogin(args); -} - -void RemotingSetupFlow::ShowSetupDone() { - std::wstring javascript = L"setMessage('You are all set!');"; - ExecuteJavascriptInIFrame(kDoneIframeXPath, javascript); - - if (dom_ui_) - dom_ui_->CallJavascriptFunction(L"showSetupDone"); - - ExecuteJavascriptInIFrame(kDoneIframeXPath, L"onPageShown();"); -} - -void RemotingSetupFlow::ExecuteJavascriptInIFrame( - const std::wstring& iframe_xpath, - const std::wstring& js) { - if (dom_ui_) { - RenderViewHost* rvh = dom_ui_->tab_contents()->render_view_host(); - rvh->ExecuteJavascriptInWebFrame(iframe_xpath, js); - } -} |