OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/extensions/extension_prefs.h" | 5 #include "chrome/browser/extensions/extension_prefs.h" |
6 | 6 |
7 #include "base/string_util.h" | 7 #include "base/string_util.h" |
8 #include "base/string_number_conversions.h" | 8 #include "base/string_number_conversions.h" |
9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
10 #include "chrome/common/extensions/extension.h" | 10 #include "chrome/common/extensions/extension.h" |
11 #include "chrome/common/pref_names.h" | 11 #include "chrome/common/pref_names.h" |
12 | 12 |
13 using base::Time; | 13 using base::Time; |
14 | 14 |
15 namespace { | 15 namespace { |
16 | 16 |
17 // Additional preferences keys | 17 // Preferences keys |
| 18 |
| 19 // A preference that keeps track of per-extension settings. This is a dictionary |
| 20 // object read from the Preferences file, keyed off of extension id's. |
| 21 const char kExtensionsPref[] = "extensions.settings"; |
18 | 22 |
19 // Where an extension was installed from. (see Extension::Location) | 23 // Where an extension was installed from. (see Extension::Location) |
20 const char kPrefLocation[] = "location"; | 24 const char kPrefLocation[] = "location"; |
21 | 25 |
22 // Enabled, disabled, killed, etc. (see Extension::State) | 26 // Enabled, disabled, killed, etc. (see Extension::State) |
23 const char kPrefState[] = "state"; | 27 const char kPrefState[] = "state"; |
24 | 28 |
25 // The path to the current version's manifest file. | 29 // The path to the current version's manifest file. |
26 const char kPrefPath[] = "path"; | 30 const char kPrefPath[] = "path"; |
27 | 31 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 const char kPrefIncognitoEnabled[] = "incognito"; | 72 const char kPrefIncognitoEnabled[] = "incognito"; |
69 | 73 |
70 // A preference to control whether an extension is allowed to inject script in | 74 // A preference to control whether an extension is allowed to inject script in |
71 // pages with file URLs. | 75 // pages with file URLs. |
72 const char kPrefAllowFileAccess[] = "allowFileAccess"; | 76 const char kPrefAllowFileAccess[] = "allowFileAccess"; |
73 | 77 |
74 // A preference set by the web store to indicate login information for | 78 // A preference set by the web store to indicate login information for |
75 // purchased apps. | 79 // purchased apps. |
76 const char kWebStoreLogin[] = "extensions.webstore_login"; | 80 const char kWebStoreLogin[] = "extensions.webstore_login"; |
77 | 81 |
78 // A preference set by the the NTP to persist the desired launch container type | |
79 // used for apps. | |
80 const char kPrefLaunchType[] = "launchType"; | |
81 | |
82 } // namespace | 82 } // namespace |
83 | 83 |
84 //////////////////////////////////////////////////////////////////////////////// | 84 //////////////////////////////////////////////////////////////////////////////// |
85 | 85 |
86 namespace { | 86 namespace { |
87 | 87 |
88 // TODO(asargent) - This is cleanup code for a key that was introduced into | 88 // TODO(asargent) - This is cleanup code for a key that was introduced into |
89 // the extensions.settings sub-dictionary which wasn't a valid extension | 89 // the extensions.settings sub-dictionary which wasn't a valid extension |
90 // id. We can remove this in a couple of months. (See http://crbug.com/40017 | 90 // id. We can remove this in a couple of months. (See http://crbug.com/40017 |
91 // and http://crbug.com/39745 for more details). | 91 // and http://crbug.com/39745 for more details). |
92 static void CleanupBadExtensionKeys(PrefService* prefs) { | 92 static void CleanupBadExtensionKeys(PrefService* prefs) { |
93 DictionaryValue* dictionary = | 93 DictionaryValue* dictionary = prefs->GetMutableDictionary(kExtensionsPref); |
94 prefs->GetMutableDictionary(ExtensionPrefs::kExtensionsPref); | |
95 std::set<std::string> bad_keys; | 94 std::set<std::string> bad_keys; |
96 for (DictionaryValue::key_iterator i = dictionary->begin_keys(); | 95 for (DictionaryValue::key_iterator i = dictionary->begin_keys(); |
97 i != dictionary->end_keys(); ++i) { | 96 i != dictionary->end_keys(); ++i) { |
98 const std::string& key_name(*i); | 97 const std::string& key_name(*i); |
99 if (!Extension::IdIsValid(key_name)) { | 98 if (!Extension::IdIsValid(key_name)) { |
100 bad_keys.insert(key_name); | 99 bad_keys.insert(key_name); |
101 } | 100 } |
102 } | 101 } |
103 bool dirty = false; | 102 bool dirty = false; |
104 for (std::set<std::string>::iterator i = bad_keys.begin(); | 103 for (std::set<std::string>::iterator i = bad_keys.begin(); |
(...skipping 10 matching lines...) Expand all Loading... |
115 ExtensionPrefs::ExtensionPrefs(PrefService* prefs, const FilePath& root_dir) | 114 ExtensionPrefs::ExtensionPrefs(PrefService* prefs, const FilePath& root_dir) |
116 : prefs_(prefs), | 115 : prefs_(prefs), |
117 install_directory_(root_dir) { | 116 install_directory_(root_dir) { |
118 // TODO(asargent) - Remove this in a couple of months. (See comment above | 117 // TODO(asargent) - Remove this in a couple of months. (See comment above |
119 // CleanupBadExtensionKeys). | 118 // CleanupBadExtensionKeys). |
120 CleanupBadExtensionKeys(prefs); | 119 CleanupBadExtensionKeys(prefs); |
121 | 120 |
122 MakePathsRelative(); | 121 MakePathsRelative(); |
123 } | 122 } |
124 | 123 |
125 // static | |
126 const char ExtensionPrefs::kExtensionsPref[] = "extensions.settings"; | |
127 | |
128 static FilePath::StringType MakePathRelative(const FilePath& parent, | 124 static FilePath::StringType MakePathRelative(const FilePath& parent, |
129 const FilePath& child, | 125 const FilePath& child, |
130 bool *dirty) { | 126 bool *dirty) { |
131 if (!parent.IsParent(child)) | 127 if (!parent.IsParent(child)) |
132 return child.value(); | 128 return child.value(); |
133 | 129 |
134 if (dirty) | 130 if (dirty) |
135 *dirty = true; | 131 *dirty = true; |
136 FilePath::StringType retval = child.value().substr( | 132 FilePath::StringType retval = child.value().substr( |
137 parent.value().length()); | 133 parent.value().length()); |
(...skipping 23 matching lines...) Expand all Loading... |
161 FilePath::StringType path_string; | 157 FilePath::StringType path_string; |
162 if (!extension_dict->GetString(kPrefPath, &path_string)) | 158 if (!extension_dict->GetString(kPrefPath, &path_string)) |
163 continue; | 159 continue; |
164 FilePath path(path_string); | 160 FilePath path(path_string); |
165 if (path.IsAbsolute()) { | 161 if (path.IsAbsolute()) { |
166 extension_dict->SetString(kPrefPath, | 162 extension_dict->SetString(kPrefPath, |
167 MakePathRelative(install_directory_, path, &dirty)); | 163 MakePathRelative(install_directory_, path, &dirty)); |
168 } | 164 } |
169 } | 165 } |
170 if (dirty) | 166 if (dirty) |
171 SavePrefsAndNotify(); | 167 prefs_->ScheduleSavePersistentPrefs(); |
172 } | 168 } |
173 | 169 |
174 void ExtensionPrefs::MakePathsAbsolute(DictionaryValue* dict) { | 170 void ExtensionPrefs::MakePathsAbsolute(DictionaryValue* dict) { |
175 if (!dict || dict->empty()) | 171 if (!dict || dict->empty()) |
176 return; | 172 return; |
177 | 173 |
178 for (DictionaryValue::key_iterator i = dict->begin_keys(); | 174 for (DictionaryValue::key_iterator i = dict->begin_keys(); |
179 i != dict->end_keys(); ++i) { | 175 i != dict->end_keys(); ++i) { |
180 DictionaryValue* extension_dict; | 176 DictionaryValue* extension_dict; |
181 if (!dict->GetDictionaryWithoutPathExpansion(*i, &extension_dict)) { | 177 if (!dict->GetDictionaryWithoutPathExpansion(*i, &extension_dict)) { |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 return false; | 226 return false; |
231 | 227 |
232 DictionaryValue* ext = NULL; | 228 DictionaryValue* ext = NULL; |
233 if (!extensions->GetDictionary(extension_id, &ext)) { | 229 if (!extensions->GetDictionary(extension_id, &ext)) { |
234 // No such extension yet. | 230 // No such extension yet. |
235 return false; | 231 return false; |
236 } | 232 } |
237 return ReadBooleanFromPref(ext, pref_key); | 233 return ReadBooleanFromPref(ext, pref_key); |
238 } | 234 } |
239 | 235 |
240 bool ExtensionPrefs::ReadIntegerFromPref( | |
241 DictionaryValue* ext, const std::string& pref_key, int* out_value) { | |
242 if (!ext->HasKey(pref_key)) return false; | |
243 if (!ext->GetInteger(pref_key, out_value)) { | |
244 NOTREACHED() << "Failed to fetch " << pref_key << " flag."; | |
245 // In case we could not fetch the flag, we treat it as false. | |
246 return false; | |
247 } | |
248 return out_value; | |
249 } | |
250 | |
251 bool ExtensionPrefs::ReadExtensionPrefInteger( | |
252 const std::string& extension_id, const std::string& pref_key, | |
253 int* out_value) { | |
254 const DictionaryValue* extensions = prefs_->GetDictionary(kExtensionsPref); | |
255 if (!extensions) | |
256 return false; | |
257 DictionaryValue* ext = NULL; | |
258 if (!extensions->GetDictionary(extension_id, &ext)) { | |
259 // No such extension yet. | |
260 return false; | |
261 } | |
262 return ReadIntegerFromPref(ext, pref_key, out_value); | |
263 } | |
264 | |
265 void ExtensionPrefs::SavePrefsAndNotify() { | |
266 prefs_->ScheduleSavePersistentPrefs(); | |
267 prefs_->pref_notifier()->OnUserPreferenceSet(kExtensionsPref); | |
268 } | |
269 | |
270 bool ExtensionPrefs::IsBlacklistBitSet(DictionaryValue* ext) { | 236 bool ExtensionPrefs::IsBlacklistBitSet(DictionaryValue* ext) { |
271 return ReadBooleanFromPref(ext, kPrefBlacklist); | 237 return ReadBooleanFromPref(ext, kPrefBlacklist); |
272 } | 238 } |
273 | 239 |
274 bool ExtensionPrefs::IsExtensionBlacklisted(const std::string& extension_id) { | 240 bool ExtensionPrefs::IsExtensionBlacklisted(const std::string& extension_id) { |
275 return ReadExtensionPrefBoolean(extension_id, kPrefBlacklist); | 241 return ReadExtensionPrefBoolean(extension_id, kPrefBlacklist); |
276 } | 242 } |
277 | 243 |
278 bool ExtensionPrefs::IsExtensionAllowedByPolicy( | 244 bool ExtensionPrefs::IsExtensionAllowedByPolicy( |
279 const std::string& extension_id) { | 245 const std::string& extension_id) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 bool ExtensionPrefs::DidExtensionEscalatePermissions( | 282 bool ExtensionPrefs::DidExtensionEscalatePermissions( |
317 const std::string& extension_id) { | 283 const std::string& extension_id) { |
318 return ReadExtensionPrefBoolean(extension_id, | 284 return ReadExtensionPrefBoolean(extension_id, |
319 kExtensionDidEscalatePermissions); | 285 kExtensionDidEscalatePermissions); |
320 } | 286 } |
321 | 287 |
322 void ExtensionPrefs::SetDidExtensionEscalatePermissions( | 288 void ExtensionPrefs::SetDidExtensionEscalatePermissions( |
323 Extension* extension, bool did_escalate) { | 289 Extension* extension, bool did_escalate) { |
324 UpdateExtensionPref(extension->id(), kExtensionDidEscalatePermissions, | 290 UpdateExtensionPref(extension->id(), kExtensionDidEscalatePermissions, |
325 Value::CreateBooleanValue(did_escalate)); | 291 Value::CreateBooleanValue(did_escalate)); |
326 prefs_->ScheduleSavePersistentPrefs(); | 292 prefs_->SavePersistentPrefs(); |
327 } | 293 } |
328 | 294 |
329 void ExtensionPrefs::UpdateBlacklist( | 295 void ExtensionPrefs::UpdateBlacklist( |
330 const std::set<std::string>& blacklist_set) { | 296 const std::set<std::string>& blacklist_set) { |
331 std::vector<std::string> remove_pref_ids; | 297 std::vector<std::string> remove_pref_ids; |
332 std::set<std::string> used_id_set; | 298 std::set<std::string> used_id_set; |
333 const DictionaryValue* extensions = prefs_->GetDictionary(kExtensionsPref); | 299 const DictionaryValue* extensions = prefs_->GetDictionary(kExtensionsPref); |
334 | 300 |
335 if (extensions) { | 301 if (extensions) { |
336 for (DictionaryValue::key_iterator extension_id = extensions->begin_keys(); | 302 for (DictionaryValue::key_iterator extension_id = extensions->begin_keys(); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 std::set<std::string>::const_iterator set_itr = blacklist_set.begin(); | 336 std::set<std::string>::const_iterator set_itr = blacklist_set.begin(); |
371 for (; set_itr != blacklist_set.end(); ++set_itr) { | 337 for (; set_itr != blacklist_set.end(); ++set_itr) { |
372 if (used_id_set.find(*set_itr) == used_id_set.end()) { | 338 if (used_id_set.find(*set_itr) == used_id_set.end()) { |
373 UpdateExtensionPref(*set_itr, kPrefBlacklist, | 339 UpdateExtensionPref(*set_itr, kPrefBlacklist, |
374 Value::CreateBooleanValue(true)); | 340 Value::CreateBooleanValue(true)); |
375 } | 341 } |
376 } | 342 } |
377 for (unsigned int i = 0; i < remove_pref_ids.size(); ++i) { | 343 for (unsigned int i = 0; i < remove_pref_ids.size(); ++i) { |
378 DeleteExtensionPrefs(remove_pref_ids[i]); | 344 DeleteExtensionPrefs(remove_pref_ids[i]); |
379 } | 345 } |
380 SavePrefsAndNotify(); | 346 // Update persistent registry |
| 347 prefs_->ScheduleSavePersistentPrefs(); |
381 return; | 348 return; |
382 } | 349 } |
383 | 350 |
384 Time ExtensionPrefs::LastPingDayImpl(const DictionaryValue* dictionary) const { | 351 Time ExtensionPrefs::LastPingDayImpl(const DictionaryValue* dictionary) const { |
385 if (dictionary && dictionary->HasKey(kLastPingDay)) { | 352 if (dictionary && dictionary->HasKey(kLastPingDay)) { |
386 std::string string_value; | 353 std::string string_value; |
387 int64 value; | 354 int64 value; |
388 dictionary->GetString(kLastPingDay, &string_value); | 355 dictionary->GetString(kLastPingDay, &string_value); |
389 if (base::StringToInt64(string_value, &value)) { | 356 if (base::StringToInt64(string_value, &value)) { |
390 return Time::FromInternalValue(value); | 357 return Time::FromInternalValue(value); |
391 } | 358 } |
392 } | 359 } |
393 return Time(); | 360 return Time(); |
394 } | 361 } |
395 | 362 |
396 void ExtensionPrefs::SetLastPingDayImpl(const Time& time, | 363 void ExtensionPrefs::SetLastPingDayImpl(const Time& time, |
397 DictionaryValue* dictionary) { | 364 DictionaryValue* dictionary) { |
398 if (!dictionary) { | 365 if (!dictionary) { |
399 NOTREACHED(); | 366 NOTREACHED(); |
400 return; | 367 return; |
401 } | 368 } |
402 std::string value = base::Int64ToString(time.ToInternalValue()); | 369 std::string value = base::Int64ToString(time.ToInternalValue()); |
403 dictionary->SetString(kLastPingDay, value); | 370 dictionary->SetString(kLastPingDay, value); |
404 SavePrefsAndNotify(); | 371 prefs_->ScheduleSavePersistentPrefs(); |
405 } | 372 } |
406 | 373 |
407 Time ExtensionPrefs::LastPingDay(const std::string& extension_id) const { | 374 Time ExtensionPrefs::LastPingDay(const std::string& extension_id) const { |
408 DCHECK(Extension::IdIsValid(extension_id)); | 375 DCHECK(Extension::IdIsValid(extension_id)); |
409 return LastPingDayImpl(GetExtensionPref(extension_id)); | 376 return LastPingDayImpl(GetExtensionPref(extension_id)); |
410 } | 377 } |
411 | 378 |
412 Time ExtensionPrefs::BlacklistLastPingDay() const { | 379 Time ExtensionPrefs::BlacklistLastPingDay() const { |
413 return LastPingDayImpl(prefs_->GetDictionary(kExtensionsBlacklistUpdate)); | 380 return LastPingDayImpl(prefs_->GetDictionary(kExtensionsBlacklistUpdate)); |
414 } | 381 } |
(...skipping 10 matching lines...) Expand all Loading... |
425 } | 392 } |
426 | 393 |
427 bool ExtensionPrefs::IsIncognitoEnabled(const std::string& extension_id) { | 394 bool ExtensionPrefs::IsIncognitoEnabled(const std::string& extension_id) { |
428 return ReadExtensionPrefBoolean(extension_id, kPrefIncognitoEnabled); | 395 return ReadExtensionPrefBoolean(extension_id, kPrefIncognitoEnabled); |
429 } | 396 } |
430 | 397 |
431 void ExtensionPrefs::SetIsIncognitoEnabled(const std::string& extension_id, | 398 void ExtensionPrefs::SetIsIncognitoEnabled(const std::string& extension_id, |
432 bool enabled) { | 399 bool enabled) { |
433 UpdateExtensionPref(extension_id, kPrefIncognitoEnabled, | 400 UpdateExtensionPref(extension_id, kPrefIncognitoEnabled, |
434 Value::CreateBooleanValue(enabled)); | 401 Value::CreateBooleanValue(enabled)); |
435 SavePrefsAndNotify(); | 402 prefs_->SavePersistentPrefs(); |
436 } | 403 } |
437 | 404 |
438 bool ExtensionPrefs::AllowFileAccess(const std::string& extension_id) { | 405 bool ExtensionPrefs::AllowFileAccess(const std::string& extension_id) { |
439 return ReadExtensionPrefBoolean(extension_id, kPrefAllowFileAccess); | 406 return ReadExtensionPrefBoolean(extension_id, kPrefAllowFileAccess); |
440 } | 407 } |
441 | 408 |
442 void ExtensionPrefs::SetAllowFileAccess(const std::string& extension_id, | 409 void ExtensionPrefs::SetAllowFileAccess(const std::string& extension_id, |
443 bool allow) { | 410 bool allow) { |
444 UpdateExtensionPref(extension_id, kPrefAllowFileAccess, | 411 UpdateExtensionPref(extension_id, kPrefAllowFileAccess, |
445 Value::CreateBooleanValue(allow)); | 412 Value::CreateBooleanValue(allow)); |
446 SavePrefsAndNotify(); | 413 prefs_->SavePersistentPrefs(); |
447 } | |
448 | |
449 ExtensionPrefs::LaunchType ExtensionPrefs::GetLaunchType( | |
450 const std::string& extension_id) { | |
451 int value; | |
452 if (ReadExtensionPrefInteger(extension_id, kPrefLaunchType, &value) && ( | |
453 value == LAUNCH_PINNED || | |
454 value == LAUNCH_REGULAR || | |
455 value == LAUNCH_FULLSCREEN)) { | |
456 return static_cast<LaunchType>(value); | |
457 } | |
458 return LAUNCH_PINNED; | |
459 } | |
460 | |
461 void ExtensionPrefs::SetLaunchType(const std::string& extension_id, | |
462 LaunchType launch_type) { | |
463 UpdateExtensionPref(extension_id, kPrefLaunchType, | |
464 Value::CreateIntegerValue(static_cast<int>(launch_type))); | |
465 SavePrefsAndNotify(); | |
466 } | 414 } |
467 | 415 |
468 void ExtensionPrefs::GetKilledExtensionIds(std::set<std::string>* killed_ids) { | 416 void ExtensionPrefs::GetKilledExtensionIds(std::set<std::string>* killed_ids) { |
469 const DictionaryValue* dict = prefs_->GetDictionary(kExtensionsPref); | 417 const DictionaryValue* dict = prefs_->GetDictionary(kExtensionsPref); |
470 if (!dict || dict->empty()) | 418 if (!dict || dict->empty()) |
471 return; | 419 return; |
472 | 420 |
473 for (DictionaryValue::key_iterator i = dict->begin_keys(); | 421 for (DictionaryValue::key_iterator i = dict->begin_keys(); |
474 i != dict->end_keys(); ++i) { | 422 i != dict->end_keys(); ++i) { |
475 const std::string& key_name(*i); | 423 const std::string& key_name(*i); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 } | 455 } |
508 | 456 |
509 void ExtensionPrefs::SetToolbarOrder( | 457 void ExtensionPrefs::SetToolbarOrder( |
510 const std::vector<std::string>& extension_ids) { | 458 const std::vector<std::string>& extension_ids) { |
511 ListValue* toolbar_order = prefs_->GetMutableList(kExtensionToolbar); | 459 ListValue* toolbar_order = prefs_->GetMutableList(kExtensionToolbar); |
512 toolbar_order->Clear(); | 460 toolbar_order->Clear(); |
513 for (std::vector<std::string>::const_iterator iter = extension_ids.begin(); | 461 for (std::vector<std::string>::const_iterator iter = extension_ids.begin(); |
514 iter != extension_ids.end(); ++iter) { | 462 iter != extension_ids.end(); ++iter) { |
515 toolbar_order->Append(new StringValue(*iter)); | 463 toolbar_order->Append(new StringValue(*iter)); |
516 } | 464 } |
517 SavePrefsAndNotify(); | 465 prefs_->ScheduleSavePersistentPrefs(); |
518 } | 466 } |
519 | 467 |
520 void ExtensionPrefs::OnExtensionInstalled( | 468 void ExtensionPrefs::OnExtensionInstalled( |
521 Extension* extension, Extension::State initial_state, | 469 Extension* extension, Extension::State initial_state, |
522 bool initial_incognito_enabled) { | 470 bool initial_incognito_enabled) { |
523 const std::string& id = extension->id(); | 471 const std::string& id = extension->id(); |
524 UpdateExtensionPref(id, kPrefState, | 472 UpdateExtensionPref(id, kPrefState, |
525 Value::CreateIntegerValue(initial_state)); | 473 Value::CreateIntegerValue(initial_state)); |
526 UpdateExtensionPref(id, kPrefIncognitoEnabled, | 474 UpdateExtensionPref(id, kPrefIncognitoEnabled, |
527 Value::CreateBooleanValue(initial_incognito_enabled)); | 475 Value::CreateBooleanValue(initial_incognito_enabled)); |
528 UpdateExtensionPref(id, kPrefLocation, | 476 UpdateExtensionPref(id, kPrefLocation, |
529 Value::CreateIntegerValue(extension->location())); | 477 Value::CreateIntegerValue(extension->location())); |
530 FilePath::StringType path = MakePathRelative(install_directory_, | 478 FilePath::StringType path = MakePathRelative(install_directory_, |
531 extension->path(), NULL); | 479 extension->path(), NULL); |
532 UpdateExtensionPref(id, kPrefPath, Value::CreateStringValue(path)); | 480 UpdateExtensionPref(id, kPrefPath, Value::CreateStringValue(path)); |
533 // We store prefs about LOAD extensions, but don't cache their manifest | 481 // We store prefs about LOAD extensions, but don't cache their manifest |
534 // since it may change on disk. | 482 // since it may change on disk. |
535 if (extension->location() != Extension::LOAD) { | 483 if (extension->location() != Extension::LOAD) { |
536 UpdateExtensionPref(id, kPrefManifest, | 484 UpdateExtensionPref(id, kPrefManifest, |
537 extension->manifest_value()->DeepCopy()); | 485 extension->manifest_value()->DeepCopy()); |
538 } | 486 } |
539 SavePrefsAndNotify(); | 487 prefs_->SavePersistentPrefs(); |
540 } | 488 } |
541 | 489 |
542 void ExtensionPrefs::OnExtensionUninstalled(const std::string& extension_id, | 490 void ExtensionPrefs::OnExtensionUninstalled(const std::string& extension_id, |
543 const Extension::Location& location, | 491 const Extension::Location& location, |
544 bool external_uninstall) { | 492 bool external_uninstall) { |
545 // For external extensions, we save a preference reminding ourself not to try | 493 // For external extensions, we save a preference reminding ourself not to try |
546 // and install the extension anymore (except when |external_uninstall| is | 494 // and install the extension anymore (except when |external_uninstall| is |
547 // true, which signifies that the registry key was deleted or the pref file | 495 // true, which signifies that the registry key was deleted or the pref file |
548 // no longer lists the extension). | 496 // no longer lists the extension). |
549 if (!external_uninstall && Extension::IsExternalLocation(location)) { | 497 if (!external_uninstall && Extension::IsExternalLocation(location)) { |
550 UpdateExtensionPref(extension_id, kPrefState, | 498 UpdateExtensionPref(extension_id, kPrefState, |
551 Value::CreateIntegerValue(Extension::KILLBIT)); | 499 Value::CreateIntegerValue(Extension::KILLBIT)); |
552 SavePrefsAndNotify(); | 500 prefs_->ScheduleSavePersistentPrefs(); |
553 } else { | 501 } else { |
554 DeleteExtensionPrefs(extension_id); | 502 DeleteExtensionPrefs(extension_id); |
555 } | 503 } |
556 } | 504 } |
557 | 505 |
558 Extension::State ExtensionPrefs::GetExtensionState( | 506 Extension::State ExtensionPrefs::GetExtensionState( |
559 const std::string& extension_id) { | 507 const std::string& extension_id) { |
560 DictionaryValue* extension = GetExtensionPref(extension_id); | 508 DictionaryValue* extension = GetExtensionPref(extension_id); |
561 | 509 |
562 // If the extension doesn't have a pref, it's a --load-extension. | 510 // If the extension doesn't have a pref, it's a --load-extension. |
563 if (!extension) | 511 if (!extension) |
564 return Extension::ENABLED; | 512 return Extension::ENABLED; |
565 | 513 |
566 int state = -1; | 514 int state = -1; |
567 if (!extension->GetInteger(kPrefState, &state) || | 515 if (!extension->GetInteger(kPrefState, &state) || |
568 state < 0 || state >= Extension::NUM_STATES) { | 516 state < 0 || state >= Extension::NUM_STATES) { |
569 LOG(ERROR) << "Bad or missing pref 'state' for extension '" | 517 LOG(ERROR) << "Bad or missing pref 'state' for extension '" |
570 << extension_id << "'"; | 518 << extension_id << "'"; |
571 return Extension::ENABLED; | 519 return Extension::ENABLED; |
572 } | 520 } |
573 return static_cast<Extension::State>(state); | 521 return static_cast<Extension::State>(state); |
574 } | 522 } |
575 | 523 |
576 void ExtensionPrefs::SetExtensionState(Extension* extension, | 524 void ExtensionPrefs::SetExtensionState(Extension* extension, |
577 Extension::State state) { | 525 Extension::State state) { |
578 UpdateExtensionPref(extension->id(), kPrefState, | 526 UpdateExtensionPref(extension->id(), kPrefState, |
579 Value::CreateIntegerValue(state)); | 527 Value::CreateIntegerValue(state)); |
580 SavePrefsAndNotify(); | 528 prefs_->SavePersistentPrefs(); |
581 } | 529 } |
582 | 530 |
583 std::string ExtensionPrefs::GetVersionString(const std::string& extension_id) { | 531 std::string ExtensionPrefs::GetVersionString(const std::string& extension_id) { |
584 DictionaryValue* extension = GetExtensionPref(extension_id); | 532 DictionaryValue* extension = GetExtensionPref(extension_id); |
585 if (!extension) | 533 if (!extension) |
586 return std::string(); | 534 return std::string(); |
587 | 535 |
588 std::string version; | 536 std::string version; |
589 if (!extension->GetString(kPrefVersion, &version)) { | 537 if (!extension->GetString(kPrefVersion, &version)) { |
590 LOG(ERROR) << "Bad or missing pref 'version' for extension '" | 538 LOG(ERROR) << "Bad or missing pref 'version' for extension '" |
591 << extension_id << "'"; | 539 << extension_id << "'"; |
592 } | 540 } |
593 | 541 |
594 return version; | 542 return version; |
595 } | 543 } |
596 | 544 |
597 void ExtensionPrefs::UpdateManifest(Extension* extension) { | 545 void ExtensionPrefs::UpdateManifest(Extension* extension) { |
598 if (extension->location() != Extension::LOAD) { | 546 if (extension->location() != Extension::LOAD) { |
599 UpdateExtensionPref(extension->id(), kPrefManifest, | 547 UpdateExtensionPref(extension->id(), kPrefManifest, |
600 extension->manifest_value()->DeepCopy()); | 548 extension->manifest_value()->DeepCopy()); |
601 SavePrefsAndNotify(); | 549 prefs_->ScheduleSavePersistentPrefs(); |
602 } | 550 } |
603 } | 551 } |
604 | 552 |
605 FilePath ExtensionPrefs::GetExtensionPath(const std::string& extension_id) { | 553 FilePath ExtensionPrefs::GetExtensionPath(const std::string& extension_id) { |
606 const DictionaryValue* dict = prefs_->GetDictionary(kExtensionsPref); | 554 const DictionaryValue* dict = prefs_->GetDictionary(kExtensionsPref); |
607 if (!dict || dict->empty()) | 555 if (!dict || dict->empty()) |
608 return FilePath(); | 556 return FilePath(); |
609 | 557 |
610 std::string path; | 558 std::string path; |
611 if (!dict->GetString(extension_id + "." + kPrefPath, &path)) | 559 if (!dict->GetString(extension_id + "." + kPrefPath, &path)) |
(...skipping 10 matching lines...) Expand all Loading... |
622 return; | 570 return; |
623 } | 571 } |
624 DictionaryValue* extension = GetOrCreateExtensionPref(extension_id); | 572 DictionaryValue* extension = GetOrCreateExtensionPref(extension_id); |
625 extension->Set(key, data_value); | 573 extension->Set(key, data_value); |
626 } | 574 } |
627 | 575 |
628 void ExtensionPrefs::DeleteExtensionPrefs(const std::string& extension_id) { | 576 void ExtensionPrefs::DeleteExtensionPrefs(const std::string& extension_id) { |
629 DictionaryValue* dict = prefs_->GetMutableDictionary(kExtensionsPref); | 577 DictionaryValue* dict = prefs_->GetMutableDictionary(kExtensionsPref); |
630 if (dict->HasKey(extension_id)) { | 578 if (dict->HasKey(extension_id)) { |
631 dict->Remove(extension_id, NULL); | 579 dict->Remove(extension_id, NULL); |
632 SavePrefsAndNotify(); | 580 prefs_->ScheduleSavePersistentPrefs(); |
633 } | 581 } |
634 } | 582 } |
635 | 583 |
636 DictionaryValue* ExtensionPrefs::GetOrCreateExtensionPref( | 584 DictionaryValue* ExtensionPrefs::GetOrCreateExtensionPref( |
637 const std::string& extension_id) { | 585 const std::string& extension_id) { |
638 DCHECK(Extension::IdIsValid(extension_id)); | 586 DCHECK(Extension::IdIsValid(extension_id)); |
639 DictionaryValue* dict = prefs_->GetMutableDictionary(kExtensionsPref); | 587 DictionaryValue* dict = prefs_->GetMutableDictionary(kExtensionsPref); |
640 DictionaryValue* extension = NULL; | 588 DictionaryValue* extension = NULL; |
641 if (!dict->GetDictionary(extension_id, &extension)) { | 589 if (!dict->GetDictionary(extension_id, &extension)) { |
642 // Extension pref does not exist, create it. | 590 // Extension pref does not exist, create it. |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
762 NOTREACHED(); | 710 NOTREACHED(); |
763 return; | 711 return; |
764 } | 712 } |
765 extension_prefs->Remove(kIdleInstallInfo, NULL); | 713 extension_prefs->Remove(kIdleInstallInfo, NULL); |
766 DictionaryValue* info = new DictionaryValue(); | 714 DictionaryValue* info = new DictionaryValue(); |
767 info->SetString(kIdleInstallInfoCrxPath, crx_path.value()); | 715 info->SetString(kIdleInstallInfoCrxPath, crx_path.value()); |
768 info->SetString(kIdleInstallInfoVersion, version); | 716 info->SetString(kIdleInstallInfoVersion, version); |
769 info->SetString(kIdleInstallInfoFetchTime, | 717 info->SetString(kIdleInstallInfoFetchTime, |
770 base::Int64ToString(fetch_time.ToInternalValue())); | 718 base::Int64ToString(fetch_time.ToInternalValue())); |
771 extension_prefs->Set(kIdleInstallInfo, info); | 719 extension_prefs->Set(kIdleInstallInfo, info); |
772 SavePrefsAndNotify(); | 720 prefs_->ScheduleSavePersistentPrefs(); |
773 } | 721 } |
774 | 722 |
775 bool ExtensionPrefs::RemoveIdleInstallInfo(const std::string& extension_id) { | 723 bool ExtensionPrefs::RemoveIdleInstallInfo(const std::string& extension_id) { |
776 DictionaryValue* extension_prefs = GetExtensionPref(extension_id); | 724 DictionaryValue* extension_prefs = GetExtensionPref(extension_id); |
777 if (!extension_prefs) | 725 if (!extension_prefs) |
778 return false; | 726 return false; |
779 bool result = extension_prefs->Remove(kIdleInstallInfo, NULL); | 727 bool result = extension_prefs->Remove(kIdleInstallInfo, NULL); |
780 SavePrefsAndNotify(); | 728 prefs_->ScheduleSavePersistentPrefs(); |
781 return result; | 729 return result; |
782 } | 730 } |
783 | 731 |
784 bool ExtensionPrefs::GetIdleInstallInfo(const std::string& extension_id, | 732 bool ExtensionPrefs::GetIdleInstallInfo(const std::string& extension_id, |
785 FilePath* crx_path, | 733 FilePath* crx_path, |
786 std::string* version, | 734 std::string* version, |
787 base::Time* fetch_time) { | 735 base::Time* fetch_time) { |
788 DictionaryValue* extension_prefs = GetExtensionPref(extension_id); | 736 DictionaryValue* extension_prefs = GetExtensionPref(extension_id); |
789 if (!extension_prefs) | 737 if (!extension_prefs) |
790 return false; | 738 return false; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
852 bool ExtensionPrefs::GetWebStoreLogin(std::string* result) { | 800 bool ExtensionPrefs::GetWebStoreLogin(std::string* result) { |
853 if (prefs_->HasPrefPath(kWebStoreLogin)) { | 801 if (prefs_->HasPrefPath(kWebStoreLogin)) { |
854 *result = prefs_->GetString(kWebStoreLogin); | 802 *result = prefs_->GetString(kWebStoreLogin); |
855 return true; | 803 return true; |
856 } | 804 } |
857 return false; | 805 return false; |
858 } | 806 } |
859 | 807 |
860 void ExtensionPrefs::SetWebStoreLogin(const std::string& login) { | 808 void ExtensionPrefs::SetWebStoreLogin(const std::string& login) { |
861 prefs_->SetString(kWebStoreLogin, login); | 809 prefs_->SetString(kWebStoreLogin, login); |
862 SavePrefsAndNotify(); | 810 prefs_->ScheduleSavePersistentPrefs(); |
863 } | 811 } |
864 | 812 |
865 // static | 813 // static |
866 void ExtensionPrefs::RegisterUserPrefs(PrefService* prefs) { | 814 void ExtensionPrefs::RegisterUserPrefs(PrefService* prefs) { |
867 prefs->RegisterDictionaryPref(kExtensionsPref); | 815 prefs->RegisterDictionaryPref(kExtensionsPref); |
868 prefs->RegisterListPref(kExtensionToolbar); | 816 prefs->RegisterListPref(kExtensionToolbar); |
869 prefs->RegisterIntegerPref(prefs::kExtensionToolbarSize, -1); | 817 prefs->RegisterIntegerPref(prefs::kExtensionToolbarSize, -1); |
870 prefs->RegisterDictionaryPref(kExtensionsBlacklistUpdate); | 818 prefs->RegisterDictionaryPref(kExtensionsBlacklistUpdate); |
871 prefs->RegisterListPref(kExtensionInstallAllowList); | 819 prefs->RegisterListPref(kExtensionInstallAllowList); |
872 prefs->RegisterListPref(kExtensionInstallDenyList); | 820 prefs->RegisterListPref(kExtensionInstallDenyList); |
873 prefs->RegisterStringPref(kWebStoreLogin, std::string() /* default_value */); | 821 prefs->RegisterStringPref(kWebStoreLogin, std::string() /* default_value */); |
874 } | 822 } |
OLD | NEW |