1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/service_worker/service_worker_main_resource_handle.h"
6
7 #include <utility>
8
9 #include "base/bind.h"
10 #include "base/task/post_task.h"
11 #include "content/browser/service_worker/service_worker_context_wrapper.h"
12 #include "content/browser/service_worker/service_worker_main_resource_handle_core.h"
13 #include "content/common/service_worker/service_worker_utils.h"
14 #include "content/public/browser/browser_task_traits.h"
15 #include "content/public/browser/browser_thread.h"
16 #include "services/network/public/cpp/cross_origin_embedder_policy.h"
17
18 namespace content {
19
ServiceWorkerMainResourceHandle(ServiceWorkerContextWrapper * context_wrapper,ServiceWorkerAccessedCallback on_service_worker_accessed)20 ServiceWorkerMainResourceHandle::ServiceWorkerMainResourceHandle(
21 ServiceWorkerContextWrapper* context_wrapper,
22 ServiceWorkerAccessedCallback on_service_worker_accessed)
23 : context_wrapper_(context_wrapper) {
24 DCHECK_CURRENTLY_ON(BrowserThread::UI);
25 core_ = new ServiceWorkerMainResourceHandleCore(
26 weak_factory_.GetWeakPtr(), context_wrapper,
27 std::move(on_service_worker_accessed));
28 }
29
~ServiceWorkerMainResourceHandle()30 ServiceWorkerMainResourceHandle::~ServiceWorkerMainResourceHandle() {
31 DCHECK_CURRENTLY_ON(BrowserThread::UI);
32 // Delete the ServiceWorkerMainResourceHandleCore on the core thread.
33 BrowserThread::DeleteSoon(ServiceWorkerContext::GetCoreThreadId(), FROM_HERE,
34 core_);
35 }
36
OnCreatedContainerHost(blink::mojom::ServiceWorkerContainerInfoForClientPtr container_info)37 void ServiceWorkerMainResourceHandle::OnCreatedContainerHost(
38 blink::mojom::ServiceWorkerContainerInfoForClientPtr container_info) {
39 DCHECK_CURRENTLY_ON(BrowserThread::UI);
40 DCHECK(container_info->host_remote.is_valid() &&
41 container_info->client_receiver.is_valid());
42
43 container_info_ = std::move(container_info);
44 }
45
OnBeginNavigationCommit(int render_process_id,int render_frame_id,const network::CrossOriginEmbedderPolicy & cross_origin_embedder_policy,mojo::PendingRemote<network::mojom::CrossOriginEmbedderPolicyReporter> coep_reporter,blink::mojom::ServiceWorkerContainerInfoForClientPtr * out_container_info,ukm::SourceId document_ukm_source_id)46 void ServiceWorkerMainResourceHandle::OnBeginNavigationCommit(
47 int render_process_id,
48 int render_frame_id,
49 const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy,
50 mojo::PendingRemote<network::mojom::CrossOriginEmbedderPolicyReporter>
51 coep_reporter,
52 blink::mojom::ServiceWorkerContainerInfoForClientPtr* out_container_info,
53 ukm::SourceId document_ukm_source_id) {
54 DCHECK_CURRENTLY_ON(BrowserThread::UI);
55 // We may have failed to pre-create the container host.
56 if (!container_info_)
57 return;
58 ServiceWorkerContextWrapper::RunOrPostTaskOnCoreThread(
59 FROM_HERE,
60 base::BindOnce(
61 &ServiceWorkerMainResourceHandleCore::OnBeginNavigationCommit,
62 base::Unretained(core_), render_process_id, render_frame_id,
63 cross_origin_embedder_policy, std::move(coep_reporter),
64 document_ukm_source_id));
65 *out_container_info = std::move(container_info_);
66 }
67
OnEndNavigationCommit()68 void ServiceWorkerMainResourceHandle::OnEndNavigationCommit() {
69 DCHECK_CURRENTLY_ON(BrowserThread::UI);
70 ServiceWorkerContextWrapper::RunOrPostTaskOnCoreThread(
71 FROM_HERE,
72 base::BindOnce(
73 &ServiceWorkerMainResourceHandleCore::OnEndNavigationCommit,
74 base::Unretained(core_)));
75 }
76
OnBeginWorkerCommit(const network::CrossOriginEmbedderPolicy & cross_origin_embedder_policy,ukm::SourceId worker_ukm_source_id)77 void ServiceWorkerMainResourceHandle::OnBeginWorkerCommit(
78 const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy,
79 ukm::SourceId worker_ukm_source_id) {
80 DCHECK_CURRENTLY_ON(BrowserThread::UI);
81 ServiceWorkerContextWrapper::RunOrPostTaskOnCoreThread(
82 FROM_HERE,
83 base::BindOnce(&ServiceWorkerMainResourceHandleCore::OnBeginWorkerCommit,
84 base::Unretained(core_), cross_origin_embedder_policy,
85 worker_ukm_source_id));
86 }
87
88 } // namespace content
89