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/time/time.h"
17 #include "base/values.h"
18 #include "chrome/browser/prefs/pref_service_syncable.h"
19 #include "chrome/common/chrome_paths.h"
20 #include "components/pref_registry/pref_registry_syncable.h"
21 #include "content/public/browser/notification_details.h"
22 #include "content/public/browser/notification_source.h"
23 #include "content/public/test/mock_notification_observer.h"
24 #include "extensions/browser/extension_pref_value_map.h"
25 #include "extensions/browser/extension_prefs.h"
26 #include "extensions/browser/install_flag.h"
27 #include "extensions/common/extension.h"
28 #include "extensions/common/extension_builder.h"
29 #include "extensions/common/manifest_constants.h"
30 #include "extensions/common/permissions/permission_set.h"
31 #include "extensions/common/permissions/permissions_info.h"
32 #include "sync/api/string_ordinal.h"
35 using base::TimeDelta
;
36 using content::BrowserThread
;
38 namespace extensions
{
40 static void AddPattern(URLPatternSet
* extent
, const std::string
& pattern
) {
41 int schemes
= URLPattern::SCHEME_ALL
;
42 extent
->AddPattern(URLPattern(schemes
, pattern
));
45 ExtensionPrefsTest::ExtensionPrefsTest()
46 : ui_thread_(BrowserThread::UI
, &message_loop_
),
47 prefs_(message_loop_
.message_loop_proxy().get()) {}
49 ExtensionPrefsTest::~ExtensionPrefsTest() {
52 void ExtensionPrefsTest::RegisterPreferences(
53 user_prefs::PrefRegistrySyncable
* registry
) {}
55 void ExtensionPrefsTest::SetUp() {
56 RegisterPreferences(prefs_
.pref_registry().get());
60 void ExtensionPrefsTest::TearDown() {
63 // Reset ExtensionPrefs, and re-verify.
64 prefs_
.ResetPrefRegistry();
65 RegisterPreferences(prefs_
.pref_registry().get());
66 prefs_
.RecreateExtensionPrefs();
68 prefs_
.pref_service()->CommitPendingWrite();
69 message_loop_
.RunUntilIdle();
72 // Tests the LastPingDay/SetLastPingDay functions.
73 class ExtensionPrefsLastPingDay
: public ExtensionPrefsTest
{
75 ExtensionPrefsLastPingDay()
76 : extension_time_(Time::Now() - TimeDelta::FromHours(4)),
77 blacklist_time_(Time::Now() - TimeDelta::FromHours(2)) {}
79 void Initialize() override
{
80 extension_id_
= prefs_
.AddExtensionAndReturnId("last_ping_day");
81 EXPECT_TRUE(prefs()->LastPingDay(extension_id_
).is_null());
82 prefs()->SetLastPingDay(extension_id_
, extension_time_
);
83 prefs()->SetBlacklistLastPingDay(blacklist_time_
);
86 void Verify() override
{
87 Time result
= prefs()->LastPingDay(extension_id_
);
88 EXPECT_FALSE(result
.is_null());
89 EXPECT_TRUE(result
== extension_time_
);
90 result
= prefs()->BlacklistLastPingDay();
91 EXPECT_FALSE(result
.is_null());
92 EXPECT_TRUE(result
== blacklist_time_
);
98 std::string extension_id_
;
100 TEST_F(ExtensionPrefsLastPingDay
, LastPingDay
) {}
102 // Tests the GetToolbarOrder/SetToolbarOrder functions.
103 class ExtensionPrefsToolbarOrder
: public ExtensionPrefsTest
{
105 void Initialize() override
{
106 list_
.push_back(prefs_
.AddExtensionAndReturnId("1"));
107 list_
.push_back(prefs_
.AddExtensionAndReturnId("2"));
108 list_
.push_back(prefs_
.AddExtensionAndReturnId("3"));
109 ExtensionIdList before_list
= prefs()->GetToolbarOrder();
110 EXPECT_TRUE(before_list
.empty());
111 prefs()->SetToolbarOrder(list_
);
114 void Verify() override
{
115 ExtensionIdList result
= prefs()->GetToolbarOrder();
116 ASSERT_EQ(list_
, result
);
120 ExtensionIdList list_
;
122 TEST_F(ExtensionPrefsToolbarOrder
, ToolbarOrder
) {}
124 // Tests the IsExtensionDisabled/SetExtensionState functions.
125 class ExtensionPrefsExtensionState
: public ExtensionPrefsTest
{
127 void Initialize() override
{
128 extension
= prefs_
.AddExtension("test");
129 prefs()->SetExtensionState(extension
->id(), Extension::DISABLED
);
132 void Verify() override
{
133 EXPECT_TRUE(prefs()->IsExtensionDisabled(extension
->id()));
137 scoped_refptr
<Extension
> extension
;
139 TEST_F(ExtensionPrefsExtensionState
, ExtensionState
) {}
141 class ExtensionPrefsEscalatePermissions
: public ExtensionPrefsTest
{
143 void Initialize() override
{
144 extension
= prefs_
.AddExtension("test");
145 prefs()->AddDisableReason(extension
->id(),
146 Extension::DISABLE_PERMISSIONS_INCREASE
);
149 void Verify() override
{
150 EXPECT_TRUE(prefs()->DidExtensionEscalatePermissions(extension
->id()));
154 scoped_refptr
<Extension
> extension
;
156 TEST_F(ExtensionPrefsEscalatePermissions
, EscalatePermissions
) {}
158 // Tests the AddGrantedPermissions / GetGrantedPermissions functions.
159 class ExtensionPrefsGrantedPermissions
: public ExtensionPrefsTest
{
161 void Initialize() override
{
162 const APIPermissionInfo
* permission_info
=
163 PermissionsInfo::GetInstance()->GetByID(APIPermission::kSocket
);
165 extension_id_
= prefs_
.AddExtensionAndReturnId("test");
167 api_perm_set1_
.insert(APIPermission::kTab
);
168 api_perm_set1_
.insert(APIPermission::kBookmark
);
169 scoped_ptr
<APIPermission
> permission(
170 permission_info
->CreateAPIPermission());
172 scoped_ptr
<base::ListValue
> value(new base::ListValue());
173 value
->Append(new base::StringValue("tcp-connect:*.example.com:80"));
174 value
->Append(new base::StringValue("udp-bind::8080"));
175 value
->Append(new base::StringValue("udp-send-to::8888"));
176 ASSERT_TRUE(permission
->FromValue(value
.get(), NULL
, NULL
));
178 api_perm_set1_
.insert(permission
.release());
180 api_perm_set2_
.insert(APIPermission::kHistory
);
182 AddPattern(&ehost_perm_set1_
, "http://*.google.com/*");
183 AddPattern(&ehost_perm_set1_
, "http://example.com/*");
184 AddPattern(&ehost_perm_set1_
, "chrome://favicon/*");
186 AddPattern(&ehost_perm_set2_
, "https://*.google.com/*");
188 AddPattern(&ehost_perm_set2_
, "http://*.google.com/*");
190 AddPattern(&shost_perm_set1_
, "http://reddit.com/r/test/*");
191 AddPattern(&shost_perm_set2_
, "http://reddit.com/r/test/*");
192 AddPattern(&shost_perm_set2_
, "http://somesite.com/*");
193 AddPattern(&shost_perm_set2_
, "http://example.com/*");
195 APIPermissionSet expected_apis
= api_perm_set1_
;
197 AddPattern(&ehost_permissions_
, "http://*.google.com/*");
198 AddPattern(&ehost_permissions_
, "http://example.com/*");
199 AddPattern(&ehost_permissions_
, "chrome://favicon/*");
200 AddPattern(&ehost_permissions_
, "https://*.google.com/*");
202 AddPattern(&shost_permissions_
, "http://reddit.com/r/test/*");
203 AddPattern(&shost_permissions_
, "http://somesite.com/*");
204 AddPattern(&shost_permissions_
, "http://example.com/*");
206 APIPermissionSet empty_set
;
207 ManifestPermissionSet empty_manifest_permissions
;
208 URLPatternSet empty_extent
;
209 scoped_refptr
<PermissionSet
> permissions
;
210 scoped_refptr
<PermissionSet
> granted_permissions
;
212 // Make sure both granted api and host permissions start empty.
213 granted_permissions
=
214 prefs()->GetGrantedPermissions(extension_id_
);
215 EXPECT_TRUE(granted_permissions
->IsEmpty());
217 permissions
= new PermissionSet(
218 api_perm_set1_
, empty_manifest_permissions
, empty_extent
, empty_extent
);
220 // Add part of the api permissions.
221 prefs()->AddGrantedPermissions(extension_id_
, permissions
.get());
222 granted_permissions
= prefs()->GetGrantedPermissions(extension_id_
);
223 EXPECT_TRUE(granted_permissions
.get());
224 EXPECT_FALSE(granted_permissions
->IsEmpty());
225 EXPECT_EQ(expected_apis
, granted_permissions
->apis());
226 EXPECT_TRUE(granted_permissions
->effective_hosts().is_empty());
227 EXPECT_FALSE(granted_permissions
->HasEffectiveFullAccess());
228 granted_permissions
= NULL
;
230 // Add part of the explicit host permissions.
231 permissions
= new PermissionSet(
232 empty_set
, empty_manifest_permissions
, ehost_perm_set1_
, empty_extent
);
233 prefs()->AddGrantedPermissions(extension_id_
, permissions
.get());
234 granted_permissions
= prefs()->GetGrantedPermissions(extension_id_
);
235 EXPECT_FALSE(granted_permissions
->IsEmpty());
236 EXPECT_FALSE(granted_permissions
->HasEffectiveFullAccess());
237 EXPECT_EQ(expected_apis
, granted_permissions
->apis());
238 EXPECT_EQ(ehost_perm_set1_
,
239 granted_permissions
->explicit_hosts());
240 EXPECT_EQ(ehost_perm_set1_
,
241 granted_permissions
->effective_hosts());
243 // Add part of the scriptable host permissions.
244 permissions
= new PermissionSet(
245 empty_set
, empty_manifest_permissions
, empty_extent
, shost_perm_set1_
);
246 prefs()->AddGrantedPermissions(extension_id_
, permissions
.get());
247 granted_permissions
= prefs()->GetGrantedPermissions(extension_id_
);
248 EXPECT_FALSE(granted_permissions
->IsEmpty());
249 EXPECT_FALSE(granted_permissions
->HasEffectiveFullAccess());
250 EXPECT_EQ(expected_apis
, granted_permissions
->apis());
251 EXPECT_EQ(ehost_perm_set1_
,
252 granted_permissions
->explicit_hosts());
253 EXPECT_EQ(shost_perm_set1_
,
254 granted_permissions
->scriptable_hosts());
256 URLPatternSet::CreateUnion(ehost_perm_set1_
, shost_perm_set1_
,
257 &effective_permissions_
);
258 EXPECT_EQ(effective_permissions_
, granted_permissions
->effective_hosts());
260 // Add the rest of the permissions.
261 permissions
= new PermissionSet(
262 api_perm_set2_
, empty_manifest_permissions
,
263 ehost_perm_set2_
, shost_perm_set2_
);
265 APIPermissionSet::Union(expected_apis
, api_perm_set2_
, &api_permissions_
);
267 prefs()->AddGrantedPermissions(extension_id_
, permissions
.get());
268 granted_permissions
= prefs()->GetGrantedPermissions(extension_id_
);
269 EXPECT_TRUE(granted_permissions
.get());
270 EXPECT_FALSE(granted_permissions
->IsEmpty());
271 EXPECT_EQ(api_permissions_
, granted_permissions
->apis());
272 EXPECT_EQ(ehost_permissions_
,
273 granted_permissions
->explicit_hosts());
274 EXPECT_EQ(shost_permissions_
,
275 granted_permissions
->scriptable_hosts());
276 effective_permissions_
.ClearPatterns();
277 URLPatternSet::CreateUnion(ehost_permissions_
, shost_permissions_
,
278 &effective_permissions_
);
279 EXPECT_EQ(effective_permissions_
, granted_permissions
->effective_hosts());
282 void Verify() override
{
283 scoped_refptr
<PermissionSet
> permissions(
284 prefs()->GetGrantedPermissions(extension_id_
));
285 EXPECT_TRUE(permissions
.get());
286 EXPECT_FALSE(permissions
->HasEffectiveFullAccess());
287 EXPECT_EQ(api_permissions_
, permissions
->apis());
288 EXPECT_EQ(ehost_permissions_
,
289 permissions
->explicit_hosts());
290 EXPECT_EQ(shost_permissions_
,
291 permissions
->scriptable_hosts());
295 std::string extension_id_
;
296 APIPermissionSet api_perm_set1_
;
297 APIPermissionSet api_perm_set2_
;
298 URLPatternSet ehost_perm_set1_
;
299 URLPatternSet ehost_perm_set2_
;
300 URLPatternSet shost_perm_set1_
;
301 URLPatternSet shost_perm_set2_
;
303 APIPermissionSet api_permissions_
;
304 URLPatternSet ehost_permissions_
;
305 URLPatternSet shost_permissions_
;
306 URLPatternSet effective_permissions_
;
308 TEST_F(ExtensionPrefsGrantedPermissions
, GrantedPermissions
) {}
310 // Tests the SetActivePermissions / GetActivePermissions functions.
311 class ExtensionPrefsActivePermissions
: public ExtensionPrefsTest
{
313 void Initialize() override
{
314 extension_id_
= prefs_
.AddExtensionAndReturnId("test");
316 APIPermissionSet api_perms
;
317 api_perms
.insert(APIPermission::kTab
);
318 api_perms
.insert(APIPermission::kBookmark
);
319 api_perms
.insert(APIPermission::kHistory
);
321 ManifestPermissionSet empty_manifest_permissions
;
323 URLPatternSet ehosts
;
324 AddPattern(&ehosts
, "http://*.google.com/*");
325 AddPattern(&ehosts
, "http://example.com/*");
326 AddPattern(&ehosts
, "chrome://favicon/*");
328 URLPatternSet shosts
;
329 AddPattern(&shosts
, "https://*.google.com/*");
330 AddPattern(&shosts
, "http://reddit.com/r/test/*");
332 active_perms_
= new PermissionSet(
333 api_perms
, empty_manifest_permissions
, ehosts
, shosts
);
335 // Make sure the active permissions start empty.
336 scoped_refptr
<PermissionSet
> active(
337 prefs()->GetActivePermissions(extension_id_
));
338 EXPECT_TRUE(active
->IsEmpty());
340 // Set the active permissions.
341 prefs()->SetActivePermissions(extension_id_
, active_perms_
.get());
342 active
= prefs()->GetActivePermissions(extension_id_
);
343 EXPECT_EQ(active_perms_
->apis(), active
->apis());
344 EXPECT_EQ(active_perms_
->explicit_hosts(), active
->explicit_hosts());
345 EXPECT_EQ(active_perms_
->scriptable_hosts(), active
->scriptable_hosts());
346 EXPECT_EQ(*active_perms_
.get(), *active
.get());
349 void Verify() override
{
350 scoped_refptr
<PermissionSet
> permissions(
351 prefs()->GetActivePermissions(extension_id_
));
352 EXPECT_EQ(*active_perms_
.get(), *permissions
.get());
356 std::string extension_id_
;
357 scoped_refptr
<PermissionSet
> active_perms_
;
359 TEST_F(ExtensionPrefsActivePermissions
, SetAndGetActivePermissions
) {}
361 // Tests the GetVersionString function.
362 class ExtensionPrefsVersionString
: public ExtensionPrefsTest
{
364 void Initialize() override
{
365 extension
= prefs_
.AddExtension("test");
366 EXPECT_EQ("0.1", prefs()->GetVersionString(extension
->id()));
367 prefs()->OnExtensionUninstalled(extension
->id(),
368 Manifest::INTERNAL
, false);
371 void Verify() override
{
372 EXPECT_EQ("", prefs()->GetVersionString(extension
->id()));
376 scoped_refptr
<Extension
> extension
;
378 TEST_F(ExtensionPrefsVersionString
, VersionString
) {}
380 class ExtensionPrefsAcknowledgment
: public ExtensionPrefsTest
{
382 void Initialize() override
{
383 not_installed_id_
= "pghjnghklobnfoidcldiidjjjhkeeaoi";
385 // Install some extensions.
386 for (int i
= 0; i
< 5; i
++) {
387 std::string name
= "test" + base::IntToString(i
);
388 extensions_
.push_back(prefs_
.AddExtension(name
));
391 prefs()->GetInstalledExtensionInfo(not_installed_id_
).get());
393 ExtensionList::const_iterator iter
;
394 for (iter
= extensions_
.begin(); iter
!= extensions_
.end(); ++iter
) {
395 std::string id
= (*iter
)->id();
396 EXPECT_FALSE(prefs()->IsExternalExtensionAcknowledged(id
));
397 EXPECT_FALSE(prefs()->IsBlacklistedExtensionAcknowledged(id
));
398 if (external_id_
.empty()) {
402 if (blacklisted_id_
.empty()) {
403 blacklisted_id_
= id
;
407 // For each type of acknowledgment, acknowledge one installed and one
408 // not-installed extension id.
409 prefs()->AcknowledgeExternalExtension(external_id_
);
410 prefs()->AcknowledgeBlacklistedExtension(blacklisted_id_
);
411 prefs()->AcknowledgeExternalExtension(not_installed_id_
);
412 prefs()->AcknowledgeBlacklistedExtension(not_installed_id_
);
415 void Verify() override
{
416 ExtensionList::const_iterator iter
;
417 for (iter
= extensions_
.begin(); iter
!= extensions_
.end(); ++iter
) {
418 std::string id
= (*iter
)->id();
419 if (id
== external_id_
) {
420 EXPECT_TRUE(prefs()->IsExternalExtensionAcknowledged(id
));
422 EXPECT_FALSE(prefs()->IsExternalExtensionAcknowledged(id
));
424 if (id
== blacklisted_id_
) {
425 EXPECT_TRUE(prefs()->IsBlacklistedExtensionAcknowledged(id
));
427 EXPECT_FALSE(prefs()->IsBlacklistedExtensionAcknowledged(id
));
430 EXPECT_TRUE(prefs()->IsExternalExtensionAcknowledged(not_installed_id_
));
431 EXPECT_TRUE(prefs()->IsBlacklistedExtensionAcknowledged(not_installed_id_
));
435 ExtensionList extensions_
;
437 std::string not_installed_id_
;
438 std::string external_id_
;
439 std::string blacklisted_id_
;
441 TEST_F(ExtensionPrefsAcknowledgment
, Acknowledgment
) {}
443 // Tests the idle install information functions.
444 class ExtensionPrefsDelayedInstallInfo
: public ExtensionPrefsTest
{
446 // Sets idle install information for one test extension.
447 void SetIdleInfo(const std::string
& id
, int num
) {
448 base::DictionaryValue manifest
;
449 manifest
.SetString(manifest_keys::kName
, "test");
450 manifest
.SetString(manifest_keys::kVersion
, "1." + base::IntToString(num
));
451 base::FilePath path
=
452 prefs_
.extensions_dir().AppendASCII(base::IntToString(num
));
454 scoped_refptr
<Extension
> extension
= Extension::Create(
455 path
, Manifest::INTERNAL
, manifest
, Extension::NO_FLAGS
, id
, &errors
);
456 ASSERT_TRUE(extension
.get()) << errors
;
457 ASSERT_EQ(id
, extension
->id());
458 prefs()->SetDelayedInstallInfo(extension
.get(),
461 ExtensionPrefs::DELAY_REASON_WAIT_FOR_IDLE
,
462 syncer::StringOrdinal(),
466 // Verifies that we get back expected idle install information previously
467 // set by SetIdleInfo.
468 void VerifyIdleInfo(const std::string
& id
, int num
) {
469 scoped_ptr
<ExtensionInfo
> info(prefs()->GetDelayedInstallInfo(id
));
472 ASSERT_TRUE(info
->extension_manifest
->GetString("version", &version
));
473 ASSERT_EQ("1." + base::IntToString(num
), version
);
474 ASSERT_EQ(base::IntToString(num
),
475 info
->extension_path
.BaseName().MaybeAsASCII());
478 bool HasInfoForId(ExtensionPrefs::ExtensionsInfo
* info
,
479 const std::string
& id
) {
480 for (size_t i
= 0; i
< info
->size(); ++i
) {
481 if (info
->at(i
)->extension_id
== id
)
487 void Initialize() override
{
488 PathService::Get(chrome::DIR_TEST_DATA
, &basedir_
);
490 id1_
= prefs_
.AddExtensionAndReturnId("1");
491 id2_
= prefs_
.AddExtensionAndReturnId("2");
492 id3_
= prefs_
.AddExtensionAndReturnId("3");
493 id4_
= prefs_
.AddExtensionAndReturnId("4");
495 // Set info for two extensions, then remove it.
496 SetIdleInfo(id1_
, 1);
497 SetIdleInfo(id2_
, 2);
498 VerifyIdleInfo(id1_
, 1);
499 VerifyIdleInfo(id2_
, 2);
500 scoped_ptr
<ExtensionPrefs::ExtensionsInfo
> info(
501 prefs()->GetAllDelayedInstallInfo());
502 EXPECT_EQ(2u, info
->size());
503 EXPECT_TRUE(HasInfoForId(info
.get(), id1_
));
504 EXPECT_TRUE(HasInfoForId(info
.get(), id2_
));
505 prefs()->RemoveDelayedInstallInfo(id1_
);
506 prefs()->RemoveDelayedInstallInfo(id2_
);
507 info
= prefs()->GetAllDelayedInstallInfo();
508 EXPECT_TRUE(info
->empty());
510 // Try getting/removing info for an id that used to have info set.
511 EXPECT_FALSE(prefs()->GetDelayedInstallInfo(id1_
));
512 EXPECT_FALSE(prefs()->RemoveDelayedInstallInfo(id1_
));
514 // Try getting/removing info for an id that has not yet had any info set.
515 EXPECT_FALSE(prefs()->GetDelayedInstallInfo(id3_
));
516 EXPECT_FALSE(prefs()->RemoveDelayedInstallInfo(id3_
));
518 // Set info for 4 extensions, then remove for one of them.
519 SetIdleInfo(id1_
, 1);
520 SetIdleInfo(id2_
, 2);
521 SetIdleInfo(id3_
, 3);
522 SetIdleInfo(id4_
, 4);
523 VerifyIdleInfo(id1_
, 1);
524 VerifyIdleInfo(id2_
, 2);
525 VerifyIdleInfo(id3_
, 3);
526 VerifyIdleInfo(id4_
, 4);
527 prefs()->RemoveDelayedInstallInfo(id3_
);
530 void Verify() override
{
531 // Make sure the info for the 3 extensions we expect is present.
532 scoped_ptr
<ExtensionPrefs::ExtensionsInfo
> info(
533 prefs()->GetAllDelayedInstallInfo());
534 EXPECT_EQ(3u, info
->size());
535 EXPECT_TRUE(HasInfoForId(info
.get(), id1_
));
536 EXPECT_TRUE(HasInfoForId(info
.get(), id2_
));
537 EXPECT_TRUE(HasInfoForId(info
.get(), id4_
));
538 VerifyIdleInfo(id1_
, 1);
539 VerifyIdleInfo(id2_
, 2);
540 VerifyIdleInfo(id4_
, 4);
542 // Make sure there isn't info the for the one extension id we removed.
543 EXPECT_FALSE(prefs()->GetDelayedInstallInfo(id3_
));
548 base::FilePath basedir_
;
554 TEST_F(ExtensionPrefsDelayedInstallInfo
, DelayedInstallInfo
) {}
556 // Tests the FinishDelayedInstallInfo function.
557 class ExtensionPrefsFinishDelayedInstallInfo
: public ExtensionPrefsTest
{
559 void Initialize() override
{
560 base::DictionaryValue dictionary
;
561 dictionary
.SetString(manifest_keys::kName
, "test");
562 dictionary
.SetString(manifest_keys::kVersion
, "0.1");
563 dictionary
.SetString(manifest_keys::kBackgroundPage
, "background.html");
564 scoped_refptr
<Extension
> extension
=
565 prefs_
.AddExtensionWithManifest(dictionary
, Manifest::INTERNAL
);
566 id_
= extension
->id();
570 base::DictionaryValue manifest
;
571 manifest
.SetString(manifest_keys::kName
, "test");
572 manifest
.SetString(manifest_keys::kVersion
, "0.2");
573 scoped_ptr
<base::ListValue
> scripts(new base::ListValue
);
574 scripts
->AppendString("test.js");
575 manifest
.Set(manifest_keys::kBackgroundScripts
, scripts
.release());
576 base::FilePath path
=
577 prefs_
.extensions_dir().AppendASCII("test_0.2");
579 scoped_refptr
<Extension
> new_extension
= Extension::Create(
580 path
, Manifest::INTERNAL
, manifest
, Extension::NO_FLAGS
, id_
, &errors
);
581 ASSERT_TRUE(new_extension
.get()) << errors
;
582 ASSERT_EQ(id_
, new_extension
->id());
583 prefs()->SetDelayedInstallInfo(new_extension
.get(),
586 ExtensionPrefs::DELAY_REASON_WAIT_FOR_IDLE
,
587 syncer::StringOrdinal(),
590 // Finish idle installation
591 ASSERT_TRUE(prefs()->FinishDelayedInstallInfo(id_
));
594 void Verify() override
{
595 EXPECT_FALSE(prefs()->GetDelayedInstallInfo(id_
));
596 EXPECT_EQ(std::string("Param"), prefs()->GetInstallParam(id_
));
598 const base::DictionaryValue
* manifest
;
599 ASSERT_TRUE(prefs()->ReadPrefAsDictionary(id_
, "manifest", &manifest
));
600 ASSERT_TRUE(manifest
);
602 EXPECT_TRUE(manifest
->GetString(manifest_keys::kName
, &value
));
603 EXPECT_EQ("test", value
);
604 EXPECT_TRUE(manifest
->GetString(manifest_keys::kVersion
, &value
));
605 EXPECT_EQ("0.2", value
);
606 EXPECT_FALSE(manifest
->GetString(manifest_keys::kBackgroundPage
, &value
));
607 const base::ListValue
* scripts
;
608 ASSERT_TRUE(manifest
->GetList(manifest_keys::kBackgroundScripts
, &scripts
));
609 EXPECT_EQ(1u, scripts
->GetSize());
615 TEST_F(ExtensionPrefsFinishDelayedInstallInfo
, FinishDelayedInstallInfo
) {}
617 class ExtensionPrefsOnExtensionInstalled
: public ExtensionPrefsTest
{
619 void Initialize() override
{
620 extension_
= prefs_
.AddExtension("on_extension_installed");
621 EXPECT_FALSE(prefs()->IsExtensionDisabled(extension_
->id()));
622 prefs()->OnExtensionInstalled(extension_
.get(),
624 syncer::StringOrdinal(),
628 void Verify() override
{
629 EXPECT_TRUE(prefs()->IsExtensionDisabled(extension_
->id()));
630 EXPECT_EQ(std::string("Param"), prefs()->GetInstallParam(extension_
->id()));
634 scoped_refptr
<Extension
> extension_
;
636 TEST_F(ExtensionPrefsOnExtensionInstalled
,
637 ExtensionPrefsOnExtensionInstalled
) {}
639 class ExtensionPrefsAppDraggedByUser
: public ExtensionPrefsTest
{
641 void Initialize() override
{
642 extension_
= prefs_
.AddExtension("on_extension_installed");
643 EXPECT_FALSE(prefs()->WasAppDraggedByUser(extension_
->id()));
644 prefs()->OnExtensionInstalled(extension_
.get(),
646 syncer::StringOrdinal(),
650 void Verify() override
{
651 // Set the flag and see if it persisted.
652 prefs()->SetAppDraggedByUser(extension_
->id());
653 EXPECT_TRUE(prefs()->WasAppDraggedByUser(extension_
->id()));
655 // Make sure it doesn't change on consecutive calls.
656 prefs()->SetAppDraggedByUser(extension_
->id());
657 EXPECT_TRUE(prefs()->WasAppDraggedByUser(extension_
->id()));
661 scoped_refptr
<Extension
> extension_
;
663 TEST_F(ExtensionPrefsAppDraggedByUser
, ExtensionPrefsAppDraggedByUser
) {}
665 class ExtensionPrefsFlags
: public ExtensionPrefsTest
{
667 void Initialize() override
{
669 base::DictionaryValue dictionary
;
670 dictionary
.SetString(manifest_keys::kName
, "from_webstore");
671 dictionary
.SetString(manifest_keys::kVersion
, "0.1");
672 webstore_extension_
= prefs_
.AddExtensionWithManifestAndFlags(
673 dictionary
, Manifest::INTERNAL
, Extension::FROM_WEBSTORE
);
677 base::DictionaryValue dictionary
;
678 dictionary
.SetString(manifest_keys::kName
, "from_bookmark");
679 dictionary
.SetString(manifest_keys::kVersion
, "0.1");
680 bookmark_extension_
= prefs_
.AddExtensionWithManifestAndFlags(
681 dictionary
, Manifest::INTERNAL
, Extension::FROM_BOOKMARK
);
685 base::DictionaryValue dictionary
;
686 dictionary
.SetString(manifest_keys::kName
, "was_installed_by_default");
687 dictionary
.SetString(manifest_keys::kVersion
, "0.1");
688 default_extension_
= prefs_
.AddExtensionWithManifestAndFlags(
691 Extension::WAS_INSTALLED_BY_DEFAULT
);
695 base::DictionaryValue dictionary
;
696 dictionary
.SetString(manifest_keys::kName
, "was_installed_by_oem");
697 dictionary
.SetString(manifest_keys::kVersion
, "0.1");
698 oem_extension_
= prefs_
.AddExtensionWithManifestAndFlags(
699 dictionary
, Manifest::INTERNAL
, Extension::WAS_INSTALLED_BY_OEM
);
703 void Verify() override
{
704 EXPECT_TRUE(prefs()->IsFromWebStore(webstore_extension_
->id()));
705 EXPECT_FALSE(prefs()->IsFromBookmark(webstore_extension_
->id()));
707 EXPECT_TRUE(prefs()->IsFromBookmark(bookmark_extension_
->id()));
708 EXPECT_FALSE(prefs()->IsFromWebStore(bookmark_extension_
->id()));
710 EXPECT_TRUE(prefs()->WasInstalledByDefault(default_extension_
->id()));
711 EXPECT_TRUE(prefs()->WasInstalledByOem(oem_extension_
->id()));
715 scoped_refptr
<Extension
> webstore_extension_
;
716 scoped_refptr
<Extension
> bookmark_extension_
;
717 scoped_refptr
<Extension
> default_extension_
;
718 scoped_refptr
<Extension
> oem_extension_
;
720 TEST_F(ExtensionPrefsFlags
, ExtensionPrefsFlags
) {}
722 PrefsPrepopulatedTestBase::PrefsPrepopulatedTestBase()
723 : ExtensionPrefsTest() {
724 base::DictionaryValue simple_dict
;
727 simple_dict
.SetString(manifest_keys::kVersion
, "1.0.0.0");
728 simple_dict
.SetString(manifest_keys::kName
, "unused");
730 extension1_
= Extension::Create(
731 prefs_
.temp_dir().AppendASCII("ext1_"),
732 Manifest::EXTERNAL_PREF
,
736 extension2_
= Extension::Create(
737 prefs_
.temp_dir().AppendASCII("ext2_"),
738 Manifest::EXTERNAL_PREF
,
742 extension3_
= Extension::Create(
743 prefs_
.temp_dir().AppendASCII("ext3_"),
744 Manifest::EXTERNAL_PREF
,
748 extension4_
= Extension::Create(
749 prefs_
.temp_dir().AppendASCII("ext4_"),
750 Manifest::EXTERNAL_PREF
,
755 for (size_t i
= 0; i
< kNumInstalledExtensions
; ++i
)
756 installed_
[i
] = false;
759 PrefsPrepopulatedTestBase::~PrefsPrepopulatedTestBase() {
762 // Tests that blacklist state can be queried.
763 class ExtensionPrefsBlacklistedExtensions
: public ExtensionPrefsTest
{
765 ~ExtensionPrefsBlacklistedExtensions() override
{}
767 void Initialize() override
{
768 extension_a_
= prefs_
.AddExtension("a");
769 extension_b_
= prefs_
.AddExtension("b");
770 extension_c_
= prefs_
.AddExtension("c");
773 void Verify() override
{
776 EXPECT_EQ(ids
, prefs()->GetBlacklistedExtensions());
778 prefs()->SetExtensionBlacklisted(extension_a_
->id(), true);
781 ids
.insert(extension_a_
->id());
782 EXPECT_EQ(ids
, prefs()->GetBlacklistedExtensions());
784 prefs()->SetExtensionBlacklisted(extension_b_
->id(), true);
785 prefs()->SetExtensionBlacklisted(extension_c_
->id(), true);
788 ids
.insert(extension_a_
->id());
789 ids
.insert(extension_b_
->id());
790 ids
.insert(extension_c_
->id());
791 EXPECT_EQ(ids
, prefs()->GetBlacklistedExtensions());
793 prefs()->SetExtensionBlacklisted(extension_a_
->id(), false);
796 ids
.insert(extension_b_
->id());
797 ids
.insert(extension_c_
->id());
798 EXPECT_EQ(ids
, prefs()->GetBlacklistedExtensions());
800 prefs()->SetExtensionBlacklisted(extension_b_
->id(), false);
801 prefs()->SetExtensionBlacklisted(extension_c_
->id(), false);
804 EXPECT_EQ(ids
, prefs()->GetBlacklistedExtensions());
807 // The interesting part: make sure that we're cleaning up after ourselves
808 // when we're storing *just* the fact that the extension is blacklisted.
809 std::string arbitrary_id
= "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
811 prefs()->SetExtensionBlacklisted(arbitrary_id
, true);
812 prefs()->SetExtensionBlacklisted(extension_a_
->id(), true);
814 // (And make sure that the acknowledged bit is also cleared).
815 prefs()->AcknowledgeBlacklistedExtension(arbitrary_id
);
817 EXPECT_TRUE(prefs()->GetExtensionPref(arbitrary_id
));
820 ids
.insert(arbitrary_id
);
821 ids
.insert(extension_a_
->id());
822 EXPECT_EQ(ids
, prefs()->GetBlacklistedExtensions());
824 prefs()->SetExtensionBlacklisted(arbitrary_id
, false);
825 prefs()->SetExtensionBlacklisted(extension_a_
->id(), false);
826 EXPECT_FALSE(prefs()->GetExtensionPref(arbitrary_id
));
829 EXPECT_EQ(ids
, prefs()->GetBlacklistedExtensions());
834 scoped_refptr
<const Extension
> extension_a_
;
835 scoped_refptr
<const Extension
> extension_b_
;
836 scoped_refptr
<const Extension
> extension_c_
;
838 TEST_F(ExtensionPrefsBlacklistedExtensions
,
839 ExtensionPrefsBlacklistedExtensions
) {}
841 // Tests the blacklist state. Old "blacklist" preference should take precedence
842 // over new "blacklist_state".
843 class ExtensionPrefsBlacklistState
: public ExtensionPrefsTest
{
845 ~ExtensionPrefsBlacklistState() override
{}
847 void Initialize() override
{ extension_a_
= prefs_
.AddExtension("a"); }
849 void Verify() override
{
850 ExtensionIdSet empty_ids
;
851 EXPECT_EQ(empty_ids
, prefs()->GetBlacklistedExtensions());
853 prefs()->SetExtensionBlacklisted(extension_a_
->id(), true);
854 EXPECT_EQ(BLACKLISTED_MALWARE
,
855 prefs()->GetExtensionBlacklistState(extension_a_
->id()));
857 prefs()->SetExtensionBlacklistState(extension_a_
->id(),
858 BLACKLISTED_POTENTIALLY_UNWANTED
);
859 EXPECT_EQ(BLACKLISTED_POTENTIALLY_UNWANTED
,
860 prefs()->GetExtensionBlacklistState(extension_a_
->id()));
861 EXPECT_FALSE(prefs()->IsExtensionBlacklisted(extension_a_
->id()));
862 EXPECT_EQ(empty_ids
, prefs()->GetBlacklistedExtensions());
864 prefs()->SetExtensionBlacklisted(extension_a_
->id(), true);
865 EXPECT_TRUE(prefs()->IsExtensionBlacklisted(extension_a_
->id()));
866 EXPECT_EQ(BLACKLISTED_MALWARE
,
867 prefs()->GetExtensionBlacklistState(extension_a_
->id()));
868 EXPECT_EQ(1u, prefs()->GetBlacklistedExtensions().size());
870 prefs()->SetExtensionBlacklistState(extension_a_
->id(),
872 EXPECT_EQ(NOT_BLACKLISTED
,
873 prefs()->GetExtensionBlacklistState(extension_a_
->id()));
874 EXPECT_FALSE(prefs()->IsExtensionBlacklisted(extension_a_
->id()));
875 EXPECT_EQ(empty_ids
, prefs()->GetBlacklistedExtensions());
879 scoped_refptr
<const Extension
> extension_a_
;
881 TEST_F(ExtensionPrefsBlacklistState
, ExtensionPrefsBlacklistState
) {}
883 // Tests clearing the last launched preference.
884 class ExtensionPrefsClearLastLaunched
: public ExtensionPrefsTest
{
886 ~ExtensionPrefsClearLastLaunched() override
{}
888 void Initialize() override
{
889 extension_a_
= prefs_
.AddExtension("a");
890 extension_b_
= prefs_
.AddExtension("b");
893 void Verify() override
{
894 // Set last launched times for each extension.
895 prefs()->SetLastLaunchTime(extension_a_
->id(), base::Time::Now());
896 prefs()->SetLastLaunchTime(extension_b_
->id(), base::Time::Now());
898 // Also set some other preference for one of the extensions.
899 prefs()->SetAllowFileAccess(extension_a_
->id(), true);
901 // Now clear the launch times.
902 prefs()->ClearLastLaunchTimes();
904 // All launch times should be gone.
905 EXPECT_EQ(base::Time(), prefs()->GetLastLaunchTime(extension_a_
->id()));
906 EXPECT_EQ(base::Time(), prefs()->GetLastLaunchTime(extension_b_
->id()));
908 // Other preferences should be untouched.
909 EXPECT_TRUE(prefs()->AllowFileAccess(extension_a_
->id()));
913 scoped_refptr
<const Extension
> extension_a_
;
914 scoped_refptr
<const Extension
> extension_b_
;
916 TEST_F(ExtensionPrefsClearLastLaunched
, ExtensionPrefsClearLastLaunched
) {}
918 class ExtensionPrefsComponentExtension
: public ExtensionPrefsTest
{
920 ~ExtensionPrefsComponentExtension() override
{}
921 void Initialize() override
{
922 // Adding a component extension.
923 component_extension_
=
925 .SetManifest(DictionaryBuilder()
926 .Set(manifest_keys::kName
, "a")
927 .Set(manifest_keys::kVersion
, "0.1"))
928 .SetLocation(Manifest::COMPONENT
)
929 .SetPath(prefs_
.extensions_dir().AppendASCII("a"))
931 prefs_
.AddExtension(component_extension_
.get());
933 // Adding a non component extension.
934 no_component_extension_
=
936 .SetManifest(DictionaryBuilder()
937 .Set(manifest_keys::kName
, "b")
938 .Set(manifest_keys::kVersion
, "0.1"))
939 .SetLocation(Manifest::INTERNAL
)
940 .SetPath(prefs_
.extensions_dir().AppendASCII("b"))
942 prefs_
.AddExtension(no_component_extension_
.get());
944 APIPermissionSet api_perms
;
945 api_perms
.insert(APIPermission::kTab
);
946 api_perms
.insert(APIPermission::kBookmark
);
947 api_perms
.insert(APIPermission::kHistory
);
949 ManifestPermissionSet empty_manifest_permissions
;
951 URLPatternSet ehosts
, shosts
;
952 AddPattern(&shosts
, "chrome://print/*");
954 active_perms_
= new PermissionSet(api_perms
, empty_manifest_permissions
,
956 // Set the active permissions.
957 prefs()->SetActivePermissions(component_extension_
->id(),
958 active_perms_
.get());
959 prefs()->SetActivePermissions(no_component_extension_
->id(),
960 active_perms_
.get());
963 void Verify() override
{
964 // Component extension can access chrome://print/*.
965 scoped_refptr
<PermissionSet
> component_permissions(
966 prefs()->GetActivePermissions(component_extension_
->id()));
967 EXPECT_EQ(1u, component_permissions
->scriptable_hosts().size());
969 // Non Component extension can not access chrome://print/*.
970 scoped_refptr
<PermissionSet
> no_component_permissions(
971 prefs()->GetActivePermissions(no_component_extension_
->id()));
972 EXPECT_EQ(0u, no_component_permissions
->scriptable_hosts().size());
974 // |URLPattern::SCHEME_CHROMEUI| scheme will be added in valid_schemes for
975 // component extensions.
976 URLPatternSet scriptable_hosts
;
977 std::string pref_key
= "active_permissions.scriptable_host";
978 int valid_schemes
= URLPattern::SCHEME_ALL
& ~URLPattern::SCHEME_CHROMEUI
;
980 EXPECT_TRUE(prefs()->ReadPrefAsURLPatternSet(component_extension_
->id(),
981 pref_key
, &scriptable_hosts
,
984 EXPECT_FALSE(prefs()->ReadPrefAsURLPatternSet(no_component_extension_
->id(),
985 pref_key
, &scriptable_hosts
,
990 scoped_refptr
<PermissionSet
> active_perms_
;
991 scoped_refptr
<Extension
> component_extension_
;
992 scoped_refptr
<Extension
> no_component_extension_
;
994 TEST_F(ExtensionPrefsComponentExtension
, ExtensionPrefsComponentExtension
) {
997 } // namespace extensions