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