blob: f67fb04edcb6cf47a1ff8e92cd7b5c4787dbb096 [file] [log] [blame]
// Copyright 2017 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/url_request_mojom_traits.h"
#include <vector>
#include "base/logging.h"
#include "mojo/public/cpp/base/file_mojom_traits.h"
#include "mojo/public/cpp/base/file_path_mojom_traits.h"
#include "mojo/public/cpp/base/time_mojom_traits.h"
#include "mojo/public/cpp/base/unguessable_token_mojom_traits.h"
#include "services/network/public/cpp/http_request_headers_mojom_traits.h"
#include "services/network/public/cpp/network_ipc_param_traits.h"
#include "services/network/public/cpp/resource_request_body.h"
#include "services/network/public/mojom/chunked_data_pipe_getter.mojom.h"
#include "services/network/public/mojom/url_loader.mojom-shared.h"
#include "url/mojom/origin_mojom_traits.h"
#include "url/mojom/url_gurl_mojom_traits.h"
namespace mojo {
network::mojom::RequestPriority
EnumTraits<network::mojom::RequestPriority, net::RequestPriority>::ToMojom(
net::RequestPriority priority) {
switch (priority) {
case net::THROTTLED:
return network::mojom::RequestPriority::kThrottled;
case net::IDLE:
return network::mojom::RequestPriority::kIdle;
case net::LOWEST:
return network::mojom::RequestPriority::kLowest;
case net::LOW:
return network::mojom::RequestPriority::kLow;
case net::MEDIUM:
return network::mojom::RequestPriority::kMedium;
case net::HIGHEST:
return network::mojom::RequestPriority::kHighest;
}
NOTREACHED();
return static_cast<network::mojom::RequestPriority>(priority);
}
bool EnumTraits<network::mojom::RequestPriority, net::RequestPriority>::
FromMojom(network::mojom::RequestPriority in, net::RequestPriority* out) {
switch (in) {
case network::mojom::RequestPriority::kThrottled:
*out = net::THROTTLED;
return true;
case network::mojom::RequestPriority::kIdle:
*out = net::IDLE;
return true;
case network::mojom::RequestPriority::kLowest:
*out = net::LOWEST;
return true;
case network::mojom::RequestPriority::kLow:
*out = net::LOW;
return true;
case network::mojom::RequestPriority::kMedium:
*out = net::MEDIUM;
return true;
case network::mojom::RequestPriority::kHighest:
*out = net::HIGHEST;
return true;
}
NOTREACHED();
*out = static_cast<net::RequestPriority>(in);
return true;
}
network::mojom::URLRequestReferrerPolicy EnumTraits<
network::mojom::URLRequestReferrerPolicy,
net::URLRequest::ReferrerPolicy>::ToMojom(net::URLRequest::ReferrerPolicy
policy) {
switch (policy) {
case net::URLRequest::ReferrerPolicy::
CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE:
return network::mojom::URLRequestReferrerPolicy::
kClearReferrerOnTransitionFromSecureToInsecure;
case net::URLRequest::ReferrerPolicy::
REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN:
return network::mojom::URLRequestReferrerPolicy::
kReduceReferrerGranularityOnTransitionCrossOrigin;
case net::URLRequest::ReferrerPolicy::
ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN:
return network::mojom::URLRequestReferrerPolicy::
kOriginOnlyOnTransitionCrossOrigin;
case net::URLRequest::ReferrerPolicy::NEVER_CLEAR_REFERRER:
return network::mojom::URLRequestReferrerPolicy::kNeverClearReferrer;
case net::URLRequest::ReferrerPolicy::ORIGIN:
return network::mojom::URLRequestReferrerPolicy::kOrigin;
case net::URLRequest::ReferrerPolicy::
CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN:
return network::mojom::URLRequestReferrerPolicy::
kClearReferrerOnTransitionCrossOrigin;
case net::URLRequest::ReferrerPolicy::
ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE:
return network::mojom::URLRequestReferrerPolicy::
kOriginClearOnTransitionFromSecureToInsecure;
case net::URLRequest::ReferrerPolicy::NO_REFERRER:
return network::mojom::URLRequestReferrerPolicy::kNoReferrer;
}
NOTREACHED();
return static_cast<network::mojom::URLRequestReferrerPolicy>(policy);
}
bool EnumTraits<network::mojom::URLRequestReferrerPolicy,
net::URLRequest::ReferrerPolicy>::
FromMojom(network::mojom::URLRequestReferrerPolicy in,
net::URLRequest::ReferrerPolicy* out) {
switch (in) {
case network::mojom::URLRequestReferrerPolicy::
kClearReferrerOnTransitionFromSecureToInsecure:
*out = net::URLRequest::ReferrerPolicy::
CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE;
return true;
case network::mojom::URLRequestReferrerPolicy::
kReduceReferrerGranularityOnTransitionCrossOrigin:
*out = net::URLRequest::ReferrerPolicy::
REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN;
return true;
case network::mojom::URLRequestReferrerPolicy::
kOriginOnlyOnTransitionCrossOrigin:
*out = net::URLRequest::ReferrerPolicy::
ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN;
return true;
case network::mojom::URLRequestReferrerPolicy::kNeverClearReferrer:
*out = net::URLRequest::ReferrerPolicy::NEVER_CLEAR_REFERRER;
return true;
case network::mojom::URLRequestReferrerPolicy::kOrigin:
*out = net::URLRequest::ReferrerPolicy::ORIGIN;
return true;
case network::mojom::URLRequestReferrerPolicy::
kClearReferrerOnTransitionCrossOrigin:
*out = net::URLRequest::ReferrerPolicy::
CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN;
return true;
case network::mojom::URLRequestReferrerPolicy::
kOriginClearOnTransitionFromSecureToInsecure:
*out = net::URLRequest::ReferrerPolicy::
ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE;
return true;
case network::mojom::URLRequestReferrerPolicy::kNoReferrer:
*out = net::URLRequest::ReferrerPolicy::NO_REFERRER;
return true;
}
NOTREACHED();
return false;
}
bool StructTraits<
network::mojom::URLRequestDataView,
network::ResourceRequest>::Read(network::mojom::URLRequestDataView data,
network::ResourceRequest* out) {
if (!data.ReadMethod(&out->method) || !data.ReadUrl(&out->url) ||
!data.ReadSiteForCookies(&out->site_for_cookies) ||
!data.ReadTopFrameOrigin(&out->top_frame_origin) ||
!data.ReadRequestInitiator(&out->request_initiator) ||
!data.ReadReferrer(&out->referrer) ||
!data.ReadReferrerPolicy(&out->referrer_policy) ||
!data.ReadHeaders(&out->headers) ||
!data.ReadRequestedWithHeader(&out->requested_with_header) ||
!data.ReadClientDataHeader(&out->client_data_header) ||
!data.ReadPriority(&out->priority) ||
!data.ReadCorsPreflightPolicy(&out->cors_preflight_policy) ||
!data.ReadFetchRequestMode(&out->fetch_request_mode) ||
!data.ReadFetchCredentialsMode(&out->fetch_credentials_mode) ||
!data.ReadFetchRedirectMode(&out->fetch_redirect_mode) ||
!data.ReadFetchIntegrity(&out->fetch_integrity) ||
!data.ReadFetchFrameType(&out->fetch_frame_type) ||
!data.ReadRequestBody(&out->request_body) ||
!data.ReadThrottlingProfileId(&out->throttling_profile_id) ||
!data.ReadCustomProxyPreCacheHeaders(
&out->custom_proxy_pre_cache_headers) ||
!data.ReadCustomProxyPostCacheHeaders(
&out->custom_proxy_post_cache_headers) ||
!data.ReadFetchWindowId(&out->fetch_window_id)) {
return false;
}
out->attach_same_site_cookies = data.attach_same_site_cookies();
out->update_first_party_url_on_redirect =
data.update_first_party_url_on_redirect();
out->is_prerendering = data.is_prerendering();
out->load_flags = data.load_flags();
out->allow_credentials = data.allow_credentials();
out->plugin_child_id = data.plugin_child_id();
out->resource_type = data.resource_type();
out->appcache_host_id = data.appcache_host_id();
out->should_reset_appcache = data.should_reset_appcache();
out->is_external_request = data.is_external_request();
out->service_worker_provider_id = data.service_worker_provider_id();
out->originated_from_service_worker = data.originated_from_service_worker();
out->skip_service_worker = data.skip_service_worker();
out->fetch_request_context_type = data.fetch_request_context_type();
out->keepalive = data.keepalive();
out->has_user_gesture = data.has_user_gesture();
out->enable_load_timing = data.enable_load_timing();
out->enable_upload_progress = data.enable_upload_progress();
out->do_not_prompt_for_login = data.do_not_prompt_for_login();
out->render_frame_id = data.render_frame_id();
out->is_main_frame = data.is_main_frame();
out->transition_type = data.transition_type();
out->allow_download = data.allow_download();
out->report_raw_headers = data.report_raw_headers();
out->previews_state = data.previews_state();
out->initiated_in_secure_context = data.initiated_in_secure_context();
out->upgrade_if_insecure = data.upgrade_if_insecure();
out->is_revalidating = data.is_revalidating();
out->custom_proxy_use_alternate_proxy_list =
data.custom_proxy_use_alternate_proxy_list();
return true;
}
bool StructTraits<network::mojom::URLRequestBodyDataView,
scoped_refptr<network::ResourceRequestBody>>::
Read(network::mojom::URLRequestBodyDataView data,
scoped_refptr<network::ResourceRequestBody>* out) {
auto body = base::MakeRefCounted<network::ResourceRequestBody>();
if (!data.ReadElements(&(body->elements_)))
return false;
body->set_identifier(data.identifier());
body->set_contains_sensitive_info(data.contains_sensitive_info());
*out = std::move(body);
return true;
}
bool StructTraits<network::mojom::DataElementDataView, network::DataElement>::
Read(network::mojom::DataElementDataView data, network::DataElement* out) {
if (!data.ReadPath(&out->path_) || !data.ReadFile(&out->file_) ||
!data.ReadBlobUuid(&out->blob_uuid_) ||
!data.ReadExpectedModificationTime(&out->expected_modification_time_)) {
return false;
}
// TODO(Richard): Fix this workaround once |buf_| becomes vector<uint8_t>
if (data.type() == network::mojom::DataElementType::kBytes) {
out->buf_.resize(data.length());
auto buf = base::make_span(reinterpret_cast<uint8_t*>(out->buf_.data()),
out->buf_.size());
if (!data.ReadBuf(&buf))
return false;
}
out->type_ = data.type();
out->data_pipe_getter_ =
data.TakeDataPipeGetter<network::mojom::DataPipeGetterPtrInfo>();
out->chunked_data_pipe_getter_ = data.TakeChunkedDataPipeGetter<
network::mojom::ChunkedDataPipeGetterPtrInfo>();
out->offset_ = data.offset();
out->length_ = data.length();
return true;
}
} // namespace mojo