Make sure Blob refcounts/lifetime work for cache and fetch APIs.
Pass a mojo BlobPtr in addition to the uuid in all the IPCs/mojo calls
for the cache and fetch APIs to make sure the blobs stay alive long
enough. Since the cache and fetch APIs largely pass around their parameters
in a copyable struct (mostly passed by const reference) this also required
introduction of a storage::BlobHandle type, a ref-counted wrapper around
a BlobPtr.
The BlobPtr passed along in IPCs/mojo messages isn't actually used for
anything other than lifetime management at this point. The browser side
code still uses the UUID to actually look up the blob and get its data.
Also add service worker and fetch tests to the mojo blobs virtual test
suite to make sure this all works correctly.
Bug: 740744
Change-Id: I6bfcda977cd605099bd6c04d9f079ce7783b43f4
Reviewed-on: https://chromium-review.googlesource.com/567549
Reviewed-by: Daniel Cheng <[email protected]>
Reviewed-by: Takeshi Yoshino <[email protected]>
Reviewed-by: Kinuko Yasuda <[email protected]>
Reviewed-by: Daniel Murphy <[email protected]>
Commit-Queue: Marijn Kruisselbrink <[email protected]>
Cr-Commit-Position: refs/heads/master@{#491140}
diff --git a/content/browser/cache_storage/cache_storage_cache.cc b/content/browser/cache_storage/cache_storage_cache.cc
index a8e8f074..d438c984 100644
--- a/content/browser/cache_storage/cache_storage_cache.cc
+++ b/content/browser/cache_storage/cache_storage_cache.cc
@@ -27,6 +27,7 @@
#include "content/browser/cache_storage/cache_storage_cache_observer.h"
#include "content/browser/cache_storage/cache_storage_scheduler.h"
#include "content/public/browser/browser_thread.h"
+#include "content/public/common/content_features.h"
#include "content/public/common/referrer.h"
#include "net/base/completion_callback.h"
#include "net/base/io_buffer.h"
@@ -35,9 +36,11 @@
#include "net/url_request/url_request_context_getter.h"
#include "storage/browser/blob/blob_data_builder.h"
#include "storage/browser/blob/blob_data_handle.h"
+#include "storage/browser/blob/blob_impl.h"
#include "storage/browser/blob/blob_storage_context.h"
#include "storage/browser/blob/blob_url_request_job_factory.h"
#include "storage/browser/quota/quota_manager_proxy.h"
+#include "storage/common/blob_storage/blob_handle.h"
#include "storage/common/storage_histograms.h"
#include "third_party/WebKit/public/platform/modules/fetch/fetch_api_request.mojom.h"
@@ -247,7 +250,8 @@
std::move(url_list), metadata.response().status_code(),
metadata.response().status_text(),
ProtoResponseTypeToFetchResponseType(metadata.response().response_type()),
- std::move(headers), "", 0, blink::kWebServiceWorkerResponseErrorUnknown,
+ std::move(headers), "", 0, nullptr /* blob */,
+ blink::kWebServiceWorkerResponseErrorUnknown,
base::Time::FromInternalValue(metadata.response().response_time()),
true /* is_in_cache_storage */, cache_name,
base::MakeUnique<ServiceWorkerHeaderList>(
@@ -1059,6 +1063,8 @@
std::unique_ptr<storage::BlobDataHandle> blob_data_handle;
if (!response->blob_uuid.empty()) {
+ DCHECK_EQ(response->blob != nullptr,
+ base::FeatureList::IsEnabled(features::kMojoBlobs));
if (!blob_storage_context_) {
std::move(callback).Run(CACHE_STORAGE_ERROR_STORAGE);
return;
@@ -1534,7 +1540,18 @@
blob_data.AppendDiskCacheEntryWithSideData(
new CacheStorageCacheDataHandle(CreateCacheHandle(), std::move(entry)),
temp_entry, INDEX_RESPONSE_BODY, INDEX_SIDE_DATA);
- return blob_storage_context_->AddFinishedBlob(&blob_data);
+ auto result = blob_storage_context_->AddFinishedBlob(&blob_data);
+
+ if (base::FeatureList::IsEnabled(features::kMojoBlobs)) {
+ storage::mojom::BlobPtr blob_ptr;
+ storage::BlobImpl::Create(
+ base::MakeUnique<storage::BlobDataHandle>(*result),
+ MakeRequest(&blob_ptr));
+ response->blob =
+ base::MakeRefCounted<storage::BlobHandle>(std::move(blob_ptr));
+ }
+
+ return result;
}
std::unique_ptr<CacheStorageCacheHandle>
diff --git a/content/browser/cache_storage/cache_storage_cache_unittest.cc b/content/browser/cache_storage/cache_storage_cache_unittest.cc
index 32f2d2d..bf9f560 100644
--- a/content/browser/cache_storage/cache_storage_cache_unittest.cc
+++ b/content/browser/cache_storage/cache_storage_cache_unittest.cc
@@ -41,6 +41,7 @@
#include "storage/browser/quota/quota_manager_proxy.h"
#include "storage/browser/test/mock_quota_manager_proxy.h"
#include "storage/browser/test/mock_special_storage_policy.h"
+#include "storage/common/blob_storage/blob_handle.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
@@ -444,8 +445,9 @@
return ServiceWorkerResponse(
base::MakeUnique<std::vector<GURL>>(1, GURL(url)), 200, "OK",
blink::mojom::FetchResponseType::kDefault, std::move(headers),
- blob_uuid, blob_size, blink::kWebServiceWorkerResponseErrorUnknown,
- base::Time::Now(), false /* is_in_cache_storage */,
+ blob_uuid, blob_size, nullptr /* blob */,
+ blink::kWebServiceWorkerResponseErrorUnknown, base::Time::Now(),
+ false /* is_in_cache_storage */,
std::string() /* cache_storage_cache_name */,
std::move(cors_exposed_header_names));
}
@@ -1518,7 +1520,7 @@
ServiceWorkerResponse response(
base::MakeUnique<std::vector<GURL>>(), 200, "OK",
blink::mojom::FetchResponseType::kDefault,
- base::MakeUnique<ServiceWorkerHeaderMap>(), "", 0,
+ base::MakeUnique<ServiceWorkerHeaderMap>(), "", 0, nullptr /* blob */,
blink::kWebServiceWorkerResponseErrorUnknown, base::Time(),
false /* is_in_cache_storage */,
std::string() /* cache_storage_cache_name */,
diff --git a/content/browser/cache_storage/cache_storage_manager_unittest.cc b/content/browser/cache_storage/cache_storage_manager_unittest.cc
index 8540496..b41f985 100644
--- a/content/browser/cache_storage/cache_storage_manager_unittest.cc
+++ b/content/browser/cache_storage/cache_storage_manager_unittest.cc
@@ -44,6 +44,7 @@
#include "storage/browser/quota/quota_manager_proxy.h"
#include "storage/browser/test/mock_quota_manager_proxy.h"
#include "storage/browser/test/mock_special_storage_policy.h"
+#include "storage/common/blob_storage/blob_handle.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
@@ -379,7 +380,7 @@
std::move(url_list), status_code, "OK",
blink::mojom::FetchResponseType::kDefault,
base::MakeUnique<ServiceWorkerHeaderMap>(response_headers),
- blob_handle->uuid(), request.url.spec().size(),
+ blob_handle->uuid(), request.url.spec().size(), nullptr /* blob */,
blink::kWebServiceWorkerResponseErrorUnknown, base::Time(),
false /* is_in_cache_storage */,
std::string() /* cache_storage_cache_name */,
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc
index 53b398ebc..d3001f0 100644
--- a/content/browser/service_worker/embedded_worker_test_helper.cc
+++ b/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -35,6 +35,7 @@
#include "content/public/test/test_browser_context.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "storage/common/blob_storage/blob_handle.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
@@ -496,8 +497,8 @@
base::MakeUnique<std::vector<GURL>>(), 200, "OK",
blink::mojom::FetchResponseType::kDefault,
base::MakeUnique<ServiceWorkerHeaderMap>(), std::string(), 0,
- blink::kWebServiceWorkerResponseErrorUnknown, base::Time(),
- false /* is_in_cache_storage */,
+ nullptr /* blob */, blink::kWebServiceWorkerResponseErrorUnknown,
+ base::Time(), false /* is_in_cache_storage */,
std::string() /* cache_storage_cache_name */,
base::MakeUnique<
ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
diff --git a/content/browser/service_worker/service_worker_url_request_job.cc b/content/browser/service_worker/service_worker_url_request_job.cc
index 373dd26..a9eb42b 100644
--- a/content/browser/service_worker/service_worker_url_request_job.cc
+++ b/content/browser/service_worker/service_worker_url_request_job.cc
@@ -36,6 +36,7 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/resource_request_info.h"
#include "content/public/browser/service_worker_context.h"
+#include "content/public/common/content_features.h"
#include "content/public/common/referrer.h"
#include "content/public/common/resource_request_body.h"
#include "net/base/net_errors.h"
@@ -48,6 +49,7 @@
#include "net/log/net_log_with_source.h"
#include "storage/browser/blob/blob_data_builder.h"
#include "storage/browser/blob/blob_data_handle.h"
+#include "storage/browser/blob/blob_impl.h"
#include "storage/browser/blob/blob_storage_context.h"
#include "ui/base/page_transition_types.h"
@@ -575,6 +577,7 @@
}
request->blob_uuid = blob_uuid;
request->blob_size = blob_size;
+ request->blob = request_body_blob_handle_;
request->credentials_mode = credentials_mode_;
request->redirect_mode = redirect_mode_;
request->integrity = integrity_;
@@ -608,6 +611,15 @@
blob_storage_context_->AddFinishedBlob(&blob_builder);
*blob_uuid = blob_builder.uuid();
*blob_size = request_body_blob_data_handle_->size();
+
+ if (base::FeatureList::IsEnabled(features::kMojoBlobs)) {
+ storage::mojom::BlobPtr blob_ptr;
+ storage::BlobImpl::Create(base::MakeUnique<storage::BlobDataHandle>(
+ *request_body_blob_data_handle_),
+ MakeRequest(&blob_ptr));
+ request_body_blob_handle_ =
+ base::MakeRefCounted<storage::BlobHandle>(std::move(blob_ptr));
+ }
}
bool ServiceWorkerURLRequestJob::ShouldRecordNavigationMetrics(
diff --git a/content/browser/service_worker/service_worker_url_request_job.h b/content/browser/service_worker/service_worker_url_request_job.h
index 2cdd543..7d800c9 100644
--- a/content/browser/service_worker/service_worker_url_request_job.h
+++ b/content/browser/service_worker/service_worker_url_request_job.h
@@ -309,6 +309,7 @@
// using the userdata mechanism. So we have to keep it not to free the blobs.
scoped_refptr<ResourceRequestBody> body_;
std::unique_ptr<storage::BlobDataHandle> request_body_blob_data_handle_;
+ scoped_refptr<storage::BlobHandle> request_body_blob_handle_;
ServiceWorkerFetchType fetch_type_;
base::Optional<base::TimeDelta> timeout_;
diff --git a/content/browser/service_worker/service_worker_url_request_job_unittest.cc b/content/browser/service_worker/service_worker_url_request_job_unittest.cc
index 79559ac..94d867b 100644
--- a/content/browser/service_worker/service_worker_url_request_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_url_request_job_unittest.cc
@@ -60,6 +60,7 @@
#include "storage/browser/blob/blob_storage_context.h"
#include "storage/browser/blob/blob_url_request_job.h"
#include "storage/browser/blob/blob_url_request_job_factory.h"
+#include "storage/common/blob_storage/blob_handle.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
@@ -477,8 +478,8 @@
base::MakeUnique<std::vector<GURL>>(), 200, "OK",
blink::mojom::FetchResponseType::kDefault,
base::MakeUnique<ServiceWorkerHeaderMap>(), std::string(), 0,
- blink::kWebServiceWorkerResponseErrorUnknown, base::Time(),
- false /* response_is_in_cache_storage */,
+ nullptr /* blob */, blink::kWebServiceWorkerResponseErrorUnknown,
+ base::Time(), false /* response_is_in_cache_storage */,
std::string() /* response_cache_storage_cache_name */,
base::MakeUnique<
ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
@@ -714,8 +715,8 @@
base::MakeUnique<std::vector<GURL>>(), 200, "OK",
blink::mojom::FetchResponseType::kDefault,
base::MakeUnique<ServiceWorkerHeaderMap>(), std::string(), 0,
- blink::kWebServiceWorkerResponseErrorUnknown, base::Time(),
- false /* response_is_in_cache_storage */,
+ nullptr /* blob */, blink::kWebServiceWorkerResponseErrorUnknown,
+ base::Time(), false /* response_is_in_cache_storage */,
std::string() /* response_cache_storage_cache_name */,
base::MakeUnique<
ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
@@ -801,7 +802,7 @@
ServiceWorkerResponse(
base::MakeUnique<std::vector<GURL>>(), 200, "OK",
blink::mojom::FetchResponseType::kDefault, MakeHeaders(),
- blob_uuid_, blob_size_,
+ blob_uuid_, blob_size_, nullptr /* blob */,
blink::kWebServiceWorkerResponseErrorUnknown, base::Time(),
false /* response_is_in_cache_storage */,
std::string() /* response_cache_storage_cache_name */,
@@ -901,8 +902,8 @@
ServiceWorkerResponse(
base::MakeUnique<std::vector<GURL>>(), 200, "OK",
blink::mojom::FetchResponseType::kDefault, MakeHeaders(), "", 0,
- blink::kWebServiceWorkerResponseErrorUnknown, base::Time(),
- false /* response_is_in_cache_storage */,
+ nullptr /* blob */, blink::kWebServiceWorkerResponseErrorUnknown,
+ base::Time(), false /* response_is_in_cache_storage */,
std::string() /* response_cache_storage_cache_name */,
base::MakeUnique<
ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
@@ -1386,8 +1387,8 @@
base::MakeUnique<std::vector<GURL>>(), 200, "OK",
blink::mojom::FetchResponseType::kDefault,
base::MakeUnique<ServiceWorkerHeaderMap>(), std::string(), 0,
- blink::kWebServiceWorkerResponseErrorUnknown, base::Time(),
- false /* response_is_in_cache_storage */,
+ nullptr /* blob */, blink::kWebServiceWorkerResponseErrorUnknown,
+ base::Time(), false /* response_is_in_cache_storage */,
std::string() /* response_cache_storage_cache_name */,
base::MakeUnique<
ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index 566cbd5..9805472 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -641,6 +641,7 @@
"//services/video_capture/public/interfaces",
"//services/viz/public/interfaces/compositing",
"//skia/public/interfaces",
+ "//storage/public/interfaces",
"//third_party/WebKit/public:mojo_bindings",
"//ui/base/mojo:mojo_bindings",
"//ui/gfx/geometry/mojo",
diff --git a/content/common/content_param_traits.cc b/content/common/content_param_traits.cc
index 83fa75c..89fdec94 100644
--- a/content/common/content_param_traits.cc
+++ b/content/common/content_param_traits.cc
@@ -8,6 +8,7 @@
#include "base/strings/string_number_conversions.h"
#include "content/common/message_port.h"
+#include "ipc/ipc_mojo_message_helper.h"
#include "ipc/ipc_mojo_param_traits.h"
#include "net/base/ip_endpoint.h"
#include "ui/accessibility/ax_modes.h"
@@ -110,6 +111,56 @@
}
void ParamTraits<ui::AXMode>::Log(const param_type& p, std::string* l) {}
+
+void ParamTraits<scoped_refptr<storage::BlobHandle>>::GetSize(
+ base::PickleSizer* s,
+ const param_type& p) {
+ s->AddBool();
+ if (p) {
+ s->AddUInt32();
+ s->AddAttachment();
+ }
+}
+
+void ParamTraits<scoped_refptr<storage::BlobHandle>>::Write(
+ base::Pickle* m,
+ const param_type& p) {
+ WriteParam(m, p != nullptr);
+ if (p) {
+ auto info = p->Clone().PassInterface();
+ m->WriteUInt32(info.version());
+ MojoMessageHelper::WriteMessagePipeTo(m, info.PassHandle());
+ }
+}
+
+bool ParamTraits<scoped_refptr<storage::BlobHandle>>::Read(
+ const base::Pickle* m,
+ base::PickleIterator* iter,
+ param_type* r) {
+ bool is_not_null;
+ if (!ReadParam(m, iter, &is_not_null))
+ return false;
+ if (!is_not_null)
+ return true;
+
+ uint32_t version;
+ if (!ReadParam(m, iter, &version))
+ return false;
+ mojo::ScopedMessagePipeHandle handle;
+ if (!MojoMessageHelper::ReadMessagePipeFrom(m, iter, &handle))
+ return false;
+ DCHECK(handle.is_valid());
+ storage::mojom::BlobPtr blob;
+ blob.Bind(storage::mojom::BlobPtrInfo(std::move(handle), version));
+ *r = base::MakeRefCounted<storage::BlobHandle>(std::move(blob));
+ return true;
+}
+
+void ParamTraits<scoped_refptr<storage::BlobHandle>>::Log(const param_type& p,
+ std::string* l) {
+ l->append("<storage::BlobHandle>");
+}
+
} // namespace IPC
// Generate param traits size methods.
diff --git a/content/common/content_param_traits.h b/content/common/content_param_traits.h
index 937f74a4..c16267e 100644
--- a/content/common/content_param_traits.h
+++ b/content/common/content_param_traits.h
@@ -17,6 +17,7 @@
#include "content/common/content_param_traits_macros.h"
#include "content/common/cursors/webcursor.h"
#include "ipc/ipc_mojo_param_traits.h"
+#include "storage/common/blob_storage/blob_handle.h"
#include "third_party/WebKit/public/platform/WebInputEvent.h"
#include "ui/accessibility/ax_modes.h"
@@ -74,6 +75,17 @@
static void Log(const param_type& p, std::string* l);
};
+template <>
+struct CONTENT_EXPORT ParamTraits<scoped_refptr<storage::BlobHandle>> {
+ typedef scoped_refptr<storage::BlobHandle> param_type;
+ static void GetSize(base::PickleSizer* s, const param_type& p);
+ static void Write(base::Pickle* m, const param_type& p);
+ static bool Read(const base::Pickle* m,
+ base::PickleIterator* iter,
+ param_type* r);
+ static void Log(const param_type& p, std::string* l);
+};
+
} // namespace IPC
#endif // CONTENT_COMMON_CONTENT_PARAM_TRAITS_H_
diff --git a/content/common/service_worker/service_worker_fetch_request.typemap b/content/common/service_worker/service_worker_fetch_request.typemap
index dbc9030..2323e8b6 100644
--- a/content/common/service_worker/service_worker_fetch_request.typemap
+++ b/content/common/service_worker/service_worker_fetch_request.typemap
@@ -10,6 +10,8 @@
"//content/public/common/request_context_frame_type.h",
"//content/public/common/request_context_type.h",
"//content/public/common/service_worker_modes.h",
+ "//storage/common/blob_storage/blob_handle.h",
+ "//storage/common/storage_common_export.h",
]
traits_headers = [ "//content/common/service_worker/service_worker_fetch_request_struct_traits.h" ]
sources = [
diff --git a/content/common/service_worker/service_worker_fetch_request_struct_traits.cc b/content/common/service_worker/service_worker_fetch_request_struct_traits.cc
index 7bf14bf..dec7383 100644
--- a/content/common/service_worker/service_worker_fetch_request_struct_traits.cc
+++ b/content/common/service_worker/service_worker_fetch_request_struct_traits.cc
@@ -454,6 +454,9 @@
out->blob_uuid = blob_uuid.value();
out->blob_size = data.blob_size();
}
+ storage::mojom::BlobPtr blob = data.TakeBlob<storage::mojom::BlobPtr>();
+ if (blob)
+ out->blob = base::MakeRefCounted<storage::BlobHandle>(std::move(blob));
out->is_reload = data.is_reload();
return true;
}
diff --git a/content/common/service_worker/service_worker_fetch_request_struct_traits.h b/content/common/service_worker/service_worker_fetch_request_struct_traits.h
index 41549feb..80912e2 100644
--- a/content/common/service_worker/service_worker_fetch_request_struct_traits.h
+++ b/content/common/service_worker/service_worker_fetch_request_struct_traits.h
@@ -7,6 +7,7 @@
#include "base/numerics/safe_conversions.h"
#include "content/public/common/referrer.h"
+#include "storage/common/blob_storage/blob_handle.h"
#include "third_party/WebKit/public/platform/modules/fetch/fetch_api_request.mojom.h"
namespace mojo {
@@ -118,6 +119,13 @@
return request.blob_size;
}
+ static storage::mojom::BlobPtr blob(
+ const content::ServiceWorkerFetchRequest& request) {
+ if (!request.blob)
+ return nullptr;
+ return request.blob->Clone();
+ }
+
static const content::Referrer& referrer(
const content::ServiceWorkerFetchRequest& request) {
return request.referrer;
diff --git a/content/common/service_worker/service_worker_messages.h b/content/common/service_worker/service_worker_messages.h
index 9750c9f..4a367032 100644
--- a/content/common/service_worker/service_worker_messages.h
+++ b/content/common/service_worker/service_worker_messages.h
@@ -73,6 +73,7 @@
IPC_STRUCT_TRAITS_MEMBER(headers)
IPC_STRUCT_TRAITS_MEMBER(blob_uuid)
IPC_STRUCT_TRAITS_MEMBER(blob_size)
+ IPC_STRUCT_TRAITS_MEMBER(blob)
IPC_STRUCT_TRAITS_MEMBER(referrer)
IPC_STRUCT_TRAITS_MEMBER(credentials_mode)
IPC_STRUCT_TRAITS_MEMBER(redirect_mode)
@@ -93,6 +94,7 @@
IPC_STRUCT_TRAITS_MEMBER(headers)
IPC_STRUCT_TRAITS_MEMBER(blob_uuid)
IPC_STRUCT_TRAITS_MEMBER(blob_size)
+ IPC_STRUCT_TRAITS_MEMBER(blob)
IPC_STRUCT_TRAITS_MEMBER(error)
IPC_STRUCT_TRAITS_MEMBER(response_time)
IPC_STRUCT_TRAITS_MEMBER(is_in_cache_storage)
diff --git a/content/common/service_worker/service_worker_types.cc b/content/common/service_worker/service_worker_types.cc
index 0bb3d8f..e692f70 100644
--- a/content/common/service_worker/service_worker_types.cc
+++ b/content/common/service_worker/service_worker_types.cc
@@ -5,6 +5,7 @@
#include "content/common/service_worker/service_worker_types.h"
#include "content/public/common/service_worker_modes.h"
+#include "storage/common/blob_storage/blob_handle.h"
namespace content {
@@ -55,6 +56,9 @@
ServiceWorkerFetchRequest::ServiceWorkerFetchRequest(
const ServiceWorkerFetchRequest& other) = default;
+ServiceWorkerFetchRequest& ServiceWorkerFetchRequest::operator=(
+ const ServiceWorkerFetchRequest& other) = default;
+
ServiceWorkerFetchRequest::~ServiceWorkerFetchRequest() {}
size_t ServiceWorkerFetchRequest::EstimatedStructSize() {
@@ -85,6 +89,7 @@
std::unique_ptr<ServiceWorkerHeaderMap> headers,
const std::string& blob_uuid,
uint64_t blob_size,
+ scoped_refptr<storage::BlobHandle> blob,
blink::WebServiceWorkerResponseError error,
base::Time response_time,
bool is_in_cache_storage,
@@ -95,6 +100,7 @@
response_type(response_type),
blob_uuid(blob_uuid),
blob_size(blob_size),
+ blob(std::move(blob)),
error(error),
response_time(response_time),
is_in_cache_storage(is_in_cache_storage),
@@ -107,6 +113,9 @@
ServiceWorkerResponse::ServiceWorkerResponse(
const ServiceWorkerResponse& other) = default;
+ServiceWorkerResponse& ServiceWorkerResponse::operator=(
+ const ServiceWorkerResponse& other) = default;
+
ServiceWorkerResponse::~ServiceWorkerResponse() {}
size_t ServiceWorkerResponse::EstimatedStructSize() {
diff --git a/content/common/service_worker/service_worker_types.h b/content/common/service_worker/service_worker_types.h
index 39f1dfc..0cc29de 100644
--- a/content/common/service_worker/service_worker_types.h
+++ b/content/common/service_worker/service_worker_types.h
@@ -29,6 +29,10 @@
// This file is to have common definitions that are to be shared by
// browser and child process.
+namespace storage {
+class BlobHandle;
+}
+
namespace content {
// Indicates the document main thread ID in the child process. This is used for
@@ -101,6 +105,7 @@
const Referrer& referrer,
bool is_reload);
ServiceWorkerFetchRequest(const ServiceWorkerFetchRequest& other);
+ ServiceWorkerFetchRequest& operator=(const ServiceWorkerFetchRequest& other);
~ServiceWorkerFetchRequest();
size_t EstimatedStructSize();
@@ -114,6 +119,7 @@
ServiceWorkerHeaderMap headers;
std::string blob_uuid;
uint64_t blob_size;
+ scoped_refptr<storage::BlobHandle> blob;
Referrer referrer;
FetchCredentialsMode credentials_mode;
FetchRedirectMode redirect_mode;
@@ -134,12 +140,14 @@
std::unique_ptr<ServiceWorkerHeaderMap> headers,
const std::string& blob_uuid,
uint64_t blob_size,
+ scoped_refptr<storage::BlobHandle> blob,
blink::WebServiceWorkerResponseError error,
base::Time response_time,
bool is_in_cache_storage,
const std::string& cache_storage_cache_name,
std::unique_ptr<ServiceWorkerHeaderList> cors_exposed_header_names);
ServiceWorkerResponse(const ServiceWorkerResponse& other);
+ ServiceWorkerResponse& operator=(const ServiceWorkerResponse& other);
~ServiceWorkerResponse();
size_t EstimatedStructSize();
@@ -154,6 +162,7 @@
// ServiceWorkerFetchResponseCallback.
std::string blob_uuid;
uint64_t blob_size;
+ scoped_refptr<storage::BlobHandle> blob;
blink::WebServiceWorkerResponseError error;
base::Time response_time;
bool is_in_cache_storage = false;
diff --git a/content/renderer/cache_storage/cache_storage_dispatcher.cc b/content/renderer/cache_storage/cache_storage_dispatcher.cc
index f1ba2dc8..60920e6 100644
--- a/content/renderer/cache_storage/cache_storage_dispatcher.cc
+++ b/content/renderer/cache_storage/cache_storage_dispatcher.cc
@@ -18,18 +18,20 @@
#include "base/threading/thread_local.h"
#include "content/child/thread_safe_sender.h"
#include "content/common/cache_storage/cache_storage_messages.h"
+#include "content/public/common/content_features.h"
#include "content/public/common/referrer.h"
#include "content/public/renderer/render_thread.h"
#include "content/renderer/service_worker/service_worker_type_util.h"
+#include "storage/common/blob_storage/blob_handle.h"
#include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerCache.h"
#include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerRequest.h"
#include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponse.h"
#include "url/origin.h"
-using base::TimeTicks;
namespace content {
+using base::TimeTicks;
using blink::WebServiceWorkerCacheError;
using blink::WebServiceWorkerCacheStorage;
using blink::WebServiceWorkerRequest;
@@ -648,8 +650,13 @@
}
if (!response.blob_uuid.empty()) {
+ DCHECK_EQ(response.blob != nullptr,
+ base::FeatureList::IsEnabled(features::kMojoBlobs));
+ mojo::ScopedMessagePipeHandle blob_pipe;
+ if (response.blob)
+ blob_pipe = response.blob->Clone().PassInterface().PassHandle();
web_response->SetBlob(blink::WebString::FromUTF8(response.blob_uuid),
- response.blob_size);
+ response.blob_size, std::move(blob_pipe));
// Let the host know that it can release its reference to the blob.
Send(new CacheStorageHostMsg_BlobDataHandled(response.blob_uuid));
}
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index 2bd7d83..3bff055 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -57,6 +57,7 @@
#include "ipc/ipc_message_macros.h"
#include "net/base/net_errors.h"
#include "net/http/http_response_headers.h"
+#include "storage/common/blob_storage/blob_handle.h"
#include "third_party/WebKit/public/platform/InterfaceProvider.h"
#include "third_party/WebKit/public/platform/URLConversion.h"
#include "third_party/WebKit/public/platform/WebMessagePortChannel.h"
@@ -214,8 +215,13 @@
blink::WebString::FromUTF8(pair.second));
}
if (!request.blob_uuid.empty()) {
+ DCHECK_EQ(request.blob != nullptr,
+ base::FeatureList::IsEnabled(features::kMojoBlobs));
+ mojo::ScopedMessagePipeHandle blob_pipe;
+ if (request.blob)
+ blob_pipe = request.blob->Clone().PassInterface().PassHandle();
web_request->SetBlob(blink::WebString::FromASCII(request.blob_uuid),
- request.blob_size);
+ request.blob_size, std::move(blob_pipe));
}
web_request->SetReferrer(
blink::WebString::FromUTF8(request.referrer.url.spec()),
@@ -253,8 +259,13 @@
blink::WebString::FromUTF8(pair.second));
}
if (!response.blob_uuid.empty()) {
+ DCHECK_EQ(response.blob != nullptr,
+ base::FeatureList::IsEnabled(features::kMojoBlobs));
+ mojo::ScopedMessagePipeHandle blob_pipe;
+ if (response.blob)
+ blob_pipe = response.blob->Clone().PassInterface().PassHandle();
web_response->SetBlob(blink::WebString::FromASCII(response.blob_uuid),
- response.blob_size);
+ response.blob_size, std::move(blob_pipe));
}
web_response->SetError(response.error);
web_response->SetResponseTime(response.response_time);
diff --git a/content/renderer/service_worker/service_worker_type_util.cc b/content/renderer/service_worker/service_worker_type_util.cc
index c6024b0..0365827f 100644
--- a/content/renderer/service_worker/service_worker_type_util.cc
+++ b/content/renderer/service_worker/service_worker_type_util.cc
@@ -10,6 +10,7 @@
#include "base/memory/ptr_util.h"
#include "base/strings/utf_string_conversions.h"
#include "content/common/service_worker/service_worker_types.h"
+#include "storage/common/blob_storage/blob_handle.h"
#include "third_party/WebKit/public/platform/WebHTTPHeaderVisitor.h"
#include "third_party/WebKit/public/platform/WebString.h"
#include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerRequest.h"
@@ -82,11 +83,20 @@
ServiceWorkerResponse GetServiceWorkerResponseFromWebResponse(
const blink::WebServiceWorkerResponse& web_response) {
+ scoped_refptr<storage::BlobHandle> blob;
+ auto blob_pipe = web_response.CloneBlobPtr();
+ if (blob_pipe.is_valid()) {
+ storage::mojom::BlobPtr blob_ptr;
+ blob_ptr.Bind(storage::mojom::BlobPtrInfo(std::move(blob_pipe),
+ storage::mojom::Blob::Version_));
+ blob = base::MakeRefCounted<storage::BlobHandle>(std::move(blob_ptr));
+ }
+
return ServiceWorkerResponse(
GetURLList(web_response.UrlList()), web_response.Status(),
web_response.StatusText().Utf8(), web_response.ResponseType(),
GetHeaderMap(web_response), web_response.BlobUUID().Utf8(),
- web_response.BlobSize(), web_response.GetError(),
+ web_response.BlobSize(), std::move(blob), web_response.GetError(),
web_response.ResponseTime(),
!web_response.CacheStorageCacheName().IsNull(),
web_response.CacheStorageCacheName().Utf8(),
diff --git a/storage/browser/BUILD.gn b/storage/browser/BUILD.gn
index f45832f..b5f8a15 100644
--- a/storage/browser/BUILD.gn
+++ b/storage/browser/BUILD.gn
@@ -201,7 +201,6 @@
public_deps = [
"//storage/common",
- "//storage/public/interfaces",
]
deps = [
"//base",
diff --git a/storage/common/BUILD.gn b/storage/common/BUILD.gn
index 56bbfede..a233cbeb 100644
--- a/storage/common/BUILD.gn
+++ b/storage/common/BUILD.gn
@@ -5,6 +5,8 @@
component("common") {
output_name = "storage_common"
sources = [
+ "blob_storage/blob_handle.cc",
+ "blob_storage/blob_handle.h",
"blob_storage/blob_item_bytes_request.cc",
"blob_storage/blob_item_bytes_request.h",
"blob_storage/blob_item_bytes_response.cc",
@@ -41,6 +43,9 @@
defines = [ "STORAGE_COMMON_IMPLEMENTATION" ]
+ public_deps = [
+ "//storage/public/interfaces",
+ ]
deps = [
"//base",
"//base/third_party/dynamic_annotations",
diff --git a/storage/common/blob_storage/blob_handle.cc b/storage/common/blob_storage/blob_handle.cc
new file mode 100644
index 0000000..0ba2074
--- /dev/null
+++ b/storage/common/blob_storage/blob_handle.cc
@@ -0,0 +1,21 @@
+// 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 "storage/common/blob_storage/blob_handle.h"
+
+namespace storage {
+
+BlobHandle::BlobHandle(mojom::BlobPtr blob) : blob_(std::move(blob)) {
+ DCHECK(blob_);
+}
+
+mojom::BlobPtr BlobHandle::Clone() const {
+ mojom::BlobPtr clone;
+ blob_->Clone(MakeRequest(&clone));
+ return clone;
+}
+
+BlobHandle::~BlobHandle() = default;
+
+} // namespace storage
diff --git a/storage/common/blob_storage/blob_handle.h b/storage/common/blob_storage/blob_handle.h
new file mode 100644
index 0000000..378bfcd
--- /dev/null
+++ b/storage/common/blob_storage/blob_handle.h
@@ -0,0 +1,35 @@
+// 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.
+
+#ifndef STORAGE_COMMON_BLOB_STORAGE_BLOB_HANDLE_H_
+#define STORAGE_COMMON_BLOB_STORAGE_BLOB_HANDLE_H_
+
+#include "base/memory/ref_counted.h"
+#include "storage/common/storage_common_export.h"
+#include "storage/public/interfaces/blobs.mojom.h"
+
+namespace storage {
+
+// Refcounted wrapper around a mojom::BlobPtr.
+class STORAGE_COMMON_EXPORT BlobHandle : public base::RefCounted<BlobHandle> {
+ public:
+ explicit BlobHandle(mojom::BlobPtr blob);
+
+ bool is_bound() const { return blob_.is_bound(); }
+ mojom::Blob* get() const { return blob_.get(); }
+ mojom::Blob* operator->() const { return get(); }
+ mojom::Blob& operator*() const { return *get(); }
+
+ mojom::BlobPtr Clone() const;
+
+ private:
+ friend class base::RefCounted<BlobHandle>;
+ ~BlobHandle();
+
+ mojom::BlobPtr blob_;
+};
+
+} // namespace storage
+
+#endif // STORAGE_COMMON_BLOB_STORAGE_BLOB_HANDLE_H_
diff --git a/storage/public/interfaces/BUILD.gn b/storage/public/interfaces/BUILD.gn
index 252367c6..d30561e 100644
--- a/storage/public/interfaces/BUILD.gn
+++ b/storage/public/interfaces/BUILD.gn
@@ -14,9 +14,9 @@
"//url/mojo:url_mojom_gurl",
]
- export_class_attribute = "STORAGE_EXPORT"
- export_define = "STORAGE_BROWSER_IMPLEMENTATION=1"
- export_header = "storage/browser/storage_browser_export.h"
+ export_class_attribute = "STORAGE_COMMON_EXPORT"
+ export_define = "STORAGE_COMMON_IMPLEMENTATION=1"
+ export_header = "storage/common/storage_common_export.h"
export_class_attribute_blink = "BLINK_PLATFORM_EXPORT"
export_define_blink = "BLINK_PLATFORM_IMPLEMENTATION=1"
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 4c0aba4f..30cfb1e4 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -1925,6 +1925,7 @@
crbug.com/626703 external/wpt/secure-contexts/shared-worker-insecure-first.https.html [ Timeout ]
crbug.com/626703 external/wpt/secure-contexts/shared-worker-secure-first.https.html [ Timeout ]
crbug.com/626703 external/wpt/service-workers/service-worker/update-bytecheck.https.html [ Timeout ]
+crbug.com/626703 virtual/mojo-blobs/external/wpt/service-workers/service-worker/update-bytecheck.https.html [ Timeout ]
crbug.com/626703 external/wpt/streams/readable-streams/general.html [ Failure Timeout ]
crbug.com/626703 external/wpt/svg/linking/reftests/href-filter-element.html [ Failure ]
crbug.com/626703 external/wpt/wasm/wasm_indexeddb_test.html [ Timeout ]
@@ -2265,6 +2266,7 @@
crbug.com/658997 external/wpt/service-workers/service-worker/clients-matchall-client-types.https.html [ Skip ]
crbug.com/658997 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall-client-types.https.html [ Skip ]
crbug.com/658997 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall-client-types.https.html [ Skip ]
+crbug.com/658997 virtual/mojo-blobs/external/wpt/service-workers/service-worker/clients-matchall-client-types.https.html [ Skip ]
crbug.com/435547 http/tests/cachestorage/serviceworker/ignore-search-with-credentials.html [ Skip ]
crbug.com/435547 virtual/mojo-loading/http/tests/cachestorage/serviceworker/ignore-search-with-credentials.html [ Skip ]
@@ -2414,19 +2416,23 @@
crbug.com/602693 external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Timeout ]
crbug.com/602693 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Timeout ]
crbug.com/602693 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Timeout ]
+crbug.com/602693 virtual/mojo-blobs/external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Timeout ]
# This test requires a special browser flag and seems not suitable for a wpt test, see bug.
crbug.com/691944 external/wpt/service-workers/service-worker/update-after-oneday.https.html [ Skip ]
crbug.com/691944 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/update-after-oneday.https.html [ Skip ]
crbug.com/691944 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/update-after-oneday.https.html [ Skip ]
+crbug.com/691944 virtual/mojo-blobs/external/wpt/service-workers/service-worker/update-after-oneday.https.html [ Skip ]
# These tests (erroneously) see a platform-specific User-Agent header
crbug.com/595993 external/wpt/service-workers/service-worker/fetch-header-visibility.https.html [ Failure ]
crbug.com/595993 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-header-visibility.https.html [ Failure ]
crbug.com/595993 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-header-visibility.https.html [ Failure ]
+crbug.com/595993 virtual/mojo-blobs/external/wpt/service-workers/service-worker/fetch-header-visibility.https.html [ Failure ]
crbug.com/595993 external/wpt/service-workers/service-worker/request-end-to-end.https.html [ Failure ]
crbug.com/595993 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/request-end-to-end.https.html [ Failure ]
crbug.com/595993 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/request-end-to-end.https.html [ Failure ]
+crbug.com/595993 virtual/mojo-blobs/external/wpt/service-workers/service-worker/request-end-to-end.https.html [ Failure ]
crbug.com/619427 [ Mac Linux ] fast/overflow/overflow-height-float-not-removed-crash3.html [ Pass Failure ]
@@ -2775,10 +2781,13 @@
# Importing 'fetch' tests from WPT.
crbug.com/705490 external/wpt/fetch/api/basic/error-after-response.html [ Timeout Pass ]
+crbug.com/705490 virtual/mojo-blobs/external/wpt/fetch/api/basic/error-after-response.html [ Timeout Pass ]
# Non-deterministic output, as the failing subtests dump timestamps.
crbug.com/705490 external/wpt/fetch/api/request/request-cache-reload.html [ Failure ]
crbug.com/705490 external/wpt/fetch/api/request/request-cache-no-store.html [ Failure ]
+crbug.com/705490 virtual/mojo-blobs/external/wpt/fetch/api/request/request-cache-reload.html [ Failure ]
+crbug.com/705490 virtual/mojo-blobs/external/wpt/fetch/api/request/request-cache-no-store.html [ Failure ]
# This test has device ID strings in failure messages which change on every test run.
crbug.com/679742 external/wpt/mediacapture-streams/MediaStreamTrack-getSettings.https.html [ Failure ]
@@ -2799,6 +2808,7 @@
crbug.com/688486 external/wpt/service-workers/service-worker/fetch-request-resources.https.html [ Failure Pass ]
crbug.com/688486 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-request-resources.https.html [ Failure Pass ]
crbug.com/688486 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-request-resources.https.html [ Failure Pass ]
+crbug.com/688486 virtual/mojo-blobs/external/wpt/service-workers/service-worker/fetch-request-resources.https.html [ Failure Pass ]
# Sheriff failures 2017-02-21
crbug.com/73609 http/tests/media/video-play-stall.html [ Pass Timeout ]
diff --git a/third_party/WebKit/LayoutTests/VirtualTestSuites b/third_party/WebKit/LayoutTests/VirtualTestSuites
index 3fda57e..42799f6 100644
--- a/third_party/WebKit/LayoutTests/VirtualTestSuites
+++ b/third_party/WebKit/LayoutTests/VirtualTestSuites
@@ -565,6 +565,16 @@
},
{
"prefix": "mojo-blobs",
+ "base": "external/wpt/fetch",
+ "args": ["--enable-features=MojoBlobs"]
+ },
+ {
+ "prefix": "mojo-blobs",
+ "base": "external/wpt/service-workers",
+ "args": ["--enable-features=MojoBlobs"]
+ },
+ {
+ "prefix": "mojo-blobs",
"base": "fast/files",
"args": ["--enable-features=MojoBlobs"]
}
diff --git a/third_party/WebKit/LayoutTests/virtual/mojo-blobs/external/wpt/fetch/README.txt b/third_party/WebKit/LayoutTests/virtual/mojo-blobs/external/wpt/fetch/README.txt
new file mode 100644
index 0000000..a507250
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/virtual/mojo-blobs/external/wpt/fetch/README.txt
@@ -0,0 +1 @@
+This directory is for testing blobs with mojo.
diff --git a/third_party/WebKit/LayoutTests/virtual/mojo-blobs/external/wpt/service-workers/README.txt b/third_party/WebKit/LayoutTests/virtual/mojo-blobs/external/wpt/service-workers/README.txt
new file mode 100644
index 0000000..a507250
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/virtual/mojo-blobs/external/wpt/service-workers/README.txt
@@ -0,0 +1 @@
+This directory is for testing blobs with mojo.
diff --git a/third_party/WebKit/Source/modules/fetch/FetchDataLoader.cpp b/third_party/WebKit/Source/modules/fetch/FetchDataLoader.cpp
index d602c49f4..8de74fd 100644
--- a/third_party/WebKit/Source/modules/fetch/FetchDataLoader.cpp
+++ b/third_party/WebKit/Source/modules/fetch/FetchDataLoader.cpp
@@ -44,9 +44,14 @@
if (blob_handle) {
DCHECK_NE(UINT64_MAX, blob_handle->size());
if (blob_handle->GetType() != mime_type_) {
+ storage::mojom::blink::BlobPtr blob_clone = blob_handle->CloneBlobPtr();
// A new BlobDataHandle is created to override the Blob's type.
+ // TODO(mek): It might be cleaner to create a new blob (referencing the
+ // old blob) rather than just a new BlobDataHandle with mime type not
+ // matching the type of the underlying blob.
client_->DidFetchDataLoadedBlobHandle(BlobDataHandle::Create(
- blob_handle->Uuid(), mime_type_, blob_handle->size()));
+ blob_handle->Uuid(), mime_type_, blob_handle->size(),
+ blob_clone.PassInterface()));
} else {
client_->DidFetchDataLoadedBlobHandle(std::move(blob_handle));
}
diff --git a/third_party/WebKit/Source/platform/blob/BlobData.cpp b/third_party/WebKit/Source/platform/blob/BlobData.cpp
index 0848cd0d..3419935a 100644
--- a/third_party/WebKit/Source/platform/blob/BlobData.cpp
+++ b/third_party/WebKit/Source/platform/blob/BlobData.cpp
@@ -412,6 +412,19 @@
}
}
+BlobDataHandle::BlobDataHandle(const String& uuid,
+ const String& type,
+ long long size,
+ storage::mojom::blink::BlobPtrInfo blob_info)
+ : uuid_(uuid.IsolatedCopy()),
+ type_(IsValidBlobType(type) ? type.IsolatedCopy() : ""),
+ size_(size),
+ is_single_unknown_size_file_(false),
+ blob_info_(std::move(blob_info)) {
+ DCHECK(RuntimeEnabledFeatures::MojoBlobsEnabled());
+ DCHECK(blob_info_.is_valid());
+}
+
BlobDataHandle::~BlobDataHandle() {
if (!RuntimeEnabledFeatures::MojoBlobsEnabled())
BlobRegistry::RemoveBlobDataRef(uuid_);
@@ -419,6 +432,8 @@
BlobPtr BlobDataHandle::CloneBlobPtr() {
MutexLocker locker(blob_info_mutex_);
+ if (!blob_info_.is_valid())
+ return nullptr;
BlobPtr blob, blob_clone;
blob.Bind(std::move(blob_info_));
blob->Clone(MakeRequest(&blob_clone));
diff --git a/third_party/WebKit/Source/platform/blob/BlobData.h b/third_party/WebKit/Source/platform/blob/BlobData.h
index b9bb7a8..070287c2 100644
--- a/third_party/WebKit/Source/platform/blob/BlobData.h
+++ b/third_party/WebKit/Source/platform/blob/BlobData.h
@@ -241,6 +241,18 @@
return AdoptRef(new BlobDataHandle(uuid, type, size));
}
+ static PassRefPtr<BlobDataHandle> Create(
+ const String& uuid,
+ const String& type,
+ long long size,
+ storage::mojom::blink::BlobPtrInfo blob_info) {
+ if (blob_info.is_valid()) {
+ return AdoptRef(
+ new BlobDataHandle(uuid, type, size, std::move(blob_info)));
+ }
+ return AdoptRef(new BlobDataHandle(uuid, type, size));
+ }
+
String Uuid() const { return uuid_.IsolatedCopy(); }
String GetType() const { return type_.IsolatedCopy(); }
unsigned long long size() const { return size_; }
@@ -249,12 +261,16 @@
~BlobDataHandle();
+ storage::mojom::blink::BlobPtr CloneBlobPtr();
+
private:
BlobDataHandle();
BlobDataHandle(std::unique_ptr<BlobData>, long long size);
BlobDataHandle(const String& uuid, const String& type, long long size);
-
- storage::mojom::blink::BlobPtr CloneBlobPtr();
+ BlobDataHandle(const String& uuid,
+ const String& type,
+ long long size,
+ storage::mojom::blink::BlobPtrInfo);
const String uuid_;
const String type_;
diff --git a/third_party/WebKit/Source/platform/exported/WebServiceWorkerRequest.cpp b/third_party/WebKit/Source/platform/exported/WebServiceWorkerRequest.cpp
index c4469a2..0897ffb7 100644
--- a/third_party/WebKit/Source/platform/exported/WebServiceWorkerRequest.cpp
+++ b/third_party/WebKit/Source/platform/exported/WebServiceWorkerRequest.cpp
@@ -103,8 +103,20 @@
return private_->headers_;
}
-void WebServiceWorkerRequest::SetBlob(const WebString& uuid, long long size) {
- private_->blob_data_handle = BlobDataHandle::Create(uuid, String(), size);
+void WebServiceWorkerRequest::SetBlob(const WebString& uuid,
+ long long size,
+ mojo::ScopedMessagePipeHandle blob_pipe) {
+ SetBlob(uuid, size,
+ storage::mojom::blink::BlobPtrInfo(
+ std::move(blob_pipe), storage::mojom::blink::Blob::Version_));
+}
+
+void WebServiceWorkerRequest::SetBlob(
+ const WebString& uuid,
+ long long size,
+ storage::mojom::blink::BlobPtrInfo blob_info) {
+ private_->blob_data_handle =
+ BlobDataHandle::Create(uuid, String(), size, std::move(blob_info));
}
PassRefPtr<BlobDataHandle> WebServiceWorkerRequest::GetBlobDataHandle() const {
diff --git a/third_party/WebKit/Source/platform/exported/WebServiceWorkerResponse.cpp b/third_party/WebKit/Source/platform/exported/WebServiceWorkerResponse.cpp
index 87b555fb..57b3e70 100644
--- a/third_party/WebKit/Source/platform/exported/WebServiceWorkerResponse.cpp
+++ b/third_party/WebKit/Source/platform/exported/WebServiceWorkerResponse.cpp
@@ -111,8 +111,14 @@
header_visitor->VisitHeader(i->key, i->value);
}
-void WebServiceWorkerResponse::SetBlob(const WebString& uuid, uint64_t size) {
- private_->blob_data_handle = BlobDataHandle::Create(uuid, String(), size);
+void WebServiceWorkerResponse::SetBlob(
+ const WebString& uuid,
+ uint64_t size,
+ mojo::ScopedMessagePipeHandle blob_pipe) {
+ private_->blob_data_handle = BlobDataHandle::Create(
+ uuid, String(), size,
+ storage::mojom::blink::BlobPtrInfo(
+ std::move(blob_pipe), storage::mojom::blink::Blob::Version_));
}
WebString WebServiceWorkerResponse::BlobUUID() const {
@@ -127,6 +133,14 @@
return private_->blob_data_handle->size();
}
+mojo::ScopedMessagePipeHandle WebServiceWorkerResponse::CloneBlobPtr() const {
+ if (!private_->blob_data_handle)
+ return mojo::ScopedMessagePipeHandle();
+ return private_->blob_data_handle->CloneBlobPtr()
+ .PassInterface()
+ .PassHandle();
+}
+
void WebServiceWorkerResponse::SetError(WebServiceWorkerResponseError error) {
private_->error = error;
}
diff --git a/third_party/WebKit/Source/platform/mojo/FetchAPIRequestStructTraits.cpp b/third_party/WebKit/Source/platform/mojo/FetchAPIRequestStructTraits.cpp
index 4fee6c7d..aa67d0c 100644
--- a/third_party/WebKit/Source/platform/mojo/FetchAPIRequestStructTraits.cpp
+++ b/third_party/WebKit/Source/platform/mojo/FetchAPIRequestStructTraits.cpp
@@ -450,6 +450,20 @@
}
// static
+storage::mojom::blink::BlobPtr StructTraits<
+ blink::mojom::FetchAPIRequestDataView,
+ blink::WebServiceWorkerRequest>::blob(const blink::WebServiceWorkerRequest&
+ request) {
+ if (request.GetBlobDataHandle()) {
+ storage::mojom::blink::BlobPtr result =
+ request.GetBlobDataHandle()->CloneBlobPtr();
+ return result;
+ }
+
+ return nullptr;
+}
+
+// static
WTF::String StructTraits<blink::mojom::FetchAPIRequestDataView,
blink::WebServiceWorkerRequest>::
integrity(const blink::WebServiceWorkerRequest& request) {
@@ -475,6 +489,7 @@
WTF::String method;
WTF::HashMap<WTF::String, WTF::String> headers;
WTF::String blobUuid;
+ storage::mojom::blink::BlobPtr blob;
blink::Referrer referrer;
blink::WebURLRequest::FetchCredentialsMode credentialsMode;
blink::WebURLRequest::FetchRedirectMode redirectMode;
@@ -499,7 +514,8 @@
out->SetMethod(method);
for (const auto& pair : headers)
out->SetHeader(pair.key, pair.value);
- out->SetBlob(blobUuid, static_cast<long long>(data.blob_size()));
+ out->SetBlob(blobUuid, static_cast<long long>(data.blob_size()),
+ data.TakeBlob<storage::mojom::blink::BlobPtr>().PassInterface());
out->SetReferrer(referrer.referrer, static_cast<blink::WebReferrerPolicy>(
referrer.referrer_policy));
out->SetCredentialsMode(credentialsMode);
diff --git a/third_party/WebKit/Source/platform/mojo/FetchAPIRequestStructTraits.h b/third_party/WebKit/Source/platform/mojo/FetchAPIRequestStructTraits.h
index 1a683a9..a28b1e5c 100644
--- a/third_party/WebKit/Source/platform/mojo/FetchAPIRequestStructTraits.h
+++ b/third_party/WebKit/Source/platform/mojo/FetchAPIRequestStructTraits.h
@@ -104,6 +104,9 @@
static uint64_t blob_size(const blink::WebServiceWorkerRequest&);
+ static storage::mojom::blink::BlobPtr blob(
+ const blink::WebServiceWorkerRequest&);
+
static const blink::Referrer& referrer(const blink::WebServiceWorkerRequest&);
static blink::WebURLRequest::FetchCredentialsMode credentials_mode(
diff --git a/third_party/WebKit/public/BUILD.gn b/third_party/WebKit/public/BUILD.gn
index 6f00a75..273c677 100644
--- a/third_party/WebKit/public/BUILD.gn
+++ b/third_party/WebKit/public/BUILD.gn
@@ -754,6 +754,7 @@
"//device/bluetooth/public/interfaces",
"//device/screen_orientation/public/interfaces",
"//mojo/common:common_custom_types",
+ "//storage/public/interfaces",
"//ui/gfx/geometry/mojo",
"//url/mojo:url_mojom_gurl",
"//url/mojo:url_mojom_origin",
diff --git a/third_party/WebKit/public/platform/DEPS b/third_party/WebKit/public/platform/DEPS
index 8ae4b91..33ab0a6 100644
--- a/third_party/WebKit/public/platform/DEPS
+++ b/third_party/WebKit/public/platform/DEPS
@@ -25,6 +25,7 @@
"+public/platform",
"-public/web",
"+services/service_manager/public/interfaces",
+ "+storage/public/interfaces",
"+third_party/skia",
"+ui/gfx",
"+url",
diff --git a/third_party/WebKit/public/platform/modules/fetch/fetch_api_request.mojom b/third_party/WebKit/public/platform/modules/fetch/fetch_api_request.mojom
index 8101cf0..aa65290 100644
--- a/third_party/WebKit/public/platform/modules/fetch/fetch_api_request.mojom
+++ b/third_party/WebKit/public/platform/modules/fetch/fetch_api_request.mojom
@@ -5,6 +5,7 @@
module blink.mojom;
import "third_party/WebKit/public/platform/referrer.mojom";
+import "storage/public/interfaces/blobs.mojom";
import "url/mojo/url.mojom";
// The mode associated with a request.
@@ -111,6 +112,7 @@
map<string, string> headers;
string? blob_uuid;
uint64 blob_size;
+ storage.mojom.Blob? blob;
Referrer referrer;
FetchCredentialsMode credentials_mode;
FetchRedirectMode redirect_mode;
diff --git a/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerRequest.h b/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerRequest.h
index d862d3a..638f260 100644
--- a/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerRequest.h
+++ b/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerRequest.h
@@ -5,6 +5,7 @@
#ifndef WebServiceWorkerRequest_h
#define WebServiceWorkerRequest_h
+#include "mojo/public/cpp/system/message_pipe.h"
#include "public/platform/WebCommon.h"
#include "public/platform/WebPrivatePtr.h"
#include "public/platform/WebReferrerPolicy.h"
@@ -18,6 +19,7 @@
#include "platform/weborigin/Referrer.h"
#include "platform/wtf/Forward.h"
#include "platform/wtf/text/StringHash.h"
+#include "storage/public/interfaces/blobs.mojom-blink.h" // nogncheck
#endif
namespace blink {
@@ -56,7 +58,9 @@
void VisitHTTPHeaderFields(WebHTTPHeaderVisitor*) const;
- void SetBlob(const WebString& uuid, long long size);
+ void SetBlob(const WebString& uuid,
+ long long size,
+ mojo::ScopedMessagePipeHandle);
void SetReferrer(const WebString&, WebReferrerPolicy);
WebURL ReferrerUrl() const;
@@ -96,6 +100,9 @@
const HTTPHeaderMap& Headers() const;
PassRefPtr<BlobDataHandle> GetBlobDataHandle() const;
const Referrer& GetReferrer() const;
+ void SetBlob(const WebString& uuid,
+ long long size,
+ storage::mojom::blink::BlobPtrInfo);
#endif
private:
diff --git a/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponse.h b/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponse.h
index 33f5b31..298ae356 100644
--- a/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponse.h
+++ b/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponse.h
@@ -6,6 +6,7 @@
#define WebServiceWorkerResponse_h
#include "base/time/time.h"
+#include "mojo/public/cpp/system/message_pipe.h"
#include "public/platform/WebCommon.h"
#include "public/platform/WebPrivatePtr.h"
#include "public/platform/WebString.h"
@@ -67,10 +68,14 @@
WebString GetHeader(const WebString& key) const;
void VisitHTTPHeaderFields(WebHTTPHeaderVisitor*) const;
- void SetBlob(const WebString& uuid, uint64_t size);
+ void SetBlob(const WebString& uuid,
+ uint64_t size,
+ mojo::ScopedMessagePipeHandle);
WebString BlobUUID() const;
uint64_t BlobSize() const;
+ mojo::ScopedMessagePipeHandle CloneBlobPtr() const;
+
// Provides a more detailed error when status() is zero.
void SetError(WebServiceWorkerResponseError);
WebServiceWorkerResponseError GetError() const;