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