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