extension_unittest.cc revision 58537e28ecd584eab876aee8be7156509866d23a
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/format_macros.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/command.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/extension.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_file_util.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/extension_test_util.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h" 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/common/extensions/permissions/permissions_data.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/extension_resource.h" 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/mime_sniffer.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/image_operations.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/codec/png_codec.h" 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using extension_test_util::LoadManifest; 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using extension_test_util::LoadManifestStrict; 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using base::FilePath; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We persist location values in the preferences, so this is a sanity test that 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// someone doesn't accidentally change them. 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, LocationValuesTest) { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(0, Manifest::INVALID_LOCATION); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1, Manifest::INTERNAL); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2, Manifest::EXTERNAL_PREF); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(3, Manifest::EXTERNAL_REGISTRY); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(4, Manifest::UNPACKED); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(5, Manifest::COMPONENT); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(6, Manifest::EXTERNAL_PREF_DOWNLOAD); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(7, Manifest::EXTERNAL_POLICY_DOWNLOAD); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(8, Manifest::COMMAND_LINE); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, LocationPriorityTest) { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < Manifest::NUM_LOCATIONS; i++) { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Location loc = static_cast<Manifest::Location>(i); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // INVALID is not a valid location. 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (loc == Manifest::INVALID_LOCATION) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Comparing a location that has no rank will hit a CHECK. Do a 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compare with every valid location, to be sure each one is covered. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that no install source can override a componenet extension. 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::COMPONENT, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation(Manifest::COMPONENT, loc)); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::COMPONENT, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation(loc, Manifest::COMPONENT)); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that any source can override a user install. This might change 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the future, in which case this test should be updated. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(loc, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation(Manifest::INTERNAL, loc)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(loc, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation(loc, Manifest::INTERNAL)); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check a few interesting cases that we know can happen: 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::EXTERNAL_POLICY_DOWNLOAD, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation( 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::EXTERNAL_POLICY_DOWNLOAD, 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::EXTERNAL_PREF)); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::EXTERNAL_PREF, 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation( 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::INTERNAL, 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::EXTERNAL_PREF)); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, GetResourceURLAndPath) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension = LoadManifestStrict("empty_manifest", 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "empty.json"); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension.get()); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->url().spec() + "bar/baz.js", 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::GetResourceURL(extension->url(), "bar/baz.js").spec()); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->url().spec() + "baz.js", 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::GetResourceURL(extension->url(), 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bar/../baz.js").spec()); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->url().spec() + "baz.js", 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::GetResourceURL(extension->url(), "../baz.js").spec()); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that absolute-looking paths ("/"-prefixed) are pasted correctly. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->url().spec() + "test.html", 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->GetResourceURL("/test.html").spec()); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(ExtensionTest, GetResource) { 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const FilePath valid_path_test_cases[] = { 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("manifest.json")), 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("a/b/c/manifest.json")), 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com/manifest.json")), 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("lpt/manifest.json")), 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const FilePath invalid_path_test_cases[] = { 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Directory name 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("src/")), 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Contains a drive letter specification. 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("C:\\manifest.json")), 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Use backslash '\\' as separator. 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("a\\b\\c\\manifest.json")), 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Reserved Characters with extension 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("mani>fest.json")), 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("mani<fest.json")), 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("mani*fest.json")), 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("mani:fest.json")), 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("mani?fest.json")), 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("mani|fest.json")), 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Reserved Characters without extension 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("mani>fest")), 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("mani<fest")), 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("mani*fest")), 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("mani:fest")), 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("mani?fest")), 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("mani|fest")), 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Reserved Names with extension. 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com1.json")), 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com9.json")), 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT1.json")), 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT9.json")), 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("CON.json")), 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("PRN.json")), 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("AUX.json")), 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("NUL.json")), 14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Reserved Names without extension. 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com1")), 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com9")), 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT1")), 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT9")), 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("CON")), 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("PRN")), 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("AUX")), 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("NUL")), 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Reserved Names as directory. 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com1/manifest.json")), 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com9/manifest.json")), 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT1/manifest.json")), 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT9/manifest.json")), 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("CON/manifest.json")), 15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("PRN/manifest.json")), 15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("AUX/manifest.json")), 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("NUL/manifest.json")), 15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<Extension> extension = LoadManifestStrict("empty_manifest", 16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) "empty.json"); 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(extension.get()); 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < arraysize(valid_path_test_cases); ++i) 16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(!extension->GetResource(valid_path_test_cases[i]).empty()); 16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < arraysize(invalid_path_test_cases); ++i) 16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(extension->GetResource(invalid_path_test_cases[i]).empty()); 16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, GetAbsolutePathNoError) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension = LoadManifestStrict("absolute_path", 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "absolute.json"); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension.get()); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string err; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<InstallWarning> warnings; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension_file_util::ValidateExtension(extension.get(), 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &err, &warnings)); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, warnings.size()); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->path().AppendASCII("test.html").value(), 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->GetResource("test.html").GetFilePath().value()); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->path().AppendASCII("test.js").value(), 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->GetResource("test.js").GetFilePath().value()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, IdIsValid) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Extension::IdIsValid("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Extension::IdIsValid("pppppppppppppppppppppppppppppppp")); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnop")); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Extension::IdIsValid("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmno")); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnopa")); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Extension::IdIsValid("0123456789abcdef0123456789abcdef")); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnoq")); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmno0")); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test ensures that the mimetype sniffing code stays in sync with the 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// actual crx files that we test other parts of the system with. 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, MimeTypeSniffing) { 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &path)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.AppendASCII("extensions").AppendASCII("good.crx"); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data; 20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(base::ReadFileToString(path, &data)); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(net::SniffMimeType(data.c_str(), 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data.size(), 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL("http://www.example.com/foo.crx"), 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &result)); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(Extension::kMimeType), result); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.clear(); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.clear(); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.DirName().AppendASCII("bad_magic.crx"); 22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(base::ReadFileToString(path, &data)); 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(net::SniffMimeType(data.c_str(), 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data.size(), 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL("http://www.example.com/foo.crx"), 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &result)); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("application/octet-stream", result); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, WantsFileAccess) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL file_url("file:///etc/passwd"); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Ignore the policy delegate for this test. 23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PermissionsData::SetPolicyDelegate(NULL); 23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // <all_urls> permission 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "permissions_all_urls.json"); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage( 240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), file_url, file_url, -1, NULL, -1, NULL)); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest( 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "permissions", "permissions_all_urls.json", Extension::ALLOW_FILE_ACCESS); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(PermissionsData::CanExecuteScriptOnPage( 245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), file_url, file_url, -1, NULL, -1, NULL)); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // file:///* permission 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "permissions_file_scheme.json"); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage( 251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), file_url, file_url, -1, NULL, -1, NULL)); 252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension = LoadManifest("permissions", 253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "permissions_file_scheme.json", 254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Extension::ALLOW_FILE_ACCESS); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(PermissionsData::CanExecuteScriptOnPage( 257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), file_url, file_url, -1, NULL, -1, NULL)); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://* permission 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "permissions_http_scheme.json"); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->wants_file_access()); 26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage( 263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), file_url, file_url, -1, NULL, -1, NULL)); 264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension = LoadManifest("permissions", 265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "permissions_http_scheme.json", 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Extension::ALLOW_FILE_ACCESS); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->wants_file_access()); 26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage( 269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), file_url, file_url, -1, NULL, -1, NULL)); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // <all_urls> content script match 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_all_urls.json"); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage( 275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) -1, 279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &ContentScriptsInfo::GetContentScripts(extension.get())[0], 28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) -1, 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_all_urls.json", 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::ALLOW_FILE_ACCESS); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(PermissionsData::CanExecuteScriptOnPage( 286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) -1, 290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &ContentScriptsInfo::GetContentScripts(extension.get())[0], 29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) -1, 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // file:///* content script match 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_file_scheme.json"); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage( 298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) -1, 302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &ContentScriptsInfo::GetContentScripts(extension.get())[0], 30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) -1, 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_file_scheme.json", 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::ALLOW_FILE_ACCESS); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(PermissionsData::CanExecuteScriptOnPage( 309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) -1, 313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &ContentScriptsInfo::GetContentScripts(extension.get())[0], 31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) -1, 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://* content script match 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_http_scheme.json"); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->wants_file_access()); 32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage( 321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) -1, 325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &ContentScriptsInfo::GetContentScripts(extension.get())[0], 32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) -1, 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_http_scheme.json", 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::ALLOW_FILE_ACCESS); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->wants_file_access()); 33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage( 332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) -1, 336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &ContentScriptsInfo::GetContentScripts(extension.get())[0], 33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) -1, 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, ExtraFlags) { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("app", "manifest.json", Extension::FROM_WEBSTORE); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->from_webstore()); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("app", "manifest.json", Extension::FROM_BOOKMARK); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->from_bookmark()); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("app", "manifest.json", Extension::NO_FLAGS); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->from_bookmark()); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->from_webstore()); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 355