Index: chrome/browser/chromeos/customization_document.h |
diff --git a/chrome/browser/chromeos/customization_document.h b/chrome/browser/chromeos/customization_document.h |
index 91970c604b24a23f9f04603bf832b26550eaeb9c..66d711aff8d49b0a6463ad865559d686e1f44dd8 100644 |
--- a/chrome/browser/chromeos/customization_document.h |
+++ b/chrome/browser/chromeos/customization_document.h |
@@ -8,12 +8,18 @@ |
#include <string> |
-#include "base/file_path.h" |
+#include "base/gtest_prod_util.h" |
#include "base/memory/scoped_ptr.h" |
+#include "base/memory/singleton.h" |
+#include "base/timer.h" |
#include "base/values.h" |
+#include "chrome/common/net/url_fetcher.h" |
+#include "googleurl/src/gurl.h" |
class DictionaryValue; |
+class FilePath; |
class ListValue; |
+class PrefService; |
namespace chromeos { |
@@ -22,13 +28,17 @@ class SystemAccess; |
// Base class for OEM customization document classes. |
class CustomizationDocument { |
public: |
- CustomizationDocument() {} |
virtual ~CustomizationDocument() {} |
+ // Return true if the document was successfully fetched and parsed. |
+ bool IsReady() const { return root_.get(); } |
+ |
+ protected: |
+ CustomizationDocument() {} |
+ |
virtual bool LoadManifestFromFile(const FilePath& manifest_path); |
virtual bool LoadManifestFromString(const std::string& manifest); |
- protected: |
std::string GetLocaleSpecificString(const std::string& locale, |
const std::string& dictionary_name, |
const std::string& entry_name) const; |
@@ -40,11 +50,12 @@ class CustomizationDocument { |
}; |
// OEM startup customization document class. |
+// Now StartupCustomizationDocument is loaded in c-tor so just after create it |
+// may be ready or not (if manifest is missing or corrupted) and this state |
+// won't be changed later (i.e. IsReady() always return the same value). |
class StartupCustomizationDocument : public CustomizationDocument { |
public: |
- explicit StartupCustomizationDocument(SystemAccess* system_access); |
- |
- virtual bool LoadManifestFromString(const std::string& manifest); |
+ static StartupCustomizationDocument* GetInstance(); |
const std::string& initial_locale() const { return initial_locale_; } |
const std::string& initial_timezone() const { return initial_timezone_; } |
@@ -55,11 +66,23 @@ class StartupCustomizationDocument : public CustomizationDocument { |
std::string GetEULAPage(const std::string& locale) const; |
private: |
+ FRIEND_TEST(StartupCustomizationDocumentTest, Basic); |
+ FRIEND_TEST(StartupCustomizationDocumentTest, VPD); |
+ FRIEND_TEST(StartupCustomizationDocumentTest, BadManifest); |
+ friend struct DefaultSingletonTraits<StartupCustomizationDocument>; |
+ |
+ // C-tor for singleton construction. |
+ StartupCustomizationDocument(); |
+ |
+ // C-tor for test construction. |
+ StartupCustomizationDocument(SystemAccess* system_access, |
+ const std::string& manifest); |
+ |
+ void Init(SystemAccess* system_access); |
+ |
// If |attr| exists in machine stat, assign it to |value|. |
void InitFromMachineStatistic(const char* attr, std::string* value); |
- SystemAccess* system_access_; |
- |
std::string initial_locale_; |
std::string initial_timezone_; |
std::string keyboard_layout_; |
@@ -69,14 +92,72 @@ class StartupCustomizationDocument : public CustomizationDocument { |
}; |
// OEM services customization document class. |
-class ServicesCustomizationDocument : public CustomizationDocument { |
+// ServicesCustomizationDocument is fetched from network or local file but on |
+// FILE thread therefore it may not be ready just after creation. Fetching of |
+// the manifest should be initiated outside this class by calling |
+// StartFetching() method. User of the file should check IsReady before use it. |
+class ServicesCustomizationDocument : public CustomizationDocument, |
+ private URLFetcher::Delegate { |
public: |
- ServicesCustomizationDocument() {} |
+ static ServicesCustomizationDocument* GetInstance(); |
+ |
+ // Registers preferences. |
+ static void RegisterPrefs(PrefService* local_state); |
+ |
+ // Return true if the customization was applied. Customization is applied only |
+ // once per machine. |
+ static bool WasApplied(); |
+ |
+ // Start fetching customization document. |
+ void StartFetching(); |
+ |
+ // Apply customization and save in machine options that customization was |
+ // applied successfully. Return true if customization was applied. |
+ bool ApplyCustomization(); |
std::string GetInitialStartPage(const std::string& locale) const; |
std::string GetSupportPage(const std::string& locale) const; |
private: |
+ FRIEND_TEST(ServicesCustomizationDocumentTest, Basic); |
+ FRIEND_TEST(ServicesCustomizationDocumentTest, BadManifest); |
+ friend struct DefaultSingletonTraits<ServicesCustomizationDocument>; |
+ |
+ // C-tor for singleton construction. |
+ ServicesCustomizationDocument(); |
+ |
+ // C-tor for test construction. |
+ explicit ServicesCustomizationDocument(const std::string& manifest); |
+ |
+ // Save applied state in machine settings. |
+ static void SetApplied(bool val); |
+ |
+ // Overriden from URLFetcher::Delegate: |
+ virtual void OnURLFetchComplete(const URLFetcher* source, |
+ const GURL& url, |
+ const net::URLRequestStatus& status, |
+ int response_code, |
+ const ResponseCookies& cookies, |
+ const std::string& data); |
+ |
+ // Initiate file fetching. |
+ void StartFileFetch(); |
+ |
+ // Executes on FILE thread and reads file to string. |
+ void ReadFileInBackground(const FilePath& file); |
+ |
+ // Services customization manifest URL. |
+ GURL url_; |
+ |
+ // URLFetcher instance. |
+ scoped_ptr<URLFetcher> url_fetcher_; |
+ |
+ // Timer to retry fetching file if network is not available. |
+ base::OneShotTimer<ServicesCustomizationDocument> retry_timer_; |
+ |
+ // How many times we already tried to fetch customization manifest file. |
+ int num_retries_; |
+ |
DISALLOW_COPY_AND_ASSIGN(ServicesCustomizationDocument); |
}; |