Commit bf48a10e authored by Yuta Kasai's avatar Yuta Kasai Committed by Commit Bot

Service Worker: Prepare for connecting Mojo for FetchEventWorkerTiming in worker

This patch is a part of FetchEvent WorkerTiming patches. This feature enables a
service worker to attach PerformanceMark/PerformanceMeasure timings to a
request during the fetch event handler. The timings will then be exposed to the
page using blink::PerformanceResourceTiming.

This patch prepares for passing a Mojo pending receiver for
WorkerTimingContainer to blink::PerformanceResourceTiming. In order to identify
a Mojo receiver corresponding to a FetchEvent, WebWorkerFetchContextImpl has
a map from |request_id| to a pending receiver. This patch adds a method to take
a Mojo pending receiver from content::WebWorkerFetchContextImpl. It's used to
pass Mojo pending receivers to blink::PerformanceResourceTiming in later
patches.

Explainer : https://github.com/wanderview/fetchevent-worker-timing/blob/master/explainer.md
Design doc: https://docs.google.com/document/d/1-ebnv7OFiVd3k2-jbtQGO5s3BKHIp7lRx3ujhgNKvB0

Bug: 900700
Change-Id: I3d1119362b2eabbce4df1d709f392a87ba42cc18
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1924343
Commit-Queue: Yuta Kasai <yutakasai@google.com>
Reviewed-by: default avatarHiroki Nakagawa <nhiroki@chromium.org>
Reviewed-by: default avatarMatt Falkenhagen <falken@chromium.org>
Reviewed-by: default avatarMakoto Shimazu <shimazu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#719077}
parent 1a1dbcfa
...@@ -524,6 +524,17 @@ WebWorkerFetchContextImpl::CreateWebSocketHandshakeThrottle( ...@@ -524,6 +524,17 @@ WebWorkerFetchContextImpl::CreateWebSocketHandshakeThrottle(
ancestor_frame_id_, std::move(task_runner)); ancestor_frame_id_, std::move(task_runner));
} }
mojo::ScopedMessagePipeHandle
WebWorkerFetchContextImpl::TakePendingWorkerTimingReceiver(int request_id) {
auto iter = worker_timing_container_receivers_.find(request_id);
if (iter == worker_timing_container_receivers_.end()) {
return {};
}
auto receiver = std::move(iter->second);
worker_timing_container_receivers_.erase(iter);
return receiver.PassPipe();
}
void WebWorkerFetchContextImpl::set_controller_service_worker_mode( void WebWorkerFetchContextImpl::set_controller_service_worker_mode(
blink::mojom::ControllerServiceWorkerMode mode) { blink::mojom::ControllerServiceWorkerMode mode) {
controller_service_worker_mode_ = mode; controller_service_worker_mode_ = mode;
...@@ -633,9 +644,6 @@ void WebWorkerFetchContextImpl::ResetServiceWorkerURLLoaderFactory() { ...@@ -633,9 +644,6 @@ void WebWorkerFetchContextImpl::ResetServiceWorkerURLLoaderFactory() {
base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN});
auto current_task_runner = auto current_task_runner =
base::CreateSequencedTaskRunner({base::CurrentThread()}); base::CreateSequencedTaskRunner({base::CurrentThread()});
// TODO(https://crbug.com/900700): Pass RepeatingCallback to store
// WorkerTimingContainer pending receiver and request_id from
// ServiceWorkerSubresourceLoaderFactory.
task_runner->PostTask( task_runner->PostTask(
FROM_HERE, FROM_HERE,
base::BindOnce( base::BindOnce(
...@@ -643,7 +651,10 @@ void WebWorkerFetchContextImpl::ResetServiceWorkerURLLoaderFactory() { ...@@ -643,7 +651,10 @@ void WebWorkerFetchContextImpl::ResetServiceWorkerURLLoaderFactory() {
std::move(service_worker_container_host), client_id_, std::move(service_worker_container_host), client_id_,
fallback_factory_->Clone(), fallback_factory_->Clone(),
service_worker_url_loader_factory.InitWithNewPipeAndPassReceiver(), service_worker_url_loader_factory.InitWithNewPipeAndPassReceiver(),
task_runner, std::move(current_task_runner), base::DoNothing())); task_runner, std::move(current_task_runner),
base::BindRepeating(
&WebWorkerFetchContextImpl::AddPendingWorkerTimingReceiver,
weak_factory_.GetWeakPtr())));
web_loader_factory_->SetServiceWorkerURLLoaderFactory( web_loader_factory_->SetServiceWorkerURLLoaderFactory(
std::move(service_worker_url_loader_factory)); std::move(service_worker_url_loader_factory));
} }
...@@ -678,4 +689,13 @@ blink::WebString WebWorkerFetchContextImpl::GetAcceptLanguages() const { ...@@ -678,4 +689,13 @@ blink::WebString WebWorkerFetchContextImpl::GetAcceptLanguages() const {
return blink::WebString::FromUTF8(renderer_preferences_.accept_languages); return blink::WebString::FromUTF8(renderer_preferences_.accept_languages);
} }
void WebWorkerFetchContextImpl::AddPendingWorkerTimingReceiver(
int request_id,
mojo::PendingReceiver<blink::mojom::WorkerTimingContainer> receiver) {
// TODO(https://crbug.com/900700): Handle redirects properly. Currently on
// redirect, the receiver is replaced with a new one, discarding the timings
// before the redirect.
worker_timing_container_receivers_[request_id] = std::move(receiver);
}
} // namespace content } // namespace content
...@@ -127,6 +127,8 @@ class CONTENT_EXPORT WebWorkerFetchContextImpl ...@@ -127,6 +127,8 @@ class CONTENT_EXPORT WebWorkerFetchContextImpl
std::unique_ptr<blink::WebSocketHandshakeThrottle> std::unique_ptr<blink::WebSocketHandshakeThrottle>
CreateWebSocketHandshakeThrottle( CreateWebSocketHandshakeThrottle(
scoped_refptr<base::SingleThreadTaskRunner> task_runner) override; scoped_refptr<base::SingleThreadTaskRunner> task_runner) override;
mojo::ScopedMessagePipeHandle TakePendingWorkerTimingReceiver(
int request_id) override;
// blink::mojom::ServiceWorkerWorkerClient implementation: // blink::mojom::ServiceWorkerWorkerClient implementation:
void OnControllerChanged(blink::mojom::ControllerServiceWorkerMode) override; void OnControllerChanged(blink::mojom::ControllerServiceWorkerMode) override;
...@@ -172,8 +174,18 @@ class CONTENT_EXPORT WebWorkerFetchContextImpl ...@@ -172,8 +174,18 @@ class CONTENT_EXPORT WebWorkerFetchContextImpl
blink::WebString GetAcceptLanguages() const override; blink::WebString GetAcceptLanguages() const override;
// Sets up |receiver| to receive resource performance timings for the given
// |request_id|. This receiver will be taken later by
// TakePendingWorkerTimingReceiver().
void AddPendingWorkerTimingReceiver(
int request_id,
mojo::PendingReceiver<blink::mojom::WorkerTimingContainer> receiver);
private: private:
class Factory; class Factory;
using WorkerTimingContainerReceiverMap =
std::map<int /* request_id */,
mojo::PendingReceiver<blink::mojom::WorkerTimingContainer>>;
// - |service_worker_client_receiver| receives OnControllerChanged() // - |service_worker_client_receiver| receives OnControllerChanged()
// notifications. // notifications.
...@@ -346,6 +358,13 @@ class CONTENT_EXPORT WebWorkerFetchContextImpl ...@@ -346,6 +358,13 @@ class CONTENT_EXPORT WebWorkerFetchContextImpl
std::unique_ptr<NavigationResponseOverrideParameters> response_override_; std::unique_ptr<NavigationResponseOverrideParameters> response_override_;
blink::AcceptLanguagesWatcher* accept_languages_watcher_ = nullptr; blink::AcceptLanguagesWatcher* accept_languages_watcher_ = nullptr;
// Contains pending receivers whose corresponding requests are still
// in-flight. The pending receivers are taken by
// TakePendingWorkerTimingReceiver() when the request is completed.
WorkerTimingContainerReceiverMap worker_timing_container_receivers_;
base::WeakPtrFactory<WebWorkerFetchContextImpl> weak_factory_{this};
}; };
} // namespace content } // namespace content
......
...@@ -191,4 +191,11 @@ blink::WebString ServiceWorkerFetchContextImpl::GetAcceptLanguages() const { ...@@ -191,4 +191,11 @@ blink::WebString ServiceWorkerFetchContextImpl::GetAcceptLanguages() const {
return blink::WebString::FromUTF8(renderer_preferences_.accept_languages); return blink::WebString::FromUTF8(renderer_preferences_.accept_languages);
} }
mojo::ScopedMessagePipeHandle
ServiceWorkerFetchContextImpl::TakePendingWorkerTimingReceiver(int request_id) {
// No receiver exists because requests from service workers are never handled
// by a service worker.
return {};
}
} // namespace content } // namespace content
...@@ -70,6 +70,8 @@ class CONTENT_EXPORT ServiceWorkerFetchContextImpl final ...@@ -70,6 +70,8 @@ class CONTENT_EXPORT ServiceWorkerFetchContextImpl final
CreateWebSocketHandshakeThrottle( CreateWebSocketHandshakeThrottle(
scoped_refptr<base::SingleThreadTaskRunner> task_runner) override; scoped_refptr<base::SingleThreadTaskRunner> task_runner) override;
blink::WebString GetAcceptLanguages() const override; blink::WebString GetAcceptLanguages() const override;
mojo::ScopedMessagePipeHandle TakePendingWorkerTimingReceiver(
int request_id) override;
private: private:
~ServiceWorkerFetchContextImpl() override; ~ServiceWorkerFetchContextImpl() override;
......
...@@ -144,6 +144,12 @@ class WebWorkerFetchContext : public base::RefCounted<WebWorkerFetchContext> { ...@@ -144,6 +144,12 @@ class WebWorkerFetchContext : public base::RefCounted<WebWorkerFetchContext> {
// Returns the current list of user prefered languages. // Returns the current list of user prefered languages.
virtual blink::WebString GetAcceptLanguages() const = 0; virtual blink::WebString GetAcceptLanguages() const = 0;
// Returns mojo::PendingReceiver<blink::mojom::blink::WorkerTimingContainer>
// for the blink::ResourceResponse with the given |request_id|. Null if the
// request has not been intercepted by a service worker.
virtual mojo::ScopedMessagePipeHandle TakePendingWorkerTimingReceiver(
int request_id) = 0;
}; };
} // namespace blink } // namespace blink
......
...@@ -247,10 +247,12 @@ void WorkerFetchContext::PopulateResourceRequest( ...@@ -247,10 +247,12 @@ void WorkerFetchContext::PopulateResourceRequest(
mojo::PendingReceiver<mojom::blink::WorkerTimingContainer> mojo::PendingReceiver<mojom::blink::WorkerTimingContainer>
WorkerFetchContext::TakePendingWorkerTimingReceiver(int request_id) { WorkerFetchContext::TakePendingWorkerTimingReceiver(int request_id) {
// TODO(https://crbug.com/900700): Take a pending receiver for mojo::ScopedMessagePipeHandle pipe =
// WorkerTimingContainer from WebWorkerFetchContextImpl. GetWebWorkerFetchContext()->TakePendingWorkerTimingReceiver(request_id);
return mojo::NullReceiver(); return mojo::PendingReceiver<mojom::blink::WorkerTimingContainer>(
std::move(pipe));
} }
void WorkerFetchContext::SetFirstPartyCookie(ResourceRequest& out_request) { void WorkerFetchContext::SetFirstPartyCookie(ResourceRequest& out_request) {
if (out_request.SiteForCookies().IsNull()) if (out_request.SiteForCookies().IsNull())
out_request.SetSiteForCookies(GetSiteForCookies()); out_request.SetSiteForCookies(GetSiteForCookies());
......
...@@ -111,6 +111,10 @@ class FakeWebWorkerFetchContext final : public WebWorkerFetchContext { ...@@ -111,6 +111,10 @@ class FakeWebWorkerFetchContext final : public WebWorkerFetchContext {
return base::Optional<WebSecurityOrigin>(); return base::Optional<WebSecurityOrigin>();
} }
WebString GetAcceptLanguages() const override { return WebString(); } WebString GetAcceptLanguages() const override { return WebString(); }
mojo::ScopedMessagePipeHandle TakePendingWorkerTimingReceiver(
int request_id) override {
return {};
}
private: private:
FakeWebURLLoaderFactory fake_web_url_loader_factory_; FakeWebURLLoaderFactory fake_web_url_loader_factory_;
......
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