blob: a28a436064a11deda585ddaffc1e1e4d1df04cf2 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "extensions/common/manifest_handlers/csp_info.h"
#include "extensions/common/error_utils.h"
#include "extensions/common/manifest_constants.h"
#include "extensions/common/manifest_test.h"
namespace extensions {
namespace errors = manifest_errors;
using CSPInfoUnitTest = ManifestTest;
TEST_F(CSPInfoUnitTest, SandboxedPages) {
// Sandboxed pages specified, no custom CSP value.
scoped_refptr<Extension> extension1(
LoadAndExpectSuccess("sandboxed_pages_valid_1.json"));
// No sandboxed pages.
scoped_refptr<Extension> extension2(
LoadAndExpectSuccess("sandboxed_pages_valid_2.json"));
// Sandboxed pages specified with a custom CSP value.
scoped_refptr<Extension> extension3(
LoadAndExpectSuccess("sandboxed_pages_valid_3.json"));
// Sandboxed pages specified with wildcard, no custom CSP value.
scoped_refptr<Extension> extension4(
LoadAndExpectSuccess("sandboxed_pages_valid_4.json"));
// Sandboxed pages specified with filename wildcard, no custom CSP value.
scoped_refptr<Extension> extension5(
LoadAndExpectSuccess("sandboxed_pages_valid_5.json"));
const char kSandboxedCSP[] =
"sandbox allow-scripts allow-forms allow-popups allow-modals; "
"script-src 'self' 'unsafe-inline' 'unsafe-eval'; child-src 'self';";
const char kDefaultCSP[] =
"script-src 'self' blob: filesystem: chrome-extension-resource:; "
"object-src 'self' blob: filesystem:;";
const char kCustomSandboxedCSP[] =
"sandbox; script-src 'self'; child-src 'self';";
EXPECT_EQ(kSandboxedCSP, CSPInfo::GetResourceContentSecurityPolicy(
extension1.get(), "/test"));
EXPECT_EQ(kDefaultCSP, CSPInfo::GetResourceContentSecurityPolicy(
extension1.get(), "/none"));
EXPECT_EQ(kDefaultCSP, CSPInfo::GetResourceContentSecurityPolicy(
extension2.get(), "/test"));
EXPECT_EQ(kCustomSandboxedCSP, CSPInfo::GetResourceContentSecurityPolicy(
extension3.get(), "/test"));
EXPECT_EQ(kDefaultCSP, CSPInfo::GetResourceContentSecurityPolicy(
extension3.get(), "/none"));
EXPECT_EQ(kSandboxedCSP, CSPInfo::GetResourceContentSecurityPolicy(
extension4.get(), "/test"));
EXPECT_EQ(kSandboxedCSP, CSPInfo::GetResourceContentSecurityPolicy(
extension5.get(), "/path/test.ext"));
EXPECT_EQ(kDefaultCSP, CSPInfo::GetResourceContentSecurityPolicy(
extension5.get(), "/test"));
Testcase testcases[] = {
Testcase("sandboxed_pages_invalid_1.json",
errors::kInvalidSandboxedPagesList),
Testcase("sandboxed_pages_invalid_2.json", errors::kInvalidSandboxedPage),
Testcase("sandboxed_pages_invalid_3.json",
errors::kInvalidSandboxedPagesCSP),
Testcase("sandboxed_pages_invalid_4.json",
errors::kInvalidSandboxedPagesCSP),
Testcase("sandboxed_pages_invalid_5.json",
errors::kInvalidSandboxedPagesCSP)};
RunTestcases(testcases, arraysize(testcases), EXPECT_TYPE_ERROR);
}
TEST_F(CSPInfoUnitTest, CSPKey) {
const char kDefaultCSP[] =
"script-src 'self' blob: filesystem: chrome-extension-resource:; "
"object-src 'self' blob: filesystem:;";
struct {
const char* file_name;
const char* csp;
} success_cases[] = {
{"csp_string_valid.json", "script-src 'self'; default-src 'none';"},
{"csp_dictionary_valid.json", "default-src 'none';"},
{"csp_empty_valid.json", "script-src 'self'; object-src 'self';"},
{"csp_empty_dictionary_valid.json", kDefaultCSP}};
for (const auto& test_case : success_cases) {
SCOPED_TRACE(test_case.file_name);
scoped_refptr<Extension> extension =
LoadAndExpectSuccess(test_case.file_name);
ASSERT_TRUE(extension.get());
EXPECT_EQ(test_case.csp,
CSPInfo::GetContentSecurityPolicy(extension.get()));
}
auto get_invalid_manifest_key_error = [](base::StringPiece key) {
return ErrorUtils::FormatErrorMessage(errors::kInvalidManifestKey, key);
};
const char* kExtensionPagesKey = "content_security_policy.extension_pages";
const char* kCSPKey = "content_security_policy";
Testcase testcases[] = {
Testcase("csp_invalid_1.json", get_invalid_manifest_key_error(kCSPKey)),
Testcase("csp_invalid_2.json",
get_invalid_manifest_key_error(kExtensionPagesKey)),
Testcase("csp_invalid_3.json",
get_invalid_manifest_key_error(kExtensionPagesKey))};
RunTestcases(testcases, arraysize(testcases), EXPECT_TYPE_ERROR);
}
} // namespace extensions