| 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 |