master_preferences.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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
3// found in the LICENSE file.
4//
5// This file contains functions processing master preference file used by
6// setup and first run.
7
8#ifndef CHROME_INSTALLER_UTIL_MASTER_PREFERENCES_H_
9#define CHROME_INSTALLER_UTIL_MASTER_PREFERENCES_H_
10
11#include <string>
12#include <vector>
13
14#include "base/command_line.h"
15#include "base/memory/scoped_ptr.h"
16
17namespace base {
18class DictionaryValue;
19class FilePath;
20}
21
22namespace installer {
23
24#if !defined(OS_MACOSX)
25// This is the default name for the master preferences file used to pre-set
26// values in the user profile at first run.
27const char kDefaultMasterPrefs[] = "master_preferences";
28#endif
29
30// The master preferences is a JSON file with the same entries as the
31// 'Default\Preferences' file. This function parses the distribution
32// section of the preferences file.
33//
34// A prototypical 'master_preferences' file looks like this:
35//
36// {
37//   "distribution": {
38//      "alternate_shortcut_text": false,
39//      "auto_launch_chrome": false,
40//      "chrome_shortcut_icon_index": 0,
41//      "create_all_shortcuts": true,
42//      "import_bookmarks": false,
43//      "import_bookmarks_from_file": "c:\\path",
44//      "import_history": false,
45//      "import_home_page": false,
46//      "import_search_engine": true,
47//      "ping_delay": 40,
48//      "show_welcome_page": true,
49//      "skip_first_run_ui": true,
50//      "do_not_launch_chrome": false,
51//      "make_chrome_default": false,
52//      "make_chrome_default_for_user": true,
53//      "require_eula": true,
54//      "system_level": false,
55//      "verbose_logging": true
56//   },
57//   "browser": {
58//      "show_home_button": true
59//   },
60//   "bookmark_bar": {
61//      "show_on_all_tabs": true
62//   },
63//   "first_run_tabs": [
64//      "http://gmail.com",
65//      "https://igoogle.com"
66//   ],
67//   "homepage": "http://example.org",
68//   "homepage_is_newtabpage": false
69// }
70//
71// A reserved "distribution" entry in the file is used to group related
72// installation properties. This entry will be ignored at other times.
73// This function parses the 'distribution' entry and returns a combination
74// of MasterPrefResult.
75
76class MasterPreferences {
77 public:
78  // Construct a master preferences from the current process' current command
79  // line. Equivalent to calling
80  // MasterPreferences(*CommandLine::ForCurrentProcess()).
81  MasterPreferences();
82
83  // Parses the command line and optionally reads the master preferences file
84  // to get distribution related install options (if the "installerdata" switch
85  // is present in the command line.
86  // The options from the preference file and command line are merged, with the
87  // ones from the command line taking precedence in case of a conflict.
88  explicit MasterPreferences(const CommandLine& cmd_line);
89
90  // Parses a specific preferences file and does not merge any command line
91  // switches with the distribution dictionary.
92  explicit MasterPreferences(const base::FilePath& prefs_path);
93
94  // Parses a preferences directly from |prefs| and does not merge any command
95  // line switches with the distribution dictionary.
96  explicit MasterPreferences(const std::string& prefs);
97
98  ~MasterPreferences();
99
100  // Each of the Get methods below returns true if the named value was found in
101  // the distribution dictionary and its value assigned to the 'value'
102  // parameter.  If the value wasn't found, the return value is false.
103  bool GetBool(const std::string& name, bool* value) const;
104  bool GetInt(const std::string& name, int* value) const;
105  bool GetString(const std::string& name, std::string* value) const;
106
107  // As part of the master preferences an optional section indicates the tabs
108  // to open during first run. An example is the following:
109  //
110  //  {
111  //    "first_run_tabs": [
112  //       "http://google.com/f1",
113  //       "https://google.com/f2"
114  //    ]
115  //  }
116  //
117  // Note that the entries are usually urls but they don't have to be.
118  //
119  // An empty vector is returned if the first_run_tabs preference is absent.
120  std::vector<std::string> GetFirstRunTabs() const;
121
122  // The master preferences can also contain a regular extensions
123  // preference block. If so, the extensions referenced there will be
124  // installed during the first run experience.
125  // An extension can go in the master prefs needs just the basic
126  // elements such as:
127  //   1- An extension entry under settings, assigned by the gallery
128  //   2- The "location" : 1 entry
129  //   3- A minimal "manifest" block with key, name, permissions, update url
130  //      and version. The version needs to be lower than the version of
131  //      the extension that is hosted in the gallery.
132  //   4- The "path" entry with the version as last component
133  //   5- The "state" : 1 entry
134  //
135  // The following is an example of a master pref file that installs
136  // Google XYZ:
137  //
138  //  {
139  //     "extensions": {
140  //        "settings": {
141  //           "ppflmjolhbonpkbkooiamcnenbmbjcbb": {
142  //              "location": 1,
143  //              "manifest": {
144  //                 "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4<rest of key ommited>",
145  //                 "name": "Google XYZ (Installing...)",
146  //                 "permissions": [ "tabs", "http://xyz.google.com/" ],
147  //                 "update_url": "http://fixme.com/fixme/fixme/crx",
148  //                 "version": "0.0"
149  //              },
150  //              "path": "ppflmjolhbonpkbkooiamcnenbmbjcbb\\0.0",
151  //              "state": 1
152  //           }
153  //        }
154  //     }
155  //  }
156  //
157  bool GetExtensionsBlock(base::DictionaryValue** extensions) const;
158
159  // Returns the variations seed entry from the master prefs.
160  std::string GetVariationsSeed() const;
161
162  // Returns true iff the master preferences were successfully read from a file.
163  bool read_from_file() const {
164    return preferences_read_from_file_;
165  }
166
167  bool install_chrome() const {
168    return chrome_;
169  }
170
171  bool install_chrome_app_launcher() const {
172    return chrome_app_launcher_;
173  }
174
175  bool install_chrome_frame() const {
176    return chrome_frame_;
177  }
178
179  bool is_multi_install() const {
180    return multi_install_;
181  }
182
183  // Returns a static preference object that has been initialized with the
184  // CommandLine object for the current process.
185  // NOTE: Must not be called before CommandLine::Init() is called!
186  // OTHER NOTE: Not thread safe.
187  static const MasterPreferences& ForCurrentProcess();
188
189 protected:
190  void InitializeFromCommandLine(const CommandLine& cmd_line);
191
192  // Initializes the instance from a given JSON string, returning true if the
193  // string was successfully parsed.
194  bool InitializeFromString(const std::string& json_data);
195
196  void InitializeProductFlags();
197
198  // Enforces legacy preferences that should no longer be used, but could be
199  // found in older master_preferences files.
200  void EnforceLegacyPreferences();
201
202 protected:
203  scoped_ptr<base::DictionaryValue> master_dictionary_;
204  base::DictionaryValue* distribution_;
205  bool preferences_read_from_file_;
206  bool chrome_;
207  bool chrome_app_launcher_;
208  bool chrome_frame_;
209  bool multi_install_;
210
211 private:
212  DISALLOW_COPY_AND_ASSIGN(MasterPreferences);
213};
214
215}  // namespace installer
216
217#endif  // CHROME_INSTALLER_UTIL_MASTER_PREFERENCES_H_
218