1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
28ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Use of this source code is governed by a BSD-style license that can be
38ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// found in the LICENSE file.
48ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
58ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension.h"
68ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
78ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#if defined(TOOLKIT_GTK)
88ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include <gtk/gtk.h>
98ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif
108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/format_macros.h"
128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/file_path.h"
138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/file_util.h"
148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/i18n/rtl.h"
158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/path_service.h"
168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/string_number_conversions.h"
178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/string_util.h"
188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/utf_string_conversions.h"
198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/chrome_paths.h"
208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_action.h"
218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_constants.h"
228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_error_utils.h"
238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_resource.h"
248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/url_constants.h"
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/json_value_serializer.h"
268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "googleurl/src/gurl.h"
278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "net/base/mime_sniffer.h"
288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "skia/ext/image_operations.h"
298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/test/ui_test_utils.h"
308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "net/base/mock_host_resolver.h"
318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "testing/gtest/include/gtest/gtest.h"
328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "third_party/skia/include/core/SkBitmap.h"
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/codec/png_codec.h"
358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsennamespace keys = extension_manifest_keys;
378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsennamespace values = extension_manifest_values;
388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsennamespace errors = extension_manifest_errors;
398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
40731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace {
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CompareLists(const std::vector<std::string>& expected,
43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                  const std::vector<std::string>& actual) {
44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_EQ(expected.size(), actual.size());
45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  for (size_t i = 0; i < expected.size(); ++i) {
47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(expected[i], actual[i]);
48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
51201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochstatic void AddPattern(ExtensionExtent* extent, const std::string& pattern) {
52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int schemes = URLPattern::SCHEME_ALL;
53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  extent->AddPattern(URLPattern(schemes, pattern));
54201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass ExtensionTest : public testing::Test {
598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen};
608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// We persist location values in the preferences, so this is a sanity test that
628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// someone doesn't accidentally change them.
638ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionTest, LocationValuesTest) {
648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(0, Extension::INVALID);
658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(1, Extension::INTERNAL);
668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(2, Extension::EXTERNAL_PREF);
678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(3, Extension::EXTERNAL_REGISTRY);
688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(4, Extension::LOAD);
698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(5, Extension::COMPONENT);
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(6, Extension::EXTERNAL_PREF_DOWNLOAD);
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(7, Extension::EXTERNAL_POLICY_DOWNLOAD);
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(ExtensionTest, LocationPriorityTest) {
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (int i = 0; i < Extension::NUM_LOCATIONS; i++) {
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Extension::Location loc = static_cast<Extension::Location>(i);
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // INVALID is not a valid location.
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (loc == Extension::INVALID)
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      continue;
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Comparing a location that has no rank will hit a CHECK. Do a
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // compare with every valid location, to be sure each one is covered.
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Check that no install source can override a componenet extension.
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_EQ(Extension::COMPONENT,
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              Extension::GetHigherPriorityLocation(Extension::COMPONENT, loc));
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_EQ(Extension::COMPONENT,
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              Extension::GetHigherPriorityLocation(loc, Extension::COMPONENT));
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Check that any source can override a user install. This might change
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // in the future, in which case this test should be updated.
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_EQ(loc,
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              Extension::GetHigherPriorityLocation(Extension::INTERNAL, loc));
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_EQ(loc,
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              Extension::GetHigherPriorityLocation(loc, Extension::INTERNAL));
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Check a few interesting cases that we know can happen:
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(Extension::EXTERNAL_POLICY_DOWNLOAD,
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            Extension::GetHigherPriorityLocation(
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                Extension::EXTERNAL_POLICY_DOWNLOAD,
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                Extension::EXTERNAL_PREF));
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(Extension::EXTERNAL_PREF,
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            Extension::GetHigherPriorityLocation(
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                Extension::INTERNAL,
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                Extension::EXTERNAL_PREF));
1098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
1108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Please don't put any more manifest tests here!!
1138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Move them to extension_manifest_unittest.cc instead and make them use the
1148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// more data-driven style there instead.
1158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Bug: http://crbug.com/38462
1168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1188ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionTest, InitFromValueInvalid) {
1198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#if defined(OS_WIN)
1208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath path(FILE_PATH_LITERAL("c:\\foo"));
1218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#elif defined(OS_POSIX)
1228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath path(FILE_PATH_LITERAL("/foo"));
1238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif
124513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<Extension> extension_ptr(new Extension(path,
125513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                                       Extension::INVALID));
126513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Extension& extension = *extension_ptr;
1278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  int error_code = 0;
1288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
1298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Start with a valid extension manifest
1318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath extensions_path;
1328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path));
1338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  extensions_path = extensions_path.AppendASCII("extensions")
1348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      .AppendASCII("good")
1358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      .AppendASCII("Extensions")
1368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
1378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      .AppendASCII("1.0.0.0")
1388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      .Append(Extension::kManifestFilename);
1398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  JSONFileValueSerializer serializer(extensions_path);
1418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  scoped_ptr<DictionaryValue> valid_value(
1428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      static_cast<DictionaryValue*>(serializer.Deserialize(&error_code,
1438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                           &error)));
1448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("", error);
1458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(0, error_code);
1468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(valid_value.get());
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_TRUE(extension.InitFromValue(*valid_value, Extension::REQUIRE_KEY,
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      &error));
1498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ("", error);
1508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("en_US", extension.default_locale());
1518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  scoped_ptr<DictionaryValue> input_value;
1538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test missing and invalid versions
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  input_value.reset(valid_value->DeepCopy());
1568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->Remove(keys::kVersion, NULL);
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
1598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(errors::kInvalidVersion, error);
1608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->SetInteger(keys::kVersion, 42);
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
1648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(errors::kInvalidVersion, error);
1658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test missing and invalid names.
16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  input_value.reset(valid_value->DeepCopy());
1688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->Remove(keys::kName, NULL);
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
1718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(errors::kInvalidName, error);
1728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->SetInteger(keys::kName, 42);
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
1768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(errors::kInvalidName, error);
1778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test invalid description
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  input_value.reset(valid_value->DeepCopy());
1808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->SetInteger(keys::kDescription, 42);
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
1838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(errors::kInvalidDescription, error);
1848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test invalid icons
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  input_value.reset(valid_value->DeepCopy());
1878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->SetInteger(keys::kIcons, 42);
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
1908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(errors::kInvalidIcons, error);
1918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test invalid icon paths
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  input_value.reset(valid_value->DeepCopy());
1948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue* icons = NULL;
1958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->GetDictionary(keys::kIcons, &icons);
1968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_FALSE(NULL == icons);
1978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  icons->SetInteger(base::IntToString(128), 42);
198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
2008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidIconPath));
2018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test invalid user scripts list
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  input_value.reset(valid_value->DeepCopy());
2048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->SetInteger(keys::kContentScripts, 42);
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
2078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(errors::kInvalidContentScriptsList, error);
2088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test invalid user script item
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  input_value.reset(valid_value->DeepCopy());
2118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ListValue* content_scripts = NULL;
2128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->GetList(keys::kContentScripts, &content_scripts);
2138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_FALSE(NULL == content_scripts);
2148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  content_scripts->Set(0, Value::CreateIntegerValue(42));
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
2178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidContentScript));
2188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test missing and invalid matches array
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  input_value.reset(valid_value->DeepCopy());
2218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->GetList(keys::kContentScripts, &content_scripts);
2228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue* user_script = NULL;
2238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  content_scripts->GetDictionary(0, &user_script);
2248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  user_script->Remove(keys::kMatches, NULL);
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
2278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidMatches));
2288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  user_script->Set(keys::kMatches, Value::CreateIntegerValue(42));
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
2328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidMatches));
2338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ListValue* matches = new ListValue;
2358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  user_script->Set(keys::kMatches, matches);
236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
2388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidMatchCount));
2398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test invalid match element
2418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  matches->Set(0, Value::CreateIntegerValue(42));
242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
2448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidMatch));
2458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  matches->Set(0, Value::CreateStringValue("chrome://*/*"));
247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
2498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidMatch));
2508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test missing and invalid files array
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  input_value.reset(valid_value->DeepCopy());
2538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->GetList(keys::kContentScripts, &content_scripts);
2548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  content_scripts->GetDictionary(0, &user_script);
2558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  user_script->Remove(keys::kJs, NULL);
2568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  user_script->Remove(keys::kCss, NULL);
257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
2598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kMissingFile));
2608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  user_script->Set(keys::kJs, Value::CreateIntegerValue(42));
262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
2648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidJsList));
2658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  user_script->Set(keys::kCss, new ListValue);
2678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  user_script->Set(keys::kJs, new ListValue);
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
2708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kMissingFile));
2718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  user_script->Remove(keys::kCss, NULL);
2728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ListValue* files = new ListValue;
2748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  user_script->Set(keys::kJs, files);
275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
2778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kMissingFile));
2788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test invalid file element
2808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  files->Set(0, Value::CreateIntegerValue(42));
281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
2838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidJs));
2848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  user_script->Remove(keys::kJs, NULL);
2868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test the css element
2878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  user_script->Set(keys::kCss, Value::CreateIntegerValue(42));
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
2908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidCssList));
2918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test invalid file element
2938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ListValue* css_files = new ListValue;
2948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  user_script->Set(keys::kCss, css_files);
2958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  css_files->Set(0, Value::CreateIntegerValue(42));
296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
2988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidCss));
2998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test missing and invalid permissions array
30172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  input_value.reset(valid_value->DeepCopy());
302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      &error));
304dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ListValue* permissions = NULL;
3068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->GetList(keys::kPermissions, &permissions);
3078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_FALSE(NULL == permissions);
3088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  permissions = new ListValue;
3108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->Set(keys::kPermissions, permissions);
311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      &error));
3138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->Set(keys::kPermissions, Value::CreateIntegerValue(9));
315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
3178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidPermissions));
3188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
31972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  input_value.reset(valid_value->DeepCopy());
3208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->GetList(keys::kPermissions, &permissions);
3218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  permissions->Set(0, Value::CreateIntegerValue(24));
322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
3248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidPermission));
3258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
326201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // We allow unknown API permissions, so this will be valid until we better
327201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // distinguish between API and host permissions.
3288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  permissions->Set(0, Value::CreateStringValue("www.google.com"));
329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      &error));
3318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Multiple page actions are not allowed.
33372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  input_value.reset(valid_value->DeepCopy());
3348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue* action = new DictionaryValue;
3358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action->SetString(keys::kPageActionId, "MyExtensionActionId");
3368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action->SetString(keys::kName, "MyExtensionActionName");
3378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ListValue* action_list = new ListValue;
3388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action_list->Append(action->DeepCopy());
3398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action_list->Append(action);
3408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->Set(keys::kPageActions, action_list);
341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
3438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_STREQ(errors::kInvalidPageActionsListSize, error.c_str());
3448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test invalid options page url.
34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  input_value.reset(valid_value->DeepCopy());
3478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->Set(keys::kOptionsPage, Value::CreateNullValue());
348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
3508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidOptionsPage));
3518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test invalid/empty default locale.
35372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  input_value.reset(valid_value->DeepCopy());
3548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->Set(keys::kDefaultLocale, Value::CreateIntegerValue(5));
355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
3578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidDefaultLocale));
3588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->Set(keys::kDefaultLocale, Value::CreateStringValue(""));
360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
3628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidDefaultLocale));
3638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test invalid minimum_chrome_version.
36572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  input_value.reset(valid_value->DeepCopy());
3668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->Set(keys::kMinimumChromeVersion, Value::CreateIntegerValue(42));
367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
3698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kInvalidMinimumChromeVersion));
3708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#if !defined(OS_MACOSX)
3728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // TODO(aa): The version isn't stamped into the unit test binary on mac.
3738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value->Set(keys::kMinimumChromeVersion,
3748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                   Value::CreateStringValue("88.8"));
375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension.InitFromValue(*input_value, Extension::REQUIRE_KEY,
376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       &error));
3778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(MatchPattern(error, errors::kChromeVersionTooLow));
3788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif
3798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
3808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3818ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionTest, InitFromValueValid) {
3828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#if defined(OS_WIN)
3838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath path(FILE_PATH_LITERAL("C:\\foo"));
3848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#elif defined(OS_POSIX)
3858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath path(FILE_PATH_LITERAL("/foo"));
3868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif
387513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<Extension> extension_ptr(new Extension(path,
388513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                                       Extension::INVALID));
389513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Extension& extension = *extension_ptr;
3908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
3918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue input_value;
3928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test minimal extension
3948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value.SetString(keys::kVersion, "1.0.0.0");
3958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value.SetString(keys::kName, "my extension");
3968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension.InitFromValue(input_value, Extension::NO_FLAGS,
398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      &error));
3998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("", error);
4008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(Extension::IdIsValid(extension.id()));
4018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("1.0.0.0", extension.VersionString());
4028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("my extension", extension.name());
4038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(extension.id(), extension.url().host());
4048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(path.value(), extension.path().value());
4058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
4068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test permissions scheme.
4078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ListValue* permissions = new ListValue;
4088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  permissions->Set(0, Value::CreateStringValue("file:///C:/foo.txt"));
4098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value.Set(keys::kPermissions, permissions);
410201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
411201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // We allow unknown API permissions, so this will be valid until we better
412201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // distinguish between API and host permissions.
413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension.InitFromValue(input_value, Extension::NO_FLAGS,
414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      &error));
4158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value.Remove(keys::kPermissions, NULL);
4168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
4178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test with an options page.
4188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value.SetString(keys::kOptionsPage, "options.html");
419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension.InitFromValue(input_value, Extension::NO_FLAGS,
420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      &error));
4218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("", error);
4228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("chrome-extension", extension.options_url().scheme());
4238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("/options.html", extension.options_url().path());
4248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
4258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test that an empty list of page actions does not stop a browser action
4268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // from being loaded.
4278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ListValue* empty_list = new ListValue;
4288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value.Set(keys::kPageActions, empty_list);
429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension.InitFromValue(input_value, Extension::NO_FLAGS,
430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      &error));
4318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("", error);
4328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
4338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#if !defined(OS_MACOSX)
4348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // TODO(aa): The version isn't stamped into the unit test binary on mac.
4358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test with a minimum_chrome_version.
4368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value.SetString(keys::kMinimumChromeVersion, "1.0");
437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension.InitFromValue(input_value, Extension::NO_FLAGS,
438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      &error));
4398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("", error);
4408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // The minimum chrome version is not stored in the Extension object.
4418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif
4428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
4438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
4448ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionTest, InitFromValueValidNameInRTL) {
4458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#if defined(TOOLKIT_GTK)
4468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  GtkTextDirection gtk_dir = gtk_widget_get_default_direction();
4478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  gtk_widget_set_default_direction(GTK_TEXT_DIR_RTL);
4488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#else
4498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string locale = l10n_util::GetApplicationLocale("");
4508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  base::i18n::SetICUDefaultLocale("he");
4518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif
4528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
4538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#if defined(OS_WIN)
4548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath path(FILE_PATH_LITERAL("C:\\foo"));
4558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#elif defined(OS_POSIX)
4568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath path(FILE_PATH_LITERAL("/foo"));
4578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif
458513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<Extension> extension_ptr(new Extension(path,
459513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                                       Extension::INVALID));
460513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Extension& extension = *extension_ptr;
4618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
4628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue input_value;
4638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
4648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value.SetString(keys::kVersion, "1.0.0.0");
4658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // No strong RTL characters in name.
4668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::wstring name(L"Dictionary (by Google)");
4678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value.SetString(keys::kName, WideToUTF16Hack(name));
468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension.InitFromValue(input_value, Extension::NO_FLAGS,
469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      &error));
4708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("", error);
4718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::wstring localized_name(name);
472201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  base::i18n::AdjustStringForLocaleDirection(&localized_name);
4738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(localized_name, UTF8ToWide(extension.name()));
4748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
4758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Strong RTL characters in name.
4768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  name = L"Dictionary (\x05D1\x05D2"L" Google)";
4778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value.SetString(keys::kName, WideToUTF16Hack(name));
478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension.InitFromValue(input_value, Extension::NO_FLAGS,
479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      &error));
4808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("", error);
4818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  localized_name = name;
482201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  base::i18n::AdjustStringForLocaleDirection(&localized_name);
4838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(localized_name, UTF8ToWide(extension.name()));
4848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
4858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Reset locale.
4868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#if defined(TOOLKIT_GTK)
4878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  gtk_widget_set_default_direction(gtk_dir);
4888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#else
4898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  base::i18n::SetICUDefaultLocale(locale);
4908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif
4918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
4928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
4938ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionTest, GetResourceURLAndPath) {
4948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#if defined(OS_WIN)
4958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath path(FILE_PATH_LITERAL("C:\\foo"));
4968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#elif defined(OS_POSIX)
4978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath path(FILE_PATH_LITERAL("/foo"));
4988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif
4998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue input_value;
5008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value.SetString(keys::kVersion, "1.0.0.0");
5018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input_value.SetString(keys::kName, "my extension");
502ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<Extension> extension(Extension::Create(path,
503ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Extension::INVALID, input_value, Extension::STRICT_ERROR_CHECKS, NULL));
504513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(extension.get());
505513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
506513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(extension->url().spec() + "bar/baz.js",
507513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch            Extension::GetResourceURL(extension->url(), "bar/baz.js").spec());
508513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(extension->url().spec() + "baz.js",
509513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch            Extension::GetResourceURL(extension->url(),
510513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                      "bar/../baz.js").spec());
511513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(extension->url().spec() + "baz.js",
512513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch            Extension::GetResourceURL(extension->url(), "../baz.js").spec());
5138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
5148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
5158ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionTest, LoadPageActionHelper) {
5168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#if defined(OS_WIN)
517513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    FilePath path(base::StringPrintf(L"c:\\extension"));
5188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#else
519513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    FilePath path(base::StringPrintf("/extension"));
5208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif
521513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<Extension> extension_ptr(new Extension(path,
522513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                                       Extension::INVALID));
523513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Extension& extension = *extension_ptr;
5248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error_msg;
5258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  scoped_ptr<ExtensionAction> action;
5268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue input;
5278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
5288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // First try with an empty dictionary.
5298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action.reset(extension.LoadExtensionActionHelper(&input, &error_msg));
5308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(action != NULL);
5318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(error_msg.empty());
5328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
5338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Now setup some values to use in the action.
5348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  const std::string id("MyExtensionActionId");
5358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  const std::string name("MyExtensionActionName");
5368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string img1("image1.png");
5378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string img2("image2.png");
5388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
5398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Add the dictionary for the contextual action.
5408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.SetString(keys::kPageActionId, id);
5418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.SetString(keys::kName, name);
5428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ListValue* icons = new ListValue;
5438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  icons->Set(0, Value::CreateStringValue(img1));
5448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  icons->Set(1, Value::CreateStringValue(img2));
5458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.Set(keys::kPageActionIcons, icons);
5468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
5478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Parse and read back the values from the object.
5488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action.reset(extension.LoadExtensionActionHelper(&input, &error_msg));
5498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(NULL != action.get());
5508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(error_msg.empty());
5518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(id, action->id());
5528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // No title, so fall back to name.
5538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(name, action->GetTitle(1));
5548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(2u, action->icon_paths()->size());
5558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(img1, (*action->icon_paths())[0]);
5568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(img2, (*action->icon_paths())[1]);
5578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
5588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Explicitly set the same type and parse again.
5598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.SetString(keys::kType, values::kPageActionTypeTab);
5608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action.reset(extension.LoadExtensionActionHelper(&input, &error_msg));
5618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(NULL != action.get());
5628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(error_msg.empty());
5638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
5648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Make a deep copy of the input and remove one key at a time and see if we
5658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // get the right error.
5668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  scoped_ptr<DictionaryValue> copy;
5678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
5688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // First remove id key.
56972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  copy.reset(input.DeepCopy());
5708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  copy->Remove(keys::kPageActionId, NULL);
5718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action.reset(extension.LoadExtensionActionHelper(copy.get(), &error_msg));
5728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(NULL != action.get());
5738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
5748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Then remove the name key. It's optional, so no error.
57572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  copy.reset(input.DeepCopy());
5768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  copy->Remove(keys::kName, NULL);
5778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action.reset(extension.LoadExtensionActionHelper(copy.get(), &error_msg));
5788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(NULL != action.get());
5798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(action->GetTitle(1).empty());
5808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(error_msg.empty());
5818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
5828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Then remove the icon paths key.
58372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  copy.reset(input.DeepCopy());
5848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  copy->Remove(keys::kPageActionIcons, NULL);
5858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action.reset(extension.LoadExtensionActionHelper(copy.get(), &error_msg));
5868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(NULL != action.get());
5878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  error_msg = "";
5888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
5898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Now test that we can parse the new format for page actions.
5908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
5918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Now setup some values to use in the page action.
5928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  const std::string kTitle("MyExtensionActionTitle");
5938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  const std::string kIcon("image1.png");
5948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  const std::string kPopupHtmlFile("a_popup.html");
5958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
5968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Add the dictionary for the contextual action.
5978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.Clear();
5988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.SetString(keys::kPageActionDefaultTitle, kTitle);
5998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.SetString(keys::kPageActionDefaultIcon, kIcon);
6008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
6018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Parse and read back the values from the object.
6028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action.reset(extension.LoadExtensionActionHelper(&input, &error_msg));
6038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(action.get());
6048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(error_msg.empty());
6058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(kTitle, action->GetTitle(1));
6068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(0u, action->icon_paths()->size());
6078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
6088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Invalid title should give an error even with a valid name.
6098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.Clear();
6108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.SetInteger(keys::kPageActionDefaultTitle, 42);
6118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.SetString(keys::kName, name);
6128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action.reset(extension.LoadExtensionActionHelper(&input, &error_msg));
6138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(NULL == action.get());
6148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_STREQ(errors::kInvalidPageActionDefaultTitle, error_msg.c_str());
6158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  error_msg = "";
6168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
6178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Invalid name should give an error only with no title.
6188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.SetString(keys::kPageActionDefaultTitle, kTitle);
6198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.SetInteger(keys::kName, 123);
6208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action.reset(extension.LoadExtensionActionHelper(&input, &error_msg));
6218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(NULL != action.get());
6228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(kTitle, action->GetTitle(1));
6238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(error_msg.empty());
6248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
6258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.Remove(keys::kPageActionDefaultTitle, NULL);
6268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action.reset(extension.LoadExtensionActionHelper(&input, &error_msg));
6278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(NULL == action.get());
6288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_STREQ(errors::kInvalidPageActionName, error_msg.c_str());
6298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  error_msg = "";
6308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
6318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test that keys "popup" and "default_popup" both work, but can not
6328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // be used at the same time.
6338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.Clear();
6348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.SetString(keys::kPageActionDefaultTitle, kTitle);
6358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.SetString(keys::kPageActionDefaultIcon, kIcon);
6368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
637731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // LoadExtensionActionHelper expects the extension member |extension_url|
6388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // to be set.
639513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  extension.extension_url_ =
640731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      GURL(std::string(chrome::kExtensionScheme) +
641731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           chrome::kStandardSchemeSeparator +
642731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick           "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/");
6438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
6448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Add key "popup", expect success.
6458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.SetString(keys::kPageActionPopup, kPopupHtmlFile);
6468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action.reset(extension.LoadExtensionActionHelper(&input, &error_msg));
6478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(NULL != action.get());
6488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(error_msg.empty());
6498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_STREQ(
650731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      extension.url().Resolve(kPopupHtmlFile).spec().c_str(),
6518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      action->GetPopupUrl(ExtensionAction::kDefaultTabId).spec().c_str());
6528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
6538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Add key "default_popup", expect failure.
6548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.SetString(keys::kPageActionDefaultPopup, kPopupHtmlFile);
6558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action.reset(extension.LoadExtensionActionHelper(&input, &error_msg));
6568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(NULL == action.get());
6578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_STREQ(
6588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      ExtensionErrorUtils::FormatErrorMessage(
6598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen          errors::kInvalidPageActionOldAndNewKeys,
6608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen          keys::kPageActionDefaultPopup,
6618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen          keys::kPageActionPopup).c_str(),
6628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      error_msg.c_str());
6638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  error_msg = "";
6648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
6658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Remove key "popup", expect success.
6668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.Remove(keys::kPageActionPopup, NULL);
6678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action.reset(extension.LoadExtensionActionHelper(&input, &error_msg));
6688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(NULL != action.get());
6698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(error_msg.empty());
6708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_STREQ(
671731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      extension.url().Resolve(kPopupHtmlFile).spec().c_str(),
6728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      action->GetPopupUrl(ExtensionAction::kDefaultTabId).spec().c_str());
6738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
6748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Setting default_popup to "" is the same as having no popup.
6758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.Remove(keys::kPageActionDefaultPopup, NULL);
6768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.SetString(keys::kPageActionDefaultPopup, "");
6778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action.reset(extension.LoadExtensionActionHelper(&input, &error_msg));
6788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(NULL != action.get());
6798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(error_msg.empty());
6808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(action->HasPopup(ExtensionAction::kDefaultTabId));
6818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_STREQ(
6828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      "",
6838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      action->GetPopupUrl(ExtensionAction::kDefaultTabId).spec().c_str());
6848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
6858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Setting popup to "" is the same as having no popup.
6868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.Remove(keys::kPageActionDefaultPopup, NULL);
6878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  input.SetString(keys::kPageActionPopup, "");
6888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action.reset(extension.LoadExtensionActionHelper(&input, &error_msg));
6898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(NULL != action.get());
6908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(error_msg.empty());
6918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(action->HasPopup(ExtensionAction::kDefaultTabId));
6928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_STREQ(
6938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      "",
6948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      action->GetPopupUrl(ExtensionAction::kDefaultTabId).spec().c_str());
6958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
6968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
6978ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionTest, IdIsValid) {
6988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(Extension::IdIsValid("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
6998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(Extension::IdIsValid("pppppppppppppppppppppppppppppppp"));
7008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnop"));
7018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(Extension::IdIsValid("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"));
7028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmno"));
7038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnopa"));
7048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(Extension::IdIsValid("0123456789abcdef0123456789abcdef"));
7058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnoq"));
7068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmno0"));
7078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
7088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
7098ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionTest, GenerateID) {
7108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  const uint8 public_key_info[] = {
7118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
7128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81,
7138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    0x89, 0x02, 0x81, 0x81, 0x00, 0xb8, 0x7f, 0x2b, 0x20, 0xdc, 0x7c, 0x9b,
7148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    0x0c, 0xdc, 0x51, 0x61, 0x99, 0x0d, 0x36, 0x0f, 0xd4, 0x66, 0x88, 0x08,
7158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    0x55, 0x84, 0xd5, 0x3a, 0xbf, 0x2b, 0xa4, 0x64, 0x85, 0x7b, 0x0c, 0x04,
7168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    0x13, 0x3f, 0x8d, 0xf4, 0xbc, 0x38, 0x0d, 0x49, 0xfe, 0x6b, 0xc4, 0x5a,
7178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    0xb0, 0x40, 0x53, 0x3a, 0xd7, 0x66, 0x09, 0x0f, 0x9e, 0x36, 0x74, 0x30,
7188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    0xda, 0x8a, 0x31, 0x4f, 0x1f, 0x14, 0x50, 0xd7, 0xc7, 0x20, 0x94, 0x17,
7198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    0xde, 0x4e, 0xb9, 0x57, 0x5e, 0x7e, 0x0a, 0xe5, 0xb2, 0x65, 0x7a, 0x89,
7208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    0x4e, 0xb6, 0x47, 0xff, 0x1c, 0xbd, 0xb7, 0x38, 0x13, 0xaf, 0x47, 0x85,
7218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    0x84, 0x32, 0x33, 0xf3, 0x17, 0x49, 0xbf, 0xe9, 0x96, 0xd0, 0xd6, 0x14,
7228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    0x6f, 0x13, 0x8d, 0xc5, 0xfc, 0x2c, 0x72, 0xba, 0xac, 0xea, 0x7e, 0x18,
7238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    0x53, 0x56, 0xa6, 0x83, 0xa2, 0xce, 0x93, 0x93, 0xe7, 0x1f, 0x0f, 0xe6,
7248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    0x0f, 0x02, 0x03, 0x01, 0x00, 0x01
7258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  };
7268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
7278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string extension_id;
7288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(
7298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      Extension::GenerateId(
7308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen          std::string(reinterpret_cast<const char*>(&public_key_info[0]),
7318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                      arraysize(public_key_info)),
7328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen          &extension_id));
7338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("melddjfinppjdikinhbgehiennejpfhp", extension_id);
7348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
7358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
7368ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionTest, UpdateUrls) {
7378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test several valid update urls
7388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::vector<std::string> valid;
7398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  valid.push_back("http://test.com");
7408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  valid.push_back("http://test.com/");
7418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  valid.push_back("http://test.com/update");
7428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  valid.push_back("http://test.com/update?check=true");
7438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  for (size_t i = 0; i < valid.size(); i++) {
7448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    GURL url(valid[i]);
7458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    EXPECT_TRUE(url.is_valid());
7468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
7478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    DictionaryValue input_value;
7488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#if defined(OS_WIN)
7498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    // (Why %Iu below?  This is the single file in the whole code base that
7508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    // might make use of a WidePRIuS; let's not encourage any more.)
751513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    FilePath path(base::StringPrintf(L"c:\\extension%Iu", i));
7528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#else
753513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    FilePath path(base::StringPrintf("/extension%" PRIuS, i));
7548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif
7558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    std::string error;
7568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
7578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    input_value.SetString(keys::kVersion, "1.0");
7588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    input_value.SetString(keys::kName, "Test");
7598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    input_value.SetString(keys::kUpdateURL, url.spec());
7608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
761513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_refptr<Extension> extension(Extension::Create(
762ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        path, Extension::INVALID, input_value, Extension::STRICT_ERROR_CHECKS,
763ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        &error));
764513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_TRUE(extension.get()) << error;
7658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  }
7668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
7678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Test some invalid update urls
7688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::vector<std::string> invalid;
7698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  invalid.push_back("");
7708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  invalid.push_back("test.com");
7718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  valid.push_back("http://test.com/update#whatever");
7728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  for (size_t i = 0; i < invalid.size(); i++) {
7738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    DictionaryValue input_value;
7748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#if defined(OS_WIN)
7758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    // (Why %Iu below?  This is the single file in the whole code base that
7768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    // might make use of a WidePRIuS; let's not encourage any more.)
777513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    FilePath path(base::StringPrintf(L"c:\\extension%Iu", i));
7788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#else
779513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    FilePath path(base::StringPrintf("/extension%" PRIuS, i));
7808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif
7818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    std::string error;
7828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    input_value.SetString(keys::kVersion, "1.0");
7838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    input_value.SetString(keys::kName, "Test");
7848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    input_value.SetString(keys::kUpdateURL, invalid[i]);
7858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
786513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_refptr<Extension> extension(Extension::Create(
787ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        path, Extension::INVALID, input_value, Extension::STRICT_ERROR_CHECKS,
788ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        &error));
789513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_FALSE(extension.get());
7908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    EXPECT_TRUE(MatchPattern(error, errors::kInvalidUpdateURL));
7918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  }
7928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
7938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
7948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// This test ensures that the mimetype sniffing code stays in sync with the
7958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// actual crx files that we test other parts of the system with.
7968ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionTest, MimeTypeSniffing) {
7978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath path;
7988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &path));
7998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  path = path.AppendASCII("extensions").AppendASCII("good.crx");
8008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
8018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string data;
8028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(file_util::ReadFileToString(path, &data));
8038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
8048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string result;
8058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(net::SniffMimeType(data.c_str(), data.size(),
8068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen              GURL("http://www.example.com/foo.crx"), "", &result));
8078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(std::string(Extension::kMimeType), result);
8088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
8098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  data.clear();
8108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  result.clear();
8118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  path = path.DirName().AppendASCII("bad_magic.crx");
8128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(file_util::ReadFileToString(path, &data));
8138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(net::SniffMimeType(data.c_str(), data.size(),
8148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen              GURL("http://www.example.com/foo.crx"), "", &result));
8158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("application/octet-stream", result);
8168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
8178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
818513209b27ff55e2841eac0e4120199c23acce758Ben Murdochstatic scoped_refptr<Extension> LoadManifest(const std::string& dir,
819ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             const std::string& test_file,
820ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             int extra_flags) {
8218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath path;
8228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  PathService::Get(chrome::DIR_TEST_DATA, &path);
8238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  path = path.AppendASCII("extensions")
8248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen             .AppendASCII(dir)
8258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen             .AppendASCII(test_file);
8268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
8278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  JSONFileValueSerializer serializer(path);
828731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string error;
829731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_ptr<Value> result(serializer.Deserialize(NULL, &error));
830731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!result.get()) {
831731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ("", error);
8328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    return NULL;
833731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
8348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
835513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<Extension> extension = Extension::Create(
836513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      path.DirName(), Extension::INVALID,
837ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      *static_cast<DictionaryValue*>(result.get()),
838ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Extension::STRICT_ERROR_CHECKS | extra_flags, &error);
839513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(extension) << error;
840513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return extension;
8418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
8428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
843ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic scoped_refptr<Extension> LoadManifest(const std::string& dir,
844ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             const std::string& test_file) {
845ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return LoadManifest(dir, test_file, Extension::NO_FLAGS);
846ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
847ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
8488ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionTest, EffectiveHostPermissions) {
849513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<Extension> extension;
8508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ExtensionExtent hosts;
8518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
852513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  extension = LoadManifest("effective_host_permissions", "empty.json");
8538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(0u, extension->GetEffectiveHostPermissions().patterns().size());
854731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(hosts.ContainsURL(GURL("http://www.google.com")));
8558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(extension->HasEffectiveAccessToAllHosts());
8568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
857513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  extension = LoadManifest("effective_host_permissions", "one_host.json");
8588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  hosts = extension->GetEffectiveHostPermissions();
8598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(hosts.ContainsURL(GURL("http://www.google.com")));
860731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(hosts.ContainsURL(GURL("https://www.google.com")));
8618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(extension->HasEffectiveAccessToAllHosts());
8628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
863513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  extension = LoadManifest("effective_host_permissions",
864513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                           "one_host_wildcard.json");
8658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  hosts = extension->GetEffectiveHostPermissions();
8668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(hosts.ContainsURL(GURL("http://google.com")));
867731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(hosts.ContainsURL(GURL("http://foo.google.com")));
8688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(extension->HasEffectiveAccessToAllHosts());
8698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
870513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  extension = LoadManifest("effective_host_permissions", "two_hosts.json");
8718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  hosts = extension->GetEffectiveHostPermissions();
8728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(hosts.ContainsURL(GURL("http://www.google.com")));
8738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(hosts.ContainsURL(GURL("http://www.reddit.com")));
8748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(extension->HasEffectiveAccessToAllHosts());
8758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
876513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  extension = LoadManifest("effective_host_permissions",
877513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                           "https_not_considered.json");
8788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  hosts = extension->GetEffectiveHostPermissions();
8798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(hosts.ContainsURL(GURL("http://google.com")));
880731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(hosts.ContainsURL(GURL("https://google.com")));
8818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(extension->HasEffectiveAccessToAllHosts());
8828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
883513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  extension = LoadManifest("effective_host_permissions",
884513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                           "two_content_scripts.json");
8858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  hosts = extension->GetEffectiveHostPermissions();
8868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(hosts.ContainsURL(GURL("http://google.com")));
8878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(hosts.ContainsURL(GURL("http://www.reddit.com")));
8888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(hosts.ContainsURL(GURL("http://news.ycombinator.com")));
8898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(extension->HasEffectiveAccessToAllHosts());
8908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
891513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  extension = LoadManifest("effective_host_permissions", "all_hosts.json");
8928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  hosts = extension->GetEffectiveHostPermissions();
8938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(hosts.ContainsURL(GURL("http://test/")));
894731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(hosts.ContainsURL(GURL("https://test/")));
895731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(hosts.ContainsURL(GURL("http://www.google.com")));
8968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(extension->HasEffectiveAccessToAllHosts());
8978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
898513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  extension = LoadManifest("effective_host_permissions", "all_hosts2.json");
8998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  hosts = extension->GetEffectiveHostPermissions();
9008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(hosts.ContainsURL(GURL("http://test/")));
9018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(hosts.ContainsURL(GURL("http://www.google.com")));
9028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(extension->HasEffectiveAccessToAllHosts());
9038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
904513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  extension = LoadManifest("effective_host_permissions", "all_hosts3.json");
9058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  hosts = extension->GetEffectiveHostPermissions();
906731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(hosts.ContainsURL(GURL("http://test/")));
9078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(hosts.ContainsURL(GURL("https://test/")));
9088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(hosts.ContainsURL(GURL("http://www.google.com")));
9098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(extension->HasEffectiveAccessToAllHosts());
9108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
9118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
912731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(ExtensionTest, IsPrivilegeIncrease) {
9138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  const struct {
9148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    const char* base_name;
915201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Increase these sizes if you have more than 10.
916201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const char* granted_apis[10];
917201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const char* granted_hosts[10];
918201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    bool full_access;
919201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    bool expect_increase;
9208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  } kTests[] = {
921201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "allhosts1", {NULL}, {"http://*/", NULL}, false,
922201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      false },  // all -> all
923201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "allhosts2", {NULL}, {"http://*/", NULL}, false,
924201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      false },  // all -> one
925201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "allhosts3", {NULL}, {NULL}, false, true },  // one -> all
926201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "hosts1", {NULL},
927201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      {"http://www.google.com/", "http://www.reddit.com/", NULL}, false,
928201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      false },  // http://a,http://b -> http://a,http://b
929201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "hosts2", {NULL},
930201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      {"http://www.google.com/", "http://www.reddit.com/", NULL}, false,
931201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      true },  // http://a,http://b -> https://a,http://*.b
932201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "hosts3", {NULL},
933201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      {"http://www.google.com/", "http://www.reddit.com/", NULL}, false,
934201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      false },  // http://a,http://b -> http://a
935201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "hosts4", {NULL},
936201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      {"http://www.google.com/", NULL}, false,
937201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      true },  // http://a -> http://a,http://b
938201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "hosts5", {"tabs", "notifications", NULL},
939201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      {"http://*.example.com/", "http://*.example.com/*",
940201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch       "http://*.example.co.uk/*", "http://*.example.com.au/*",
941201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch       NULL}, false,
942201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      false },  // http://a,b,c -> http://a,b,c + https://a,b,c
943201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "hosts6", {"tabs", "notifications", NULL},
944201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      {"http://*.example.com/", "http://*.example.com/*", NULL}, false,
945201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      false },  // http://a.com -> http://a.com + http://a.co.uk
946201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "permissions1", {"tabs", NULL},
947201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      {NULL}, false, false },  // tabs -> tabs
948201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "permissions2", {"tabs", NULL},
949201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      {NULL}, false, true },  // tabs -> tabs,bookmarks
950201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "permissions3", {NULL},
951201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      {"http://*/*", NULL},
952201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      false, true },  // http://a -> http://a,tabs
953201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "permissions5", {"bookmarks", NULL},
954201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      {NULL}, false, true },  // bookmarks -> bookmarks,history
955731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if !defined(OS_CHROMEOS)  // plugins aren't allowed in ChromeOS
956201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "permissions4", {NULL},
957201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      {NULL}, true, false },  // plugin -> plugin,tabs
958201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "plugin1", {NULL},
959201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      {NULL}, true, false },  // plugin -> plugin
960201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "plugin2", {NULL},
961201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      {NULL}, true, false },  // plugin -> none
962201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "plugin3", {NULL},
963201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      {NULL}, false, true },  // none -> plugin
9648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif
965201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "storage", {NULL},
966201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      {NULL}, false, false },  // none -> storage
967201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { "notifications", {NULL},
968201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      {NULL}, false, false }  // none -> notifications
9698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  };
9708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
9718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) {
972513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_refptr<Extension> old_extension(
9738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen        LoadManifest("allow_silent_upgrade",
9748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                     std::string(kTests[i].base_name) + "_old.json"));
975513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_refptr<Extension> new_extension(
9768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen        LoadManifest("allow_silent_upgrade",
9778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                     std::string(kTests[i].base_name) + "_new.json"));
9788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
979201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::set<std::string> granted_apis;
980201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    for (size_t j = 0; kTests[i].granted_apis[j] != NULL; ++j)
981201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      granted_apis.insert(kTests[i].granted_apis[j]);
982201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
983201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    ExtensionExtent granted_hosts;
984201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    for (size_t j = 0; kTests[i].granted_hosts[j] != NULL; ++j)
985201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      AddPattern(&granted_hosts, kTests[i].granted_hosts[j]);
986201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
987731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_TRUE(new_extension.get()) << kTests[i].base_name << "_new.json";
988201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!new_extension.get())
989731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      continue;
990731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
991201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    EXPECT_EQ(kTests[i].expect_increase,
992201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch              Extension::IsPrivilegeIncrease(kTests[i].full_access,
993201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                             granted_apis,
994201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                             granted_hosts,
9958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                             new_extension.get()))
9968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen        << kTests[i].base_name;
9978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  }
9988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
9998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
10008ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionTest, PermissionMessages) {
10018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Ensure that all permissions that needs to show install UI actually have
10028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // strings associated with them.
10038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
10048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::set<std::string> skip;
10058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
10068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // These are considered "nuisance" or "trivial" permissions that don't need
10078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // a prompt.
10088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  skip.insert(Extension::kContextMenusPermission);
10098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  skip.insert(Extension::kIdlePermission);
10108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  skip.insert(Extension::kNotificationPermission);
10118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  skip.insert(Extension::kUnlimitedStoragePermission);
1012dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  skip.insert(Extension::kContentSettingsPermission);
10138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
10148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // TODO(erikkay) add a string for this permission.
10158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  skip.insert(Extension::kBackgroundPermission);
10168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
10178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // The cookie permission does nothing unless you have associated host
10188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // permissions.
10198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  skip.insert(Extension::kCookiePermission);
10208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
10218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // The proxy permission is warned as part of host permission checks.
10228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  skip.insert(Extension::kProxyPermission);
10238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1024ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // This permission requires explicit user action (context menu handler)
1025ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // so we won't prompt for it for now.
1026ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  skip.insert(Extension::kFileBrowserHandlerPermission);
1027ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
10288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // If you've turned on the experimental command-line flag, we don't need
10298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // to warn you further.
10308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  skip.insert(Extension::kExperimentalPermission);
10318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1032ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // These are only usable by component extensions.
10338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  skip.insert(Extension::kWebstorePrivatePermission);
1034ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  skip.insert(Extension::kFileBrowserPrivatePermission);
1035ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  skip.insert(Extension::kChromeosInfoPrivatePermissions);
1036ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1037ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const Extension::PermissionMessage::MessageId ID_NONE =
1038ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Extension::PermissionMessage::ID_NONE;
10398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
10408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  for (size_t i = 0; i < Extension::kNumPermissions; ++i) {
1041ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Extension::Permission permission = Extension::kPermissions[i];
1042ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (skip.count(permission.name)) {
1043ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      EXPECT_EQ(ID_NONE, permission.message_id)
1044ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          << "unexpected message_id for " << permission.name;
1045ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
1046ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      EXPECT_NE(ID_NONE, permission.message_id)
1047ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          << "missing message_id for " << permission.name;
1048ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
10498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  }
10508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
10518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
10528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Returns a copy of |source| resized to |size| x |size|.
10538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenstatic SkBitmap ResizedCopy(const SkBitmap& source, int size) {
10548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  return skia::ImageOperations::Resize(source,
10558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                       skia::ImageOperations::RESIZE_LANCZOS3,
10568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                       size,
10578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                       size);
10588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
10598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
10608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenstatic bool SizeEquals(const SkBitmap& bitmap, const gfx::Size& size) {
10618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  return bitmap.width() == size.width() && bitmap.height() == size.height();
10628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
10638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
10648ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionTest, ImageCaching) {
10658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath path;
10668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &path));
10678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  path = path.AppendASCII("extensions");
10688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
10698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Initialize the Extension.
10708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string errors;
10718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue values;
10728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  values.SetString(keys::kName, "test");
10738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  values.SetString(keys::kVersion, "0.1");
1074513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<Extension> extension(Extension::Create(
1075ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      path, Extension::INVALID, values, Extension::STRICT_ERROR_CHECKS,
1076ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      &errors));
1077513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_TRUE(extension.get());
10788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
10798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Create an ExtensionResource pointing at an icon.
10808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath icon_relative_path(FILE_PATH_LITERAL("icon3.png"));
10818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ExtensionResource resource(extension->id(),
10828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                             extension->path(),
10838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                             icon_relative_path);
10848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
10858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Read in the icon file.
10868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath icon_absolute_path = extension->path().Append(icon_relative_path);
10878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string raw_png;
10888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(file_util::ReadFileToString(icon_absolute_path, &raw_png));
10898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  SkBitmap image;
10908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(gfx::PNGCodec::Decode(
10918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      reinterpret_cast<const unsigned char*>(raw_png.data()),
10928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      raw_png.length(),
10938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      &image));
10948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
10958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Make sure the icon file is the size we expect.
10968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  gfx::Size original_size(66, 66);
10978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(image.width(), original_size.width());
10988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(image.height(), original_size.height());
10998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
11008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Create two resized versions at size 16x16 and 24x24.
11018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  SkBitmap image16 = ResizedCopy(image, 16);
11028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  SkBitmap image24 = ResizedCopy(image, 24);
11038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
11048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  gfx::Size size16(16, 16);
11058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  gfx::Size size24(24, 24);
11068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
11078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Cache the 16x16 copy.
11088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(extension->HasCachedImage(resource, size16));
11098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  extension->SetCachedImage(resource, image16, original_size);
11108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(extension->HasCachedImage(resource, size16));
11118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(SizeEquals(extension->GetCachedImage(resource, size16), size16));
11128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(extension->HasCachedImage(resource, size24));
11138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(extension->HasCachedImage(resource, original_size));
11148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
11158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Cache the 24x24 copy.
11168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  extension->SetCachedImage(resource, image24, original_size);
11178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(extension->HasCachedImage(resource, size24));
11188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(SizeEquals(extension->GetCachedImage(resource, size24), size24));
11198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(extension->HasCachedImage(resource, original_size));
11208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
11218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Cache the original, and verify that it gets returned when we ask for a
11228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // max_size that is larger than the original.
11238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  gfx::Size size128(128, 128);
11248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(image.width() < size128.width() &&
11258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen              image.height() < size128.height());
11268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  extension->SetCachedImage(resource, image, original_size);
11278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(extension->HasCachedImage(resource, original_size));
11288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(extension->HasCachedImage(resource, size128));
11298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(SizeEquals(extension->GetCachedImage(resource, original_size),
11308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                         original_size));
11318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(SizeEquals(extension->GetCachedImage(resource, size128),
11328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                         original_size));
11338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(extension->GetCachedImage(resource, original_size).getPixels(),
11348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen            extension->GetCachedImage(resource, size128).getPixels());
11358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
11368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
11378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Tests that the old permission name "unlimited_storage" still works for
11388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// backwards compatibility (we renamed it to "unlimitedStorage").
11398ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionTest, OldUnlimitedStoragePermission) {
11408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ScopedTempDir directory;
11418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(directory.CreateUniqueTempDir());
11428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath extension_path = directory.path();
11438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue dictionary;
11448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
11458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // The two required keys.
11468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  dictionary.SetString(extension_manifest_keys::kName, "test");
11478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  dictionary.SetString(extension_manifest_keys::kVersion, "0.1");
11488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
11498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Create a permissions list containing "unlimited_storage" and add it.
11508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ListValue* permissions = new ListValue();
11518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  const char* old_unlimited = "unlimited_storage";
11528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_STREQ(old_unlimited, Extension::kOldUnlimitedStoragePermission);
11538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  permissions->Append(Value::CreateStringValue(old_unlimited));
11548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  dictionary.Set(extension_manifest_keys::kPermissions, permissions);
11558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
11568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Initialize the extension and make sure the permission for unlimited storage
11578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // is present.
11588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string errors;
1159513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<Extension> extension(Extension::Create(
1160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      extension_path, Extension::INVALID, dictionary,
1161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Extension::STRICT_ERROR_CHECKS, &errors));
1162513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(extension.get());
1163513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(extension->HasApiPermission(
11648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      Extension::kUnlimitedStoragePermission));
11658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
11668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
11678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// This tests the API permissions with an empty manifest (one that just
11688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// specifies a name and a version and nothing else).
11698ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionTest, ApiPermissions) {
11708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  const struct {
11718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    const char* permission_name;
11728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    bool expect_success;
11738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  } kTests[] = {
11748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    // Negative test.
11758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "non_existing_permission", false },
11768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    // Test default module/package permission.
11778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "browserAction",  true },
11788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "browserActions", true },
11798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "devtools",       true },
11808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "extension",      true },
11818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "i18n",           true },
11828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "pageAction",     true },
11838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "pageActions",    true },
11848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "test",           true },
11858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    // Some negative tests.
11868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "bookmarks",      false },
11878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "cookies",        false },
11888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "history",        false },
11898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "tabs.onUpdated", false },
11908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    // Make sure we find the module name after stripping '.' and '/'.
11918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "browserAction/abcd/onClick",  true },
11928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "browserAction.abcd.onClick",  true },
11938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    // Test Tabs functions.
11948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "tabs.create",      true},
11958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "tabs.update",      true},
11968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    { "tabs.getSelected", false},
11978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  };
11988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1199513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<Extension> extension;
1200513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  extension = LoadManifest("empty_manifest", "empty.json");
12018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
12028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) {
12038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    EXPECT_EQ(kTests[i].expect_success,
12048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen              extension->HasApiPermission(kTests[i].permission_name))
12058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                  << "Permission being tested: " << kTests[i].permission_name;
12068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  }
12078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
1208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(ExtensionTest, GetHostPermissionMessages_ManyHosts) {
1210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<Extension> extension;
1211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = LoadManifest("permissions", "many-hosts.json");
1212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<string16> warnings = extension->GetPermissionMessageStrings();
1213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(1u, warnings.size());
1214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ("Your data on www.google.com and encrypted.google.com",
1215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            UTF16ToUTF8(warnings[0]));
1216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(ExtensionTest, GetPermissionMessages_Plugins) {
1219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<Extension> extension;
1220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = LoadManifest("permissions", "plugins.json");
1221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<string16> warnings = extension->GetPermissionMessageStrings();
1222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // We don't parse the plugins key on Chrome OS, so it should not ask for any
1223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // permissions.
1224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_CHROMEOS)
1225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(0u, warnings.size());
1226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#else
1227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(1u, warnings.size());
1228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ("All data on your computer and the websites you visit",
1229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            UTF16ToUTF8(warnings[0]));
1230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif
1231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(ExtensionTest, WantsFileAccess) {
1234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<Extension> extension;
1235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GURL file_url("file:///etc/passwd");
1236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // <all_urls> permission
1238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = LoadManifest("permissions", "permissions_all_urls.json");
1239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension->wants_file_access());
1240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL));
1241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = LoadManifest(
1242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "permissions", "permissions_all_urls.json", Extension::ALLOW_FILE_ACCESS);
1243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension->wants_file_access());
1244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL));
1245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // file:///* permission
1247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = LoadManifest("permissions", "permissions_file_scheme.json");
1248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension->wants_file_access());
1249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL));
1250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = LoadManifest("permissions", "permissions_file_scheme.json",
1251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Extension::ALLOW_FILE_ACCESS);
1252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension->wants_file_access());
1253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL));
1254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // http://* permission
1256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = LoadManifest("permissions", "permissions_http_scheme.json");
1257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension->wants_file_access());
1258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL));
1259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = LoadManifest("permissions", "permissions_http_scheme.json",
1260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Extension::ALLOW_FILE_ACCESS);
1261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension->wants_file_access());
1262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL));
1263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // <all_urls> content script match
1265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = LoadManifest("permissions", "content_script_all_urls.json");
1266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension->wants_file_access());
1267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension->CanExecuteScriptOnPage(
1268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      file_url, &extension->content_scripts()[0], NULL));
1269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = LoadManifest("permissions", "content_script_all_urls.json",
1270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Extension::ALLOW_FILE_ACCESS);
1271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension->wants_file_access());
1272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension->CanExecuteScriptOnPage(
1273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      file_url, &extension->content_scripts()[0], NULL));
1274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // file:///* content script match
1276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = LoadManifest("permissions", "content_script_file_scheme.json");
1277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension->wants_file_access());
1278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension->CanExecuteScriptOnPage(
1279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      file_url, &extension->content_scripts()[0], NULL));
1280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = LoadManifest("permissions", "content_script_file_scheme.json",
1281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Extension::ALLOW_FILE_ACCESS);
1282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension->wants_file_access());
1283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension->CanExecuteScriptOnPage(
1284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      file_url, &extension->content_scripts()[0], NULL));
1285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // http://* content script match
1287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = LoadManifest("permissions", "content_script_http_scheme.json");
1288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension->wants_file_access());
1289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension->CanExecuteScriptOnPage(
1290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      file_url, &extension->content_scripts()[0], NULL));
1291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = LoadManifest("permissions", "content_script_http_scheme.json",
1292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Extension::ALLOW_FILE_ACCESS);
1293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension->wants_file_access());
1294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension->CanExecuteScriptOnPage(
1295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      file_url, &extension->content_scripts()[0], NULL));
1296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Base class for testing the CanExecuteScriptOnPage and CanCaptureVisiblePage
1299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// methods of Extension for extensions with various permissions.
1300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ExtensionScriptAndCaptureVisibleTest : public testing::Test {
1301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
1302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExtensionScriptAndCaptureVisibleTest() {
1303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PathService::Get(chrome::DIR_TEST_DATA, &dirpath_);
1304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<Extension> MakeExtension(const std::string& permissions,
1307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                         Extension::Location location) {
1308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Replace single-quotes with double-quotes in permissions, since JSON
1309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // mandates double-quotes.
1310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string munged_permissions = permissions;
1311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ReplaceSubstringsAfterOffset(&munged_permissions, 0, "'", "\"");
1312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue dictionary;
1314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    dictionary.SetString(keys::kName, "permission test");
1315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    dictionary.SetString(keys::kVersion, "1");
1316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string error;
1317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    JSONStringValueSerializer serializer(munged_permissions);
1318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_ptr<Value> permission_value(serializer.Deserialize(NULL, &error));
1319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_EQ("", error);
1320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!permission_value.get())
1321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return NULL;
1322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXPECT_TRUE(permission_value->IsType(Value::TYPE_LIST));
1323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    dictionary.Set(keys::kPermissions, permission_value.release());
1324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    FilePath dirpath;
1326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PathService::Get(chrome::DIR_TEST_DATA, &dirpath);
1327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    dirpath = dirpath.AppendASCII("extensions").AppendASCII("permissions");
1328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_refptr<Extension> extension =  Extension::Create(
1330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        dirpath,
1331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        location,
1332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        dictionary,
1333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        Extension::STRICT_ERROR_CHECKS,
1334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        &error);
1335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!extension)
1336ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      VLOG(1) << error;
1337ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return extension;
1338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool Allowed(const Extension* extension, const GURL& url) {
1341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return (extension->CanExecuteScriptOnPage(url, NULL, NULL) &&
1342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            extension->CanCaptureVisiblePage(url, NULL));
1343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool CaptureOnly(const Extension* extension, const GURL& url) {
1346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return !extension->CanExecuteScriptOnPage(url, NULL, NULL) &&
1347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        extension->CanCaptureVisiblePage(url, NULL);
1348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool Blocked(const Extension* extension, const GURL& url) {
1351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return !(extension->CanExecuteScriptOnPage(url, NULL, NULL) ||
1352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen             extension->CanCaptureVisiblePage(url, NULL));
1353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected:
1356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FilePath dirpath_;
1357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
1358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1359ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(ExtensionScriptAndCaptureVisibleTest, Permissions) {
1360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<Extension> extension;
1361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // URLs that are "safe" to provide scripting and capture visible tab access
1362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // to if the permissions allow it.
1363ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GURL http_url("http://www.google.com");
1364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GURL https_url("https://www.google.com");
1365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GURL file_url("file:///foo/bar");
1366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // We should allow host permission but not scripting permission for favicon
1368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // urls.
1369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GURL favicon_url("chrome://favicon/http://www.google.com");
1370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string dummy_id =
1372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Extension::GenerateIdForPath(FilePath(FILE_PATH_LITERAL("whatever")));
1373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // URLs that regular extensions should never get access to.
1375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GURL extension_url("chrome-extension://" + dummy_id);
1376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GURL settings_url("chrome://settings");
1377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GURL about_url("about:flags");
1378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Test <all_urls> for regular extensions.
1380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = MakeExtension("['tabs','<all_urls>']", Extension::INTERNAL);
1381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Allowed(extension, http_url));
1382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Allowed(extension, https_url));
1383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, file_url));
1384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, settings_url));
1385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(CaptureOnly(extension, favicon_url));
1386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, about_url));
1387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, extension_url));
1388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension->HasHostPermission(settings_url));
1390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension->HasHostPermission(about_url));
1391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension->HasHostPermission(favicon_url));
1392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Test * for scheme, which implies just the http/https schemes.
1394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = MakeExtension("['tabs','*://*/']", Extension::INTERNAL);
1395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Allowed(extension, http_url));
1396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Allowed(extension, https_url));
1397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, settings_url));
1398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, about_url));
1399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, file_url));
1400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, favicon_url));
1401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = MakeExtension("['tabs','*://settings/*']", Extension::INTERNAL);
1402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, settings_url));
1403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Having chrome://*/ should not work for regular extensions. Note that
1405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // for favicon access, we require the explicit pattern chrome://favicon/*.
1406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = MakeExtension("['tabs','chrome://*/']",
1407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            Extension::INTERNAL);
1408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension == NULL);
1409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Having chrome://favicon/* should not give you chrome://*
1411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = MakeExtension("['tabs','chrome://favicon/*']",
1412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            Extension::INTERNAL);
1413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, settings_url));
1414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(CaptureOnly(extension, favicon_url));
1415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, about_url));
1416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension->HasHostPermission(favicon_url));
1417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Having http://favicon should not give you chrome://favicon
1419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = MakeExtension("['tabs', 'http://favicon/']", Extension::INTERNAL);
1420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, settings_url));
1421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, favicon_url));
1422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Component extensions with <all_urls> should get everything.
1424ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = MakeExtension("['tabs','<all_urls>']", Extension::COMPONENT);
1425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Allowed(extension, http_url));
1426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Allowed(extension, https_url));
1427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Allowed(extension, settings_url));
1428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Allowed(extension, about_url));
1429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Allowed(extension, favicon_url));
1430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(extension->HasHostPermission(favicon_url));
1431ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Component extensions should only get access to what they ask for.
1433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension = MakeExtension("['tabs', 'http://www.google.com/']",
1434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            Extension::COMPONENT);
1435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Allowed(extension, http_url));
1436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, https_url));
1437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, file_url));
1438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, settings_url));
1439ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, favicon_url));
1440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, about_url));
1441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Blocked(extension, extension_url));
1442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(extension->HasHostPermission(settings_url));
1443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1446201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST(ExtensionTest, GetDistinctHostsForDisplay) {
1447731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::vector<std::string> expected;
1448731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  expected.push_back("www.foo.com");
1449731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  expected.push_back("www.bar.com");
1450731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  expected.push_back("www.baz.com");
1451731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  URLPatternList actual;
1452731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1453731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  {
1454731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SCOPED_TRACE("no dupes");
1455731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1456731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Simple list with no dupes.
1457731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    actual.push_back(
1458731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.com/path"));
1459731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    actual.push_back(
1460731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        URLPattern(URLPattern::SCHEME_HTTP, "http://www.bar.com/path"));
1461731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    actual.push_back(
1462731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        URLPattern(URLPattern::SCHEME_HTTP, "http://www.baz.com/path"));
1463731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    CompareLists(expected,
1464201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                 Extension::GetDistinctHostsForDisplay(actual));
1465731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
1466731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1467731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  {
1468731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SCOPED_TRACE("two dupes");
1469731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1470731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Add some dupes.
1471731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    actual.push_back(
1472731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.com/path"));
1473731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    actual.push_back(
1474731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        URLPattern(URLPattern::SCHEME_HTTP, "http://www.baz.com/path"));
1475731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    CompareLists(expected,
1476201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                 Extension::GetDistinctHostsForDisplay(actual));
1477731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
1478731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1479731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  {
1480731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SCOPED_TRACE("schemes differ");
1481731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1482731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Add a pattern that differs only by scheme. This should be filtered out.
1483731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    actual.push_back(
1484731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        URLPattern(URLPattern::SCHEME_HTTPS, "https://www.bar.com/path"));
1485731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    CompareLists(expected,
1486201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                 Extension::GetDistinctHostsForDisplay(actual));
1487731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
1488731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1489731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  {
1490731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SCOPED_TRACE("paths differ");
1491731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1492731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Add some dupes by path.
1493731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    actual.push_back(
1494731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        URLPattern(URLPattern::SCHEME_HTTP, "http://www.bar.com/pathypath"));
1495731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    CompareLists(expected,
1496201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                 Extension::GetDistinctHostsForDisplay(actual));
1497731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
1498731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1499731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  {
1500731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SCOPED_TRACE("subdomains differ");
1501731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1502731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // We don't do anything special for subdomains.
1503731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    actual.push_back(
1504731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        URLPattern(URLPattern::SCHEME_HTTP, "http://monkey.www.bar.com/path"));
1505731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    actual.push_back(
1506731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        URLPattern(URLPattern::SCHEME_HTTP, "http://bar.com/path"));
1507731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1508731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    expected.push_back("monkey.www.bar.com");
1509731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    expected.push_back("bar.com");
1510731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1511731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    CompareLists(expected,
1512201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                 Extension::GetDistinctHostsForDisplay(actual));
1513731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
1514731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1515731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  {
1516731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SCOPED_TRACE("RCDs differ");
1517731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1518731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Now test for RCD uniquing.
1519731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    actual.push_back(
1520731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.com/path"));
1521731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    actual.push_back(
1522731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.co.uk/path"));
1523731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    actual.push_back(
1524731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.de/path"));
1525731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    actual.push_back(
1526731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.ca.us/path"));
1527731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    actual.push_back(
1528731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.net/path"));
1529731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    actual.push_back(
1530731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.com.my/path"));
1531731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1532731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // This is an unknown RCD, which shouldn't be uniqued out.
1533731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    actual.push_back(
1534731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.xyzzy/path"));
1535ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // But it should only occur once.
1536ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    actual.push_back(
1537ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.xyzzy/path"));
1538731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1539731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    expected.push_back("www.foo.xyzzy");
1540731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1541731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    CompareLists(expected,
1542201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                 Extension::GetDistinctHostsForDisplay(actual));
1543731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
1544201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1545201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  {
1546201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    SCOPED_TRACE("wildcards");
1547201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1548201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    actual.push_back(
1549201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        URLPattern(URLPattern::SCHEME_HTTP, "http://*.google.com/*"));
1550201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1551201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    expected.push_back("*.google.com");
1552201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1553201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    CompareLists(expected,
1554201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                 Extension::GetDistinctHostsForDisplay(actual));
1555201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
1556201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
1557201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1558ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(ExtensionTest, GetDistinctHostsForDisplay_ComIsBestRcd) {
1559ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  URLPatternList actual;
1560ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1561ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.ca/path"));
1562ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1563ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.org/path"));
1564ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1565ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.co.uk/path"));
1566ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1567ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.net/path"));
1568ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1569ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.jp/path"));
1570ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1571ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.com/path"));
1572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<std::string> expected;
1574ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  expected.push_back("www.foo.com");
1575ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1576ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CompareLists(expected,
1577ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                 Extension::GetDistinctHostsForDisplay(actual));
1578ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1579ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1580ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(ExtensionTest, GetDistinctHostsForDisplay_NetIs2ndBestRcd) {
1581ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  URLPatternList actual;
1582ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1583ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.ca/path"));
1584ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1585ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.org/path"));
1586ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1587ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.co.uk/path"));
1588ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1589ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.net/path"));
1590ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1591ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.jp/path"));
1592ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // No http://www.foo.com/path
1593ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1594ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<std::string> expected;
1595ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  expected.push_back("www.foo.net");
1596ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1597ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CompareLists(expected,
1598ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                 Extension::GetDistinctHostsForDisplay(actual));
1599ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1600ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1601ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(ExtensionTest, GetDistinctHostsForDisplay_OrgIs3rdBestRcd) {
1602ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  URLPatternList actual;
1603ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1604ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.ca/path"));
1605ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1606ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.org/path"));
1607ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1608ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.co.uk/path"));
1609ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // No http://www.foo.net/path
1610ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1611ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.jp/path"));
1612ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // No http://www.foo.com/path
1613ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1614ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<std::string> expected;
1615ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  expected.push_back("www.foo.org");
1616ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1617ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CompareLists(expected,
1618ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                 Extension::GetDistinctHostsForDisplay(actual));
1619ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1620ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1621ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(ExtensionTest, GetDistinctHostsForDisplay_FirstInListIs4thBestRcd) {
1622ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  URLPatternList actual;
1623ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1624ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.ca/path"));
1625ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // No http://www.foo.org/path
1626ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1627ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.co.uk/path"));
1628ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // No http://www.foo.net/path
1629ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  actual.push_back(
1630ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.jp/path"));
1631ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // No http://www.foo.com/path
1632ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1633ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<std::string> expected;
1634ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  expected.push_back("www.foo.ca");
1635ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1636ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CompareLists(expected,
1637ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                 Extension::GetDistinctHostsForDisplay(actual));
1638ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1639ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1640201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST(ExtensionTest, IsElevatedHostList) {
1641201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  URLPatternList list1;
1642201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  URLPatternList list2;
1643201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1644201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  list1.push_back(
1645201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      URLPattern(URLPattern::SCHEME_HTTP, "http://www.google.com.hk/path"));
1646201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  list1.push_back(
1647201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      URLPattern(URLPattern::SCHEME_HTTP, "http://www.google.com/path"));
1648201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1649201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Test that the host order does not matter.
1650201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  list2.push_back(
1651201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      URLPattern(URLPattern::SCHEME_HTTP, "http://www.google.com/path"));
1652201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  list2.push_back(
1653201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      URLPattern(URLPattern::SCHEME_HTTP, "http://www.google.com.hk/path"));
1654201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1655201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_FALSE(Extension::IsElevatedHostList(list1, list2));
1656201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_FALSE(Extension::IsElevatedHostList(list2, list1));
1657201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1658201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Test that paths are ignored.
1659201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  list2.clear();
1660201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  list2.push_back(
1661201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      URLPattern(URLPattern::SCHEME_HTTP, "http://www.google.com/*"));
1662201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_FALSE(Extension::IsElevatedHostList(list1, list2));
1663201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_FALSE(Extension::IsElevatedHostList(list2, list1));
1664201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1665201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Test that RCDs are ignored.
1666201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  list2.clear();
1667201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  list2.push_back(
1668201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      URLPattern(URLPattern::SCHEME_HTTP, "http://www.google.com.hk/*"));
1669201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_FALSE(Extension::IsElevatedHostList(list1, list2));
1670201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_FALSE(Extension::IsElevatedHostList(list2, list1));
1671201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1672201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Test that subdomain wildcards are handled properly.
1673201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  list2.clear();
1674201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  list2.push_back(
1675201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      URLPattern(URLPattern::SCHEME_HTTP, "http://*.google.com.hk/*"));
1676201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(Extension::IsElevatedHostList(list1, list2));
1677201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  //TODO(jstritar): Does not match subdomains properly. http://crbug.com/65337
1678201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  //EXPECT_FALSE(Extension::IsElevatedHostList(list2, list1));
1679201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1680201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Test that different domains count as different hosts.
1681201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  list2.clear();
1682201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  list2.push_back(
1683201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      URLPattern(URLPattern::SCHEME_HTTP, "http://www.google.com/path"));
1684201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  list2.push_back(
1685201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      URLPattern(URLPattern::SCHEME_HTTP, "http://www.example.org/path"));
1686201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(Extension::IsElevatedHostList(list1, list2));
1687201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_FALSE(Extension::IsElevatedHostList(list2, list1));
1688201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1689201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Test that different subdomains count as different hosts.
1690201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  list2.clear();
1691201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  list2.push_back(
1692201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      URLPattern(URLPattern::SCHEME_HTTP, "http://mail.google.com/*"));
1693201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(Extension::IsElevatedHostList(list1, list2));
1694201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(Extension::IsElevatedHostList(list2, list1));
1695731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
1696731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1697731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(ExtensionTest, GenerateId) {
1698731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string result;
1699ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(Extension::GenerateId("", &result));
1700731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1701731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(Extension::GenerateId("test", &result));
1702731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(result, "jpignaibiiemhngfjkcpokkamffknabf");
1703731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1704731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(Extension::GenerateId("_", &result));
1705731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(result, "ncocknphbhhlhkikpnnlmbcnbgdempcd");
1706731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1707731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(Extension::GenerateId(
1708731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      "this_string_is_longer_than_a_single_sha256_hash_digest", &result));
1709731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(result, "jimneklojkjdibfkgiiophfhjhbdgcfi");
1710731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
1711