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