blob: f1bc5816aad10794fb57fed845e31c519152e84d [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 "services/network/public/cpp/resource_request.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "net/base/load_flags.h"
#include "services/network/public/mojom/cookie_access_observer.mojom.h"
#include "services/network/public/mojom/url_request.mojom.h"
#include "services/network/public/mojom/web_bundle_handle.mojom.h"
namespace network {
namespace {
mojo::PendingRemote<mojom::CookieAccessObserver> Clone(
mojo::PendingRemote<mojom::CookieAccessObserver>* observer) {
if (!*observer)
return mojo::NullRemote();
mojo::Remote<mojom::CookieAccessObserver> remote(std::move(*observer));
mojo::PendingRemote<mojom::CookieAccessObserver> new_remote;
remote->Clone(new_remote.InitWithNewPipeAndPassReceiver());
*observer = remote.Unbind();
return new_remote;
}
mojo::PendingRemote<mojom::URLLoaderNetworkServiceObserver> Clone(
mojo::PendingRemote<mojom::URLLoaderNetworkServiceObserver>* observer) {
if (!*observer)
return mojo::NullRemote();
mojo::Remote<mojom::URLLoaderNetworkServiceObserver> remote(
std::move(*observer));
mojo::PendingRemote<mojom::URLLoaderNetworkServiceObserver> new_remote;
remote->Clone(new_remote.InitWithNewPipeAndPassReceiver());
*observer = remote.Unbind();
return new_remote;
}
mojo::PendingRemote<mojom::DevToolsObserver> Clone(
mojo::PendingRemote<mojom::DevToolsObserver>* observer) {
if (!*observer)
return mojo::NullRemote();
mojo::Remote<mojom::DevToolsObserver> remote(std::move(*observer));
mojo::PendingRemote<mojom::DevToolsObserver> new_remote;
remote->Clone(new_remote.InitWithNewPipeAndPassReceiver());
*observer = remote.Unbind();
return new_remote;
}
mojo::PendingRemote<mojom::AcceptCHFrameObserver> Clone(
mojo::PendingRemote<mojom::AcceptCHFrameObserver>& observer) {
if (!observer)
return mojo::NullRemote();
mojo::Remote<mojom::AcceptCHFrameObserver> remote(std::move(observer));
mojo::PendingRemote<mojom::AcceptCHFrameObserver> new_remote;
remote->Clone(new_remote.InitWithNewPipeAndPassReceiver());
observer = remote.Unbind();
return new_remote;
}
// Returns true iff either holds true:
//
// - both |lhs| and |rhs| are nullopt, or
// - neither is nullopt and they both contain equal values
//
bool OptionalTrustedParamsEqualsForTesting(
const base::Optional<ResourceRequest::TrustedParams>& lhs,
const base::Optional<ResourceRequest::TrustedParams>& rhs) {
return (!lhs && !rhs) || (lhs && rhs && lhs->EqualsForTesting(*rhs));
}
bool OptionalWebBundleTokenParamsEqualsForTesting( // IN-TEST
const base::Optional<ResourceRequest::WebBundleTokenParams>& lhs,
const base::Optional<ResourceRequest::WebBundleTokenParams>& rhs) {
return (!lhs && !rhs) ||
(lhs && rhs && lhs->EqualsForTesting(*rhs)); // IN-TEST
}
} // namespace
ResourceRequest::TrustedParams::TrustedParams() = default;
ResourceRequest::TrustedParams::~TrustedParams() = default;
ResourceRequest::TrustedParams::TrustedParams(const TrustedParams& other) {
*this = other;
}
ResourceRequest::TrustedParams& ResourceRequest::TrustedParams::operator=(
const TrustedParams& other) {
isolation_info = other.isolation_info;
disable_secure_dns = other.disable_secure_dns;
has_user_activation = other.has_user_activation;
cookie_observer =
Clone(&const_cast<mojo::PendingRemote<mojom::CookieAccessObserver>&>(
other.cookie_observer));
url_loader_network_observer = Clone(
&const_cast<mojo::PendingRemote<mojom::URLLoaderNetworkServiceObserver>&>(
other.url_loader_network_observer));
devtools_observer =
Clone(&const_cast<mojo::PendingRemote<mojom::DevToolsObserver>&>(
other.devtools_observer));
client_security_state = other.client_security_state.Clone();
accept_ch_frame_observer =
Clone(const_cast<mojo::PendingRemote<mojom::AcceptCHFrameObserver>&>(
other.accept_ch_frame_observer));
return *this;
}
bool ResourceRequest::TrustedParams::EqualsForTesting(
const TrustedParams& trusted_params) const {
return isolation_info.IsEqualForTesting(trusted_params.isolation_info) &&
disable_secure_dns == trusted_params.disable_secure_dns &&
has_user_activation == trusted_params.has_user_activation &&
client_security_state == trusted_params.client_security_state;
}
ResourceRequest::WebBundleTokenParams::WebBundleTokenParams() = default;
ResourceRequest::WebBundleTokenParams::~WebBundleTokenParams() = default;
ResourceRequest::WebBundleTokenParams::WebBundleTokenParams(
const WebBundleTokenParams& other) {
*this = other;
}
ResourceRequest::WebBundleTokenParams&
ResourceRequest::WebBundleTokenParams::operator=(
const WebBundleTokenParams& other) {
bundle_url = other.bundle_url;
token = other.token;
handle = other.CloneHandle();
render_process_id = other.render_process_id;
return *this;
}
ResourceRequest::WebBundleTokenParams::WebBundleTokenParams(
const GURL& bundle_url,
const base::UnguessableToken& token,
mojo::PendingRemote<mojom::WebBundleHandle> handle)
: bundle_url(bundle_url), token(token), handle(std::move(handle)) {}
ResourceRequest::WebBundleTokenParams::WebBundleTokenParams(
const GURL& bundle_url,
const base::UnguessableToken& token,
int32_t render_process_id)
: bundle_url(bundle_url),
token(token),
render_process_id(render_process_id) {}
bool ResourceRequest::WebBundleTokenParams::EqualsForTesting(
const WebBundleTokenParams& other) const {
return bundle_url == other.bundle_url && token == other.token &&
((handle && other.handle) || (!handle && !other.handle)) &&
render_process_id == other.render_process_id;
}
mojo::PendingRemote<mojom::WebBundleHandle>
ResourceRequest::WebBundleTokenParams::CloneHandle() const {
if (!handle)
return mojo::NullRemote();
mojo::Remote<network::mojom::WebBundleHandle> remote(std::move(
const_cast<mojo::PendingRemote<network::mojom::WebBundleHandle>&>(
handle)));
mojo::PendingRemote<network::mojom::WebBundleHandle> new_remote;
remote->Clone(new_remote.InitWithNewPipeAndPassReceiver());
const_cast<mojo::PendingRemote<network::mojom::WebBundleHandle>&>(handle) =
remote.Unbind();
return new_remote;
}
ResourceRequest::ResourceRequest() {}
ResourceRequest::ResourceRequest(const ResourceRequest& request) = default;
ResourceRequest::~ResourceRequest() {}
bool ResourceRequest::EqualsForTesting(const ResourceRequest& request) const {
return method == request.method && url == request.url &&
site_for_cookies.IsEquivalent(request.site_for_cookies) &&
update_first_party_url_on_redirect ==
request.update_first_party_url_on_redirect &&
request_initiator == request.request_initiator &&
isolated_world_origin == request.isolated_world_origin &&
referrer == request.referrer &&
referrer_policy == request.referrer_policy &&
headers.ToString() == request.headers.ToString() &&
cors_exempt_headers.ToString() ==
request.cors_exempt_headers.ToString() &&
load_flags == request.load_flags &&
resource_type == request.resource_type &&
priority == request.priority &&
devtools_stack_id == request.devtools_stack_id &&
should_reset_appcache == request.should_reset_appcache &&
is_external_request == request.is_external_request &&
cors_preflight_policy == request.cors_preflight_policy &&
originated_from_service_worker ==
request.originated_from_service_worker &&
skip_service_worker == request.skip_service_worker &&
corb_detachable == request.corb_detachable && mode == request.mode &&
credentials_mode == request.credentials_mode &&
redirect_mode == request.redirect_mode &&
fetch_integrity == request.fetch_integrity &&
destination == request.destination &&
request_body == request.request_body &&
keepalive == request.keepalive &&
has_user_gesture == request.has_user_gesture &&
enable_load_timing == request.enable_load_timing &&
enable_upload_progress == request.enable_upload_progress &&
do_not_prompt_for_login == request.do_not_prompt_for_login &&
is_main_frame == request.is_main_frame &&
transition_type == request.transition_type &&
report_raw_headers == request.report_raw_headers &&
previews_state == request.previews_state &&
upgrade_if_insecure == request.upgrade_if_insecure &&
is_revalidating == request.is_revalidating &&
throttling_profile_id == request.throttling_profile_id &&
custom_proxy_pre_cache_headers.ToString() ==
request.custom_proxy_pre_cache_headers.ToString() &&
custom_proxy_post_cache_headers.ToString() ==
request.custom_proxy_post_cache_headers.ToString() &&
fetch_window_id == request.fetch_window_id &&
devtools_request_id == request.devtools_request_id &&
is_signed_exchange_prefetch_cache_enabled ==
request.is_signed_exchange_prefetch_cache_enabled &&
is_fetch_like_api == request.is_fetch_like_api &&
is_favicon == request.is_favicon &&
obey_origin_policy == request.obey_origin_policy &&
recursive_prefetch_token == request.recursive_prefetch_token &&
OptionalTrustedParamsEqualsForTesting(trusted_params,
request.trusted_params) &&
devtools_accepted_stream_types ==
request.devtools_accepted_stream_types &&
trust_token_params == request.trust_token_params &&
OptionalWebBundleTokenParamsEqualsForTesting( // IN-TEST
web_bundle_token_params, request.web_bundle_token_params);
}
bool ResourceRequest::SendsCookies() const {
return credentials_mode == network::mojom::CredentialsMode::kInclude;
}
bool ResourceRequest::SavesCookies() const {
return credentials_mode == network::mojom::CredentialsMode::kInclude &&
!(load_flags & net::LOAD_DO_NOT_SAVE_COOKIES);
}
net::ReferrerPolicy ReferrerPolicyForUrlRequest(
mojom::ReferrerPolicy referrer_policy) {
switch (referrer_policy) {
case mojom::ReferrerPolicy::kAlways:
return net::ReferrerPolicy::NEVER_CLEAR;
case mojom::ReferrerPolicy::kNever:
return net::ReferrerPolicy::NO_REFERRER;
case mojom::ReferrerPolicy::kOrigin:
return net::ReferrerPolicy::ORIGIN;
case mojom::ReferrerPolicy::kNoReferrerWhenDowngrade:
return net::ReferrerPolicy::CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE;
case mojom::ReferrerPolicy::kOriginWhenCrossOrigin:
return net::ReferrerPolicy::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN;
case mojom::ReferrerPolicy::kSameOrigin:
return net::ReferrerPolicy::CLEAR_ON_TRANSITION_CROSS_ORIGIN;
case mojom::ReferrerPolicy::kStrictOrigin:
return net::ReferrerPolicy::
ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE;
case mojom::ReferrerPolicy::kDefault:
CHECK(false);
return net::ReferrerPolicy::NO_REFERRER;
case mojom::ReferrerPolicy::kStrictOriginWhenCrossOrigin:
return net::ReferrerPolicy::REDUCE_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN;
}
NOTREACHED();
return net::ReferrerPolicy::CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE;
}
} // namespace network