Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(573)

Side by Side Diff: chrome/browser/chromeos/customization_document.cc

Issue 236013002: Apply default wallpaper from customization manifest. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comments updated. Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698