blob: adeedeb231f1326b74e7c273e287a1dd74715059 [file] [log] [blame]
// Copyright 2019 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 "net/base/network_isolation_key.h"
#include "base/feature_list.h"
#include "net/base/features.h"
namespace net {
namespace {
std::string GetOriginDebugString(const base::Optional<url::Origin>& origin) {
return origin ? origin->GetDebugString() : "null";
}
} // namespace
NetworkIsolationKey::NetworkIsolationKey(
const base::Optional<url::Origin>& top_frame_origin,
const base::Optional<url::Origin>& initiating_frame_origin)
: use_initiating_frame_origin_(base::FeatureList::IsEnabled(
net::features::kAppendInitiatingFrameOriginToNetworkIsolationKey)),
top_frame_origin_(top_frame_origin) {
if (use_initiating_frame_origin_) {
// TODO(crbug.com/950069): Move this above if once call sites are modified.
DCHECK(initiating_frame_origin);
initiating_frame_origin_ = initiating_frame_origin;
}
}
NetworkIsolationKey::NetworkIsolationKey()
: use_initiating_frame_origin_(base::FeatureList::IsEnabled(
net::features::kAppendInitiatingFrameOriginToNetworkIsolationKey)) {}
NetworkIsolationKey::NetworkIsolationKey(
const NetworkIsolationKey& network_isolation_key) = default;
NetworkIsolationKey::~NetworkIsolationKey() = default;
NetworkIsolationKey& NetworkIsolationKey::operator=(
const NetworkIsolationKey& network_isolation_key) = default;
NetworkIsolationKey& NetworkIsolationKey::operator=(
NetworkIsolationKey&& network_isolation_key) = default;
std::string NetworkIsolationKey::ToString() const {
if (IsTransient())
return "";
return top_frame_origin_->Serialize() +
(use_initiating_frame_origin_
? " " + initiating_frame_origin_->Serialize()
: "");
}
std::string NetworkIsolationKey::ToDebugString() const {
// The space-separated serialization of the top frame and initiating origins.
std::string return_string = GetOriginDebugString(top_frame_origin_);
if (use_initiating_frame_origin_) {
return_string += " " + GetOriginDebugString(initiating_frame_origin_);
}
return return_string;
}
bool NetworkIsolationKey::IsFullyPopulated() const {
DCHECK(!use_initiating_frame_origin_ || initiating_frame_origin_.has_value());
return top_frame_origin_.has_value();
}
bool NetworkIsolationKey::IsTransient() const {
if (!IsFullyPopulated())
return true;
return top_frame_origin_->opaque() ||
(use_initiating_frame_origin_ && initiating_frame_origin_->opaque());
}
bool NetworkIsolationKey::IsEmpty() const {
return !top_frame_origin_.has_value();
}
} // namespace net