| Index: chrome/browser/sync/personalization.cc
|
| ===================================================================
|
| --- chrome/browser/sync/personalization.cc (revision 22320)
|
| +++ chrome/browser/sync/personalization.cc (working copy)
|
| @@ -1,339 +0,0 @@
|
| -// Copyright (c) 2006-2008 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.
|
| -
|
| -#ifdef CHROME_PERSONALIZATION
|
| -
|
| -#include "chrome/browser/sync/personalization.h"
|
| -
|
| -#include "app/resource_bundle.h"
|
| -#include "base/command_line.h"
|
| -#include "base/file_path.h"
|
| -#include "base/file_util.h"
|
| -#include "base/path_service.h"
|
| -#include "base/string_util.h"
|
| -#include "chrome/app/chrome_dll_resource.h"
|
| -#include "chrome/browser/browser.h"
|
| -#include "chrome/browser/browser_process.h"
|
| -#include "chrome/browser/browser_url_handler.h"
|
| -#include "chrome/browser/command_updater.h"
|
| -#include "chrome/browser/options_window.h"
|
| -#include "chrome/browser/profile.h"
|
| -#include "chrome/browser/profile_manager.h"
|
| -#include "chrome/common/chrome_paths.h"
|
| -#include "chrome/common/chrome_switches.h"
|
| -#include "chrome/common/jstemplate_builder.h"
|
| -#include "chrome/common/notification_service.h"
|
| -#include "chrome/common/pref_service.h"
|
| -#include "chrome/browser/dom_ui/new_tab_page_sync_handler.h"
|
| -#include "chrome/browser/sync/personalization_strings.h"
|
| -#include "chrome/browser/sync/auth_error_state.h"
|
| -#include "chrome/browser/sync/profile_sync_service.h"
|
| -#include "googleurl/src/gurl.h"
|
| -#include "grit/app_resources.h"
|
| -#include "grit/browser_resources.h"
|
| -#include "net/url_request/url_request.h"
|
| -
|
| -using sync_api::SyncManager;
|
| -
|
| -// TODO(ncarter): Move these switches into chrome_switches. They are here
|
| -// now because we want to keep them secret during early development.
|
| -namespace switches {
|
| - const wchar_t kSyncServiceURL[] = L"sync-url";
|
| - const wchar_t kSyncServicePort[] = L"sync-port";
|
| - const wchar_t kSyncUserForTest[] = L"sync-user-for-test";
|
| - const wchar_t kSyncPasswordForTest[] = L"sync-password-for-test";
|
| -}
|
| -
|
| -// TODO(munjal): Move these preferences to common/pref_names.h.
|
| -// Names of various preferences.
|
| -namespace prefs {
|
| - const wchar_t kSyncPath[] = L"sync";
|
| - const wchar_t kSyncLastSyncedTime[] = L"sync.last_synced_time";
|
| - const wchar_t kSyncUserName[] = L"sync.username";
|
| - const wchar_t kSyncHasSetupCompleted[] = L"sync.has_setup_completed";
|
| -}
|
| -
|
| -// Top-level path for our network layer DataSource.
|
| -static const char kCloudyResourcesPath[] = "resources";
|
| -// Path for cloudy:stats page.
|
| -static const char kCloudyStatsPath[] = "stats";
|
| -// Path for the gaia sync login dialog.
|
| -static const char kCloudyGaiaLoginPath[] = "gaialogin";
|
| -static const char kCloudyMergeAndSyncPath[] = "mergeandsync";
|
| -static const char kCloudyThrobberPath[] = "throbber.png";
|
| -static const char kCloudySetupFlowPath[] = "setup";
|
| -
|
| -namespace Personalization {
|
| -
|
| -static std::wstring MakeAuthErrorText(AuthErrorState state) {
|
| - switch (state) {
|
| - case AUTH_ERROR_INVALID_GAIA_CREDENTIALS:
|
| - return L"INVALID_GAIA_CREDENTIALS";
|
| - case AUTH_ERROR_USER_NOT_SIGNED_UP:
|
| - return L"USER_NOT_SIGNED_UP";
|
| - case AUTH_ERROR_CONNECTION_FAILED:
|
| - return L"CONNECTION_FAILED";
|
| - default:
|
| - return std::wstring();
|
| - }
|
| -}
|
| -
|
| -bool IsP13NDisabled(Profile* profile) {
|
| - const CommandLine* command_line = CommandLine::ForCurrentProcess();
|
| - if (command_line->HasSwitch(switches::kDisableP13n))
|
| - return true;
|
| - return !profile || profile->GetProfilePersonalization() == NULL;
|
| -}
|
| -
|
| -bool NeedsDOMUI(const GURL& url) {
|
| - return url.SchemeIs(kPersonalizationScheme) &&
|
| - (url.path().find(kCloudyGaiaLoginPath) != std::string::npos) ||
|
| - (url.path().find(kCloudySetupFlowPath) != std::string::npos) ||
|
| - (url.path().find(kCloudyMergeAndSyncPath) != std::string::npos);
|
| -}
|
| -
|
| -class CloudyResourceSource : public ChromeURLDataManager::DataSource {
|
| - public:
|
| - CloudyResourceSource()
|
| - : DataSource(kCloudyResourcesPath, MessageLoop::current()) {
|
| - }
|
| - virtual ~CloudyResourceSource() { }
|
| -
|
| - virtual void StartDataRequest(const std::string& path, int request_id);
|
| -
|
| - virtual std::string GetMimeType(const std::string& path) const {
|
| - if (path == kCloudyThrobberPath)
|
| - return "image/png";
|
| - else
|
| - return "text/html";
|
| - }
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(CloudyResourceSource);
|
| -};
|
| -
|
| -class CloudyStatsSource : public ChromeURLDataManager::DataSource {
|
| - public:
|
| - CloudyStatsSource() : DataSource(kCloudyStatsPath, MessageLoop::current()) {
|
| - }
|
| - virtual ~CloudyStatsSource() { }
|
| - virtual void StartDataRequest(const std::string& path, int request_id) {
|
| - std::string response(MakeCloudyStats());
|
| - scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes);
|
| - html_bytes->data.resize(response.size());
|
| - std::copy(response.begin(), response.end(), html_bytes->data.begin());
|
| - SendResponse(request_id, html_bytes);
|
| - }
|
| - virtual std::string GetMimeType(const std::string& path) const {
|
| - return "text/html";
|
| - }
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(CloudyStatsSource);
|
| -};
|
| -
|
| -DOMMessageHandler* CreateNewTabPageHandler(DOMUI* dom_ui) {
|
| - return (new NewTabPageSyncHandler())->Attach(dom_ui);
|
| -}
|
| -
|
| -std::string GetNewTabSource() {
|
| - static const StringPiece new_tab_html(
|
| - ResourceBundle::GetSharedInstance().GetRawDataResource(
|
| - IDR_NEW_TAB_P13N_HTML));
|
| -
|
| - std::string data_uri("data:text/html,");
|
| - data_uri.append(std::string(new_tab_html.data(), new_tab_html.size()));
|
| - return GURL(data_uri).spec();
|
| -}
|
| -
|
| -std::wstring GetMenuItemInfoText(Browser* browser) {
|
| - browser->command_updater()->UpdateCommandEnabled(IDC_P13N_INFO, true);
|
| - return kMenuLabelStartSync;
|
| -}
|
| -
|
| -void HandleMenuItemClick(Profile* p) {
|
| - // The menu item is enabled either when the sync is not enabled by the user
|
| - // or when it's enabled but the user name is empty. In the former case enable
|
| - // sync. In the latter case, show the login dialog.
|
| - ProfileSyncService* service = p->GetProfilePersonalization()->sync_service();
|
| - DCHECK(service);
|
| - if (service->IsSyncEnabledByUser()) {
|
| - ShowOptionsWindow(OPTIONS_PAGE_USER_DATA, OPTIONS_GROUP_NONE, p);
|
| - } else {
|
| - service->EnableForUser();
|
| - }
|
| -}
|
| -
|
| -} // namespace Personalization
|
| -
|
| -class ProfilePersonalizationImpl : public ProfilePersonalization,
|
| - public NotificationObserver {
|
| - public:
|
| - explicit ProfilePersonalizationImpl(Profile *p)
|
| - : profile_(p) {
|
| - // g_browser_process and/or io_thread may not exist during testing.
|
| - if (g_browser_process && g_browser_process->io_thread()) {
|
| - // Add our network layer data source for 'cloudy' URLs.
|
| - // TODO(timsteele): This one belongs in BrowserAboutHandler.
|
| - g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE,
|
| - NewRunnableMethod(&chrome_url_data_manager,
|
| - &ChromeURLDataManager::AddDataSource,
|
| - new Personalization::CloudyStatsSource()));
|
| - g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE,
|
| - NewRunnableMethod(&chrome_url_data_manager,
|
| - &ChromeURLDataManager::AddDataSource,
|
| - new Personalization::CloudyResourceSource()));
|
| - }
|
| -
|
| - registrar_.Add(this, NotificationType::BOOKMARK_MODEL_LOADED,
|
| - Source<Profile>(profile_));
|
| - }
|
| - virtual ~ProfilePersonalizationImpl() {}
|
| -
|
| - // ProfilePersonalization implementation
|
| - virtual ProfileSyncService* sync_service() {
|
| - if (!sync_service_.get())
|
| - InitSyncService();
|
| - return sync_service_.get();
|
| - }
|
| -
|
| - // NotificationObserver implementation.
|
| - virtual void Observe(NotificationType type,
|
| - const NotificationSource& source,
|
| - const NotificationDetails& details) {
|
| - DCHECK_EQ(type.value, NotificationType::BOOKMARK_MODEL_LOADED);
|
| - if (!sync_service_.get())
|
| - InitSyncService();
|
| - registrar_.RemoveAll();
|
| - }
|
| -
|
| - void InitSyncService() {
|
| - sync_service_.reset(new ProfileSyncService(profile_));
|
| - sync_service_->Initialize();
|
| - }
|
| -
|
| - private:
|
| - Profile* profile_;
|
| - NotificationRegistrar registrar_;
|
| - scoped_ptr<ProfileSyncService> sync_service_;
|
| - DISALLOW_COPY_AND_ASSIGN(ProfilePersonalizationImpl);
|
| -};
|
| -
|
| -namespace Personalization {
|
| -
|
| -void CloudyResourceSource::StartDataRequest(const std::string& path_raw,
|
| - int request_id) {
|
| - scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes);
|
| - if (path_raw == kCloudyThrobberPath) {
|
| - ResourceBundle::GetSharedInstance().LoadImageResourceBytes(IDR_THROBBER,
|
| - &html_bytes->data);
|
| - SendResponse(request_id, html_bytes);
|
| - return;
|
| - }
|
| -
|
| - std::string response;
|
| - if (path_raw == kCloudyGaiaLoginPath) {
|
| - static const StringPiece html(ResourceBundle::GetSharedInstance()
|
| - .GetRawDataResource(IDR_GAIA_LOGIN_HTML));
|
| - response = html.as_string();
|
| - } else if (path_raw == kCloudyMergeAndSyncPath) {
|
| - static const StringPiece html(ResourceBundle::GetSharedInstance()
|
| - .GetRawDataResource(IDR_MERGE_AND_SYNC_HTML));
|
| - response = html.as_string();
|
| - } else if (path_raw == kCloudySetupFlowPath) {
|
| - static const StringPiece html(ResourceBundle::GetSharedInstance()
|
| - .GetRawDataResource(IDR_SYNC_SETUP_FLOW_HTML));
|
| - response = html.as_string();
|
| - }
|
| - // Send the response.
|
| - html_bytes->data.resize(response.size());
|
| - std::copy(response.begin(), response.end(), html_bytes->data.begin());
|
| - SendResponse(request_id, html_bytes);
|
| -}
|
| -
|
| -ProfilePersonalization* CreateProfilePersonalization(Profile* p) {
|
| - return new ProfilePersonalizationImpl(p);
|
| -}
|
| -
|
| -void CleanupProfilePersonalization(ProfilePersonalization* p) {
|
| - if (p) delete p;
|
| -}
|
| -
|
| -static void AddBoolDetail(ListValue* details, const std::wstring& stat_name,
|
| - bool stat_value) {
|
| - DictionaryValue* val = new DictionaryValue;
|
| - val->SetString(L"stat_name", stat_name);
|
| - val->SetBoolean(L"stat_value", stat_value);
|
| - details->Append(val);
|
| -}
|
| -
|
| -static void AddIntDetail(ListValue* details, const std::wstring& stat_name,
|
| - int64 stat_value) {
|
| - DictionaryValue* val = new DictionaryValue;
|
| - val->SetString(L"stat_name", stat_name);
|
| - val->SetString(L"stat_value", FormatNumber(stat_value));
|
| - details->Append(val);
|
| -}
|
| -
|
| -std::string MakeCloudyStats() {
|
| - FilePath user_data_dir;
|
| - if (!PathService::Get(chrome::DIR_USER_DATA, &user_data_dir))
|
| - return std::string();
|
| - ProfileManager* profile_manager = g_browser_process->profile_manager();
|
| - Profile* profile = profile_manager->GetDefaultProfile(user_data_dir);
|
| - ProfilePersonalization* p13n_profile = profile->GetProfilePersonalization();
|
| - ProfileSyncService* service = p13n_profile->sync_service();
|
| -
|
| - DictionaryValue strings;
|
| - if (!service->IsSyncEnabledByUser()) {
|
| - strings.SetString(L"summary", L"SYNC DISABLED");
|
| - } else {
|
| - SyncManager::Status full_status(service->QueryDetailedSyncStatus());
|
| -
|
| - strings.SetString(L"summary",
|
| - ProfileSyncService::BuildSyncStatusSummaryText(
|
| - full_status.summary));
|
| -
|
| - strings.Set(L"authenticated",
|
| - new FundamentalValue(full_status.authenticated));
|
| - strings.SetString(L"auth_problem",
|
| - MakeAuthErrorText(service->GetAuthErrorState()));
|
| -
|
| - strings.SetString(L"time_since_sync", service->GetLastSyncedTimeString());
|
| -
|
| - ListValue* details = new ListValue();
|
| - strings.Set(L"details", details);
|
| - AddBoolDetail(details, L"Server Up", full_status.server_up);
|
| - AddBoolDetail(details, L"Server Reachable", full_status.server_reachable);
|
| - AddBoolDetail(details, L"Server Broken", full_status.server_broken);
|
| - AddBoolDetail(details, L"Notifications Enabled",
|
| - full_status.notifications_enabled);
|
| - AddIntDetail(details, L"Notifications Received",
|
| - full_status.notifications_received);
|
| - AddIntDetail(details, L"Notifications Sent",
|
| - full_status.notifications_sent);
|
| - AddIntDetail(details, L"Unsynced Count", full_status.unsynced_count);
|
| - AddIntDetail(details, L"Conflicting Count", full_status.conflicting_count);
|
| - AddBoolDetail(details, L"Syncing", full_status.syncing);
|
| - AddBoolDetail(details, L"Syncer Paused", full_status.syncer_paused);
|
| - AddBoolDetail(details, L"Initial Sync Ended",
|
| - full_status.initial_sync_ended);
|
| - AddBoolDetail(details, L"Syncer Stuck", full_status.syncer_stuck);
|
| - AddIntDetail(details, L"Updates Available", full_status.updates_available);
|
| - AddIntDetail(details, L"Updates Received", full_status.updates_received);
|
| - AddBoolDetail(details, L"Disk Full", full_status.disk_full);
|
| - AddBoolDetail(details, L"Invalid Store", full_status.invalid_store);
|
| - AddIntDetail(details, L"Max Consecutive Errors",
|
| - full_status.max_consecutive_errors);
|
| - }
|
| -
|
| - static const StringPiece sync_html(
|
| - ResourceBundle::GetSharedInstance().GetRawDataResource(
|
| - IDR_ABOUT_SYNC_HTML));
|
| -
|
| - return jstemplate_builder::GetTemplateHtml(
|
| - sync_html, &strings , "t" /* template root node id */);
|
| -}
|
| -
|
| -} // namespace Personalization
|
| -
|
| -#endif
|
|
|