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[] = | |
Daniel Erat
2014/04/15 03:06:30
nit: put "Pref" on the end of this constant's name
Alexander Alekseev
2014/04/15 22:47:31
This is not a preference. This is exactly file nam
| |
82 "default.downloaded"; | |
Nikita (slow)
2014/04/15 12:39:24
nit: should file name include extension for clarit
Alexander Alekseev
2014/04/15 22:47:31
It says nothing. Current implementation will allow
| |
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 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
363 return g_test_services_customization_document; | 382 return g_test_services_customization_document; |
364 | 383 |
365 return Singleton<ServicesCustomizationDocument, | 384 return Singleton<ServicesCustomizationDocument, |
366 DefaultSingletonTraits<ServicesCustomizationDocument> >::get(); | 385 DefaultSingletonTraits<ServicesCustomizationDocument> >::get(); |
367 } | 386 } |
368 | 387 |
369 // static | 388 // static |
370 void ServicesCustomizationDocument::RegisterPrefs( | 389 void ServicesCustomizationDocument::RegisterPrefs( |
371 PrefRegistrySimple* registry) { | 390 PrefRegistrySimple* registry) { |
372 registry->RegisterBooleanPref(kServicesCustomizationAppliedPref, false); | 391 registry->RegisterBooleanPref(kServicesCustomizationAppliedPref, false); |
392 registry->RegisterStringPref(prefs::kCustomizationDefaultWallpaperURL, ""); | |
Nikita (slow)
2014/04/15 12:39:24
std::string()
Alexander Alekseev
2014/04/15 22:47:31
Done.
| |
373 } | 393 } |
374 | 394 |
375 // static | 395 // static |
376 void ServicesCustomizationDocument::RegisterProfilePrefs( | 396 void ServicesCustomizationDocument::RegisterProfilePrefs( |
377 user_prefs::PrefRegistrySyncable* registry) { | 397 user_prefs::PrefRegistrySyncable* registry) { |
378 registry->RegisterDictionaryPref( | 398 registry->RegisterDictionaryPref( |
379 kServicesCustomizationKey, | 399 kServicesCustomizationKey, |
380 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); | 400 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); |
381 } | 401 } |
382 | 402 |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
524 LOG(ERROR) << "URL fetch for services customization failed:" | 544 LOG(ERROR) << "URL fetch for services customization failed:" |
525 << " response code = " << source->GetResponseCode() | 545 << " response code = " << source->GetResponseCode() |
526 << " URL = " << source->GetURL().spec(); | 546 << " URL = " << source->GetURL().spec(); |
527 | 547 |
528 LogManifestLoadResult(HISTOGRAM_LOAD_RESULT_RETRIES_FAIL); | 548 LogManifestLoadResult(HISTOGRAM_LOAD_RESULT_RETRIES_FAIL); |
529 } | 549 } |
530 fetch_started_ = false; | 550 fetch_started_ = false; |
531 } | 551 } |
532 | 552 |
533 bool ServicesCustomizationDocument::ApplyOOBECustomization() { | 553 bool ServicesCustomizationDocument::ApplyOOBECustomization() { |
534 // TODO(dpolukhin): apply default wallpaper, crbug.com/348136. | 554 CheckAndApplyWallpaper(); |
535 SetApplied(true); | 555 SetApplied(true); |
536 return true; | 556 return true; |
537 } | 557 } |
538 | 558 |
539 GURL ServicesCustomizationDocument::GetDefaultWallpaperUrl() const { | 559 GURL ServicesCustomizationDocument::GetDefaultWallpaperUrl() const { |
540 if (!IsReady()) | 560 if (!IsReady()) |
541 return GURL(); | 561 return GURL(); |
542 | 562 |
543 std::string url; | 563 std::string url; |
544 root_->GetString(kDefaultWallpaperAttr, &url); | 564 root_->GetString(kDefaultWallpaperAttr, &url); |
(...skipping 24 matching lines...) Expand all Loading... | |
569 } | 589 } |
570 | 590 |
571 std::string ServicesCustomizationDocument::GetOemAppsFolderName( | 591 std::string ServicesCustomizationDocument::GetOemAppsFolderName( |
572 const std::string& locale) const { | 592 const std::string& locale) const { |
573 if (!IsReady()) | 593 if (!IsReady()) |
574 return std::string(); | 594 return std::string(); |
575 | 595 |
576 return GetOemAppsFolderNameImpl(locale, *root_); | 596 return GetOemAppsFolderNameImpl(locale, *root_); |
577 } | 597 } |
578 | 598 |
599 // static | |
600 base::FilePath ServicesCustomizationDocument::GetCustomizedWallpaperCacheDir() { | |
Nikita (slow)
2014/04/15 12:39:24
nit: Please group static methods together, i.e. mo
Alexander Alekseev
2014/04/15 22:47:31
Done.
| |
601 base::FilePath custom_wallpaper_dir; | |
602 const bool success = PathService::Get(chrome::DIR_CHROMEOS_CUSTOM_WALLPAPERS, | |
603 &custom_wallpaper_dir); | |
604 DCHECK(success); | |
Daniel Erat
2014/04/15 03:06:30
nit: this could be simplified a bit as:
if (!Pa
Alexander Alekseev
2014/04/15 22:47:31
Done.
| |
605 | |
606 if (success) | |
607 return custom_wallpaper_dir.Append(kCustomizationDefaultWallpaperDir); | |
608 | |
609 return custom_wallpaper_dir; | |
610 } | |
611 | |
612 // static | |
613 base::FilePath | |
614 ServicesCustomizationDocument::GetCustomizedWallpaperDownloadedFileName() { | |
615 const base::FilePath dir = GetCustomizedWallpaperCacheDir(); | |
616 if (dir.empty()) | |
617 return dir; | |
Nikita (slow)
2014/04/15 12:39:24
nit: NOTREACHED()
Alexander Alekseev
2014/04/15 22:47:31
Done.
| |
618 return dir.Append(kCustomizationDefaultWallpaperDownloadedFile); | |
619 } | |
620 | |
579 scoped_ptr<base::DictionaryValue> | 621 scoped_ptr<base::DictionaryValue> |
580 ServicesCustomizationDocument::GetDefaultAppsInProviderFormat( | 622 ServicesCustomizationDocument::GetDefaultAppsInProviderFormat( |
581 const base::DictionaryValue& root) { | 623 const base::DictionaryValue& root) { |
582 scoped_ptr<base::DictionaryValue> prefs(new base::DictionaryValue); | 624 scoped_ptr<base::DictionaryValue> prefs(new base::DictionaryValue); |
583 const base::ListValue* apps_list = NULL; | 625 const base::ListValue* apps_list = NULL; |
584 if (root.GetList(kDefaultAppsAttr, &apps_list)) { | 626 if (root.GetList(kDefaultAppsAttr, &apps_list)) { |
585 for (size_t i = 0; i < apps_list->GetSize(); ++i) { | 627 for (size_t i = 0; i < apps_list->GetSize(); ++i) { |
586 std::string app_id; | 628 std::string app_id; |
587 if (apps_list->GetString(i, &app_id)) { | 629 if (apps_list->GetString(i, &app_id)) { |
588 base::DictionaryValue* entry = new base::DictionaryValue; | 630 base::DictionaryValue* entry = new base::DictionaryValue; |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
668 g_test_services_customization_document = new ServicesCustomizationDocument; | 710 g_test_services_customization_document = new ServicesCustomizationDocument; |
669 g_test_services_customization_document->network_delay_ = base::TimeDelta(); | 711 g_test_services_customization_document->network_delay_ = base::TimeDelta(); |
670 } | 712 } |
671 | 713 |
672 // static | 714 // static |
673 void ServicesCustomizationDocument::ShutdownForTesting() { | 715 void ServicesCustomizationDocument::ShutdownForTesting() { |
674 delete g_test_services_customization_document; | 716 delete g_test_services_customization_document; |
675 g_test_services_customization_document = NULL; | 717 g_test_services_customization_document = NULL; |
676 } | 718 } |
677 | 719 |
720 void ServicesCustomizationDocument::StartOEMWallpaperDownload( | |
721 const GURL& wallpaper_url) { | |
722 DCHECK(wallpaper_url.is_valid()); | |
723 | |
724 const base::FilePath dir = GetCustomizedWallpaperCacheDir(); | |
725 const base::FilePath file = GetCustomizedWallpaperDownloadedFileName(); | |
726 if (dir.empty() || file.empty()) | |
727 return; | |
Nikita (slow)
2014/04/15 12:39:24
NOTREACHED()
Alexander Alekseev
2014/04/15 22:47:31
Done.
| |
728 | |
729 wallpaper_downloader_.reset(new CustomizationWallpaperDownloader( | |
730 g_browser_process->system_request_context(), | |
731 wallpaper_url, | |
732 dir, | |
733 file, | |
734 base::Bind( | |
735 &ServicesCustomizationDocument::OnCustomizedWallpaperDownloaded, | |
736 weak_ptr_factory_.GetWeakPtr()))); | |
737 | |
738 wallpaper_downloader_->Start(); | |
739 } | |
740 | |
741 void ServicesCustomizationDocument::CheckAndApplyWallpaper() { | |
742 if (wallpaper_downloader_.get()) { | |
743 VLOG(1) << "CheckAndApplyWallpaper(): download has already started."; | |
744 return; | |
745 } | |
746 GURL wallpaper_url = GetDefaultWallpaperUrl(); | |
747 // Should fail if this ever happens in tests. | |
Nikita (slow)
2014/04/15 12:39:24
nit: Insert empty line before comment.
Alexander Alekseev
2014/04/15 22:47:31
Done.
| |
748 DCHECK(wallpaper_url.is_valid()); | |
749 if (!wallpaper_url.is_valid()) { | |
750 if (!wallpaper_url.is_empty()) { | |
Daniel Erat
2014/04/15 03:06:30
nit: omit curly brackets here since the statement
Alexander Alekseev
2014/04/15 22:47:31
Now it occupies two lines ;-)
| |
751 LOG(WARNING) << "Invalid Customized Wallpaper URL."; | |
Daniel Erat
2014/04/15 03:06:30
include wallpaper_url.spec() in this message to ai
Alexander Alekseev
2014/04/15 22:47:31
Done.
| |
752 } | |
753 return; | |
754 } | |
755 scoped_ptr<bool> exists(new bool(false)); | |
756 | |
757 base::Closure check_file_exists = | |
758 base::Bind(&CheckWallpaperCacheExists, | |
759 GetCustomizedWallpaperDownloadedFileName(), | |
760 base::Unretained(exists.get())); | |
761 base::Closure on_checked_closure = | |
762 base::Bind(&ServicesCustomizationDocument::OnCheckedWallpaperCacheExists, | |
763 weak_ptr_factory_.GetWeakPtr(), | |
764 base::Passed(exists.Pass())); | |
765 if (!content::BrowserThread::PostBlockingPoolTaskAndReply( | |
766 FROM_HERE, check_file_exists, on_checked_closure)) { | |
767 LOG(WARNING) << "Failed to start check Wallpaper cache exists."; | |
768 } | |
769 } | |
770 | |
771 void ServicesCustomizationDocument::OnCheckedWallpaperCacheExists( | |
772 scoped_ptr<bool> exists) { | |
773 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | |
774 DCHECK(exists.get()); | |
775 | |
776 ApplyWallpaper(*exists); | |
777 } | |
778 | |
779 void ServicesCustomizationDocument::ApplyWallpaper( | |
780 bool default_wallpaper_file_exists) { | |
781 GURL wallpaper_url = GetDefaultWallpaperUrl(); | |
782 DCHECK(wallpaper_url.is_valid()); | |
783 | |
784 PrefService* pref_service = g_browser_process->local_state(); | |
785 | |
786 std::string current_url = | |
787 pref_service->GetString(prefs::kCustomizationDefaultWallpaperURL); | |
788 if (current_url != wallpaper_url.spec()) { | |
789 VLOG(1) << "ServicesCustomizationDocument::ApplyWallpaper() : " | |
790 << "Wallpaper URL in customization document '" | |
791 << wallpaper_url.spec() << "' differs from current '" << current_url | |
792 << "'." | |
793 << (GURL(current_url).is_valid() && default_wallpaper_file_exists | |
794 ? " Ignored." | |
795 : " Will refetch."); | |
796 } | |
797 // Never update system-wide wallpaper (i.e. do not check | |
798 // current_url == wallpaper_url.spec() ) | |
799 if (GURL(current_url).is_valid() && default_wallpaper_file_exists) { | |
800 VLOG(1) | |
801 << "ServicesCustomizationDocument::ApplyWallpaper() : reuse existing"; | |
802 OnCustomizedWallpaperDownloaded(true, GURL(current_url)); | |
803 } else { | |
804 VLOG(1) | |
805 << "ServicesCustomizationDocument::ApplyWallpaper() : start download"; | |
806 StartOEMWallpaperDownload(wallpaper_url); | |
807 } | |
808 } | |
809 | |
810 void ServicesCustomizationDocument::OnCustomizedWallpaperDownloaded( | |
811 bool success, | |
812 const GURL& wallpaper_url) { | |
813 if (success) { | |
814 DCHECK(wallpaper_url.is_valid()); | |
Daniel Erat
2014/04/15 03:06:30
everything in this block needs to be indented two
Alexander Alekseev
2014/04/15 22:47:31
Done.
| |
815 | |
816 VLOG(1) << "Setting default wallpaper to '" | |
817 << GetCustomizedWallpaperDownloadedFileName().value() << "' ('" | |
818 << wallpaper_url.spec() << "')"; | |
819 WallpaperManager::Get()->SetCustomizedDefaultWallpaper( | |
820 wallpaper_url, | |
821 GetCustomizedWallpaperDownloadedFileName(), | |
822 GetCustomizedWallpaperCacheDir()); | |
823 } | |
824 wallpaper_downloader_.reset(); | |
825 } | |
826 | |
678 } // namespace chromeos | 827 } // namespace chromeos |
OLD | NEW |