Commit 6eb9ec51 authored by Miyoung Shin's avatar Miyoung Shin Committed by Commit Bot

Convert ServiceWorkerStreamCallback to new Mojo types

This CL converts ServiceWorkerStreamCallback{Ptr, Request} in
content and blink to the new Mojo types, and uses
pending_receiver<ServiceWorkerStreamCallback> in
service_worker_stream_handle.mojom.

Bug: 955171, 978694
Change-Id: I0eb07b02a08965124864022c2e1a9403efa9b0d9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1767470
Commit-Queue: Miyoung Shin <myid.shin@igalia.com>
Reviewed-by: default avatarMatt Falkenhagen <falken@chromium.org>
Reviewed-by: default avatarKen Rockot <rockot@google.com>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#690298}
parent d426cd43
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#include "content/common/service_worker/service_worker_loader_helpers.h" #include "content/common/service_worker/service_worker_loader_helpers.h"
#include "content/common/service_worker/service_worker_utils.h" #include "content/common/service_worker/service_worker_utils.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "services/network/public/cpp/features.h" #include "services/network/public/cpp/features.h"
#include "services/network/public/mojom/fetch_api.mojom.h" #include "services/network/public/mojom/fetch_api.mojom.h"
...@@ -50,12 +52,11 @@ std::string ComposeFetchEventResultString( ...@@ -50,12 +52,11 @@ std::string ComposeFetchEventResultString(
class ServiceWorkerNavigationLoader::StreamWaiter class ServiceWorkerNavigationLoader::StreamWaiter
: public blink::mojom::ServiceWorkerStreamCallback { : public blink::mojom::ServiceWorkerStreamCallback {
public: public:
StreamWaiter( StreamWaiter(ServiceWorkerNavigationLoader* owner,
ServiceWorkerNavigationLoader* owner, mojo::PendingReceiver<blink::mojom::ServiceWorkerStreamCallback>
blink::mojom::ServiceWorkerStreamCallbackRequest callback_request) callback_receiver)
: owner_(owner), : owner_(owner), receiver_(this, std::move(callback_receiver)) {
binding_(this, std::move(callback_request)) { receiver_.set_disconnect_handler(
binding_.set_connection_error_handler(
base::BindOnce(&StreamWaiter::OnAborted, base::Unretained(this))); base::BindOnce(&StreamWaiter::OnAborted, base::Unretained(this)));
} }
...@@ -71,7 +72,7 @@ class ServiceWorkerNavigationLoader::StreamWaiter ...@@ -71,7 +72,7 @@ class ServiceWorkerNavigationLoader::StreamWaiter
private: private:
ServiceWorkerNavigationLoader* owner_; ServiceWorkerNavigationLoader* owner_;
mojo::Binding<blink::mojom::ServiceWorkerStreamCallback> binding_; mojo::Receiver<blink::mojom::ServiceWorkerStreamCallback> receiver_;
DISALLOW_COPY_AND_ASSIGN(StreamWaiter); DISALLOW_COPY_AND_ASSIGN(StreamWaiter);
}; };
...@@ -377,7 +378,7 @@ void ServiceWorkerNavigationLoader::StartResponse( ...@@ -377,7 +378,7 @@ void ServiceWorkerNavigationLoader::StartResponse(
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
"result", "stream response"); "result", "stream response");
stream_waiter_ = std::make_unique<StreamWaiter>( stream_waiter_ = std::make_unique<StreamWaiter>(
this, std::move(body_as_stream->callback_request)); this, std::move(body_as_stream->callback_receiver));
CommitResponseBody(std::move(body_as_stream->stream)); CommitResponseBody(std::move(body_as_stream->stream));
// StreamWaiter will call CommitCompleted() when done. // StreamWaiter will call CommitCompleted() when done.
return; return;
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#include "content/browser/service_worker/embedded_worker_status.h" #include "content/browser/service_worker/embedded_worker_status.h"
#include "content/browser/service_worker/service_worker_fetch_dispatcher.h" #include "content/browser/service_worker/service_worker_fetch_dispatcher.h"
#include "content/browser/url_loader_factory_getter.h" #include "content/browser/url_loader_factory_getter.h"
#include "mojo/public/cpp/bindings/strong_binding.h" #include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/cpp/system/data_pipe.h" #include "mojo/public/cpp/system/data_pipe.h"
#include "services/network/public/mojom/url_loader.mojom.h" #include "services/network/public/mojom/url_loader.mojom.h"
#include "third_party/blink/public/common/service_worker/service_worker_status_code.h" #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "content/common/service_worker/service_worker_utils.h" #include "content/common/service_worker/service_worker_utils.h"
#include "content/public/test/browser_task_environment.h" #include "content/public/test/browser_task_environment.h"
#include "content/public/test/mock_render_process_host.h" #include "content/public/test/mock_render_process_host.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/system/data_pipe_utils.h" #include "mojo/public/cpp/system/data_pipe_utils.h"
...@@ -102,11 +103,12 @@ class FetchEventServiceWorker : public FakeServiceWorker { ...@@ -102,11 +103,12 @@ class FetchEventServiceWorker : public FakeServiceWorker {
// Tells this worker to respond to fetch events with the specified stream. // Tells this worker to respond to fetch events with the specified stream.
void RespondWithStream( void RespondWithStream(
blink::mojom::ServiceWorkerStreamCallbackRequest callback_request, mojo::PendingReceiver<blink::mojom::ServiceWorkerStreamCallback>
callback_receiver,
mojo::ScopedDataPipeConsumerHandle consumer_handle) { mojo::ScopedDataPipeConsumerHandle consumer_handle) {
response_mode_ = ResponseMode::kStream; response_mode_ = ResponseMode::kStream;
stream_handle_ = blink::mojom::ServiceWorkerStreamHandle::New(); stream_handle_ = blink::mojom::ServiceWorkerStreamHandle::New();
stream_handle_->callback_request = std::move(callback_request); stream_handle_->callback_receiver = std::move(callback_receiver);
stream_handle_->stream = std::move(consumer_handle); stream_handle_->stream = std::move(consumer_handle);
} }
...@@ -640,10 +642,11 @@ TEST_F(ServiceWorkerNavigationLoaderTest, StreamResponse) { ...@@ -640,10 +642,11 @@ TEST_F(ServiceWorkerNavigationLoaderTest, StreamResponse) {
// Construct the Stream to respond with. // Construct the Stream to respond with.
const char kResponseBody[] = "Here is sample text for the Stream."; const char kResponseBody[] = "Here is sample text for the Stream.";
blink::mojom::ServiceWorkerStreamCallbackPtr stream_callback; mojo::Remote<blink::mojom::ServiceWorkerStreamCallback> stream_callback;
mojo::DataPipe data_pipe; mojo::DataPipe data_pipe;
service_worker_->RespondWithStream(mojo::MakeRequest(&stream_callback), service_worker_->RespondWithStream(
std::move(data_pipe.consumer_handle)); stream_callback.BindNewPipeAndPassReceiver(),
std::move(data_pipe.consumer_handle));
// Perform the request. // Perform the request.
StartRequest(CreateRequest()); StartRequest(CreateRequest());
...@@ -687,10 +690,11 @@ TEST_F(ServiceWorkerNavigationLoaderTest, StreamResponse_Abort) { ...@@ -687,10 +690,11 @@ TEST_F(ServiceWorkerNavigationLoaderTest, StreamResponse_Abort) {
// Construct the Stream to respond with. // Construct the Stream to respond with.
const char kResponseBody[] = "Here is sample text for the Stream."; const char kResponseBody[] = "Here is sample text for the Stream.";
blink::mojom::ServiceWorkerStreamCallbackPtr stream_callback; mojo::Remote<blink::mojom::ServiceWorkerStreamCallback> stream_callback;
mojo::DataPipe data_pipe; mojo::DataPipe data_pipe;
service_worker_->RespondWithStream(mojo::MakeRequest(&stream_callback), service_worker_->RespondWithStream(
std::move(data_pipe.consumer_handle)); stream_callback.BindNewPipeAndPassReceiver(),
std::move(data_pipe.consumer_handle));
// Perform the request. // Perform the request.
StartRequest(CreateRequest()); StartRequest(CreateRequest());
...@@ -736,10 +740,11 @@ TEST_F(ServiceWorkerNavigationLoaderTest, StreamResponseAndCancel) { ...@@ -736,10 +740,11 @@ TEST_F(ServiceWorkerNavigationLoaderTest, StreamResponseAndCancel) {
// Construct the Stream to respond with. // Construct the Stream to respond with.
const char kResponseBody[] = "Here is sample text for the Stream."; const char kResponseBody[] = "Here is sample text for the Stream.";
blink::mojom::ServiceWorkerStreamCallbackPtr stream_callback; mojo::Remote<blink::mojom::ServiceWorkerStreamCallback> stream_callback;
mojo::DataPipe data_pipe; mojo::DataPipe data_pipe;
service_worker_->RespondWithStream(mojo::MakeRequest(&stream_callback), service_worker_->RespondWithStream(
std::move(data_pipe.consumer_handle)); stream_callback.BindNewPipeAndPassReceiver(),
std::move(data_pipe.consumer_handle));
// Perform the request. // Perform the request.
StartRequest(CreateRequest()); StartRequest(CreateRequest());
......
...@@ -22,7 +22,9 @@ ...@@ -22,7 +22,9 @@
#include "content/renderer/renderer_blink_platform_impl.h" #include "content/renderer/renderer_blink_platform_impl.h"
#include "content/renderer/service_worker/controller_service_worker_connector.h" #include "content/renderer/service_worker/controller_service_worker_connector.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/strong_binding.h" #include "mojo/public/cpp/bindings/strong_binding.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
#include "net/url_request/redirect_util.h" #include "net/url_request/redirect_util.h"
...@@ -129,11 +131,12 @@ class HeaderRewritingURLLoaderClient : public network::mojom::URLLoaderClient { ...@@ -129,11 +131,12 @@ class HeaderRewritingURLLoaderClient : public network::mojom::URLLoaderClient {
class ServiceWorkerSubresourceLoader::StreamWaiter class ServiceWorkerSubresourceLoader::StreamWaiter
: public blink::mojom::ServiceWorkerStreamCallback { : public blink::mojom::ServiceWorkerStreamCallback {
public: public:
StreamWaiter(ServiceWorkerSubresourceLoader* owner, StreamWaiter(
blink::mojom::ServiceWorkerStreamCallbackRequest request) ServiceWorkerSubresourceLoader* owner,
: owner_(owner), binding_(this, std::move(request)) { mojo::PendingReceiver<blink::mojom::ServiceWorkerStreamCallback> receiver)
: owner_(owner), receiver_(this, std::move(receiver)) {
DCHECK(owner_); DCHECK(owner_);
binding_.set_connection_error_handler( receiver_.set_disconnect_handler(
base::BindOnce(&StreamWaiter::OnAborted, base::Unretained(this))); base::BindOnce(&StreamWaiter::OnAborted, base::Unretained(this)));
} }
...@@ -143,7 +146,7 @@ class ServiceWorkerSubresourceLoader::StreamWaiter ...@@ -143,7 +146,7 @@ class ServiceWorkerSubresourceLoader::StreamWaiter
private: private:
ServiceWorkerSubresourceLoader* owner_; ServiceWorkerSubresourceLoader* owner_;
mojo::Binding<blink::mojom::ServiceWorkerStreamCallback> binding_; mojo::Receiver<blink::mojom::ServiceWorkerStreamCallback> receiver_;
DISALLOW_COPY_AND_ASSIGN(StreamWaiter); DISALLOW_COPY_AND_ASSIGN(StreamWaiter);
}; };
...@@ -483,7 +486,7 @@ void ServiceWorkerSubresourceLoader::StartResponse( ...@@ -483,7 +486,7 @@ void ServiceWorkerSubresourceLoader::StartResponse(
DCHECK(!response->blob); DCHECK(!response->blob);
DCHECK(url_loader_client_.is_bound()); DCHECK(url_loader_client_.is_bound());
stream_waiter_ = std::make_unique<StreamWaiter>( stream_waiter_ = std::make_unique<StreamWaiter>(
this, std::move(body_as_stream->callback_request)); this, std::move(body_as_stream->callback_receiver));
CommitResponseBody(std::move(body_as_stream->stream)); CommitResponseBody(std::move(body_as_stream->stream));
return; return;
} }
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/bindings/strong_binding.h" #include "mojo/public/cpp/bindings/strong_binding.h"
#include "mojo/public/cpp/system/data_pipe_utils.h" #include "mojo/public/cpp/system/data_pipe_utils.h"
#include "net/http/http_util.h" #include "net/http/http_util.h"
...@@ -141,11 +142,12 @@ class FakeControllerServiceWorker ...@@ -141,11 +142,12 @@ class FakeControllerServiceWorker
// Tells this controller to respond to fetch events with the specified stream. // Tells this controller to respond to fetch events with the specified stream.
void RespondWithStream( void RespondWithStream(
blink::mojom::ServiceWorkerStreamCallbackRequest callback_request, mojo::PendingReceiver<blink::mojom::ServiceWorkerStreamCallback>
callback_receiver,
mojo::ScopedDataPipeConsumerHandle consumer_handle) { mojo::ScopedDataPipeConsumerHandle consumer_handle) {
response_mode_ = ResponseMode::kStream; response_mode_ = ResponseMode::kStream;
stream_handle_ = blink::mojom::ServiceWorkerStreamHandle::New(); stream_handle_ = blink::mojom::ServiceWorkerStreamHandle::New();
stream_handle_->callback_request = std::move(callback_request); stream_handle_->callback_receiver = std::move(callback_receiver);
stream_handle_->stream = std::move(consumer_handle); stream_handle_->stream = std::move(consumer_handle);
} }
...@@ -864,10 +866,11 @@ TEST_F(ServiceWorkerSubresourceLoaderTest, StreamResponse) { ...@@ -864,10 +866,11 @@ TEST_F(ServiceWorkerSubresourceLoaderTest, StreamResponse) {
// Construct the Stream to respond with. // Construct the Stream to respond with.
const char kResponseBody[] = "Here is sample text for the Stream."; const char kResponseBody[] = "Here is sample text for the Stream.";
blink::mojom::ServiceWorkerStreamCallbackPtr stream_callback; mojo::Remote<blink::mojom::ServiceWorkerStreamCallback> stream_callback;
mojo::DataPipe data_pipe; mojo::DataPipe data_pipe;
fake_controller_.RespondWithStream(mojo::MakeRequest(&stream_callback), fake_controller_.RespondWithStream(
std::move(data_pipe.consumer_handle)); stream_callback.BindNewPipeAndPassReceiver(),
std::move(data_pipe.consumer_handle));
fake_controller_.SetResponseSource( fake_controller_.SetResponseSource(
network::mojom::FetchResponseSource::kNetwork); network::mojom::FetchResponseSource::kNetwork);
...@@ -924,10 +927,11 @@ TEST_F(ServiceWorkerSubresourceLoaderTest, StreamResponse_Abort) { ...@@ -924,10 +927,11 @@ TEST_F(ServiceWorkerSubresourceLoaderTest, StreamResponse_Abort) {
// Construct the Stream to respond with. // Construct the Stream to respond with.
const char kResponseBody[] = "Here is sample text for the Stream."; const char kResponseBody[] = "Here is sample text for the Stream.";
blink::mojom::ServiceWorkerStreamCallbackPtr stream_callback; mojo::Remote<blink::mojom::ServiceWorkerStreamCallback> stream_callback;
mojo::DataPipe data_pipe; mojo::DataPipe data_pipe;
fake_controller_.RespondWithStream(mojo::MakeRequest(&stream_callback), fake_controller_.RespondWithStream(
std::move(data_pipe.consumer_handle)); stream_callback.BindNewPipeAndPassReceiver(),
std::move(data_pipe.consumer_handle));
network::mojom::URLLoaderFactoryPtr factory = network::mojom::URLLoaderFactoryPtr factory =
CreateSubresourceLoaderFactory(); CreateSubresourceLoaderFactory();
...@@ -1228,10 +1232,11 @@ TEST_F(ServiceWorkerSubresourceLoaderTest, RedirectResponse) { ...@@ -1228,10 +1232,11 @@ TEST_F(ServiceWorkerSubresourceLoaderTest, RedirectResponse) {
// Give the final response. // Give the final response.
const char kResponseBody[] = "Here is sample text for the Stream."; const char kResponseBody[] = "Here is sample text for the Stream.";
blink::mojom::ServiceWorkerStreamCallbackPtr stream_callback; mojo::Remote<blink::mojom::ServiceWorkerStreamCallback> stream_callback;
mojo::DataPipe data_pipe; mojo::DataPipe data_pipe;
fake_controller_.RespondWithStream(mojo::MakeRequest(&stream_callback), fake_controller_.RespondWithStream(
std::move(data_pipe.consumer_handle)); stream_callback.BindNewPipeAndPassReceiver(),
std::move(data_pipe.consumer_handle));
loader->FollowRedirect({}, {}, base::nullopt); loader->FollowRedirect({}, {}, base::nullopt);
client->RunUntilResponseReceived(); client->RunUntilResponseReceived();
......
...@@ -13,5 +13,5 @@ interface ServiceWorkerStreamCallback { ...@@ -13,5 +13,5 @@ interface ServiceWorkerStreamCallback {
struct ServiceWorkerStreamHandle { struct ServiceWorkerStreamHandle {
handle<data_pipe_consumer> stream; handle<data_pipe_consumer> stream;
ServiceWorkerStreamCallback& callback_request; pending_receiver<ServiceWorkerStreamCallback> callback_receiver;
}; };
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#include "base/feature_list.h" #include "base/feature_list.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/network/public/mojom/fetch_api.mojom-blink.h" #include "services/network/public/mojom/fetch_api.mojom-blink.h"
#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h" #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h"
#include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-blink.h" #include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-blink.h"
...@@ -120,7 +122,7 @@ bool IsClientRequest(network::mojom::RequestContextFrameType frame_type, ...@@ -120,7 +122,7 @@ bool IsClientRequest(network::mojom::RequestContextFrameType frame_type,
request_context == mojom::RequestContextType::WORKER; request_context == mojom::RequestContextType::WORKER;
} }
// Notifies the result of FetchDataLoader to |callback_ptr_|, the other endpoint // Notifies the result of FetchDataLoader to |callback_|, the other endpoint
// for which is passed to the browser process via // for which is passed to the browser process via
// blink.mojom.ServiceWorkerFetchResponseCallback.OnResponseStream(). // blink.mojom.ServiceWorkerFetchResponseCallback.OnResponseStream().
class FetchLoaderClient final class FetchLoaderClient final
...@@ -132,10 +134,10 @@ class FetchLoaderClient final ...@@ -132,10 +134,10 @@ class FetchLoaderClient final
FetchLoaderClient( FetchLoaderClient(
std::unique_ptr<ServiceWorkerTimeoutTimer::StayAwakeToken> token) std::unique_ptr<ServiceWorkerTimeoutTimer::StayAwakeToken> token)
: token_(std::move(token)) { : token_(std::move(token)) {
// We need to make |callback_ptr_| callable in the first place because some // We need to make |callback_| callable in the first place because some
// DidFetchDataLoadXXX() accessing it may be called synchronously from // DidFetchDataLoadXXX() accessing it may be called synchronously from
// StartLoading(). // StartLoading().
callback_request_ = mojo::MakeRequest(&callback_ptr_); callback_receiver_ = callback_.BindNewPipeAndPassReceiver();
} }
void DidFetchDataStartedDataPipe( void DidFetchDataStartedDataPipe(
...@@ -145,18 +147,18 @@ class FetchLoaderClient final ...@@ -145,18 +147,18 @@ class FetchLoaderClient final
body_stream_ = std::move(pipe); body_stream_ = std::move(pipe);
} }
void DidFetchDataLoadedDataPipe() override { void DidFetchDataLoadedDataPipe() override {
callback_ptr_->OnCompleted(); callback_->OnCompleted();
token_.reset(); token_.reset();
} }
void DidFetchDataLoadFailed() override { void DidFetchDataLoadFailed() override {
callback_ptr_->OnAborted(); callback_->OnAborted();
token_.reset(); token_.reset();
} }
void Abort() override { void Abort() override {
// A fetch() aborted via AbortSignal in the ServiceWorker will just look // A fetch() aborted via AbortSignal in the ServiceWorker will just look
// like an ordinary failure to the page. // like an ordinary failure to the page.
// TODO(ricea): Should a fetch() on the page get an AbortError instead? // TODO(ricea): Should a fetch() on the page get an AbortError instead?
callback_ptr_->OnAborted(); callback_->OnAborted();
token_.reset(); token_.reset();
} }
...@@ -164,7 +166,7 @@ class FetchLoaderClient final ...@@ -164,7 +166,7 @@ class FetchLoaderClient final
if (!body_stream_.is_valid()) if (!body_stream_.is_valid())
return nullptr; return nullptr;
return mojom::blink::ServiceWorkerStreamHandle::New( return mojom::blink::ServiceWorkerStreamHandle::New(
std::move(body_stream_), std::move(callback_request_)); std::move(body_stream_), std::move(callback_receiver_));
} }
void Trace(blink::Visitor* visitor) override { void Trace(blink::Visitor* visitor) override {
...@@ -173,9 +175,10 @@ class FetchLoaderClient final ...@@ -173,9 +175,10 @@ class FetchLoaderClient final
private: private:
mojo::ScopedDataPipeConsumerHandle body_stream_; mojo::ScopedDataPipeConsumerHandle body_stream_;
mojom::blink::ServiceWorkerStreamCallbackRequest callback_request_; mojo::PendingReceiver<mojom::blink::ServiceWorkerStreamCallback>
callback_receiver_;
mojom::blink::ServiceWorkerStreamCallbackPtr callback_ptr_; mojo::Remote<mojom::blink::ServiceWorkerStreamCallback> callback_;
std::unique_ptr<ServiceWorkerTimeoutTimer::StayAwakeToken> token_; std::unique_ptr<ServiceWorkerTimeoutTimer::StayAwakeToken> token_;
DISALLOW_COPY_AND_ASSIGN(FetchLoaderClient); DISALLOW_COPY_AND_ASSIGN(FetchLoaderClient);
......
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