extension_unittest.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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_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"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/extension_resource.h"
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "extensions/common/file_util.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;
176a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(file_util::ValidateExtension(extension.get(), &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());
23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(extension->permissions_data()->CanAccessPage(
24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension, file_url, file_url, -1, -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());
24446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(extension->permissions_data()->CanAccessPage(
24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension, file_url, file_url, -1, -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());
25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(extension->permissions_data()->CanAccessPage(
25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension, file_url, file_url, -1, -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());
25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(extension->permissions_data()->CanAccessPage(
25746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension, file_url, file_url, -1, -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());
26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(extension->permissions_data()->CanAccessPage(
26346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension, file_url, file_url, -1, -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());
26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(extension->permissions_data()->CanAccessPage(
26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension, file_url, file_url, -1, -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());
27446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(extension->permissions_data()->CanRunContentScriptOnPage(
27546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension, file_url, file_url, -1, -1, NULL));
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("permissions", "content_script_all_urls.json",
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Extension::ALLOW_FILE_ACCESS);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->wants_file_access());
27946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(extension->permissions_data()->CanRunContentScriptOnPage(
28046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension, file_url, file_url, -1, -1, NULL));
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // file:///* content script match
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("permissions", "content_script_file_scheme.json");
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->wants_file_access());
28546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(extension->permissions_data()->CanRunContentScriptOnPage(
28646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension, file_url, file_url, -1, -1, NULL));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("permissions", "content_script_file_scheme.json",
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Extension::ALLOW_FILE_ACCESS);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->wants_file_access());
29046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(extension->permissions_data()->CanRunContentScriptOnPage(
29146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension, file_url, file_url, -1, -1, NULL));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://* content script match
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("permissions", "content_script_http_scheme.json");
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(extension->wants_file_access());
29646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(extension->permissions_data()->CanRunContentScriptOnPage(
29746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension, file_url, file_url, -1, -1, NULL));
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("permissions", "content_script_http_scheme.json",
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Extension::ALLOW_FILE_ACCESS);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(extension->wants_file_access());
30146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(extension->permissions_data()->CanRunContentScriptOnPage(
30246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension, file_url, file_url, -1, -1, NULL));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ExtensionTest, ExtraFlags) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("app", "manifest.json", Extension::FROM_WEBSTORE);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->from_webstore());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("app", "manifest.json", Extension::FROM_BOOKMARK);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->from_bookmark());
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("app", "manifest.json", Extension::NO_FLAGS);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(extension->from_bookmark());
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(extension->from_webstore());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
319