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.
5 #include "chrome/browser/extensions/extension_prefs_unittest.h"
7 #include "base/basictypes.h"
8 #include "base/files/scoped_temp_dir.h"
9 #include "base/path_service.h"
10 #include "base/prefs/mock_pref_change_callback.h"
11 #include "base/prefs/pref_change_registrar.h"
12 #include "base/prefs/scoped_user_pref_update.h"
13 #include "base/stl_util.h"
14 #include "base/strings/string_number_conversions.h"
15 #include "base/strings/stringprintf.h"
16 #include "base/values.h"
17 #include "chrome/browser/extensions/extension_pref_value_map.h"
18 #include "chrome/browser/extensions/extension_prefs.h"
19 #include "chrome/browser/prefs/pref_service_syncable.h"
20 #include "chrome/common/chrome_paths.h"
21 #include "components/user_prefs/pref_registry_syncable.h"
22 #include "content/public/browser/notification_details.h"
23 #include "content/public/browser/notification_source.h"
24 #include "content/public/test/mock_notification_observer.h"
25 #include "extensions/common/manifest_constants.h"
26 #include "extensions/common/permissions/permission_set.h"
27 #include "extensions/common/permissions/permissions_info.h"
28 #include "sync/api/string_ordinal.h"
31 using base::TimeDelta;
32 using content::BrowserThread;
34 namespace extensions {
36 static void AddPattern(URLPatternSet* extent, const std::string& pattern) {
37 int schemes = URLPattern::SCHEME_ALL;
38 extent->AddPattern(URLPattern(schemes, pattern));
41 ExtensionPrefsTest::ExtensionPrefsTest()
42 : ui_thread_(BrowserThread::UI, &message_loop_),
43 prefs_(message_loop_.message_loop_proxy().get()) {}
45 ExtensionPrefsTest::~ExtensionPrefsTest() {
48 void ExtensionPrefsTest::RegisterPreferences(
49 user_prefs::PrefRegistrySyncable* registry) {}
51 void ExtensionPrefsTest::SetUp() {
52 RegisterPreferences(prefs_.pref_registry().get());
56 void ExtensionPrefsTest::TearDown() {
59 // Reset ExtensionPrefs, and re-verify.
60 prefs_.ResetPrefRegistry();
61 RegisterPreferences(prefs_.pref_registry().get());
62 prefs_.RecreateExtensionPrefs();
64 prefs_.pref_service()->CommitPendingWrite();
65 message_loop_.RunUntilIdle();
68 // Tests the LastPingDay/SetLastPingDay functions.
69 class ExtensionPrefsLastPingDay : public ExtensionPrefsTest {
71 ExtensionPrefsLastPingDay()
72 : extension_time_(Time::Now() - TimeDelta::FromHours(4)),
73 blacklist_time_(Time::Now() - TimeDelta::FromHours(2)) {}
75 virtual void Initialize() OVERRIDE {
76 extension_id_ = prefs_.AddExtensionAndReturnId("last_ping_day");
77 EXPECT_TRUE(prefs()->LastPingDay(extension_id_).is_null());
78 prefs()->SetLastPingDay(extension_id_, extension_time_);
79 prefs()->SetBlacklistLastPingDay(blacklist_time_);
82 virtual void Verify() OVERRIDE {
83 Time result = prefs()->LastPingDay(extension_id_);
84 EXPECT_FALSE(result.is_null());
85 EXPECT_TRUE(result == extension_time_);
86 result = prefs()->BlacklistLastPingDay();
87 EXPECT_FALSE(result.is_null());
88 EXPECT_TRUE(result == blacklist_time_);
94 std::string extension_id_;
96 TEST_F(ExtensionPrefsLastPingDay, LastPingDay) {}
98 // Tests the GetToolbarOrder/SetToolbarOrder functions.
99 class ExtensionPrefsToolbarOrder : public ExtensionPrefsTest {
101 virtual void Initialize() OVERRIDE {
102 list_.push_back(prefs_.AddExtensionAndReturnId("1"));
103 list_.push_back(prefs_.AddExtensionAndReturnId("2"));
104 list_.push_back(prefs_.AddExtensionAndReturnId("3"));
105 std::vector<std::string> before_list = prefs()->GetToolbarOrder();
106 EXPECT_TRUE(before_list.empty());
107 prefs()->SetToolbarOrder(list_);
110 virtual void Verify() OVERRIDE {
111 std::vector<std::string> result = prefs()->GetToolbarOrder();
112 ASSERT_EQ(list_, result);
116 std::vector<std::string> list_;
118 TEST_F(ExtensionPrefsToolbarOrder, ToolbarOrder) {}
120 // Tests the GetKnownDisabled/SetKnownDisabled functions.
121 class ExtensionPrefsKnownDisabled : public ExtensionPrefsTest {
123 virtual void Initialize() OVERRIDE {
124 set_.insert(prefs_.AddExtensionAndReturnId("1"));
125 set_.insert(prefs_.AddExtensionAndReturnId("2"));
126 set_.insert(prefs_.AddExtensionAndReturnId("3"));
127 std::set<std::string> before_set = prefs()->GetKnownDisabled();
128 EXPECT_TRUE(before_set.empty());
129 prefs()->SetKnownDisabled(set_);
132 virtual void Verify() OVERRIDE {
133 std::set<std::string> result = prefs()->GetKnownDisabled();
134 ASSERT_EQ(set_, result);
138 std::set<std::string> set_;
140 TEST_F(ExtensionPrefsKnownDisabled, KnownDisabled) {}
142 // Tests the IsExtensionDisabled/SetExtensionState functions.
143 class ExtensionPrefsExtensionState : public ExtensionPrefsTest {
145 virtual void Initialize() OVERRIDE {
146 extension = prefs_.AddExtension("test");
147 prefs()->SetExtensionState(extension->id(), Extension::DISABLED);
150 virtual void Verify() OVERRIDE {
151 EXPECT_TRUE(prefs()->IsExtensionDisabled(extension->id()));
155 scoped_refptr<Extension> extension;
157 TEST_F(ExtensionPrefsExtensionState, ExtensionState) {}
159 class ExtensionPrefsEscalatePermissions : public ExtensionPrefsTest {
161 virtual void Initialize() OVERRIDE {
162 extension = prefs_.AddExtension("test");
163 prefs()->SetDidExtensionEscalatePermissions(extension.get(), true);
166 virtual void Verify() OVERRIDE {
167 EXPECT_TRUE(prefs()->DidExtensionEscalatePermissions(extension->id()));
171 scoped_refptr<Extension> extension;
173 TEST_F(ExtensionPrefsEscalatePermissions, EscalatePermissions) {}
175 // Tests the AddGrantedPermissions / GetGrantedPermissions functions.
176 class ExtensionPrefsGrantedPermissions : public ExtensionPrefsTest {
178 virtual void Initialize() OVERRIDE {
179 const APIPermissionInfo* permission_info =
180 PermissionsInfo::GetInstance()->GetByID(APIPermission::kSocket);
182 extension_id_ = prefs_.AddExtensionAndReturnId("test");
184 api_perm_set1_.insert(APIPermission::kTab);
185 api_perm_set1_.insert(APIPermission::kBookmark);
186 scoped_ptr<APIPermission> permission(
187 permission_info->CreateAPIPermission());
189 scoped_ptr<base::ListValue> value(new base::ListValue());
190 value->Append(new base::StringValue("tcp-connect:*.example.com:80"));
191 value->Append(new base::StringValue("udp-bind::8080"));
192 value->Append(new base::StringValue("udp-send-to::8888"));
193 if (!permission->FromValue(value.get()))
196 api_perm_set1_.insert(permission.release());
198 api_perm_set2_.insert(APIPermission::kHistory);
200 AddPattern(&ehost_perm_set1_, "http://*.google.com/*");
201 AddPattern(&ehost_perm_set1_, "http://example.com/*");
202 AddPattern(&ehost_perm_set1_, "chrome://favicon/*");
204 AddPattern(&ehost_perm_set2_, "https://*.google.com/*");
206 AddPattern(&ehost_perm_set2_, "http://*.google.com/*");
208 AddPattern(&shost_perm_set1_, "http://reddit.com/r/test/*");
209 AddPattern(&shost_perm_set2_, "http://reddit.com/r/test/*");
210 AddPattern(&shost_perm_set2_, "http://somesite.com/*");
211 AddPattern(&shost_perm_set2_, "http://example.com/*");
213 APIPermissionSet expected_apis = api_perm_set1_;
215 AddPattern(&ehost_permissions_, "http://*.google.com/*");
216 AddPattern(&ehost_permissions_, "http://example.com/*");
217 AddPattern(&ehost_permissions_, "chrome://favicon/*");
218 AddPattern(&ehost_permissions_, "https://*.google.com/*");
220 AddPattern(&shost_permissions_, "http://reddit.com/r/test/*");
221 AddPattern(&shost_permissions_, "http://somesite.com/*");
222 AddPattern(&shost_permissions_, "http://example.com/*");
224 APIPermissionSet empty_set;
225 URLPatternSet empty_extent;
226 scoped_refptr<PermissionSet> permissions;
227 scoped_refptr<PermissionSet> granted_permissions;
229 // Make sure both granted api and host permissions start empty.
230 granted_permissions =
231 prefs()->GetGrantedPermissions(extension_id_);
232 EXPECT_TRUE(granted_permissions->IsEmpty());
234 permissions = new PermissionSet(
235 api_perm_set1_, empty_extent, empty_extent);
237 // Add part of the api permissions.
238 prefs()->AddGrantedPermissions(extension_id_, permissions.get());
239 granted_permissions = prefs()->GetGrantedPermissions(extension_id_);
240 EXPECT_TRUE(granted_permissions.get());
241 EXPECT_FALSE(granted_permissions->IsEmpty());
242 EXPECT_EQ(expected_apis, granted_permissions->apis());
243 EXPECT_TRUE(granted_permissions->effective_hosts().is_empty());
244 EXPECT_FALSE(granted_permissions->HasEffectiveFullAccess());
245 granted_permissions = NULL;
247 // Add part of the explicit host permissions.
248 permissions = new PermissionSet(
249 empty_set, ehost_perm_set1_, empty_extent);
250 prefs()->AddGrantedPermissions(extension_id_, permissions.get());
251 granted_permissions = prefs()->GetGrantedPermissions(extension_id_);
252 EXPECT_FALSE(granted_permissions->IsEmpty());
253 EXPECT_FALSE(granted_permissions->HasEffectiveFullAccess());
254 EXPECT_EQ(expected_apis, granted_permissions->apis());
255 EXPECT_EQ(ehost_perm_set1_,
256 granted_permissions->explicit_hosts());
257 EXPECT_EQ(ehost_perm_set1_,
258 granted_permissions->effective_hosts());
260 // Add part of the scriptable host permissions.
261 permissions = new PermissionSet(
262 empty_set, empty_extent, shost_perm_set1_);
263 prefs()->AddGrantedPermissions(extension_id_, permissions.get());
264 granted_permissions = prefs()->GetGrantedPermissions(extension_id_);
265 EXPECT_FALSE(granted_permissions->IsEmpty());
266 EXPECT_FALSE(granted_permissions->HasEffectiveFullAccess());
267 EXPECT_EQ(expected_apis, granted_permissions->apis());
268 EXPECT_EQ(ehost_perm_set1_,
269 granted_permissions->explicit_hosts());
270 EXPECT_EQ(shost_perm_set1_,
271 granted_permissions->scriptable_hosts());
273 URLPatternSet::CreateUnion(ehost_perm_set1_, shost_perm_set1_,
274 &effective_permissions_);
275 EXPECT_EQ(effective_permissions_, granted_permissions->effective_hosts());
277 // Add the rest of the permissions.
278 permissions = new PermissionSet(
279 api_perm_set2_, ehost_perm_set2_, shost_perm_set2_);
281 APIPermissionSet::Union(expected_apis, api_perm_set2_, &api_permissions_);
283 prefs()->AddGrantedPermissions(extension_id_, permissions.get());
284 granted_permissions = prefs()->GetGrantedPermissions(extension_id_);
285 EXPECT_TRUE(granted_permissions.get());
286 EXPECT_FALSE(granted_permissions->IsEmpty());
287 EXPECT_EQ(api_permissions_, granted_permissions->apis());
288 EXPECT_EQ(ehost_permissions_,
289 granted_permissions->explicit_hosts());
290 EXPECT_EQ(shost_permissions_,
291 granted_permissions->scriptable_hosts());
292 effective_permissions_.ClearPatterns();
293 URLPatternSet::CreateUnion(ehost_permissions_, shost_permissions_,
294 &effective_permissions_);
295 EXPECT_EQ(effective_permissions_, granted_permissions->effective_hosts());
298 virtual void Verify() OVERRIDE {
299 scoped_refptr<PermissionSet> permissions(
300 prefs()->GetGrantedPermissions(extension_id_));
301 EXPECT_TRUE(permissions.get());
302 EXPECT_FALSE(permissions->HasEffectiveFullAccess());
303 EXPECT_EQ(api_permissions_, permissions->apis());
304 EXPECT_EQ(ehost_permissions_,
305 permissions->explicit_hosts());
306 EXPECT_EQ(shost_permissions_,
307 permissions->scriptable_hosts());
311 std::string extension_id_;
312 APIPermissionSet api_perm_set1_;
313 APIPermissionSet api_perm_set2_;
314 URLPatternSet ehost_perm_set1_;
315 URLPatternSet ehost_perm_set2_;
316 URLPatternSet shost_perm_set1_;
317 URLPatternSet shost_perm_set2_;
319 APIPermissionSet api_permissions_;
320 URLPatternSet ehost_permissions_;
321 URLPatternSet shost_permissions_;
322 URLPatternSet effective_permissions_;
324 TEST_F(ExtensionPrefsGrantedPermissions, GrantedPermissions) {}
326 // Tests the SetActivePermissions / GetActivePermissions functions.
327 class ExtensionPrefsActivePermissions : public ExtensionPrefsTest {
329 virtual void Initialize() OVERRIDE {
330 extension_id_ = prefs_.AddExtensionAndReturnId("test");
332 APIPermissionSet api_perms;
333 api_perms.insert(APIPermission::kTab);
334 api_perms.insert(APIPermission::kBookmark);
335 api_perms.insert(APIPermission::kHistory);
337 URLPatternSet ehosts;
338 AddPattern(&ehosts, "http://*.google.com/*");
339 AddPattern(&ehosts, "http://example.com/*");
340 AddPattern(&ehosts, "chrome://favicon/*");
342 URLPatternSet shosts;
343 AddPattern(&shosts, "https://*.google.com/*");
344 AddPattern(&shosts, "http://reddit.com/r/test/*");
346 active_perms_ = new PermissionSet(api_perms, ehosts, shosts);
348 // Make sure the active permissions start empty.
349 scoped_refptr<PermissionSet> active(
350 prefs()->GetActivePermissions(extension_id_));
351 EXPECT_TRUE(active->IsEmpty());
353 // Set the active permissions.
354 prefs()->SetActivePermissions(extension_id_, active_perms_.get());
355 active = prefs()->GetActivePermissions(extension_id_);
356 EXPECT_EQ(active_perms_->apis(), active->apis());
357 EXPECT_EQ(active_perms_->explicit_hosts(), active->explicit_hosts());
358 EXPECT_EQ(active_perms_->scriptable_hosts(), active->scriptable_hosts());
359 EXPECT_EQ(*active_perms_.get(), *active.get());
362 virtual void Verify() OVERRIDE {
363 scoped_refptr<PermissionSet> permissions(
364 prefs()->GetActivePermissions(extension_id_));
365 EXPECT_EQ(*active_perms_.get(), *permissions.get());
369 std::string extension_id_;
370 scoped_refptr<PermissionSet> active_perms_;
372 TEST_F(ExtensionPrefsActivePermissions, SetAndGetActivePermissions) {}
374 // Tests the GetVersionString function.
375 class ExtensionPrefsVersionString : public ExtensionPrefsTest {
377 virtual void Initialize() OVERRIDE {
378 extension = prefs_.AddExtension("test");
379 EXPECT_EQ("0.1", prefs()->GetVersionString(extension->id()));
380 prefs()->OnExtensionUninstalled(extension->id(),
381 Manifest::INTERNAL, false);
384 virtual void Verify() OVERRIDE {
385 EXPECT_EQ("", prefs()->GetVersionString(extension->id()));
389 scoped_refptr<Extension> extension;
391 TEST_F(ExtensionPrefsVersionString, VersionString) {}
393 class ExtensionPrefsAcknowledgment : public ExtensionPrefsTest {
395 virtual void Initialize() OVERRIDE {
396 not_installed_id_ = "pghjnghklobnfoidcldiidjjjhkeeaoi";
398 // Install some extensions.
399 for (int i = 0; i < 5; i++) {
400 std::string name = "test" + base::IntToString(i);
401 extensions_.push_back(prefs_.AddExtension(name));
404 prefs()->GetInstalledExtensionInfo(not_installed_id_).get());
406 ExtensionList::const_iterator iter;
407 for (iter = extensions_.begin(); iter != extensions_.end(); ++iter) {
408 std::string id = (*iter)->id();
409 EXPECT_FALSE(prefs()->IsExternalExtensionAcknowledged(id));
410 EXPECT_FALSE(prefs()->IsBlacklistedExtensionAcknowledged(id));
411 if (external_id_.empty()) {
415 if (blacklisted_id_.empty()) {
416 blacklisted_id_ = id;
420 // For each type of acknowledgment, acknowledge one installed and one
421 // not-installed extension id.
422 prefs()->AcknowledgeExternalExtension(external_id_);
423 prefs()->AcknowledgeBlacklistedExtension(blacklisted_id_);
424 prefs()->AcknowledgeExternalExtension(not_installed_id_);
425 prefs()->AcknowledgeBlacklistedExtension(not_installed_id_);
428 virtual void Verify() OVERRIDE {
429 ExtensionList::const_iterator iter;
430 for (iter = extensions_.begin(); iter != extensions_.end(); ++iter) {
431 std::string id = (*iter)->id();
432 if (id == external_id_) {
433 EXPECT_TRUE(prefs()->IsExternalExtensionAcknowledged(id));
435 EXPECT_FALSE(prefs()->IsExternalExtensionAcknowledged(id));
437 if (id == blacklisted_id_) {
438 EXPECT_TRUE(prefs()->IsBlacklistedExtensionAcknowledged(id));
440 EXPECT_FALSE(prefs()->IsBlacklistedExtensionAcknowledged(id));
443 EXPECT_TRUE(prefs()->IsExternalExtensionAcknowledged(not_installed_id_));
444 EXPECT_TRUE(prefs()->IsBlacklistedExtensionAcknowledged(not_installed_id_));
448 ExtensionList extensions_;
450 std::string not_installed_id_;
451 std::string external_id_;
452 std::string blacklisted_id_;
454 TEST_F(ExtensionPrefsAcknowledgment, Acknowledgment) {}
456 // Tests the idle install information functions.
457 class ExtensionPrefsDelayedInstallInfo : public ExtensionPrefsTest {
459 // Sets idle install information for one test extension.
460 void SetIdleInfo(std::string id, int num) {
461 DictionaryValue manifest;
462 manifest.SetString(manifest_keys::kName, "test");
463 manifest.SetString(manifest_keys::kVersion, "1." + base::IntToString(num));
464 base::FilePath path =
465 prefs_.extensions_dir().AppendASCII(base::IntToString(num));
467 scoped_refptr<Extension> extension = Extension::Create(
468 path, Manifest::INTERNAL, manifest, Extension::NO_FLAGS, id, &errors);
469 ASSERT_TRUE(extension.get()) << errors;
470 ASSERT_EQ(id, extension->id());
471 prefs()->SetDelayedInstallInfo(extension.get(),
473 Blacklist::NOT_BLACKLISTED,
474 ExtensionPrefs::DELAY_REASON_WAIT_FOR_IDLE,
475 syncer::StringOrdinal());
478 // Verifies that we get back expected idle install information previously
479 // set by SetIdleInfo.
480 void VerifyIdleInfo(std::string id, int num) {
481 scoped_ptr<ExtensionInfo> info(prefs()->GetDelayedInstallInfo(id));
484 ASSERT_TRUE(info->extension_manifest->GetString("version", &version));
485 ASSERT_EQ("1." + base::IntToString(num), version);
486 ASSERT_EQ(base::IntToString(num),
487 info->extension_path.BaseName().MaybeAsASCII());
490 bool HasInfoForId(ExtensionPrefs::ExtensionsInfo* info,
491 const std::string& id) {
492 for (size_t i = 0; i < info->size(); ++i) {
493 if (info->at(i)->extension_id == id)
499 virtual void Initialize() OVERRIDE {
500 PathService::Get(chrome::DIR_TEST_DATA, &basedir_);
502 id1_ = prefs_.AddExtensionAndReturnId("1");
503 id2_ = prefs_.AddExtensionAndReturnId("2");
504 id3_ = prefs_.AddExtensionAndReturnId("3");
505 id4_ = prefs_.AddExtensionAndReturnId("4");
507 // Set info for two extensions, then remove it.
508 SetIdleInfo(id1_, 1);
509 SetIdleInfo(id2_, 2);
510 VerifyIdleInfo(id1_, 1);
511 VerifyIdleInfo(id2_, 2);
512 scoped_ptr<ExtensionPrefs::ExtensionsInfo> info(
513 prefs()->GetAllDelayedInstallInfo());
514 EXPECT_EQ(2u, info->size());
515 EXPECT_TRUE(HasInfoForId(info.get(), id1_));
516 EXPECT_TRUE(HasInfoForId(info.get(), id2_));
517 prefs()->RemoveDelayedInstallInfo(id1_);
518 prefs()->RemoveDelayedInstallInfo(id2_);
519 info = prefs()->GetAllDelayedInstallInfo();
520 EXPECT_TRUE(info->empty());
522 // Try getting/removing info for an id that used to have info set.
523 EXPECT_FALSE(prefs()->GetDelayedInstallInfo(id1_));
524 EXPECT_FALSE(prefs()->RemoveDelayedInstallInfo(id1_));
526 // Try getting/removing info for an id that has not yet had any info set.
527 EXPECT_FALSE(prefs()->GetDelayedInstallInfo(id3_));
528 EXPECT_FALSE(prefs()->RemoveDelayedInstallInfo(id3_));
530 // Set info for 4 extensions, then remove for one of them.
531 SetIdleInfo(id1_, 1);
532 SetIdleInfo(id2_, 2);
533 SetIdleInfo(id3_, 3);
534 SetIdleInfo(id4_, 4);
535 VerifyIdleInfo(id1_, 1);
536 VerifyIdleInfo(id2_, 2);
537 VerifyIdleInfo(id3_, 3);
538 VerifyIdleInfo(id4_, 4);
539 prefs()->RemoveDelayedInstallInfo(id3_);
542 virtual void Verify() OVERRIDE {
543 // Make sure the info for the 3 extensions we expect is present.
544 scoped_ptr<ExtensionPrefs::ExtensionsInfo> info(
545 prefs()->GetAllDelayedInstallInfo());
546 EXPECT_EQ(3u, info->size());
547 EXPECT_TRUE(HasInfoForId(info.get(), id1_));
548 EXPECT_TRUE(HasInfoForId(info.get(), id2_));
549 EXPECT_TRUE(HasInfoForId(info.get(), id4_));
550 VerifyIdleInfo(id1_, 1);
551 VerifyIdleInfo(id2_, 2);
552 VerifyIdleInfo(id4_, 4);
554 // Make sure there isn't info the for the one extension id we removed.
555 EXPECT_FALSE(prefs()->GetDelayedInstallInfo(id3_));
560 base::FilePath basedir_;
566 TEST_F(ExtensionPrefsDelayedInstallInfo, DelayedInstallInfo) {}
568 // Tests the FinishDelayedInstallInfo function.
569 class ExtensionPrefsFinishDelayedInstallInfo : public ExtensionPrefsTest {
571 virtual void Initialize() OVERRIDE {
572 DictionaryValue dictionary;
573 dictionary.SetString(manifest_keys::kName, "test");
574 dictionary.SetString(manifest_keys::kVersion, "0.1");
575 dictionary.SetString(manifest_keys::kBackgroundPage, "background.html");
576 scoped_refptr<Extension> extension =
577 prefs_.AddExtensionWithManifest(dictionary, Manifest::INTERNAL);
578 id_ = extension->id();
582 DictionaryValue manifest;
583 manifest.SetString(manifest_keys::kName, "test");
584 manifest.SetString(manifest_keys::kVersion, "0.2");
585 scoped_ptr<ListValue> scripts(new ListValue);
586 scripts->AppendString("test.js");
587 manifest.Set(manifest_keys::kBackgroundScripts, scripts.release());
588 base::FilePath path =
589 prefs_.extensions_dir().AppendASCII("test_0.2");
591 scoped_refptr<Extension> new_extension = Extension::Create(
592 path, Manifest::INTERNAL, manifest, Extension::NO_FLAGS, id_, &errors);
593 ASSERT_TRUE(new_extension.get()) << errors;
594 ASSERT_EQ(id_, new_extension->id());
595 prefs()->SetDelayedInstallInfo(new_extension.get(),
597 Blacklist::NOT_BLACKLISTED,
598 ExtensionPrefs::DELAY_REASON_WAIT_FOR_IDLE,
599 syncer::StringOrdinal());
601 // Finish idle installation
602 ASSERT_TRUE(prefs()->FinishDelayedInstallInfo(id_));
605 virtual void Verify() OVERRIDE {
606 EXPECT_FALSE(prefs()->GetDelayedInstallInfo(id_));
608 const DictionaryValue* manifest;
609 ASSERT_TRUE(prefs()->ReadPrefAsDictionary(id_, "manifest", &manifest));
610 ASSERT_TRUE(manifest);
612 EXPECT_TRUE(manifest->GetString(manifest_keys::kName, &value));
613 EXPECT_EQ("test", value);
614 EXPECT_TRUE(manifest->GetString(manifest_keys::kVersion, &value));
615 EXPECT_EQ("0.2", value);
616 EXPECT_FALSE(manifest->GetString(manifest_keys::kBackgroundPage, &value));
617 const ListValue* scripts;
618 ASSERT_TRUE(manifest->GetList(manifest_keys::kBackgroundScripts, &scripts));
619 EXPECT_EQ(1u, scripts->GetSize());
625 TEST_F(ExtensionPrefsFinishDelayedInstallInfo, FinishDelayedInstallInfo) {}
627 class ExtensionPrefsOnExtensionInstalled : public ExtensionPrefsTest {
629 virtual void Initialize() OVERRIDE {
630 extension_ = prefs_.AddExtension("on_extension_installed");
631 EXPECT_FALSE(prefs()->IsExtensionDisabled(extension_->id()));
632 prefs()->OnExtensionInstalled(extension_.get(),
634 Blacklist::NOT_BLACKLISTED,
635 syncer::StringOrdinal());
638 virtual void Verify() OVERRIDE {
639 EXPECT_TRUE(prefs()->IsExtensionDisabled(extension_->id()));
643 scoped_refptr<Extension> extension_;
645 TEST_F(ExtensionPrefsOnExtensionInstalled,
646 ExtensionPrefsOnExtensionInstalled) {}
648 class ExtensionPrefsAppDraggedByUser : public ExtensionPrefsTest {
650 virtual void Initialize() OVERRIDE {
651 extension_ = prefs_.AddExtension("on_extension_installed");
652 EXPECT_FALSE(prefs()->WasAppDraggedByUser(extension_->id()));
653 prefs()->OnExtensionInstalled(extension_.get(),
655 Blacklist::NOT_BLACKLISTED,
656 syncer::StringOrdinal());
659 virtual void Verify() OVERRIDE {
660 // Set the flag and see if it persisted.
661 prefs()->SetAppDraggedByUser(extension_->id());
662 EXPECT_TRUE(prefs()->WasAppDraggedByUser(extension_->id()));
664 // Make sure it doesn't change on consecutive calls.
665 prefs()->SetAppDraggedByUser(extension_->id());
666 EXPECT_TRUE(prefs()->WasAppDraggedByUser(extension_->id()));
670 scoped_refptr<Extension> extension_;
672 TEST_F(ExtensionPrefsAppDraggedByUser, ExtensionPrefsAppDraggedByUser) {}
674 class ExtensionPrefsFlags : public ExtensionPrefsTest {
676 virtual void Initialize() OVERRIDE {
678 base::DictionaryValue dictionary;
679 dictionary.SetString(manifest_keys::kName, "from_webstore");
680 dictionary.SetString(manifest_keys::kVersion, "0.1");
681 webstore_extension_ = prefs_.AddExtensionWithManifestAndFlags(
682 dictionary, Manifest::INTERNAL, Extension::FROM_WEBSTORE);
686 base::DictionaryValue dictionary;
687 dictionary.SetString(manifest_keys::kName, "from_bookmark");
688 dictionary.SetString(manifest_keys::kVersion, "0.1");
689 bookmark_extension_ = prefs_.AddExtensionWithManifestAndFlags(
690 dictionary, Manifest::INTERNAL, Extension::FROM_BOOKMARK);
694 base::DictionaryValue dictionary;
695 dictionary.SetString(manifest_keys::kName, "was_installed_by_default");
696 dictionary.SetString(manifest_keys::kVersion, "0.1");
697 default_extension_ = prefs_.AddExtensionWithManifestAndFlags(
700 Extension::WAS_INSTALLED_BY_DEFAULT);
704 virtual void Verify() OVERRIDE {
705 EXPECT_TRUE(prefs()->IsFromWebStore(webstore_extension_->id()));
706 EXPECT_FALSE(prefs()->IsFromBookmark(webstore_extension_->id()));
708 EXPECT_TRUE(prefs()->IsFromBookmark(bookmark_extension_->id()));
709 EXPECT_FALSE(prefs()->IsFromWebStore(bookmark_extension_->id()));
711 EXPECT_TRUE(prefs()->WasInstalledByDefault(default_extension_->id()));
715 scoped_refptr<Extension> webstore_extension_;
716 scoped_refptr<Extension> bookmark_extension_;
717 scoped_refptr<Extension> default_extension_;
719 TEST_F(ExtensionPrefsFlags, ExtensionPrefsFlags) {}
721 PrefsPrepopulatedTestBase::PrefsPrepopulatedTestBase()
722 : ExtensionPrefsTest() {
723 DictionaryValue simple_dict;
726 simple_dict.SetString(manifest_keys::kVersion, "1.0.0.0");
727 simple_dict.SetString(manifest_keys::kName, "unused");
729 extension1_ = Extension::Create(
730 prefs_.temp_dir().AppendASCII("ext1_"),
731 Manifest::EXTERNAL_PREF,
735 extension2_ = Extension::Create(
736 prefs_.temp_dir().AppendASCII("ext2_"),
737 Manifest::EXTERNAL_PREF,
741 extension3_ = Extension::Create(
742 prefs_.temp_dir().AppendASCII("ext3_"),
743 Manifest::EXTERNAL_PREF,
747 extension4_ = Extension::Create(
748 prefs_.temp_dir().AppendASCII("ext4_"),
749 Manifest::EXTERNAL_PREF,
754 for (size_t i = 0; i < kNumInstalledExtensions; ++i)
755 installed_[i] = false;
758 PrefsPrepopulatedTestBase::~PrefsPrepopulatedTestBase() {
761 // Tests that blacklist state can be queried.
762 class ExtensionPrefsBlacklistedExtensions : public ExtensionPrefsTest {
764 virtual ~ExtensionPrefsBlacklistedExtensions() {}
766 virtual void Initialize() OVERRIDE {
767 extension_a_ = prefs_.AddExtension("a");
768 extension_b_ = prefs_.AddExtension("b");
769 extension_c_ = prefs_.AddExtension("c");
772 virtual void Verify() OVERRIDE {
774 std::set<std::string> ids;
775 EXPECT_EQ(ids, prefs()->GetBlacklistedExtensions());
777 prefs()->SetExtensionBlacklisted(extension_a_->id(), true);
779 std::set<std::string> ids;
780 ids.insert(extension_a_->id());
781 EXPECT_EQ(ids, prefs()->GetBlacklistedExtensions());
783 prefs()->SetExtensionBlacklisted(extension_b_->id(), true);
784 prefs()->SetExtensionBlacklisted(extension_c_->id(), true);
786 std::set<std::string> ids;
787 ids.insert(extension_a_->id());
788 ids.insert(extension_b_->id());
789 ids.insert(extension_c_->id());
790 EXPECT_EQ(ids, prefs()->GetBlacklistedExtensions());
792 prefs()->SetExtensionBlacklisted(extension_a_->id(), false);
794 std::set<std::string> ids;
795 ids.insert(extension_b_->id());
796 ids.insert(extension_c_->id());
797 EXPECT_EQ(ids, prefs()->GetBlacklistedExtensions());
799 prefs()->SetExtensionBlacklisted(extension_b_->id(), false);
800 prefs()->SetExtensionBlacklisted(extension_c_->id(), false);
802 std::set<std::string> ids;
803 EXPECT_EQ(ids, prefs()->GetBlacklistedExtensions());
806 // The interesting part: make sure that we're cleaning up after ourselves
807 // when we're storing *just* the fact that the extension is blacklisted.
808 std::string arbitrary_id = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
810 prefs()->SetExtensionBlacklisted(arbitrary_id, true);
811 prefs()->SetExtensionBlacklisted(extension_a_->id(), true);
813 // (And make sure that the acknowledged bit is also cleared).
814 prefs()->AcknowledgeBlacklistedExtension(arbitrary_id);
816 EXPECT_TRUE(prefs()->GetExtensionPref(arbitrary_id));
818 std::set<std::string> ids;
819 ids.insert(arbitrary_id);
820 ids.insert(extension_a_->id());
821 EXPECT_EQ(ids, prefs()->GetBlacklistedExtensions());
823 prefs()->SetExtensionBlacklisted(arbitrary_id, false);
824 prefs()->SetExtensionBlacklisted(extension_a_->id(), false);
825 EXPECT_FALSE(prefs()->GetExtensionPref(arbitrary_id));
827 std::set<std::string> ids;
828 EXPECT_EQ(ids, prefs()->GetBlacklistedExtensions());
833 scoped_refptr<const Extension> extension_a_;
834 scoped_refptr<const Extension> extension_b_;
835 scoped_refptr<const Extension> extension_c_;
837 TEST_F(ExtensionPrefsBlacklistedExtensions,
838 ExtensionPrefsBlacklistedExtensions) {}
840 } // namespace extensions