OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/common/extensions/extension.h" | 5 #include "chrome/common/extensions/extension.h" |
6 | 6 |
7 #if defined(TOOLKIT_GTK) | 7 #if defined(TOOLKIT_GTK) |
8 #include <gtk/gtk.h> | 8 #include <gtk/gtk.h> |
9 #endif | 9 #endif |
10 | 10 |
(...skipping 1277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1288 EXPECT_FALSE(extension->wants_file_access()); | 1288 EXPECT_FALSE(extension->wants_file_access()); |
1289 EXPECT_FALSE(extension->CanExecuteScriptOnPage( | 1289 EXPECT_FALSE(extension->CanExecuteScriptOnPage( |
1290 file_url, &extension->content_scripts()[0], NULL)); | 1290 file_url, &extension->content_scripts()[0], NULL)); |
1291 extension = LoadManifest("permissions", "content_script_http_scheme.json", | 1291 extension = LoadManifest("permissions", "content_script_http_scheme.json", |
1292 Extension::ALLOW_FILE_ACCESS); | 1292 Extension::ALLOW_FILE_ACCESS); |
1293 EXPECT_FALSE(extension->wants_file_access()); | 1293 EXPECT_FALSE(extension->wants_file_access()); |
1294 EXPECT_FALSE(extension->CanExecuteScriptOnPage( | 1294 EXPECT_FALSE(extension->CanExecuteScriptOnPage( |
1295 file_url, &extension->content_scripts()[0], NULL)); | 1295 file_url, &extension->content_scripts()[0], NULL)); |
1296 } | 1296 } |
1297 | 1297 |
| 1298 // Base class for testing the CanExecuteScriptOnPage and CanCaptureVisiblePage |
| 1299 // methods of Extension for extensions with various permissions. |
| 1300 class ExtensionScriptAndCaptureVisibleTest : public testing::Test { |
| 1301 public: |
| 1302 ExtensionScriptAndCaptureVisibleTest() { |
| 1303 PathService::Get(chrome::DIR_TEST_DATA, &dirpath_); |
| 1304 } |
| 1305 |
| 1306 scoped_refptr<Extension> MakeExtension(const std::string& permissions, |
| 1307 Extension::Location location) { |
| 1308 // Replace single-quotes with double-quotes in permissions, since JSON |
| 1309 // mandates double-quotes. |
| 1310 std::string munged_permissions = permissions; |
| 1311 ReplaceSubstringsAfterOffset(&munged_permissions, 0, "'", "\""); |
| 1312 |
| 1313 DictionaryValue dictionary; |
| 1314 dictionary.SetString(keys::kName, "permission test"); |
| 1315 dictionary.SetString(keys::kVersion, "1"); |
| 1316 std::string error; |
| 1317 JSONStringValueSerializer serializer(munged_permissions); |
| 1318 scoped_ptr<Value> permission_value(serializer.Deserialize(NULL, &error)); |
| 1319 EXPECT_EQ("", error); |
| 1320 if (!permission_value.get()) |
| 1321 return NULL; |
| 1322 EXPECT_TRUE(permission_value->IsType(Value::TYPE_LIST)); |
| 1323 dictionary.Set(keys::kPermissions, permission_value.release()); |
| 1324 |
| 1325 FilePath dirpath; |
| 1326 PathService::Get(chrome::DIR_TEST_DATA, &dirpath); |
| 1327 dirpath = dirpath.AppendASCII("extensions").AppendASCII("permissions"); |
| 1328 |
| 1329 scoped_refptr<Extension> extension = Extension::Create( |
| 1330 dirpath, |
| 1331 location, |
| 1332 dictionary, |
| 1333 Extension::STRICT_ERROR_CHECKS, |
| 1334 &error); |
| 1335 if (!extension) |
| 1336 VLOG(1) << error; |
| 1337 return extension; |
| 1338 } |
| 1339 |
| 1340 bool Allowed(const Extension* extension, const GURL& url) { |
| 1341 return (extension->CanExecuteScriptOnPage(url, NULL, NULL) && |
| 1342 extension->CanCaptureVisiblePage(url, NULL)); |
| 1343 } |
| 1344 |
| 1345 bool CaptureOnly(const Extension* extension, const GURL& url) { |
| 1346 return !extension->CanExecuteScriptOnPage(url, NULL, NULL) && |
| 1347 extension->CanCaptureVisiblePage(url, NULL); |
| 1348 } |
| 1349 |
| 1350 bool Blocked(const Extension* extension, const GURL& url) { |
| 1351 return !(extension->CanExecuteScriptOnPage(url, NULL, NULL) || |
| 1352 extension->CanCaptureVisiblePage(url, NULL)); |
| 1353 } |
| 1354 |
| 1355 protected: |
| 1356 FilePath dirpath_; |
| 1357 }; |
| 1358 |
| 1359 TEST_F(ExtensionScriptAndCaptureVisibleTest, Permissions) { |
| 1360 scoped_refptr<Extension> extension; |
| 1361 // URLs that are "safe" to provide scripting and capture visible tab access |
| 1362 // to if the permissions allow it. |
| 1363 GURL http_url("http://www.google.com"); |
| 1364 GURL https_url("https://www.google.com"); |
| 1365 GURL file_url("file:///foo/bar"); |
| 1366 |
| 1367 // We should allow host permission but not scripting permission for favicon |
| 1368 // urls. |
| 1369 GURL favicon_url("chrome://favicon/http://www.google.com"); |
| 1370 |
| 1371 std::string dummy_id = |
| 1372 Extension::GenerateIdForPath(FilePath(FILE_PATH_LITERAL("whatever"))); |
| 1373 |
| 1374 // URLs that regular extensions should never get access to. |
| 1375 GURL extension_url("chrome-extension://" + dummy_id); |
| 1376 GURL settings_url("chrome://settings"); |
| 1377 GURL about_url("about:flags"); |
| 1378 |
| 1379 // Test <all_urls> for regular extensions. |
| 1380 extension = MakeExtension("['tabs','<all_urls>']", Extension::INTERNAL); |
| 1381 EXPECT_TRUE(Allowed(extension, http_url)); |
| 1382 EXPECT_TRUE(Allowed(extension, https_url)); |
| 1383 EXPECT_TRUE(Blocked(extension, file_url)); |
| 1384 EXPECT_TRUE(Blocked(extension, settings_url)); |
| 1385 EXPECT_TRUE(CaptureOnly(extension, favicon_url)); |
| 1386 EXPECT_TRUE(Blocked(extension, about_url)); |
| 1387 EXPECT_TRUE(Blocked(extension, extension_url)); |
| 1388 |
| 1389 EXPECT_FALSE(extension->HasHostPermission(settings_url)); |
| 1390 EXPECT_FALSE(extension->HasHostPermission(about_url)); |
| 1391 EXPECT_TRUE(extension->HasHostPermission(favicon_url)); |
| 1392 |
| 1393 // Test * for scheme, which implies just the http/https schemes. |
| 1394 extension = MakeExtension("['tabs','*://*/']", Extension::INTERNAL); |
| 1395 EXPECT_TRUE(Allowed(extension, http_url)); |
| 1396 EXPECT_TRUE(Allowed(extension, https_url)); |
| 1397 EXPECT_TRUE(Blocked(extension, settings_url)); |
| 1398 EXPECT_TRUE(Blocked(extension, about_url)); |
| 1399 EXPECT_TRUE(Blocked(extension, file_url)); |
| 1400 EXPECT_TRUE(Blocked(extension, favicon_url)); |
| 1401 extension = MakeExtension("['tabs','*://settings/*']", Extension::INTERNAL); |
| 1402 EXPECT_TRUE(Blocked(extension, settings_url)); |
| 1403 |
| 1404 // Having chrome://*/ should not work for regular extensions. Note that |
| 1405 // for favicon access, we require the explicit pattern chrome://favicon/*. |
| 1406 extension = MakeExtension("['tabs','chrome://*/']", |
| 1407 Extension::INTERNAL); |
| 1408 EXPECT_TRUE(extension == NULL); |
| 1409 |
| 1410 // Having chrome://favicon/* should not give you chrome://* |
| 1411 extension = MakeExtension("['tabs','chrome://favicon/*']", |
| 1412 Extension::INTERNAL); |
| 1413 EXPECT_TRUE(Blocked(extension, settings_url)); |
| 1414 EXPECT_TRUE(CaptureOnly(extension, favicon_url)); |
| 1415 EXPECT_TRUE(Blocked(extension, about_url)); |
| 1416 EXPECT_TRUE(extension->HasHostPermission(favicon_url)); |
| 1417 |
| 1418 // Having http://favicon should not give you chrome://favicon |
| 1419 extension = MakeExtension("['tabs', 'http://favicon/']", Extension::INTERNAL); |
| 1420 EXPECT_TRUE(Blocked(extension, settings_url)); |
| 1421 EXPECT_TRUE(Blocked(extension, favicon_url)); |
| 1422 |
| 1423 // Component extensions with <all_urls> should get everything. |
| 1424 extension = MakeExtension("['tabs','<all_urls>']", Extension::COMPONENT); |
| 1425 EXPECT_TRUE(Allowed(extension, http_url)); |
| 1426 EXPECT_TRUE(Allowed(extension, https_url)); |
| 1427 EXPECT_TRUE(Allowed(extension, settings_url)); |
| 1428 EXPECT_TRUE(Allowed(extension, about_url)); |
| 1429 EXPECT_TRUE(Allowed(extension, favicon_url)); |
| 1430 EXPECT_TRUE(extension->HasHostPermission(favicon_url)); |
| 1431 |
| 1432 // Component extensions should only get access to what they ask for. |
| 1433 extension = MakeExtension("['tabs', 'http://www.google.com/']", |
| 1434 Extension::COMPONENT); |
| 1435 EXPECT_TRUE(Allowed(extension, http_url)); |
| 1436 EXPECT_TRUE(Blocked(extension, https_url)); |
| 1437 EXPECT_TRUE(Blocked(extension, file_url)); |
| 1438 EXPECT_TRUE(Blocked(extension, settings_url)); |
| 1439 EXPECT_TRUE(Blocked(extension, favicon_url)); |
| 1440 EXPECT_TRUE(Blocked(extension, about_url)); |
| 1441 EXPECT_TRUE(Blocked(extension, extension_url)); |
| 1442 EXPECT_FALSE(extension->HasHostPermission(settings_url)); |
| 1443 } |
| 1444 |
| 1445 |
1298 TEST(ExtensionTest, GetDistinctHostsForDisplay) { | 1446 TEST(ExtensionTest, GetDistinctHostsForDisplay) { |
1299 std::vector<std::string> expected; | 1447 std::vector<std::string> expected; |
1300 expected.push_back("www.foo.com"); | 1448 expected.push_back("www.foo.com"); |
1301 expected.push_back("www.bar.com"); | 1449 expected.push_back("www.bar.com"); |
1302 expected.push_back("www.baz.com"); | 1450 expected.push_back("www.baz.com"); |
1303 URLPatternList actual; | 1451 URLPatternList actual; |
1304 | 1452 |
1305 { | 1453 { |
1306 SCOPED_TRACE("no dupes"); | 1454 SCOPED_TRACE("no dupes"); |
1307 | 1455 |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1553 EXPECT_TRUE(Extension::GenerateId("test", &result)); | 1701 EXPECT_TRUE(Extension::GenerateId("test", &result)); |
1554 EXPECT_EQ(result, "jpignaibiiemhngfjkcpokkamffknabf"); | 1702 EXPECT_EQ(result, "jpignaibiiemhngfjkcpokkamffknabf"); |
1555 | 1703 |
1556 EXPECT_TRUE(Extension::GenerateId("_", &result)); | 1704 EXPECT_TRUE(Extension::GenerateId("_", &result)); |
1557 EXPECT_EQ(result, "ncocknphbhhlhkikpnnlmbcnbgdempcd"); | 1705 EXPECT_EQ(result, "ncocknphbhhlhkikpnnlmbcnbgdempcd"); |
1558 | 1706 |
1559 EXPECT_TRUE(Extension::GenerateId( | 1707 EXPECT_TRUE(Extension::GenerateId( |
1560 "this_string_is_longer_than_a_single_sha256_hash_digest", &result)); | 1708 "this_string_is_longer_than_a_single_sha256_hash_digest", &result)); |
1561 EXPECT_EQ(result, "jimneklojkjdibfkgiiophfhjhbdgcfi"); | 1709 EXPECT_EQ(result, "jimneklojkjdibfkgiiophfhjhbdgcfi"); |
1562 } | 1710 } |
OLD | NEW |