Commit 4ae63052 authored by Clark DuVall's avatar Clark DuVall Committed by Commit Bot

Make V8 compilation cache work with network service

This adds a new method to NetworkContext to write the cached data.
Verified this worked by adding logging in
URLLoaderClientImpl::OnReceiveCachedMetadata to make sure we were
getting metadata. Previously, this would always have 0 size with network
service enabled.

Bug: 876836
Cq-Include-Trybots: luci.chromium.try:linux_mojo
Change-Id: I359e8cf594ff8e4435872c7dae018b1ff9d3c044
Reviewed-on: https://chromium-review.googlesource.com/1185907
Commit-Queue: Clark DuVall <cduvall@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarJohn Abd-El-Malek <jam@chromium.org>
Cr-Commit-Position: refs/heads/master@{#585640}
parent 23355d59
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_context.h"
#include "content/public/browser/content_browser_client.h" #include "content/public/browser/content_browser_client.h"
#include "content/public/browser/resource_context.h" #include "content/public/browser/resource_context.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/common/content_features.h" #include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h" #include "content/public/common/content_switches.h"
#include "content/public/common/context_menu_params.h" #include "content/public/common/context_menu_params.h"
...@@ -63,6 +64,7 @@ ...@@ -63,6 +64,7 @@
#include "net/http/http_cache.h" #include "net/http/http_cache.h"
#include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_context_getter.h" #include "net/url_request/url_request_context_getter.h"
#include "services/network/public/mojom/network_context.mojom.h"
#include "url/gurl.h" #include "url/gurl.h"
#include "url/origin.h" #include "url/origin.h"
...@@ -238,24 +240,10 @@ void RenderMessageFilter::DidGenerateCacheableMetadata( ...@@ -238,24 +240,10 @@ void RenderMessageFilter::DidGenerateCacheableMetadata(
DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (!base::FeatureList::IsEnabled(features::kIsolatedCodeCache)) { if (!base::FeatureList::IsEnabled(features::kIsolatedCodeCache)) {
net::HttpCache* cache = request_context_->GetURLRequestContext() BrowserThread::PostTask(
->http_transaction_factory() BrowserThread::UI, FROM_HERE,
->GetCache(); base::BindOnce(&RenderMessageFilter::DidGenerateCacheableMetadataOnUI,
if (!cache) this, url, expected_response_time, data));
return;
// Use the same priority for the metadata write as for script
// resources (see defaultPriorityForResourceType() in WebKit's
// CachedResource.cpp). Note that WebURLRequest::PriorityMedium
// corresponds to net::LOW (see ConvertWebKitPriorityToNetPriority()
// in weburlloader_impl.cc).
const net::RequestPriority kPriority = net::LOW;
scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(data.size()));
if (!data.empty())
memcpy(buf->data(), &data.front(), data.size());
cache->WriteMetadata(url, kPriority, expected_response_time, buf.get(),
data.size());
} else { } else {
if (!generated_code_cache_context_->generated_code_cache()) if (!generated_code_cache_context_->generated_code_cache())
return; return;
...@@ -356,4 +344,23 @@ void RenderMessageFilter::HasGpuProcess(HasGpuProcessCallback callback) { ...@@ -356,4 +344,23 @@ void RenderMessageFilter::HasGpuProcess(HasGpuProcessCallback callback) {
GpuProcessHost::GetHasGpuProcess(std::move(callback)); GpuProcessHost::GetHasGpuProcess(std::move(callback));
} }
void RenderMessageFilter::DidGenerateCacheableMetadataOnUI(
const GURL& url,
base::Time expected_response_time,
const std::vector<uint8_t>& data) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
RenderProcessHost* host = RenderProcessHost::FromID(render_process_id_);
if (!host)
return;
// Use the same priority for the metadata write as for script
// resources (see defaultPriorityForResourceType() in WebKit's
// CachedResource.cpp). Note that WebURLRequest::PriorityMedium
// corresponds to net::LOW (see ConvertWebKitPriorityToNetPriority()
// in weburlloader_impl.cc).
const net::RequestPriority kPriority = net::LOW;
host->GetStoragePartition()->GetNetworkContext()->WriteCacheMetadata(
url, kPriority, expected_response_time, data);
}
} // namespace content } // namespace content
...@@ -140,6 +140,11 @@ class CONTENT_EXPORT RenderMessageFilter ...@@ -140,6 +140,11 @@ class CONTENT_EXPORT RenderMessageFilter
bool CheckBenchmarkingEnabled() const; bool CheckBenchmarkingEnabled() const;
bool CheckPreparsedJsCachingEnabled() const; bool CheckPreparsedJsCachingEnabled() const;
// NetworkContext must be called from the UI thread.
void DidGenerateCacheableMetadataOnUI(const GURL& url,
base::Time expected_response_time,
const std::vector<uint8_t>& data);
// Cached resource request dispatcher host, guaranteed to be non-null. We do // Cached resource request dispatcher host, guaranteed to be non-null. We do
// not own it; it is managed by the BrowserProcess, which has a wider scope // not own it; it is managed by the BrowserProcess, which has a wider scope
// than we do. // than we do.
......
...@@ -833,6 +833,21 @@ void NetworkContext::CreateHostResolver(mojom::HostResolverRequest request) { ...@@ -833,6 +833,21 @@ void NetworkContext::CreateHostResolver(mojom::HostResolverRequest request) {
url_request_context_->host_resolver(), network_service_->net_log())); url_request_context_->host_resolver(), network_service_->net_log()));
} }
void NetworkContext::WriteCacheMetadata(const GURL& url,
net::RequestPriority priority,
base::Time expected_response_time,
const std::vector<uint8_t>& data) {
net::HttpCache* cache =
url_request_context_->http_transaction_factory()->GetCache();
if (!cache)
return;
auto buf = base::MakeRefCounted<net::IOBuffer>(data.size());
memcpy(buf->data(), data.data(), data.size());
cache->WriteMetadata(url, priority, expected_response_time, buf.get(),
data.size());
}
void NetworkContext::AddHSTSForTesting(const std::string& host, void NetworkContext::AddHSTSForTesting(const std::string& host,
base::Time expiry, base::Time expiry,
bool include_subdomains, bool include_subdomains,
......
...@@ -211,6 +211,10 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext ...@@ -211,6 +211,10 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext
mojom::ResolveHostParametersPtr optional_parameters, mojom::ResolveHostParametersPtr optional_parameters,
mojom::ResolveHostClientPtr response_client) override; mojom::ResolveHostClientPtr response_client) override;
void CreateHostResolver(mojom::HostResolverRequest request) override; void CreateHostResolver(mojom::HostResolverRequest request) override;
void WriteCacheMetadata(const GURL& url,
net::RequestPriority priority,
base::Time expected_response_time,
const std::vector<uint8_t>& data) override;
void AddHSTSForTesting(const std::string& host, void AddHSTSForTesting(const std::string& host,
base::Time expiry, base::Time expiry,
bool include_subdomains, bool include_subdomains,
......
...@@ -557,21 +557,28 @@ interface NetworkContext { ...@@ -557,21 +557,28 @@ interface NetworkContext {
// TODO(crbug.com/821021): Consider deleting this if most/all usage goes // TODO(crbug.com/821021): Consider deleting this if most/all usage goes
// through CreateHostResolver, but most likely most usage except proxy // through CreateHostResolver, but most likely most usage except proxy
// resolver will directly use this method. // resolver will directly use this method.
ResolveHost(HostPortPair host, ResolveHost(HostPortPair host,
ResolveHostParameters? optional_parameters, ResolveHostParameters? optional_parameters,
ResolveHostClient response_client); ResolveHostClient response_client);
// Creates a HostResolver interface that can be passed to code/processes // Creates a HostResolver interface that can be passed to code/processes
// without direct access to NetworkContext to make ResolveHost requests. // without direct access to NetworkContext to make ResolveHost requests.
// //
// If this NetworkContext is destroyed, all outstanding requests from child // If this NetworkContext is destroyed, all outstanding requests from child
// HostResolvers will be cancelled. Such requests will receive ERR_FAILED via // HostResolvers will be cancelled. Such requests will receive ERR_FAILED via
// |response_client|. // |response_client|.
// //
// TODO(crbug.com/821021): If necessary as usage and functionality is added to // TODO(crbug.com/821021): If necessary as usage and functionality is added to
// the contained ResolveHost method, consider adding the ability for this to // the contained ResolveHost method, consider adding the ability for this to
// be a restricted resolver with some functionality disabled (eg maybe MDNS). // be a restricted resolver with some functionality disabled (eg maybe MDNS).
CreateHostResolver(HostResolver& host_resolver); CreateHostResolver(HostResolver& host_resolver);
// Caches |data| associated with |url| and |expected_response_time| in the
// HttpCache related to this NetworkContext.
WriteCacheMetadata(url.mojom.Url url,
RequestPriority priority,
mojo_base.mojom.Time expected_response_time,
array<uint8> data);
[Sync] [Sync]
// Adds explicitly-specified data as if it was processed from an // Adds explicitly-specified data as if it was processed from an
......
...@@ -109,6 +109,10 @@ class TestNetworkContext : public mojom::NetworkContext { ...@@ -109,6 +109,10 @@ class TestNetworkContext : public mojom::NetworkContext {
mojom::ResolveHostParametersPtr optional_parameters, mojom::ResolveHostParametersPtr optional_parameters,
mojom::ResolveHostClientPtr response_client) override {} mojom::ResolveHostClientPtr response_client) override {}
void CreateHostResolver(mojom::HostResolverRequest request) override {} void CreateHostResolver(mojom::HostResolverRequest request) override {}
void WriteCacheMetadata(const GURL& url,
net::RequestPriority priority,
base::Time expected_response_time,
const std::vector<uint8_t>& data) override {}
void AddHSTSForTesting(const std::string& host, void AddHSTSForTesting(const std::string& host,
base::Time expiry, base::Time expiry,
bool include_subdomains, bool include_subdomains,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment