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