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