[go: nahoru, domu]

blob: 82b3d38a17cd3e678fd8c43ec1027873bc00ee30 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/network/public/cpp/cross_origin_opener_policy.h"
#include "services/network/public/cpp/cross_origin_embedder_policy.h"
namespace network {
CrossOriginOpenerPolicy::CrossOriginOpenerPolicy() = default;
CrossOriginOpenerPolicy::CrossOriginOpenerPolicy(
const CrossOriginOpenerPolicy& src) = default;
CrossOriginOpenerPolicy::CrossOriginOpenerPolicy(
CrossOriginOpenerPolicy&& src) = default;
CrossOriginOpenerPolicy::~CrossOriginOpenerPolicy() = default;
CrossOriginOpenerPolicy& CrossOriginOpenerPolicy::operator=(
const CrossOriginOpenerPolicy& src) = default;
CrossOriginOpenerPolicy& CrossOriginOpenerPolicy::operator=(
CrossOriginOpenerPolicy&& src) = default;
bool CrossOriginOpenerPolicy::operator==(
const CrossOriginOpenerPolicy& other) const {
return value == other.value &&
reporting_endpoint == other.reporting_endpoint &&
report_only_value == other.report_only_value &&
report_only_reporting_endpoint ==
other.report_only_reporting_endpoint &&
soap_by_default_value == other.soap_by_default_value;
}
bool IsAccessFromCoopPage(mojom::CoopAccessReportType type) {
switch (type) {
case mojom::CoopAccessReportType::kAccessFromCoopPageToOpener:
case mojom::CoopAccessReportType::kAccessFromCoopPageToOpenee:
case mojom::CoopAccessReportType::kAccessFromCoopPageToOther:
return true;
case mojom::CoopAccessReportType::kAccessToCoopPageFromOpener:
case mojom::CoopAccessReportType::kAccessToCoopPageFromOpenee:
case mojom::CoopAccessReportType::kAccessToCoopPageFromOther:
return false;
}
}
const char* CoopAccessReportTypeToString(mojom::CoopAccessReportType type) {
switch (type) {
case network::mojom::CoopAccessReportType::kAccessFromCoopPageToOpener:
return "access-from-coop-page-to-opener";
case network::mojom::CoopAccessReportType::kAccessFromCoopPageToOpenee:
return "access-from-coop-page-to-openee";
case network::mojom::CoopAccessReportType::kAccessFromCoopPageToOther:
return "access-from-coop-page-to-other";
case network::mojom::CoopAccessReportType::kAccessToCoopPageFromOpener:
return "access-to-coop-page-from-opener";
case network::mojom::CoopAccessReportType::kAccessToCoopPageFromOpenee:
return "access-to-coop-page-from-openee";
case network::mojom::CoopAccessReportType::kAccessToCoopPageFromOther:
return "access-to-coop-page-from-other";
}
}
// [spec]: https://html.spec.whatwg.org/C/#obtain-coop
void AugmentCoopWithCoep(CrossOriginOpenerPolicy* coop,
const CrossOriginEmbedderPolicy& coep) {
// [spec]: 4.1.2. If coep's value is compatible with cross-origin isolation,
// then set policy's value to "same-origin-plus-COEP".
// "COOP: same-origin" case.
if (coop->value == mojom::CrossOriginOpenerPolicyValue::kSameOrigin &&
CompatibleWithCrossOriginIsolated(coep.value)) {
coop->value = mojom::CrossOriginOpenerPolicyValue::kSameOriginPlusCoep;
coop->soap_by_default_value =
mojom::CrossOriginOpenerPolicyValue::kSameOriginPlusCoep;
}
// "COOP: restrict-properties" case.
if (coop->value == mojom::CrossOriginOpenerPolicyValue::kRestrictProperties &&
CompatibleWithCrossOriginIsolated(coep.value)) {
coop->value =
mojom::CrossOriginOpenerPolicyValue::kRestrictPropertiesPlusCoep;
coop->soap_by_default_value =
mojom::CrossOriginOpenerPolicyValue::kRestrictPropertiesPlusCoep;
}
// COOP-Report-Only:
//
// [spec]: 6.1.2. If coep's value is compatible with cross-origin isolation or
// coep's report-only value is compatible with cross-origin isolation, then
// set policy's report-only value to "same-origin-plus-COEP".
if (coop->report_only_value ==
mojom::CrossOriginOpenerPolicyValue::kSameOrigin &&
(CompatibleWithCrossOriginIsolated(coep.value) ||
CompatibleWithCrossOriginIsolated(coep.report_only_value))) {
coop->report_only_value =
mojom::CrossOriginOpenerPolicyValue::kSameOriginPlusCoep;
}
// COOP: restrict-properties report-only case.
if (coop->report_only_value ==
mojom::CrossOriginOpenerPolicyValue::kRestrictProperties &&
(CompatibleWithCrossOriginIsolated(coep.value) ||
CompatibleWithCrossOriginIsolated(coep.report_only_value))) {
coop->report_only_value =
mojom::CrossOriginOpenerPolicyValue::kRestrictPropertiesPlusCoep;
}
}
} // namespace network