Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(333)

Side by Side Diff: content/browser/shared_worker/shared_worker_service_impl.cc

Issue 2249173003: Removes the references to shared workers from the all documents in being deleted frames (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: use WebContentsObserver::RenderFrameDeleted Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/shared_worker/shared_worker_service_impl.h" 5 #include "content/browser/shared_worker/shared_worker_service_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <iterator> 10 #include <iterator>
11 11
12 #include "base/callback.h" 12 #include "base/callback.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/memory/ptr_util.h" 14 #include "base/memory/ptr_util.h"
15 #include "base/memory/ref_counted.h" 15 #include "base/memory/ref_counted.h"
16 #include "base/stl_util.h" 16 #include "base/stl_util.h"
17 #include "base/threading/thread_task_runner_handle.h"
17 #include "content/browser/devtools/shared_worker_devtools_manager.h" 18 #include "content/browser/devtools/shared_worker_devtools_manager.h"
19 #include "content/browser/frame_host/render_frame_host_impl.h"
18 #include "content/browser/renderer_host/render_process_host_impl.h" 20 #include "content/browser/renderer_host/render_process_host_impl.h"
19 #include "content/browser/shared_worker/shared_worker_host.h" 21 #include "content/browser/shared_worker/shared_worker_host.h"
20 #include "content/browser/shared_worker/shared_worker_instance.h" 22 #include "content/browser/shared_worker/shared_worker_instance.h"
21 #include "content/browser/shared_worker/shared_worker_message_filter.h" 23 #include "content/browser/shared_worker/shared_worker_message_filter.h"
22 #include "content/browser/shared_worker/worker_document_set.h" 24 #include "content/browser/shared_worker/worker_document_set.h"
25 #include "content/browser/web_contents/web_contents_impl.h"
23 #include "content/common/view_messages.h" 26 #include "content/common/view_messages.h"
24 #include "content/common/worker_messages.h" 27 #include "content/common/worker_messages.h"
25 #include "content/public/browser/browser_thread.h" 28 #include "content/public/browser/browser_thread.h"
29 #include "content/public/browser/web_contents.h"
30 #include "content/public/browser/web_contents_observer.h"
26 #include "content/public/browser/worker_service_observer.h" 31 #include "content/public/browser/worker_service_observer.h"
27 32
28 namespace content { 33 namespace content {
29 34
30 WorkerService* WorkerService::GetInstance() { 35 WorkerService* WorkerService::GetInstance() {
31 return SharedWorkerServiceImpl::GetInstance(); 36 return SharedWorkerServiceImpl::GetInstance();
32 } 37 }
33 38
34 namespace { 39 namespace {
35 40
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 99
95 bool TryIncrementWorkerRefCount(int worker_process_id) { 100 bool TryIncrementWorkerRefCount(int worker_process_id) {
96 RenderProcessHostImpl* render_process = static_cast<RenderProcessHostImpl*>( 101 RenderProcessHostImpl* render_process = static_cast<RenderProcessHostImpl*>(
97 RenderProcessHost::FromID(worker_process_id)); 102 RenderProcessHost::FromID(worker_process_id));
98 if (!render_process || render_process->FastShutdownStarted()) 103 if (!render_process || render_process->FastShutdownStarted())
99 return false; 104 return false;
100 render_process->IncrementWorkerRefCount(); 105 render_process->IncrementWorkerRefCount();
101 return true; 106 return true;
102 } 107 }
103 108
109 void CallRenderFrameDetachedOnIO(int render_process_id, int render_frame_id) {
110 DCHECK_CURRENTLY_ON(BrowserThread::IO);
111 SharedWorkerServiceImpl::GetInstance()->RenderFrameDetached(render_process_id,
112 render_frame_id);
113 }
114
115 class WorkerDocumentSetWebContentsObserver : public WebContentsObserver {
116 public:
117 WorkerDocumentSetWebContentsObserver(WebContents* web_contents,
118 int render_process_id,
119 int render_frame_id,
120 RenderFrameHost* render_frame_host)
121 : WebContentsObserver(web_contents),
122 render_process_id_(render_process_id),
123 render_frame_id_(render_frame_id),
124 render_frame_host_(render_frame_host) {
125 DCHECK_CURRENTLY_ON(BrowserThread::UI);
126 }
127
128 private:
129 // content::WebContentsObserver overrides.
no sievers 2016/08/23 20:32:42 I wonder if this still needs to also listen to Web
horo 2016/08/24 01:15:49 Done.
130 void RenderFrameDeleted(RenderFrameHost* render_frame_host) override {
131 DCHECK_CURRENTLY_ON(BrowserThread::UI);
132 if (render_frame_host != render_frame_host_)
133 return;
134 Observe(nullptr);
135 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
136 base::Bind(&CallRenderFrameDetachedOnIO,
137 render_process_id_, render_frame_id_));
138 base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this);
139 }
140
141 const int render_process_id_;
142 const int render_frame_id_;
143 const RenderFrameHost* render_frame_host_;
144 };
145
146 void RegisterWebContentsObserverOnUI(int render_process_id,
147 int render_frame_id) {
148 DCHECK_CURRENTLY_ON(BrowserThread::UI);
149 RenderFrameHostImpl* render_frame_host =
150 RenderFrameHostImpl::FromID(render_process_id, render_frame_id);
151 if (!render_frame_host)
152 return;
153 WebContentsImpl* web_contents = static_cast<WebContentsImpl*>(
154 WebContents::FromRenderFrameHost(render_frame_host));
155 new WorkerDocumentSetWebContentsObserver(web_contents, render_process_id,
156 render_frame_id, render_frame_host);
157 }
158
104 } // namespace 159 } // namespace
105 160
106 class SharedWorkerServiceImpl::SharedWorkerPendingInstance { 161 class SharedWorkerServiceImpl::SharedWorkerPendingInstance {
107 public: 162 public:
108 struct SharedWorkerPendingRequest { 163 struct SharedWorkerPendingRequest {
109 SharedWorkerPendingRequest(SharedWorkerMessageFilter* filter, 164 SharedWorkerPendingRequest(SharedWorkerMessageFilter* filter,
110 int route_id, 165 int route_id,
111 unsigned long long document_id, 166 unsigned long long document_id,
112 int render_process_id, 167 int render_process_id,
113 int render_frame_route_id) 168 int render_frame_route_id)
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 205
151 void RemoveRequest(int process_id) { 206 void RemoveRequest(int process_id) {
152 auto to_remove = std::remove_if( 207 auto to_remove = std::remove_if(
153 requests_.begin(), requests_.end(), 208 requests_.begin(), requests_.end(),
154 [process_id](const std::unique_ptr<SharedWorkerPendingRequest>& r) { 209 [process_id](const std::unique_ptr<SharedWorkerPendingRequest>& r) {
155 return r->render_process_id == process_id; 210 return r->render_process_id == process_id;
156 }); 211 });
157 requests_.erase(to_remove, requests_.end()); 212 requests_.erase(to_remove, requests_.end());
158 } 213 }
159 214
215 void RemoveRequestFromFrame(int process_id, int frame_id) {
216 auto to_remove = std::remove_if(
217 requests_.begin(), requests_.end(),
218 [process_id,
219 frame_id](const std::unique_ptr<SharedWorkerPendingRequest>& r) {
220 return r->render_process_id == process_id &&
221 r->render_frame_route_id == frame_id;
222 });
223 requests_.erase(to_remove, requests_.end());
224 }
225
160 void RegisterToSharedWorkerHost(SharedWorkerHost* host) { 226 void RegisterToSharedWorkerHost(SharedWorkerHost* host) {
161 for (const auto& request : requests_) { 227 for (const auto& request : requests_) {
162 host->AddFilter(request->filter, request->route_id); 228 host->AddFilter(request->filter, request->route_id);
163 host->worker_document_set()->Add(request->filter, 229 host->worker_document_set()->Add(request->filter,
164 request->document_id, 230 request->document_id,
165 request->render_process_id, 231 request->render_process_id,
166 request->render_frame_route_id); 232 request->render_frame_route_id);
167 } 233 }
168 } 234 }
169 235
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 const WorkerStoragePartitionId& partition_id) { 353 const WorkerStoragePartitionId& partition_id) {
288 DCHECK_CURRENTLY_ON(BrowserThread::IO); 354 DCHECK_CURRENTLY_ON(BrowserThread::IO);
289 std::unique_ptr<SharedWorkerInstance> instance(new SharedWorkerInstance( 355 std::unique_ptr<SharedWorkerInstance> instance(new SharedWorkerInstance(
290 params.url, params.name, params.content_security_policy, 356 params.url, params.name, params.content_security_policy,
291 params.security_policy_type, params.creation_address_space, 357 params.security_policy_type, params.creation_address_space,
292 resource_context, partition_id, params.creation_context_type)); 358 resource_context, partition_id, params.creation_context_type));
293 std::unique_ptr<SharedWorkerPendingInstance::SharedWorkerPendingRequest> 359 std::unique_ptr<SharedWorkerPendingInstance::SharedWorkerPendingRequest>
294 request(new SharedWorkerPendingInstance::SharedWorkerPendingRequest( 360 request(new SharedWorkerPendingInstance::SharedWorkerPendingRequest(
295 filter, route_id, params.document_id, filter->render_process_id(), 361 filter, route_id, params.document_id, filter->render_process_id(),
296 params.render_frame_route_id)); 362 params.render_frame_route_id));
363
364 BrowserThread::PostTask(
no sievers 2016/08/23 20:32:42 Is it possible that there is a pending RenderFrame
horo 2016/08/24 01:15:49 Yes. So I check "if (!render_frame_host)" in Regis
365 BrowserThread::UI, FROM_HERE,
366 base::Bind(&RegisterWebContentsObserverOnUI, filter->render_process_id(),
367 params.render_frame_route_id));
297 if (SharedWorkerPendingInstance* pending = FindPendingInstance(*instance)) { 368 if (SharedWorkerPendingInstance* pending = FindPendingInstance(*instance)) {
298 if (params.url != pending->instance()->url()) 369 if (params.url != pending->instance()->url())
299 return blink::WebWorkerCreationErrorURLMismatch; 370 return blink::WebWorkerCreationErrorURLMismatch;
300 pending->AddRequest(std::move(request)); 371 pending->AddRequest(std::move(request));
301 if (params.creation_context_type != 372 if (params.creation_context_type !=
302 pending->instance()->creation_context_type()) 373 pending->instance()->creation_context_type())
303 return blink::WebWorkerCreationErrorSecureContextMismatch; 374 return blink::WebWorkerCreationErrorSecureContextMismatch;
304 return blink::WebWorkerCreationErrorNone; 375 return blink::WebWorkerCreationErrorNone;
305 } 376 }
306 377
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 std::vector<int> remove_pending_instance_list; 503 std::vector<int> remove_pending_instance_list;
433 for (const auto& it : pending_instances_) { 504 for (const auto& it : pending_instances_) {
434 it.second->RemoveRequest(filter->render_process_id()); 505 it.second->RemoveRequest(filter->render_process_id());
435 if (it.second->requests()->empty()) 506 if (it.second->requests()->empty())
436 remove_pending_instance_list.push_back(it.first); 507 remove_pending_instance_list.push_back(it.first);
437 } 508 }
438 for (int to_remove : remove_pending_instance_list) 509 for (int to_remove : remove_pending_instance_list)
439 pending_instances_.erase(to_remove); 510 pending_instances_.erase(to_remove);
440 } 511 }
441 512
513 void SharedWorkerServiceImpl::RenderFrameDetached(int render_process_id,
514 int render_frame_id) {
515 ScopedWorkerDependencyChecker checker(this);
516 for (const auto& it : worker_hosts_) {
517 it.second->RenderFrameDetached(render_process_id, render_frame_id);
518 }
519
520 std::vector<int> remove_pending_instance_list;
521 for (const auto& it : pending_instances_) {
522 it.second->RemoveRequestFromFrame(render_process_id, render_frame_id);
523 if (it.second->requests()->empty())
524 remove_pending_instance_list.push_back(it.first);
no sievers 2016/08/23 20:32:42 why not erase immediately (while post-incrementing
horo 2016/08/24 01:15:49 Done.
525 }
526 for (int to_remove : remove_pending_instance_list)
527 pending_instances_.erase(to_remove);
528 }
529
442 void SharedWorkerServiceImpl::NotifyWorkerDestroyed(int worker_process_id, 530 void SharedWorkerServiceImpl::NotifyWorkerDestroyed(int worker_process_id,
443 int worker_route_id) { 531 int worker_route_id) {
444 FOR_EACH_OBSERVER(WorkerServiceObserver, 532 FOR_EACH_OBSERVER(WorkerServiceObserver,
445 observers_, 533 observers_,
446 WorkerDestroyed(worker_process_id, worker_route_id)); 534 WorkerDestroyed(worker_process_id, worker_route_id));
447 } 535 }
448 536
449 blink::WebWorkerCreationError 537 blink::WebWorkerCreationError
450 SharedWorkerServiceImpl::ReserveRenderProcessToCreateWorker( 538 SharedWorkerServiceImpl::ReserveRenderProcessToCreateWorker(
451 std::unique_ptr<SharedWorkerPendingInstance> pending_instance) { 539 std::unique_ptr<SharedWorkerPendingInstance> pending_instance) {
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 UpdateWorkerDependencyFunc new_func) { 734 UpdateWorkerDependencyFunc new_func) {
647 update_worker_dependency_ = new_func; 735 update_worker_dependency_ = new_func;
648 } 736 }
649 737
650 void SharedWorkerServiceImpl::ChangeTryIncrementWorkerRefCountFuncForTesting( 738 void SharedWorkerServiceImpl::ChangeTryIncrementWorkerRefCountFuncForTesting(
651 bool (*new_func)(int)) { 739 bool (*new_func)(int)) {
652 s_try_increment_worker_ref_count_ = new_func; 740 s_try_increment_worker_ref_count_ = new_func;
653 } 741 }
654 742
655 } // namespace content 743 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/shared_worker/shared_worker_service_impl.h ('k') | content/browser/shared_worker/worker_document_set.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698