customization_document.h revision effb81e5f8246d0db0270817048dc992db66e9fb
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)
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This test is in global namespace so it must be declared here.
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Test__InitStartupCustomizationDocument(const std::string& manifest);
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ServicesCustomizationExternalLoader;
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (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;
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  friend void ::Test__InitStartupCustomizationDocument(
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
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// outside this class by calling StartFetching() method.
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// User of the file should check IsReady before use it.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServicesCustomizationDocument : public CustomizationDocument,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      private net::URLFetcherDelegate {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ServicesCustomizationDocument* GetInstance();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers preferences.
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void RegisterPrefs(PrefRegistrySimple* registry);
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static const char kManifestUrl[];
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return true if the customization was applied. Customization is applied only
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // once per machine.
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static bool WasOOBECustomizationApplied();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start fetching customization document.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartFetching();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Apply customization and save in machine options that customization was
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // applied successfully. Return true if customization was applied.
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool ApplyOOBECustomization();
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns default wallpaper URL.
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GURL GetDefaultWallpaperUrl() const;
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns list of default apps.
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool GetDefaultApps(std::vector<std::string>* ids) const;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Creates an extensions::ExternalLoader that will provide OEM default apps.
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Cache of OEM default apps stored in profile preferences.
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  extensions::ExternalLoader* CreateExternalLoader(Profile* profile);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Returns the name of the folder for OEM apps for given |locale|.
173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string GetOemAppsFolderName(const std::string& locale) const;
174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Initialize instance of ServicesCustomizationDocument for tests that will
176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // override singleton until ShutdownForTesting is called.
177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  static void InitializeForTesting();
178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Remove instance of ServicesCustomizationDocument for tests.
180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  static void ShutdownForTesting();
181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct DefaultSingletonTraits<ServicesCustomizationDocument>;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  typedef std::vector<base::WeakPtr<ServicesCustomizationExternalLoader> >
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ExternalLoaders;
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // C-tor for singleton construction.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ServicesCustomizationDocument();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // C-tor for test construction.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ServicesCustomizationDocument(const std::string& manifest);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ServicesCustomizationDocument();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save applied state in machine settings.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void SetApplied(bool val);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Overriden from CustomizationDocument:
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual bool LoadManifestFromString(const std::string& manifest) OVERRIDE;
201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overriden from net::URLFetcherDelegate:
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Initiate file fetching. Wait for online status.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartFileFetch();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Initiate file fetching. Don't wait for online status.
209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void DoStartFileFetch();
210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Executes on FILE thread and reads file to string.
212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  static void ReadFileInBackground(
213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::WeakPtr<ServicesCustomizationDocument> self,
214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const base::FilePath& file);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Called on UI thread with results of ReadFileInBackground.
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnManifesteRead(const std::string& manifest);
218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Method called when manifest was successfully loaded.
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnManifestLoaded();
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns list of default apps in ExternalProvider format.
223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static scoped_ptr<base::DictionaryValue> GetDefaultAppsInProviderFormat(
224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const base::DictionaryValue& root);
225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Update cached manifest for |profile|.
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void UpdateCachedManifest(Profile* profile);
228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Customization document not found for give ID.
230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void OnCustomizationNotFound();
231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Set OEM apps folder name for AppListSyncableService for |profile|.
233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void SetOemFolderName(Profile* profile, const base::DictionaryValue& root);
234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Returns the name of the folder for OEM apps for given |locale|.
236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string GetOemAppsFolderNameImpl(
237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const std::string& locale,
238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const base::DictionaryValue& root) const;
239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Services customization manifest URL.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLFetcher instance.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::URLFetcher> url_fetcher_;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // How many times we already tried to fetch customization manifest file.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_retries_;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Manifest fetch is already in progress.
250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool fetch_started_;
251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Delay between checks for network online state.
253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::TimeDelta network_delay_;
254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Known external loaders.
256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ExternalLoaders external_loaders_;
257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Weak factory for callbacks.
259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::WeakPtrFactory<ServicesCustomizationDocument> weak_ptr_factory_;
260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ServicesCustomizationDocument);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_CUSTOMIZATION_DOCUMENT_H_
267