1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
// 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 "components/variations/net/variations_url_loader_throttle.h"
#include "components/google/core/common/google_util.h"
#include "components/variations/net/variations_http_headers.h"
#include "components/variations/variations_client.h"
#include "components/variations/variations_ids_provider.h"
#include "services/network/public/cpp/resource_request.h"
#include "services/network/public/mojom/url_response_head.mojom.h"
#include "url/gurl.h"
namespace variations {
namespace {
// Returns the Owner corresponding to |top_frame_origin|.
Owner GetOwner(const url::Origin& top_frame_origin) {
// Use GetTupleOrPrecursorTupleIfOpaque().GetURL() rather than just GetURL()
// to handle sandboxed top frames in addition to non-sandboxed ones.
// top_frame_origin.GetURL() handles only the latter.
const GURL url(top_frame_origin.GetTupleOrPrecursorTupleIfOpaque().GetURL());
if (!url.is_valid())
return Owner::kUnknownFromRenderer;
return google_util::IsGoogleAssociatedDomainUrl(url) ? Owner::kGoogle
: Owner::kNotGoogle;
}
} // namespace
VariationsURLLoaderThrottle::VariationsURLLoaderThrottle(
variations::mojom::VariationsHeadersPtr variations_headers)
: variations_headers_(std::move(variations_headers)),
owner_(Owner::kUnknown) {}
VariationsURLLoaderThrottle::VariationsURLLoaderThrottle(
variations::mojom::VariationsHeadersPtr variations_headers,
const url::Origin& top_frame_origin)
: variations_headers_(std::move(variations_headers)),
owner_(GetOwner(top_frame_origin)) {}
VariationsURLLoaderThrottle::~VariationsURLLoaderThrottle() = default;
// static
void VariationsURLLoaderThrottle::AppendThrottleIfNeeded(
const variations::VariationsClient* variations_client,
std::vector<std::unique_ptr<blink::URLLoaderThrottle>>* throttles) {
if (!variations_client || variations_client->IsOffTheRecord())
return;
throttles->push_back(std::make_unique<VariationsURLLoaderThrottle>(
variations_client->GetVariationsHeaders()));
}
void VariationsURLLoaderThrottle::DetachFromCurrentSequence() {}
void VariationsURLLoaderThrottle::WillStartRequest(
network::ResourceRequest* request,
bool* defer) {
if (variations_headers_.is_null())
return;
// InIncognito::kNo is passed because this throttle is never created in
// incognito mode.
//
// |variations_headers_| is moved rather than cloned because a
// VariationsURLLoaderThrottle is created for each request and
// WillStartRequest() is called only onceāfrom ThrottlingURLLoader::Start().
variations::AppendVariationsHeaderWithCustomValue(
request->url, InIncognito::kNo, std::move(variations_headers_), owner_,
request);
}
void VariationsURLLoaderThrottle::WillRedirectRequest(
net::RedirectInfo* redirect_info,
const network::mojom::URLResponseHead& response_head,
bool* defer,
std::vector<std::string>* to_be_removed_headers,
net::HttpRequestHeaders* modified_headers,
net::HttpRequestHeaders* modified_cors_exempt_headers) {
variations::RemoveVariationsHeaderIfNeeded(*redirect_info, response_head,
to_be_removed_headers);
}
} // namespace variations
|