blob: 649dcfcb7b64c09e822154c8f2c1ae6f183bdef4 [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 "chrome/browser/predictors/network_hints_handler_impl.h"
#include "base/memory/ptr_util.h"
#include "base/optional.h"
#include "chrome/browser/predictors/loading_predictor.h"
#include "chrome/browser/predictors/loading_predictor_factory.h"
#include "chrome/browser/predictors/preconnect_manager.h"
#include "chrome/browser/profiles/profile.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
namespace predictors {
NetworkHintsHandlerImpl::~NetworkHintsHandlerImpl() = default;
// static
void NetworkHintsHandlerImpl::Create(
content::RenderFrameHost* frame_host,
mojo::PendingReceiver<network_hints::mojom::NetworkHintsHandler> receiver) {
mojo::MakeSelfOwnedReceiver(
base::WrapUnique(new NetworkHintsHandlerImpl(frame_host)),
std::move(receiver));
}
void NetworkHintsHandlerImpl::PrefetchDNS(
const std::vector<std::string>& names) {
if (!preconnect_manager_)
return;
content::RenderFrameHost* render_frame_host =
content::RenderFrameHost::FromID(render_process_id_, render_frame_id_);
if (!render_frame_host)
return;
preconnect_manager_->StartPreresolveHosts(
names, render_frame_host->GetNetworkIsolationKey());
}
void NetworkHintsHandlerImpl::Preconnect(const GURL& url,
bool allow_credentials) {
if (!preconnect_manager_)
return;
if (!url.is_valid() || !url.has_host() || !url.has_scheme() ||
!url.SchemeIsHTTPOrHTTPS()) {
return;
}
// TODO(mmenke): Think about enabling cross-site preconnects, though that
// will result in at least some cross-site information leakage.
content::RenderFrameHost* render_frame_host =
content::RenderFrameHost::FromID(render_process_id_, render_frame_id_);
if (!render_frame_host)
return;
preconnect_manager_->StartPreconnectUrl(
url, allow_credentials, render_frame_host->GetNetworkIsolationKey());
}
NetworkHintsHandlerImpl::NetworkHintsHandlerImpl(
content::RenderFrameHost* frame_host)
: render_process_id_(frame_host->GetProcess()->GetID()),
render_frame_id_(frame_host->GetRoutingID()) {
// Get the PreconnectManager for this process.
auto* render_process_host = frame_host->GetProcess();
auto* profile =
Profile::FromBrowserContext(render_process_host->GetBrowserContext());
auto* loading_predictor =
predictors::LoadingPredictorFactory::GetForProfile(profile);
if (loading_predictor && loading_predictor->preconnect_manager())
preconnect_manager_ = loading_predictor->preconnect_manager()->GetWeakPtr();
}
} // namespace predictors