15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_CUSTOMIZATION_DOCUMENT_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_CUSTOMIZATION_DOCUMENT_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/weak_ptr.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h" 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrefRegistrySimple; 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Profile; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace extensions { 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ExternalLoader; 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLFetcher; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace user_prefs { 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class PrefRegistrySyncable; 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass CustomizationWallpaperDownloader; 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ServicesCustomizationExternalLoader; 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void InitStartupCustomizationDocumentForTesting(const std::string& manifest); 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace system { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StatisticsProvider; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // system 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class for OEM customization document classes. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CustomizationDocument { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~CustomizationDocument(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return true if the document was successfully fetched and parsed. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsReady() const { return root_.get(); } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit CustomizationDocument(const std::string& accepted_version); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool LoadManifestFromFile(const base::FilePath& manifest_path); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool LoadManifestFromString(const std::string& manifest); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetLocaleSpecificString(const std::string& locale, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& dictionary_name, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& entry_name) const; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::DictionaryValue> root_; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Value of the "version" attribute that is supported. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise config is not loaded. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string accepted_version_; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CustomizationDocument); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OEM startup customization document class. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Now StartupCustomizationDocument is loaded in c-tor so just after create it 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// may be ready or not (if manifest is missing or corrupted) and this state 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// won't be changed later (i.e. IsReady() always return the same value). 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StartupCustomizationDocument : public CustomizationDocument { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static StartupCustomizationDocument* GetInstance(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetEULAPage(const std::string& locale) const; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These methods can be called even if !IsReady(), in this case VPD values 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will be returned. 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Raw value of "initial_locale" like initial_locale="en-US,sv,da,fi,no" . 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& initial_locale() const { return initial_locale_; } 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Vector of individual locale values. 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<std::string>& configured_locales() const; 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Default locale value (first value in initial_locale list). 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& initial_locale_default() const; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& initial_timezone() const { return initial_timezone_; } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& keyboard_layout() const { return keyboard_layout_; } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(StartupCustomizationDocumentTest, Basic); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(StartupCustomizationDocumentTest, VPD); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(StartupCustomizationDocumentTest, BadManifest); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ServicesCustomizationDocumentTest, MultiLanguage); 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) friend class OobeLocalizationTest; 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) friend void InitStartupCustomizationDocumentForTesting( 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& manifest); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend struct DefaultSingletonTraits<StartupCustomizationDocument>; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // C-tor for singleton construction. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartupCustomizationDocument(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // C-tor for test construction. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartupCustomizationDocument(system::StatisticsProvider* provider, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& manifest); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~StartupCustomizationDocument(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Init(system::StatisticsProvider* provider); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |attr| exists in machine stat, assign it to |value|. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitFromMachineStatistic(const char* attr, std::string* value); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string initial_locale_; 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<std::string> configured_locales_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string initial_timezone_; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string keyboard_layout_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(StartupCustomizationDocument); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OEM services customization document class. 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// ServicesCustomizationDocument is fetched from network therefore it is not 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// ready just after creation. Fetching of the manifest should be initiated 1380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// outside this class by calling StartFetching() or EnsureCustomizationApplied() 1390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// methods. 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// User of the file should check IsReady before use it. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServicesCustomizationDocument : public CustomizationDocument, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private net::URLFetcherDelegate { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ServicesCustomizationDocument* GetInstance(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Registers preferences. 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void RegisterPrefs(PrefRegistrySimple* registry); 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static const char kManifestUrl[]; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return true if the customization was applied. Customization is applied only 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // once per machine. 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static bool WasOOBECustomizationApplied(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // If customization has not been applied, start fetching and applying. 1570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void EnsureCustomizationApplied(); 1580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Returns Closure with the EnsureCustomizationApplied() method. 1600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Closure EnsureCustomizationAppliedClosure(); 1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start fetching customization document. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartFetching(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Apply customization and save in machine options that customization was 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // applied successfully. Return true if customization was applied. 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool ApplyOOBECustomization(); 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Returns true if default wallpaper URL attribute found in manifest. 1700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // |out_url| is set to attribute value. 1710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool GetDefaultWallpaperUrl(GURL* out_url) const; 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns list of default apps. 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool GetDefaultApps(std::vector<std::string>* ids) const; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Creates an extensions::ExternalLoader that will provide OEM default apps. 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Cache of OEM default apps stored in profile preferences. 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extensions::ExternalLoader* CreateExternalLoader(Profile* profile); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Returns the name of the folder for OEM apps for given |locale|. 181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string GetOemAppsFolderName(const std::string& locale) const; 182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Initialize instance of ServicesCustomizationDocument for tests that will 184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // override singleton until ShutdownForTesting is called. 185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static void InitializeForTesting(); 186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Remove instance of ServicesCustomizationDocument for tests. 188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static void ShutdownForTesting(); 189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // These methods are also called by WallpaperManager to get "global default" 1910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // customized wallpaper path (and to init default wallpaper path from it) 1920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // before first wallpaper is shown. 1930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static base::FilePath GetCustomizedWallpaperCacheDir(); 1940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static base::FilePath GetCustomizedWallpaperDownloadedFileName(); 1950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CustomizationWallpaperDownloader* wallpaper_downloader_for_testing() { 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return wallpaper_downloader_.get(); 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend struct DefaultSingletonTraits<ServicesCustomizationDocument>; 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(CustomizationWallpaperDownloaderBrowserTest, 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OEMWallpaperIsPresent); 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(CustomizationWallpaperDownloaderBrowserTest, 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OEMWallpaperRetryFetch); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) typedef std::vector<base::WeakPtr<ServicesCustomizationExternalLoader> > 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ExternalLoaders; 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Guard for a single application task (wallpaper downloading, for example). 2110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch class ApplyingTask; 2120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // C-tor for singleton construction. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ServicesCustomizationDocument(); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // C-tor for test construction. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ServicesCustomizationDocument(const std::string& manifest); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ServicesCustomizationDocument(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save applied state in machine settings. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetApplied(bool val); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Overriden from CustomizationDocument: 225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool LoadManifestFromString(const std::string& manifest) OVERRIDE; 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overriden from net::URLFetcherDelegate: 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Initiate file fetching. Wait for online status. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartFileFetch(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Initiate file fetching. Don't wait for online status. 234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void DoStartFileFetch(); 235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Executes on FILE thread and reads file to string. 237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static void ReadFileInBackground( 238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::WeakPtr<ServicesCustomizationDocument> self, 239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::FilePath& file); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Called on UI thread with results of ReadFileInBackground. 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnManifesteRead(const std::string& manifest); 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Method called when manifest was successfully loaded. 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnManifestLoaded(); 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns list of default apps in ExternalProvider format. 248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static scoped_ptr<base::DictionaryValue> GetDefaultAppsInProviderFormat( 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::DictionaryValue& root); 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Update cached manifest for |profile|. 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void UpdateCachedManifest(Profile* profile); 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Customization document not found for give ID. 255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void OnCustomizationNotFound(); 256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Set OEM apps folder name for AppListSyncableService for |profile|. 258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void SetOemFolderName(Profile* profile, const base::DictionaryValue& root); 259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Returns the name of the folder for OEM apps for given |locale|. 261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string GetOemAppsFolderNameImpl( 262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& locale, 263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::DictionaryValue& root) const; 264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Start download of wallpaper image if needed. 2660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void StartOEMWallpaperDownload(const GURL& wallpaper_url, 2670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<ApplyingTask> applying); 2680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Check that current customized wallpaper cache exists. Once wallpaper is 2700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // downloaded, it's never updated (even if manifest is re-fetched). 2710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Start wallpaper download if needed. 2720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void CheckAndApplyWallpaper(); 2730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Intermediate function to pass the result of PathExists to ApplyWallpaper. 2750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void OnCheckedWallpaperCacheExists(scoped_ptr<bool> exists, 2760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<ApplyingTask> applying); 2770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Called after downloaded wallpaper has been checked. 2790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void ApplyWallpaper(bool default_wallpaper_file_exists, 2800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<ApplyingTask> applying); 2810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Set Shell default wallpaper to customized. 2830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // It's wrapped as a callback and passed as a parameter to 2840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // CustomizationWallpaperDownloader. 2850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void OnOEMWallpaperDownloaded(scoped_ptr<ApplyingTask> applying, 2860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool success, 2870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const GURL& wallpaper_url); 2880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Register one of Customization applying tasks. 2900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void ApplyingTaskStarted(); 2910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Mark task finished and check for "all customization applied". 2930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void ApplyingTaskFinished(bool success); 2940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Services customization manifest URL. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URLFetcher instance. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::URLFetcher> url_fetcher_; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // How many times we already tried to fetch customization manifest file. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_retries_; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Manifest fetch is already in progress. 305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool fetch_started_; 306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 307effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Delay between checks for network online state. 308effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeDelta network_delay_; 309effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Known external loaders. 311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ExternalLoaders external_loaders_; 312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<CustomizationWallpaperDownloader> wallpaper_downloader_; 3140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // This is barrier until customization is applied. 3160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // When number of finished tasks match number of started - customization is 3170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // applied. 3180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch size_t apply_tasks_started_; 3190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch size_t apply_tasks_finished_; 3200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // This is the number of successfully finished customization tasks. 3220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // If it matches number of tasks finished - customization is applied 3230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // successfully. 3240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch size_t apply_tasks_success_; 3250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 326effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Weak factory for callbacks. 327effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::WeakPtrFactory<ServicesCustomizationDocument> weak_ptr_factory_; 328effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ServicesCustomizationDocument); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_CHROMEOS_CUSTOMIZATION_DOCUMENT_H_ 335