Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/customization_document.h" | 5 #include "chrome/browser/chromeos/customization_document.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| 11 #include "base/file_util.h" | 11 #include "base/file_util.h" |
| 12 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
| 13 #include "base/json/json_reader.h" | 13 #include "base/json/json_reader.h" |
| 14 #include "base/logging.h" | 14 #include "base/logging.h" |
| 15 #include "base/memory/weak_ptr.h" | 15 #include "base/memory/weak_ptr.h" |
| 16 #include "base/metrics/histogram.h" | 16 #include "base/metrics/histogram.h" |
| 17 #include "base/path_service.h" | |
| 17 #include "base/prefs/pref_registry_simple.h" | 18 #include "base/prefs/pref_registry_simple.h" |
| 18 #include "base/prefs/pref_service.h" | 19 #include "base/prefs/pref_service.h" |
| 19 #include "base/strings/string_split.h" | 20 #include "base/strings/string_split.h" |
| 20 #include "base/strings/string_util.h" | 21 #include "base/strings/string_util.h" |
| 21 #include "base/strings/stringprintf.h" | 22 #include "base/strings/stringprintf.h" |
| 22 #include "base/strings/utf_string_conversions.h" | 23 #include "base/strings/utf_string_conversions.h" |
| 23 #include "base/time/time.h" | 24 #include "base/time/time.h" |
| 24 #include "chrome/browser/browser_process.h" | 25 #include "chrome/browser/browser_process.h" |
| 26 #include "chrome/browser/chromeos/customization_wallpaper_downloader.h" | |
| 25 #include "chrome/browser/chromeos/extensions/default_app_order.h" | 27 #include "chrome/browser/chromeos/extensions/default_app_order.h" |
| 28 #include "chrome/browser/chromeos/login/wallpaper_manager.h" | |
| 26 #include "chrome/browser/chromeos/login/wizard_controller.h" | 29 #include "chrome/browser/chromeos/login/wizard_controller.h" |
| 27 #include "chrome/browser/chromeos/net/delay_network_call.h" | 30 #include "chrome/browser/chromeos/net/delay_network_call.h" |
| 28 #include "chrome/browser/extensions/external_loader.h" | 31 #include "chrome/browser/extensions/external_loader.h" |
| 29 #include "chrome/browser/extensions/external_provider_impl.h" | 32 #include "chrome/browser/extensions/external_provider_impl.h" |
| 30 #include "chrome/browser/profiles/profile.h" | 33 #include "chrome/browser/profiles/profile.h" |
| 31 #include "chrome/browser/ui/app_list/app_list_syncable_service.h" | 34 #include "chrome/browser/ui/app_list/app_list_syncable_service.h" |
| 32 #include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h" | 35 #include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h" |
| 36 #include "chrome/common/chrome_paths.h" | |
| 33 #include "chrome/common/extensions/extension_constants.h" | 37 #include "chrome/common/extensions/extension_constants.h" |
| 38 #include "chrome/common/pref_names.h" | |
| 34 #include "chromeos/network/network_state.h" | 39 #include "chromeos/network/network_state.h" |
| 35 #include "chromeos/network/network_state_handler.h" | 40 #include "chromeos/network/network_state_handler.h" |
| 36 #include "chromeos/system/statistics_provider.h" | 41 #include "chromeos/system/statistics_provider.h" |
| 37 #include "components/user_prefs/pref_registry_syncable.h" | 42 #include "components/user_prefs/pref_registry_syncable.h" |
| 38 #include "content/public/browser/browser_thread.h" | 43 #include "content/public/browser/browser_thread.h" |
| 39 #include "net/base/load_flags.h" | 44 #include "net/base/load_flags.h" |
| 40 #include "net/http/http_response_headers.h" | 45 #include "net/http/http_response_headers.h" |
| 41 #include "net/http/http_status_code.h" | 46 #include "net/http/http_status_code.h" |
| 42 #include "net/url_request/url_fetcher.h" | 47 #include "net/url_request/url_fetcher.h" |
| 43 #include "ui/base/l10n/l10n_util.h" | 48 #include "ui/base/l10n/l10n_util.h" |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 61 const char kDefaultAppsAttr[] = "default_apps"; | 66 const char kDefaultAppsAttr[] = "default_apps"; |
| 62 const char kLocalizedContent[] = "localized_content"; | 67 const char kLocalizedContent[] = "localized_content"; |
| 63 const char kDefaultAppsFolderName[] = "default_apps_folder_name"; | 68 const char kDefaultAppsFolderName[] = "default_apps_folder_name"; |
| 64 | 69 |
| 65 const char kAcceptedManifestVersion[] = "1.0"; | 70 const char kAcceptedManifestVersion[] = "1.0"; |
| 66 | 71 |
| 67 // Path to OEM partner startup customization manifest. | 72 // Path to OEM partner startup customization manifest. |
| 68 const char kStartupCustomizationManifestPath[] = | 73 const char kStartupCustomizationManifestPath[] = |
| 69 "/opt/oem/etc/startup_manifest.json"; | 74 "/opt/oem/etc/startup_manifest.json"; |
| 70 | 75 |
| 76 // This is subdirectory relative to PathService(DIR_CHROMEOS_CUSTOM_WALLPAPERS), | |
| 77 // where downloaded (and resized) wallpaper is stored. | |
| 78 const char kCustomizationDefaultWallpaperDir[] = "customization"; | |
| 79 | |
| 80 // The original downloaded image file is stored under this name. | |
| 81 const char kCustomizationDefaultWallpaperDownloadedFile[] = | |
| 82 "default_downloaded_wallpaper.bin"; | |
| 83 | |
| 71 // Name of local state option that tracks if services customization has been | 84 // Name of local state option that tracks if services customization has been |
| 72 // applied. | 85 // applied. |
| 73 const char kServicesCustomizationAppliedPref[] = "ServicesCustomizationApplied"; | 86 const char kServicesCustomizationAppliedPref[] = "ServicesCustomizationApplied"; |
| 74 | 87 |
| 75 // Maximum number of retries to fetch file if network is not available. | 88 // Maximum number of retries to fetch file if network is not available. |
| 76 const int kMaxFetchRetries = 3; | 89 const int kMaxFetchRetries = 3; |
| 77 | 90 |
| 78 // Delay between file fetch retries if network is not available. | 91 // Delay between file fetch retries if network is not available. |
| 79 const int kRetriesDelayInSec = 2; | 92 const int kRetriesDelayInSec = 2; |
| 80 | 93 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 123 const base::DictionaryValue* default_dictionary = NULL; | 136 const base::DictionaryValue* default_dictionary = NULL; |
| 124 if (dictionary_content->GetDictionary(kDefaultAttr, &default_dictionary)) { | 137 if (dictionary_content->GetDictionary(kDefaultAttr, &default_dictionary)) { |
| 125 std::string result; | 138 std::string result; |
| 126 if (default_dictionary->GetString(entry_name, &result)) | 139 if (default_dictionary->GetString(entry_name, &result)) |
| 127 return result; | 140 return result; |
| 128 } | 141 } |
| 129 | 142 |
| 130 return std::string(); | 143 return std::string(); |
| 131 } | 144 } |
| 132 | 145 |
| 146 void CheckWallpaperCacheExists(const base::FilePath& path, bool* exists) { | |
| 147 DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); | |
| 148 DCHECK(exists); | |
| 149 *exists = base::PathExists(path); | |
| 150 } | |
| 151 | |
| 133 } // anonymous namespace | 152 } // anonymous namespace |
| 134 | 153 |
| 135 // Template URL where to fetch OEM services customization manifest from. | 154 // Template URL where to fetch OEM services customization manifest from. |
| 136 const char ServicesCustomizationDocument::kManifestUrl[] = | 155 const char ServicesCustomizationDocument::kManifestUrl[] = |
| 137 "https://ssl.gstatic.com/chrome/chromeos-customization/%s.json"; | 156 "https://ssl.gstatic.com/chrome/chromeos-customization/%s.json"; |
| 138 | 157 |
| 139 // A custom extensions::ExternalLoader that the ServicesCustomizationDocument | 158 // A custom extensions::ExternalLoader that the ServicesCustomizationDocument |
| 140 // creates and uses to publish OEM default apps to the extensions system. | 159 // creates and uses to publish OEM default apps to the extensions system. |
| 141 class ServicesCustomizationExternalLoader | 160 class ServicesCustomizationExternalLoader |
| 142 : public extensions::ExternalLoader, | 161 : public extensions::ExternalLoader, |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 330 return configured_locales_.front(); | 349 return configured_locales_.front(); |
| 331 } | 350 } |
| 332 | 351 |
| 333 std::string StartupCustomizationDocument::GetEULAPage( | 352 std::string StartupCustomizationDocument::GetEULAPage( |
| 334 const std::string& locale) const { | 353 const std::string& locale) const { |
| 335 return GetLocaleSpecificString(locale, kSetupContentAttr, kEulaPageAttr); | 354 return GetLocaleSpecificString(locale, kSetupContentAttr, kEulaPageAttr); |
| 336 } | 355 } |
| 337 | 356 |
| 338 // ServicesCustomizationDocument implementation. ------------------------------- | 357 // ServicesCustomizationDocument implementation. ------------------------------- |
| 339 | 358 |
| 359 class ServicesCustomizationDocument::ApplyingTask { | |
| 360 public: | |
| 361 // Registers in ServicesCustomizationDocument; | |
| 362 ApplyingTask(ServicesCustomizationDocument* document); | |
| 363 | |
| 364 // Do not automatically deregister as we might be called on invalid thread. | |
| 365 ~ApplyingTask(); | |
| 366 | |
| 367 // Mark task finished and check for customization applied. | |
| 368 void Finished(bool success); | |
| 369 | |
| 370 private: | |
| 371 ServicesCustomizationDocument* document_; | |
| 372 bool engaged_; | |
|
Nikita (slow)
2014/04/17 05:23:34
nit: Add comment for engaged_.
Alexander Alekseev
2014/04/17 14:34:39
Done.
| |
| 373 }; | |
| 374 | |
| 375 ServicesCustomizationDocument::ApplyingTask::ApplyingTask( | |
| 376 ServicesCustomizationDocument* document) | |
| 377 : document_(document), engaged_(true) { | |
| 378 document->ApplyingTaskStarted(); | |
| 379 } | |
| 380 | |
| 381 ServicesCustomizationDocument::ApplyingTask::~ApplyingTask() { | |
| 382 DCHECK(!engaged_); | |
| 383 } | |
| 384 | |
| 385 void ServicesCustomizationDocument::ApplyingTask::Finished(bool success) { | |
| 386 DCHECK(engaged_); | |
| 387 if (engaged_) { | |
| 388 engaged_ = false; | |
| 389 document_->ApplyingTaskFinished(success); | |
| 390 } | |
| 391 } | |
| 392 | |
| 340 ServicesCustomizationDocument::ServicesCustomizationDocument() | 393 ServicesCustomizationDocument::ServicesCustomizationDocument() |
| 341 : CustomizationDocument(kAcceptedManifestVersion), | 394 : CustomizationDocument(kAcceptedManifestVersion), |
| 342 num_retries_(0), | 395 num_retries_(0), |
| 343 fetch_started_(false), | 396 fetch_started_(false), |
| 344 network_delay_(base::TimeDelta::FromMilliseconds( | 397 network_delay_( |
| 345 kDefaultNetworkRetryDelayMS)), | 398 base::TimeDelta::FromMilliseconds(kDefaultNetworkRetryDelayMS)), |
| 399 apply_tasks_started_(0), | |
| 400 apply_tasks_finished_(0), | |
| 401 apply_tasks_success_(0), | |
| 346 weak_ptr_factory_(this) { | 402 weak_ptr_factory_(this) { |
| 347 } | 403 } |
| 348 | 404 |
| 349 ServicesCustomizationDocument::ServicesCustomizationDocument( | 405 ServicesCustomizationDocument::ServicesCustomizationDocument( |
| 350 const std::string& manifest) | 406 const std::string& manifest) |
| 351 : CustomizationDocument(kAcceptedManifestVersion), | 407 : CustomizationDocument(kAcceptedManifestVersion), |
| 352 network_delay_(base::TimeDelta::FromMilliseconds( | 408 network_delay_( |
| 353 kDefaultNetworkRetryDelayMS)), | 409 base::TimeDelta::FromMilliseconds(kDefaultNetworkRetryDelayMS)), |
| 410 apply_tasks_started_(0), | |
| 411 apply_tasks_finished_(0), | |
| 412 apply_tasks_success_(0), | |
| 354 weak_ptr_factory_(this) { | 413 weak_ptr_factory_(this) { |
| 355 LoadManifestFromString(manifest); | 414 LoadManifestFromString(manifest); |
| 356 } | 415 } |
| 357 | 416 |
| 358 ServicesCustomizationDocument::~ServicesCustomizationDocument() {} | 417 ServicesCustomizationDocument::~ServicesCustomizationDocument() {} |
| 359 | 418 |
| 360 // static | 419 // static |
| 361 ServicesCustomizationDocument* ServicesCustomizationDocument::GetInstance() { | 420 ServicesCustomizationDocument* ServicesCustomizationDocument::GetInstance() { |
| 362 if (g_test_services_customization_document) | 421 if (g_test_services_customization_document) |
| 363 return g_test_services_customization_document; | 422 return g_test_services_customization_document; |
| 364 | 423 |
| 365 return Singleton<ServicesCustomizationDocument, | 424 return Singleton<ServicesCustomizationDocument, |
| 366 DefaultSingletonTraits<ServicesCustomizationDocument> >::get(); | 425 DefaultSingletonTraits<ServicesCustomizationDocument> >::get(); |
| 367 } | 426 } |
| 368 | 427 |
| 369 // static | 428 // static |
| 370 void ServicesCustomizationDocument::RegisterPrefs( | 429 void ServicesCustomizationDocument::RegisterPrefs( |
| 371 PrefRegistrySimple* registry) { | 430 PrefRegistrySimple* registry) { |
| 372 registry->RegisterBooleanPref(kServicesCustomizationAppliedPref, false); | 431 registry->RegisterBooleanPref(kServicesCustomizationAppliedPref, false); |
| 432 registry->RegisterStringPref(prefs::kCustomizationDefaultWallpaperURL, | |
| 433 std::string()); | |
| 373 } | 434 } |
| 374 | 435 |
| 375 // static | 436 // static |
| 376 void ServicesCustomizationDocument::RegisterProfilePrefs( | 437 void ServicesCustomizationDocument::RegisterProfilePrefs( |
| 377 user_prefs::PrefRegistrySyncable* registry) { | 438 user_prefs::PrefRegistrySyncable* registry) { |
| 378 registry->RegisterDictionaryPref( | 439 registry->RegisterDictionaryPref( |
| 379 kServicesCustomizationKey, | 440 kServicesCustomizationKey, |
| 380 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); | 441 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); |
| 381 } | 442 } |
| 382 | 443 |
| 383 // static | 444 // static |
| 384 bool ServicesCustomizationDocument::WasOOBECustomizationApplied() { | 445 bool ServicesCustomizationDocument::WasOOBECustomizationApplied() { |
| 385 PrefService* prefs = g_browser_process->local_state(); | 446 PrefService* prefs = g_browser_process->local_state(); |
| 386 return prefs->GetBoolean(kServicesCustomizationAppliedPref); | 447 return prefs->GetBoolean(kServicesCustomizationAppliedPref); |
| 387 } | 448 } |
| 388 | 449 |
| 389 // static | 450 // static |
| 390 void ServicesCustomizationDocument::SetApplied(bool val) { | 451 void ServicesCustomizationDocument::SetApplied(bool val) { |
| 391 PrefService* prefs = g_browser_process->local_state(); | 452 PrefService* prefs = g_browser_process->local_state(); |
| 392 prefs->SetBoolean(kServicesCustomizationAppliedPref, val); | 453 prefs->SetBoolean(kServicesCustomizationAppliedPref, val); |
| 393 } | 454 } |
| 394 | 455 |
| 456 // static | |
| 457 base::FilePath ServicesCustomizationDocument::GetCustomizedWallpaperCacheDir() { | |
| 458 base::FilePath custom_wallpaper_dir; | |
| 459 if (!PathService::Get(chrome::DIR_CHROMEOS_CUSTOM_WALLPAPERS, | |
| 460 &custom_wallpaper_dir)) { | |
| 461 LOG(DFATAL) << "Unable to get custom wallpaper dir."; | |
| 462 return base::FilePath(); | |
| 463 } | |
| 464 return custom_wallpaper_dir.Append(kCustomizationDefaultWallpaperDir); | |
| 465 } | |
| 466 | |
| 467 // static | |
| 468 base::FilePath | |
| 469 ServicesCustomizationDocument::GetCustomizedWallpaperDownloadedFileName() { | |
| 470 const base::FilePath dir = GetCustomizedWallpaperCacheDir(); | |
| 471 if (dir.empty()) { | |
| 472 NOTREACHED(); | |
| 473 return dir; | |
| 474 } | |
| 475 return dir.Append(kCustomizationDefaultWallpaperDownloadedFile); | |
| 476 } | |
| 477 | |
| 478 void ServicesCustomizationDocument::EnsureCustomizationApplied() { | |
| 479 if (WasOOBECustomizationApplied()) | |
| 480 return; | |
| 481 | |
| 482 // When customization manifest is fetched, applying will start automatically. | |
| 483 if (IsReady()) | |
| 484 return; | |
| 485 | |
| 486 StartFetching(); | |
| 487 } | |
| 488 | |
| 489 base::Closure | |
| 490 ServicesCustomizationDocument::EnsureCustomizationAppliedClosure() { | |
| 491 return base::Bind(&ServicesCustomizationDocument::EnsureCustomizationApplied, | |
| 492 weak_ptr_factory_.GetWeakPtr()); | |
| 493 } | |
| 494 | |
| 395 void ServicesCustomizationDocument::StartFetching() { | 495 void ServicesCustomizationDocument::StartFetching() { |
| 396 if (IsReady() || fetch_started_) | 496 if (IsReady() || fetch_started_) |
| 397 return; | 497 return; |
| 398 | 498 |
| 399 if (!url_.is_valid()) { | 499 if (!url_.is_valid()) { |
| 400 std::string customization_id; | 500 std::string customization_id; |
| 401 chromeos::system::StatisticsProvider* provider = | 501 chromeos::system::StatisticsProvider* provider = |
| 402 chromeos::system::StatisticsProvider::GetInstance(); | 502 chromeos::system::StatisticsProvider::GetInstance(); |
| 403 if (provider->GetMachineStatistic(system::kCustomizationIdKey, | 503 if (provider->GetMachineStatistic(system::kCustomizationIdKey, |
| 404 &customization_id) && | 504 &customization_id) && |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 472 LogManifestLoadResult(HISTOGRAM_LOAD_RESULT_SUCCESS); | 572 LogManifestLoadResult(HISTOGRAM_LOAD_RESULT_SUCCESS); |
| 473 OnManifestLoaded(); | 573 OnManifestLoaded(); |
| 474 return true; | 574 return true; |
| 475 } | 575 } |
| 476 | 576 |
| 477 LogManifestLoadResult(HISTOGRAM_LOAD_RESULT_PARSING_ERROR); | 577 LogManifestLoadResult(HISTOGRAM_LOAD_RESULT_PARSING_ERROR); |
| 478 return false; | 578 return false; |
| 479 } | 579 } |
| 480 | 580 |
| 481 void ServicesCustomizationDocument::OnManifestLoaded() { | 581 void ServicesCustomizationDocument::OnManifestLoaded() { |
| 482 if (!ServicesCustomizationDocument::WasOOBECustomizationApplied()) | 582 if (!WasOOBECustomizationApplied()) |
| 483 ApplyOOBECustomization(); | 583 ApplyOOBECustomization(); |
| 484 | 584 |
| 485 scoped_ptr<base::DictionaryValue> prefs = | 585 scoped_ptr<base::DictionaryValue> prefs = |
| 486 GetDefaultAppsInProviderFormat(*root_); | 586 GetDefaultAppsInProviderFormat(*root_); |
| 487 for (ExternalLoaders::iterator it = external_loaders_.begin(); | 587 for (ExternalLoaders::iterator it = external_loaders_.begin(); |
| 488 it != external_loaders_.end(); ++it) { | 588 it != external_loaders_.end(); ++it) { |
| 489 if (*it) { | 589 if (*it) { |
| 490 UpdateCachedManifest((*it)->profile()); | 590 UpdateCachedManifest((*it)->profile()); |
| 491 (*it)->SetCurrentApps( | 591 (*it)->SetCurrentApps( |
| 492 scoped_ptr<base::DictionaryValue>(prefs->DeepCopy())); | 592 scoped_ptr<base::DictionaryValue>(prefs->DeepCopy())); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 524 LOG(ERROR) << "URL fetch for services customization failed:" | 624 LOG(ERROR) << "URL fetch for services customization failed:" |
| 525 << " response code = " << source->GetResponseCode() | 625 << " response code = " << source->GetResponseCode() |
| 526 << " URL = " << source->GetURL().spec(); | 626 << " URL = " << source->GetURL().spec(); |
| 527 | 627 |
| 528 LogManifestLoadResult(HISTOGRAM_LOAD_RESULT_RETRIES_FAIL); | 628 LogManifestLoadResult(HISTOGRAM_LOAD_RESULT_RETRIES_FAIL); |
| 529 } | 629 } |
| 530 fetch_started_ = false; | 630 fetch_started_ = false; |
| 531 } | 631 } |
| 532 | 632 |
| 533 bool ServicesCustomizationDocument::ApplyOOBECustomization() { | 633 bool ServicesCustomizationDocument::ApplyOOBECustomization() { |
| 534 // TODO(dpolukhin): apply default wallpaper, crbug.com/348136. | 634 if (apply_tasks_started_) |
| 535 SetApplied(true); | 635 return false; |
| 536 return true; | 636 |
| 637 CheckAndApplyWallpaper(); | |
| 638 return false; | |
| 537 } | 639 } |
| 538 | 640 |
| 539 GURL ServicesCustomizationDocument::GetDefaultWallpaperUrl() const { | 641 GURL ServicesCustomizationDocument::GetDefaultWallpaperUrl() const { |
| 540 if (!IsReady()) | 642 if (!IsReady()) |
| 541 return GURL(); | 643 return GURL(); |
| 542 | 644 |
| 543 std::string url; | 645 std::string url; |
| 544 root_->GetString(kDefaultWallpaperAttr, &url); | 646 root_->GetString(kDefaultWallpaperAttr, &url); |
| 545 return GURL(url); | 647 return GURL(url); |
| 546 } | 648 } |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 668 g_test_services_customization_document = new ServicesCustomizationDocument; | 770 g_test_services_customization_document = new ServicesCustomizationDocument; |
| 669 g_test_services_customization_document->network_delay_ = base::TimeDelta(); | 771 g_test_services_customization_document->network_delay_ = base::TimeDelta(); |
| 670 } | 772 } |
| 671 | 773 |
| 672 // static | 774 // static |
| 673 void ServicesCustomizationDocument::ShutdownForTesting() { | 775 void ServicesCustomizationDocument::ShutdownForTesting() { |
| 674 delete g_test_services_customization_document; | 776 delete g_test_services_customization_document; |
| 675 g_test_services_customization_document = NULL; | 777 g_test_services_customization_document = NULL; |
| 676 } | 778 } |
| 677 | 779 |
| 780 void ServicesCustomizationDocument::StartOEMWallpaperDownload( | |
| 781 const GURL& wallpaper_url, | |
| 782 scoped_ptr<ServicesCustomizationDocument::ApplyingTask> applying) { | |
| 783 DCHECK(wallpaper_url.is_valid()); | |
| 784 | |
| 785 const base::FilePath dir = GetCustomizedWallpaperCacheDir(); | |
| 786 const base::FilePath file = GetCustomizedWallpaperDownloadedFileName(); | |
| 787 if (dir.empty() || file.empty()) { | |
| 788 NOTREACHED(); | |
| 789 applying->Finished(false); | |
| 790 return; | |
| 791 } | |
| 792 | |
| 793 wallpaper_downloader_.reset(new CustomizationWallpaperDownloader( | |
| 794 g_browser_process->system_request_context(), | |
| 795 wallpaper_url, | |
| 796 dir, | |
| 797 file, | |
| 798 base::Bind(&ServicesCustomizationDocument::OnOEMWallpaperDownloaded, | |
| 799 weak_ptr_factory_.GetWeakPtr(), | |
| 800 base::Passed(applying.Pass())))); | |
| 801 | |
| 802 wallpaper_downloader_->Start(); | |
| 803 } | |
| 804 | |
| 805 void ServicesCustomizationDocument::CheckAndApplyWallpaper() { | |
| 806 if (wallpaper_downloader_.get()) { | |
| 807 VLOG(1) << "CheckAndApplyWallpaper(): download has already started."; | |
| 808 return; | |
| 809 } | |
| 810 scoped_ptr<ServicesCustomizationDocument::ApplyingTask> applying( | |
| 811 new ServicesCustomizationDocument::ApplyingTask(this)); | |
| 812 | |
| 813 GURL wallpaper_url = GetDefaultWallpaperUrl(); | |
| 814 | |
| 815 // Should fail if this ever happens in tests. | |
| 816 DCHECK(wallpaper_url.is_valid()); | |
| 817 if (!wallpaper_url.is_valid()) { | |
| 818 if (!wallpaper_url.is_empty()) { | |
| 819 LOG(WARNING) << "Invalid Customized Wallpaper URL '" | |
| 820 << wallpaper_url.spec() << "'."; | |
| 821 } | |
| 822 applying->Finished(false); | |
| 823 return; | |
| 824 } | |
| 825 | |
| 826 scoped_ptr<bool> exists(new bool(false)); | |
| 827 | |
| 828 base::Closure check_file_exists = | |
| 829 base::Bind(&CheckWallpaperCacheExists, | |
| 830 GetCustomizedWallpaperDownloadedFileName(), | |
| 831 base::Unretained(exists.get())); | |
| 832 base::Closure on_checked_closure = | |
| 833 base::Bind(&ServicesCustomizationDocument::OnCheckedWallpaperCacheExists, | |
| 834 weak_ptr_factory_.GetWeakPtr(), | |
| 835 base::Passed(exists.Pass()), | |
| 836 base::Passed(applying.Pass())); | |
| 837 if (!content::BrowserThread::PostBlockingPoolTaskAndReply( | |
| 838 FROM_HERE, check_file_exists, on_checked_closure)) { | |
| 839 LOG(WARNING) << "Failed to start check Wallpaper cache exists."; | |
| 840 } | |
| 841 } | |
| 842 | |
| 843 void ServicesCustomizationDocument::OnCheckedWallpaperCacheExists( | |
| 844 scoped_ptr<bool> exists, | |
| 845 scoped_ptr<ServicesCustomizationDocument::ApplyingTask> applying) { | |
| 846 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | |
| 847 DCHECK(exists); | |
| 848 DCHECK(applying); | |
| 849 | |
| 850 ApplyWallpaper(*exists, applying.Pass()); | |
| 851 } | |
| 852 | |
| 853 void ServicesCustomizationDocument::ApplyWallpaper( | |
| 854 bool default_wallpaper_file_exists, | |
| 855 scoped_ptr<ServicesCustomizationDocument::ApplyingTask> applying) { | |
| 856 GURL wallpaper_url = GetDefaultWallpaperUrl(); | |
| 857 DCHECK(wallpaper_url.is_valid()); | |
| 858 | |
| 859 PrefService* pref_service = g_browser_process->local_state(); | |
| 860 | |
| 861 std::string current_url = | |
| 862 pref_service->GetString(prefs::kCustomizationDefaultWallpaperURL); | |
| 863 if (current_url != wallpaper_url.spec()) { | |
| 864 VLOG(1) << "ServicesCustomizationDocument::ApplyWallpaper() : " | |
| 865 << "Wallpaper URL in customization document '" | |
| 866 << wallpaper_url.spec() << "' differs from current '" << current_url | |
| 867 << "'." | |
| 868 << (GURL(current_url).is_valid() && default_wallpaper_file_exists | |
| 869 ? " Ignored." | |
| 870 : " Will refetch."); | |
| 871 } | |
| 872 // Never update system-wide wallpaper (i.e. do not check | |
| 873 // current_url == wallpaper_url.spec() ) | |
| 874 if (GURL(current_url).is_valid() && default_wallpaper_file_exists) { | |
| 875 VLOG(1) | |
| 876 << "ServicesCustomizationDocument::ApplyWallpaper() : reuse existing"; | |
| 877 OnOEMWallpaperDownloaded(applying.Pass(), true, GURL(current_url)); | |
| 878 } else { | |
| 879 VLOG(1) | |
| 880 << "ServicesCustomizationDocument::ApplyWallpaper() : start download"; | |
| 881 StartOEMWallpaperDownload(wallpaper_url, applying.Pass()); | |
| 882 } | |
| 883 } | |
| 884 | |
| 885 void ServicesCustomizationDocument::OnOEMWallpaperDownloaded( | |
| 886 scoped_ptr<ServicesCustomizationDocument::ApplyingTask> applying, | |
| 887 bool success, | |
| 888 const GURL& wallpaper_url) { | |
| 889 if (success) { | |
| 890 DCHECK(wallpaper_url.is_valid()); | |
| 891 | |
| 892 VLOG(1) << "Setting default wallpaper to '" | |
| 893 << GetCustomizedWallpaperDownloadedFileName().value() << "' ('" | |
| 894 << wallpaper_url.spec() << "')"; | |
| 895 WallpaperManager::Get()->SetCustomizedDefaultWallpaper( | |
| 896 wallpaper_url, | |
| 897 GetCustomizedWallpaperDownloadedFileName(), | |
| 898 GetCustomizedWallpaperCacheDir()); | |
| 899 } | |
| 900 wallpaper_downloader_.reset(); | |
| 901 applying->Finished(success); | |
| 902 } | |
| 903 | |
| 904 void ServicesCustomizationDocument::ApplyingTaskStarted() { | |
| 905 ++apply_tasks_started_; | |
| 906 } | |
| 907 | |
| 908 void ServicesCustomizationDocument::ApplyingTaskFinished(bool success) { | |
| 909 DCHECK(apply_tasks_started_ > apply_tasks_finished_); | |
| 910 ++apply_tasks_finished_; | |
| 911 | |
| 912 apply_tasks_success_ += success; | |
| 913 | |
| 914 if (apply_tasks_started_ != apply_tasks_finished_) | |
| 915 return; | |
| 916 | |
| 917 if (apply_tasks_success_ == apply_tasks_finished_) | |
| 918 SetApplied(true); | |
| 919 } | |
| 920 | |
| 678 } // namespace chromeos | 921 } // namespace chromeos |
| OLD | NEW |