// 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. #ifndef NET_BASE_NETWORK_ISOLATION_KEY_H_ #define NET_BASE_NETWORK_ISOLATION_KEY_H_ #include #include "base/macros.h" #include "base/optional.h" #include "net/base/net_export.h" #include "url/origin.h" namespace net { // Key used to isolate shared network stack resources used by requests based on // the context on which they were made. class NET_EXPORT NetworkIsolationKey { public: // Full constructor. When a request is initiated by the top frame, it must // also populate the |frame_origin| parameter when calling this constructor. explicit NetworkIsolationKey(const url::Origin& top_frame_origin, const url::Origin& frame_origin); // Construct an empty key. NetworkIsolationKey(); NetworkIsolationKey(const NetworkIsolationKey& network_isolation_key); ~NetworkIsolationKey(); NetworkIsolationKey& operator=( const NetworkIsolationKey& network_isolation_key); NetworkIsolationKey& operator=(NetworkIsolationKey&& network_isolation_key); // Compare keys for equality, true if all enabled fields are equal. bool operator==(const NetworkIsolationKey& other) const { return top_frame_origin_ == other.top_frame_origin_ && frame_origin_ == other.frame_origin_; } // Compare keys for inequality, true if any enabled field varies. bool operator!=(const NetworkIsolationKey& other) const { return (top_frame_origin_ != other.top_frame_origin_) || (frame_origin_ != other.frame_origin_); } // Provide an ordering for keys based on all enabled fields. bool operator<(const NetworkIsolationKey& other) const { return top_frame_origin_ < other.top_frame_origin_ || (top_frame_origin_ == other.top_frame_origin_ && frame_origin_ < other.frame_origin_); } // Returns the string representation of the key, which is the string // representation of each piece of the key separated by spaces. std::string ToString() const; // Returns string for debugging. Difference from ToString() is that transient // entries may be distinguishable from each other. std::string ToDebugString() const; // Returns true if all parts of the key are non-empty. bool IsFullyPopulated() const; // Returns true if this key's lifetime is short-lived. It may not make sense // to persist state to disk related to it (e.g., disk cache). bool IsTransient() const; // APIs for serialization to and from the mojo structure. const base::Optional& GetTopFrameOrigin() const { return top_frame_origin_; } const base::Optional& GetFrameOrigin() const { return frame_origin_; } // Returns true if all parts of the key are empty. bool IsEmpty() const; private: // Whether or not to use the |frame_origin_| as part of the key. bool use_frame_origin_; // The origin of the top frame of the page making the request. base::Optional top_frame_origin_; // The origin of the frame that initiates the request. base::Optional frame_origin_; }; } // namespace net #endif // NET_BASE_NETWORK_ISOLATION_KEY_H_