Commit 08ab4773 authored by Kenichi Ishibashi's avatar Kenichi Ishibashi Committed by Commit Bot

Stop using AppCacheResponseMetadataWriter from service workers

This CL removes AppCacheResponseMetadataWriter dependency from
ServiceWorkerResourceMetadataWriter by re-implementing the writer.
See [1] for the reasoning of the rewrite.

This CL should not have behavior changes, and existing tests cover
this change.

[1] https://docs.google.com/document/d/1UhdZnaeEP8GywZR0Gik6wF6jKmNY3je6aDhPfJ05YhU/edit?usp=sharing

Bug: 1117369
Change-Id: I47ce15de539eb23746f1154377f3d8650d951b7a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2440321
Commit-Queue: Victor Costan <pwnall@chromium.org>
Reviewed-by: default avatarMakoto Shimazu <shimazu@chromium.org>
Reviewed-by: default avatarVictor Costan <pwnall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#815776}
parent fa264619
...@@ -14,9 +14,4 @@ namespace content { ...@@ -14,9 +14,4 @@ namespace content {
ServiceWorkerDiskCache::ServiceWorkerDiskCache() ServiceWorkerDiskCache::ServiceWorkerDiskCache()
: AppCacheDiskCache(/*use_simple_cache=*/true) {} : AppCacheDiskCache(/*use_simple_cache=*/true) {}
ServiceWorkerResponseMetadataWriter::ServiceWorkerResponseMetadataWriter(
int64_t resource_id,
base::WeakPtr<AppCacheDiskCache> disk_cache)
: AppCacheResponseMetadataWriter(resource_id, std::move(disk_cache)) {}
} // namespace content } // namespace content
...@@ -5,13 +5,8 @@ ...@@ -5,13 +5,8 @@
#ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_DISK_CACHE_H_ #ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_DISK_CACHE_H_
#define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_DISK_CACHE_H_ #define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_DISK_CACHE_H_
#include <stdint.h>
#include "base/memory/weak_ptr.h"
#include "content/browser/appcache/appcache_disk_cache.h" #include "content/browser/appcache/appcache_disk_cache.h"
#include "content/browser/appcache/appcache_disk_cache_ops.h"
#include "content/common/content_export.h" #include "content/common/content_export.h"
#include "services/network/public/mojom/url_response_head.mojom.h"
namespace content { namespace content {
...@@ -26,19 +21,6 @@ class CONTENT_EXPORT ServiceWorkerDiskCache : public AppCacheDiskCache { ...@@ -26,19 +21,6 @@ class CONTENT_EXPORT ServiceWorkerDiskCache : public AppCacheDiskCache {
ServiceWorkerDiskCache(); ServiceWorkerDiskCache();
}; };
// TODO(crbug.com/1117369): Migrate to
// storage::mojom::ServiceWorkerResourceMetadataWriter.
class CONTENT_EXPORT ServiceWorkerResponseMetadataWriter
: public AppCacheResponseMetadataWriter {
protected:
// Should only be constructed by the storage class.
friend class ServiceWorkerStorage;
ServiceWorkerResponseMetadataWriter(
int64_t resource_id,
base::WeakPtr<AppCacheDiskCache> disk_cache);
};
} // namespace content } // namespace content
#endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_DISK_CACHE_H_ #endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_DISK_CACHE_H_
...@@ -13,16 +13,15 @@ namespace content { ...@@ -13,16 +13,15 @@ namespace content {
class BigIOBuffer; class BigIOBuffer;
// Manages a service worker disk cache entry. Creates and owns an entry. // Creates and owns a service worker disk cacke entry.
// TODO(bashi): Used by resource writers. Use in readers as well. class DiskEntryCreator {
class DiskEntryManager {
public: public:
DiskEntryManager(int64_t resource_id, DiskEntryCreator(int64_t resource_id,
base::WeakPtr<AppCacheDiskCache> disk_cache); base::WeakPtr<AppCacheDiskCache> disk_cache);
~DiskEntryManager(); ~DiskEntryCreator();
DiskEntryManager(const DiskEntryManager&) = delete; DiskEntryCreator(const DiskEntryCreator&) = delete;
DiskEntryManager& operator=(const DiskEntryManager&) = delete; DiskEntryCreator& operator=(const DiskEntryCreator&) = delete;
// Can be nullptr when a disk cache error occurs. // Can be nullptr when a disk cache error occurs.
AppCacheDiskCacheEntry* entry() { AppCacheDiskCacheEntry* entry() {
...@@ -58,14 +57,14 @@ class DiskEntryManager { ...@@ -58,14 +57,14 @@ class DiskEntryManager {
// TODO(crbug.com/586174): Refactor service worker's disk cache to use // TODO(crbug.com/586174): Refactor service worker's disk cache to use
// disk_cache::EntryResult to make these callbacks non-static. // disk_cache::EntryResult to make these callbacks non-static.
static void DidCreateEntryForFirstAttempt( static void DidCreateEntryForFirstAttempt(
base::WeakPtr<DiskEntryManager> entry_manager, base::WeakPtr<DiskEntryCreator> entry_creator,
AppCacheDiskCacheEntry** entry, AppCacheDiskCacheEntry** entry,
int rv); int rv);
static void DidDoomExistingEntry( static void DidDoomExistingEntry(
base::WeakPtr<DiskEntryManager> entry_manager, base::WeakPtr<DiskEntryCreator> entry_creator,
int rv); int rv);
static void DidCreateEntryForSecondAttempt( static void DidCreateEntryForSecondAttempt(
base::WeakPtr<DiskEntryManager> entry_manager, base::WeakPtr<DiskEntryCreator> entry_creator,
AppCacheDiskCacheEntry** entry, AppCacheDiskCacheEntry** entry,
int rv); int rv);
...@@ -80,7 +79,44 @@ class DiskEntryManager { ...@@ -80,7 +79,44 @@ class DiskEntryManager {
// Stored as a data member to handle //net-style maybe-async methods. // Stored as a data member to handle //net-style maybe-async methods.
base::OnceClosure ensure_entry_is_created_callback_; base::OnceClosure ensure_entry_is_created_callback_;
base::WeakPtrFactory<DiskEntryManager> weak_factory_{this}; base::WeakPtrFactory<DiskEntryCreator> weak_factory_{this};
};
// Opens and owns a service worker disk cache entry.
class DiskEntryOpener {
public:
DiskEntryOpener(int64_t resource_id,
base::WeakPtr<AppCacheDiskCache> disk_cache);
~DiskEntryOpener();
DiskEntryOpener(const DiskEntryOpener&) = delete;
DiskEntryOpener& operator=(const DiskEntryOpener&) = delete;
// Can be nullptr when a disk cache error occurs.
AppCacheDiskCacheEntry* entry() { return entry_; }
// Calls the callback when entry() is opened and can be used.
//
// If necessary, opens a disk cache entry for the `resource_id` passed to the
// constructor. After the callback is called, `entry()` can be safely called
// to obtain the created entry.
void EnsureEntryIsOpen(base::OnceClosure callback);
private:
// TODO(crbug.com/586174): Refactor service worker's disk cache to use
// disk_cache::EntryResult to make this callback non-static.
static void DidOpenEntry(base::WeakPtr<DiskEntryOpener> entry_creator,
AppCacheDiskCacheEntry** entry,
int rv);
const int64_t resource_id_;
base::WeakPtr<AppCacheDiskCache> disk_cache_;
AppCacheDiskCacheEntry* entry_ = nullptr;
// Stored as a data member to handle //net-style maybe-async methods.
base::OnceClosure ensure_entry_is_opened_callback_;
base::WeakPtrFactory<DiskEntryOpener> weak_factory_{this};
}; };
// The implementation of storage::mojom::ServiceWorkerResourceReader. // The implementation of storage::mojom::ServiceWorkerResourceReader.
...@@ -120,18 +156,7 @@ class ServiceWorkerResourceReaderImpl ...@@ -120,18 +156,7 @@ class ServiceWorkerResourceReaderImpl
// data. // data.
void DidReadDataComplete(); void DidReadDataComplete();
// Opens a disk cache entry associated with `resource_id_`, if it isn't DiskEntryOpener entry_opener_;
// opened yet.
void EnsureEntryIsOpen(base::OnceClosure callback);
static void DidOpenEntry(
base::WeakPtr<ServiceWorkerResourceReaderImpl> reader,
AppCacheDiskCacheEntry** entry,
int rv);
const int64_t resource_id_;
base::WeakPtr<AppCacheDiskCache> disk_cache_;
AppCacheDiskCacheEntry* entry_ = nullptr;
// Used to read metadata from disk cache. // Used to read metadata from disk cache.
scoped_refptr<BigIOBuffer> metadata_buffer_; scoped_refptr<BigIOBuffer> metadata_buffer_;
...@@ -145,10 +170,6 @@ class ServiceWorkerResourceReaderImpl ...@@ -145,10 +170,6 @@ class ServiceWorkerResourceReaderImpl
// Helper for ReadData(). // Helper for ReadData().
std::unique_ptr<DataReader> data_reader_; std::unique_ptr<DataReader> data_reader_;
// Holds the callback of EnsureEntryIsOpen(). Stored as a data member to
// handle //net-style maybe-async methods.
base::OnceClosure open_entry_callback_;
#if DCHECK_IS_ON() #if DCHECK_IS_ON()
enum class State { enum class State {
kIdle, kIdle,
...@@ -199,7 +220,7 @@ class ServiceWorkerResourceWriterImpl ...@@ -199,7 +220,7 @@ class ServiceWorkerResourceWriterImpl
size_t write_amount, size_t write_amount,
int rv); int rv);
DiskEntryManager entry_manager_; DiskEntryCreator entry_creator_;
// Points the current write position of WriteData(). // Points the current write position of WriteData().
size_t write_position_ = 0; size_t write_position_ = 0;
...@@ -223,15 +244,12 @@ class ServiceWorkerResourceWriterImpl ...@@ -223,15 +244,12 @@ class ServiceWorkerResourceWriterImpl
}; };
// The implementation of storage::mojom::ServiceWorkerResourceMetadataWriter. // The implementation of storage::mojom::ServiceWorkerResourceMetadataWriter.
// Currently this class is an adaptor that uses
// ServiceWorkerResponseMetadataWriter internally.
// TODO(crbug.com/1055677): Fork the implementation of
// ServiceWorkerResponseMetadataWriter and stop using it.
class ServiceWorkerResourceMetadataWriterImpl class ServiceWorkerResourceMetadataWriterImpl
: public storage::mojom::ServiceWorkerResourceMetadataWriter { : public storage::mojom::ServiceWorkerResourceMetadataWriter {
public: public:
explicit ServiceWorkerResourceMetadataWriterImpl( ServiceWorkerResourceMetadataWriterImpl(
std::unique_ptr<ServiceWorkerResponseMetadataWriter> writer); int64_t resource_id,
base::WeakPtr<AppCacheDiskCache> disk_cache);
ServiceWorkerResourceMetadataWriterImpl( ServiceWorkerResourceMetadataWriterImpl(
const ServiceWorkerResourceMetadataWriterImpl&) = delete; const ServiceWorkerResourceMetadataWriterImpl&) = delete;
...@@ -240,12 +258,34 @@ class ServiceWorkerResourceMetadataWriterImpl ...@@ -240,12 +258,34 @@ class ServiceWorkerResourceMetadataWriterImpl
~ServiceWorkerResourceMetadataWriterImpl() override; ~ServiceWorkerResourceMetadataWriterImpl() override;
private:
// storage::mojom::ServiceWorkerResourceMetadataWriter implementations: // storage::mojom::ServiceWorkerResourceMetadataWriter implementations:
void WriteMetadata(mojo_base::BigBuffer data, void WriteMetadata(mojo_base::BigBuffer data,
WriteMetadataCallback callback) override; WriteMetadataCallback callback) override;
const std::unique_ptr<ServiceWorkerResponseMetadataWriter> writer_; private:
// Called while executing WriteMetadata().
void ContinueWriteMetadata(mojo_base::BigBuffer data,
WriteMetadataCallback callback);
void DidWriteMetadata(scoped_refptr<net::IOBuffer> buffer,
size_t write_amount,
int rv);
DiskEntryOpener entry_opener_;
// Stored as a data member to handle //net-style maybe-async methods.
WriteMetadataCallback write_metadata_callback_;
#if DCHECK_IS_ON()
enum class State {
kIdle,
kWriteMetadataStarted,
kWriteMetadataHasEntry,
};
State state_ = State::kIdle;
#endif // DCHECK_IS_ON()
base::WeakPtrFactory<ServiceWorkerResourceMetadataWriterImpl> weak_factory_{
this};
}; };
} // namespace content } // namespace content
......
...@@ -598,10 +598,10 @@ ServiceWorkerStorage::CreateResourceWriter(int64_t resource_id) { ...@@ -598,10 +598,10 @@ ServiceWorkerStorage::CreateResourceWriter(int64_t resource_id) {
resource_id, disk_cache()->GetWeakPtr()); resource_id, disk_cache()->GetWeakPtr());
} }
std::unique_ptr<ServiceWorkerResponseMetadataWriter> std::unique_ptr<ServiceWorkerResourceMetadataWriterImpl>
ServiceWorkerStorage::CreateResponseMetadataWriter(int64_t resource_id) { ServiceWorkerStorage::CreateResourceMetadataWriter(int64_t resource_id) {
return base::WrapUnique(new ServiceWorkerResponseMetadataWriter( return std::make_unique<ServiceWorkerResourceMetadataWriterImpl>(
resource_id, disk_cache()->GetWeakPtr())); resource_id, disk_cache()->GetWeakPtr());
} }
void ServiceWorkerStorage::StoreUncommittedResourceId( void ServiceWorkerStorage::StoreUncommittedResourceId(
......
...@@ -38,8 +38,6 @@ class QuotaManagerProxy; ...@@ -38,8 +38,6 @@ class QuotaManagerProxy;
namespace content { namespace content {
class ServiceWorkerDiskCache;
class ServiceWorkerResponseMetadataWriter;
class ServiceWorkerStorageControlImplTest; class ServiceWorkerStorageControlImplTest;
namespace service_worker_storage_unittest { namespace service_worker_storage_unittest {
...@@ -188,8 +186,8 @@ class CONTENT_EXPORT ServiceWorkerStorage { ...@@ -188,8 +186,8 @@ class CONTENT_EXPORT ServiceWorkerStorage {
int64_t resource_id); int64_t resource_id);
std::unique_ptr<ServiceWorkerResourceWriterImpl> CreateResourceWriter( std::unique_ptr<ServiceWorkerResourceWriterImpl> CreateResourceWriter(
int64_t resource_id); int64_t resource_id);
std::unique_ptr<ServiceWorkerResponseMetadataWriter> std::unique_ptr<ServiceWorkerResourceMetadataWriterImpl>
CreateResponseMetadataWriter(int64_t resource_id); CreateResourceMetadataWriter(int64_t resource_id);
// Adds |resource_id| to the set of resources that are in the disk cache // Adds |resource_id| to the set of resources that are in the disk cache
// but not yet stored with a registration. // but not yet stored with a registration.
......
...@@ -272,9 +272,7 @@ void ServiceWorkerStorageControlImpl::CreateResourceMetadataWriter( ...@@ -272,9 +272,7 @@ void ServiceWorkerStorageControlImpl::CreateResourceMetadataWriter(
writer) { writer) {
DCHECK_NE(resource_id, blink::mojom::kInvalidServiceWorkerResourceId); DCHECK_NE(resource_id, blink::mojom::kInvalidServiceWorkerResourceId);
mojo::MakeSelfOwnedReceiver( mojo::MakeSelfOwnedReceiver(
std::make_unique<ServiceWorkerResourceMetadataWriterImpl>( storage_->CreateResourceMetadataWriter(resource_id), std::move(writer));
storage_->CreateResponseMetadataWriter(resource_id)),
std::move(writer));
} }
void ServiceWorkerStorageControlImpl::StoreUncommittedResourceId( void ServiceWorkerStorageControlImpl::StoreUncommittedResourceId(
......
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