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) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/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_test_util.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/crx_file/id_util.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/extension_resource.h" 18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "extensions/common/file_util.h" 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/mime_sniffer.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/image_operations.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/codec/png_codec.h" 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using extension_test_util::LoadManifest; 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using extension_test_util::LoadManifestStrict; 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using base::FilePath; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We persist location values in the preferences, so this is a sanity test that 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// someone doesn't accidentally change them. 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, LocationValuesTest) { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(0, Manifest::INVALID_LOCATION); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1, Manifest::INTERNAL); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2, Manifest::EXTERNAL_PREF); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(3, Manifest::EXTERNAL_REGISTRY); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(4, Manifest::UNPACKED); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(5, Manifest::COMPONENT); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(6, Manifest::EXTERNAL_PREF_DOWNLOAD); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(7, Manifest::EXTERNAL_POLICY_DOWNLOAD); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(8, Manifest::COMMAND_LINE); 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(9, Manifest::EXTERNAL_POLICY); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, LocationPriorityTest) { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < Manifest::NUM_LOCATIONS; i++) { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Location loc = static_cast<Manifest::Location>(i); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // INVALID is not a valid location. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (loc == Manifest::INVALID_LOCATION) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Comparing a location that has no rank will hit a CHECK. Do a 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compare with every valid location, to be sure each one is covered. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that no install source can override a componenet extension. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::COMPONENT, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation(Manifest::COMPONENT, loc)); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::COMPONENT, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation(loc, Manifest::COMPONENT)); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that any source can override a user install. This might change 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the future, in which case this test should be updated. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(loc, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation(Manifest::INTERNAL, loc)); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(loc, 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation(loc, Manifest::INTERNAL)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check a few interesting cases that we know can happen: 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::EXTERNAL_POLICY_DOWNLOAD, 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation( 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::EXTERNAL_POLICY_DOWNLOAD, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::EXTERNAL_PREF)); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::EXTERNAL_PREF, 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation( 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::INTERNAL, 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::EXTERNAL_PREF)); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, GetResourceURLAndPath) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension = LoadManifestStrict("empty_manifest", 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "empty.json"); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension.get()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->url().spec() + "bar/baz.js", 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::GetResourceURL(extension->url(), "bar/baz.js").spec()); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->url().spec() + "baz.js", 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::GetResourceURL(extension->url(), 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bar/../baz.js").spec()); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->url().spec() + "baz.js", 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::GetResourceURL(extension->url(), "../baz.js").spec()); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that absolute-looking paths ("/"-prefixed) are pasted correctly. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->url().spec() + "test.html", 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->GetResourceURL("/test.html").spec()); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(ExtensionTest, GetResource) { 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const FilePath valid_path_test_cases[] = { 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("manifest.json")), 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("a/b/c/manifest.json")), 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com/manifest.json")), 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("lpt/manifest.json")), 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const FilePath invalid_path_test_cases[] = { 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Directory name 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("src/")), 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Contains a drive letter specification. 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("C:\\manifest.json")), 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Use backslash '\\' as separator. 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("a\\b\\c\\manifest.json")), 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Reserved Characters with extension 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) FilePath(FILE_PATH_LITERAL("mani?fest.json")), 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("mani|fest.json")), 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Reserved Characters without extension 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) FilePath(FILE_PATH_LITERAL("mani?fest")), 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("mani|fest")), 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Reserved Names with extension. 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com1.json")), 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com9.json")), 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT1.json")), 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT9.json")), 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("CON.json")), 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("PRN.json")), 14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("AUX.json")), 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("NUL.json")), 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Reserved Names without extension. 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com1")), 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com9")), 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT1")), 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT9")), 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("CON")), 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("PRN")), 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("AUX")), 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("NUL")), 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Reserved Names as directory. 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com1/manifest.json")), 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com9/manifest.json")), 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT1/manifest.json")), 15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT9/manifest.json")), 15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("CON/manifest.json")), 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("PRN/manifest.json")), 15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("AUX/manifest.json")), 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("NUL/manifest.json")), 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<Extension> extension = LoadManifestStrict("empty_manifest", 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) "empty.json"); 16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(extension.get()); 16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < arraysize(valid_path_test_cases); ++i) 16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(!extension->GetResource(valid_path_test_cases[i]).empty()); 16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < arraysize(invalid_path_test_cases); ++i) 16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(extension->GetResource(invalid_path_test_cases[i]).empty()); 16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, GetAbsolutePathNoError) { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension = LoadManifestStrict("absolute_path", 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "absolute.json"); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension.get()); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string err; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<InstallWarning> warnings; 177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_TRUE(file_util::ValidateExtension(extension.get(), &err, &warnings)); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, warnings.size()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->path().AppendASCII("test.html").value(), 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->GetResource("test.html").GetFilePath().value()); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->path().AppendASCII("test.js").value(), 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->GetResource("test.js").GetFilePath().value()); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, IdIsValid) { 18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(crx_file::id_util::IdIsValid("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); 18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(crx_file::id_util::IdIsValid("pppppppppppppppppppppppppppppppp")); 19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(crx_file::id_util::IdIsValid("abcdefghijklmnopabcdefghijklmnop")); 19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(crx_file::id_util::IdIsValid("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")); 19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE(crx_file::id_util::IdIsValid("abcdefghijklmnopabcdefghijklmno")); 19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE( 19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) crx_file::id_util::IdIsValid("abcdefghijklmnopabcdefghijklmnopa")); 19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE( 19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) crx_file::id_util::IdIsValid("0123456789abcdef0123456789abcdef")); 19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE( 19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) crx_file::id_util::IdIsValid("abcdefghijklmnopabcdefghijklmnoq")); 19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE( 20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) crx_file::id_util::IdIsValid("abcdefghijklmnopabcdefghijklmno0")); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test ensures that the mimetype sniffing code stays in sync with the 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// actual crx files that we test other parts of the system with. 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, MimeTypeSniffing) { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &path)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.AppendASCII("extensions").AppendASCII("good.crx"); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data; 21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(base::ReadFileToString(path, &data)); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(net::SniffMimeType(data.c_str(), 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data.size(), 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL("http://www.example.com/foo.crx"), 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &result)); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(Extension::kMimeType), result); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.clear(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.clear(); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.DirName().AppendASCII("bad_magic.crx"); 22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(base::ReadFileToString(path, &data)); 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(net::SniffMimeType(data.c_str(), 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data.size(), 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL("http://www.example.com/foo.crx"), 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &result)); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("application/octet-stream", result); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, WantsFileAccess) { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL file_url("file:///etc/passwd"); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Ignore the policy delegate for this test. 23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PermissionsData::SetPolicyDelegate(NULL); 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // <all_urls> permission 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "permissions_all_urls.json"); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 24446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(extension->permissions_data()->CanAccessPage( 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension.get(), file_url, file_url, -1, -1, NULL)); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest( 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "permissions", "permissions_all_urls.json", Extension::ALLOW_FILE_ACCESS); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(extension->permissions_data()->CanAccessPage( 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension.get(), file_url, file_url, -1, -1, NULL)); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // file:///* permission 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "permissions_file_scheme.json"); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(extension->permissions_data()->CanAccessPage( 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension.get(), file_url, file_url, -1, -1, NULL)); 257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension = LoadManifest("permissions", 258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "permissions_file_scheme.json", 259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Extension::ALLOW_FILE_ACCESS); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(extension->permissions_data()->CanAccessPage( 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension.get(), file_url, file_url, -1, -1, NULL)); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://* permission 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "permissions_http_scheme.json"); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->wants_file_access()); 26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(extension->permissions_data()->CanAccessPage( 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension.get(), file_url, file_url, -1, -1, NULL)); 269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension = LoadManifest("permissions", 270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "permissions_http_scheme.json", 271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Extension::ALLOW_FILE_ACCESS); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->wants_file_access()); 27346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(extension->permissions_data()->CanAccessPage( 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension.get(), file_url, file_url, -1, -1, NULL)); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // <all_urls> content script match 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_all_urls.json"); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 27946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(extension->permissions_data()->CanRunContentScriptOnPage( 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension.get(), file_url, file_url, -1, -1, NULL)); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_all_urls.json", 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::ALLOW_FILE_ACCESS); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 28446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(extension->permissions_data()->CanRunContentScriptOnPage( 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension.get(), file_url, file_url, -1, -1, NULL)); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // file:///* content script match 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_file_scheme.json"); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 29046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(extension->permissions_data()->CanRunContentScriptOnPage( 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension.get(), file_url, file_url, -1, -1, NULL)); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_file_scheme.json", 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::ALLOW_FILE_ACCESS); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 29546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(extension->permissions_data()->CanRunContentScriptOnPage( 2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension.get(), file_url, file_url, -1, -1, NULL)); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://* content script match 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_http_scheme.json"); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->wants_file_access()); 30146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(extension->permissions_data()->CanRunContentScriptOnPage( 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension.get(), file_url, file_url, -1, -1, NULL)); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_http_scheme.json", 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::ALLOW_FILE_ACCESS); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->wants_file_access()); 30646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(extension->permissions_data()->CanRunContentScriptOnPage( 3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension.get(), file_url, file_url, -1, -1, NULL)); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, ExtraFlags) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("app", "manifest.json", Extension::FROM_WEBSTORE); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->from_webstore()); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("app", "manifest.json", Extension::FROM_BOOKMARK); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->from_bookmark()); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("app", "manifest.json", Extension::NO_FLAGS); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->from_bookmark()); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->from_webstore()); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 324