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" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_file_util.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/extension_test_util.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/extension_resource.h" 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h" 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.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); 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(9, Manifest::EXTERNAL_POLICY); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, LocationPriorityTest) { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < Manifest::NUM_LOCATIONS; i++) { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Location loc = static_cast<Manifest::Location>(i); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // INVALID is not a valid location. 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (loc == Manifest::INVALID_LOCATION) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Comparing a location that has no rank will hit a CHECK. Do a 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compare with every valid location, to be sure each one is covered. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that no install source can override a componenet extension. 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::COMPONENT, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation(Manifest::COMPONENT, loc)); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::COMPONENT, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation(loc, Manifest::COMPONENT)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that any source can override a user install. This might change 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the future, in which case this test should be updated. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(loc, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation(Manifest::INTERNAL, loc)); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(loc, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation(loc, Manifest::INTERNAL)); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check a few interesting cases that we know can happen: 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::EXTERNAL_POLICY_DOWNLOAD, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation( 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::EXTERNAL_POLICY_DOWNLOAD, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::EXTERNAL_PREF)); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(Manifest::EXTERNAL_PREF, 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::GetHigherPriorityLocation( 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::INTERNAL, 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::EXTERNAL_PREF)); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, GetResourceURLAndPath) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension = LoadManifestStrict("empty_manifest", 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "empty.json"); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension.get()); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->url().spec() + "bar/baz.js", 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::GetResourceURL(extension->url(), "bar/baz.js").spec()); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->url().spec() + "baz.js", 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::GetResourceURL(extension->url(), 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bar/../baz.js").spec()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->url().spec() + "baz.js", 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::GetResourceURL(extension->url(), "../baz.js").spec()); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that absolute-looking paths ("/"-prefixed) are pasted correctly. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->url().spec() + "test.html", 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->GetResourceURL("/test.html").spec()); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(ExtensionTest, GetResource) { 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const FilePath valid_path_test_cases[] = { 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("manifest.json")), 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("a/b/c/manifest.json")), 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com/manifest.json")), 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("lpt/manifest.json")), 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const FilePath invalid_path_test_cases[] = { 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Directory name 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("src/")), 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Contains a drive letter specification. 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("C:\\manifest.json")), 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Use backslash '\\' as separator. 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("a\\b\\c\\manifest.json")), 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Reserved Characters with extension 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) FilePath(FILE_PATH_LITERAL("mani|fest.json")), 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Reserved Characters without extension 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) FilePath(FILE_PATH_LITERAL("mani|fest")), 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Reserved Names with extension. 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com1.json")), 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com9.json")), 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT1.json")), 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT9.json")), 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("CON.json")), 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("PRN.json")), 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("AUX.json")), 14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("NUL.json")), 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Reserved Names without extension. 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com1")), 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com9")), 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT1")), 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT9")), 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("CON")), 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("PRN")), 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("AUX")), 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("NUL")), 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Reserved Names as directory. 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com1/manifest.json")), 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("com9/manifest.json")), 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT1/manifest.json")), 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("LPT9/manifest.json")), 15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("CON/manifest.json")), 15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("PRN/manifest.json")), 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("AUX/manifest.json")), 15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FilePath(FILE_PATH_LITERAL("NUL/manifest.json")), 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<Extension> extension = LoadManifestStrict("empty_manifest", 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) "empty.json"); 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(extension.get()); 16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < arraysize(valid_path_test_cases); ++i) 16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(!extension->GetResource(valid_path_test_cases[i]).empty()); 16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < arraysize(invalid_path_test_cases); ++i) 16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(extension->GetResource(invalid_path_test_cases[i]).empty()); 16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, GetAbsolutePathNoError) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension = LoadManifestStrict("absolute_path", 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "absolute.json"); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension.get()); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string err; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<InstallWarning> warnings; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension_file_util::ValidateExtension(extension.get(), 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &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) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Extension::IdIsValid("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Extension::IdIsValid("pppppppppppppppppppppppppppppppp")); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnop")); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Extension::IdIsValid("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmno")); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnopa")); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Extension::IdIsValid("0123456789abcdef0123456789abcdef")); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnoq")); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmno0")); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test ensures that the mimetype sniffing code stays in sync with the 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// actual crx files that we test other parts of the system with. 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, MimeTypeSniffing) { 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &path)); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.AppendASCII("extensions").AppendASCII("good.crx"); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data; 20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(base::ReadFileToString(path, &data)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(net::SniffMimeType(data.c_str(), 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data.size(), 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL("http://www.example.com/foo.crx"), 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &result)); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(Extension::kMimeType), result); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.clear(); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.clear(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.DirName().AppendASCII("bad_magic.crx"); 22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(base::ReadFileToString(path, &data)); 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(net::SniffMimeType(data.c_str(), 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data.size(), 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL("http://www.example.com/foo.crx"), 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &result)); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("application/octet-stream", result); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, WantsFileAccess) { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL file_url("file:///etc/passwd"); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Ignore the policy delegate for this test. 23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PermissionsData::SetPolicyDelegate(NULL); 23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // <all_urls> permission 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "permissions_all_urls.json"); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage( 241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), file_url, file_url, -1, NULL, -1, NULL)); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest( 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "permissions", "permissions_all_urls.json", Extension::ALLOW_FILE_ACCESS); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(PermissionsData::CanExecuteScriptOnPage( 246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), file_url, file_url, -1, NULL, -1, NULL)); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // file:///* permission 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "permissions_file_scheme.json"); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage( 252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), file_url, file_url, -1, NULL, -1, NULL)); 253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension = LoadManifest("permissions", 254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "permissions_file_scheme.json", 255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Extension::ALLOW_FILE_ACCESS); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(PermissionsData::CanExecuteScriptOnPage( 258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), file_url, file_url, -1, NULL, -1, NULL)); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://* permission 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "permissions_http_scheme.json"); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->wants_file_access()); 26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage( 264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), file_url, file_url, -1, NULL, -1, NULL)); 265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension = LoadManifest("permissions", 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "permissions_http_scheme.json", 267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Extension::ALLOW_FILE_ACCESS); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->wants_file_access()); 26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage( 270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), file_url, file_url, -1, NULL, -1, NULL)); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // <all_urls> content script match 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_all_urls.json"); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage( 276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) -1, 280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &ContentScriptsInfo::GetContentScripts(extension.get())[0], 28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) -1, 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_all_urls.json", 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::ALLOW_FILE_ACCESS); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(PermissionsData::CanExecuteScriptOnPage( 287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) -1, 291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &ContentScriptsInfo::GetContentScripts(extension.get())[0], 29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) -1, 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // file:///* content script match 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_file_scheme.json"); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage( 299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) -1, 303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &ContentScriptsInfo::GetContentScripts(extension.get())[0], 30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) -1, 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_file_scheme.json", 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::ALLOW_FILE_ACCESS); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->wants_file_access()); 30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(PermissionsData::CanExecuteScriptOnPage( 310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) -1, 314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &ContentScriptsInfo::GetContentScripts(extension.get())[0], 31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) -1, 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://* content script match 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_http_scheme.json"); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->wants_file_access()); 32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage( 322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) -1, 326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &ContentScriptsInfo::GetContentScripts(extension.get())[0], 32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) -1, 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("permissions", "content_script_http_scheme.json", 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::ALLOW_FILE_ACCESS); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->wants_file_access()); 33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(PermissionsData::CanExecuteScriptOnPage( 333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension.get(), 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_url, 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) -1, 337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &ContentScriptsInfo::GetContentScripts(extension.get())[0], 33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) -1, 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, ExtraFlags) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("app", "manifest.json", Extension::FROM_WEBSTORE); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->from_webstore()); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("app", "manifest.json", Extension::FROM_BOOKMARK); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension->from_bookmark()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = LoadManifest("app", "manifest.json", Extension::NO_FLAGS); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->from_bookmark()); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(extension->from_webstore()); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 356