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

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

Issue 182693002: Implement some mothods in SharedWorkerHost and SharedWorkerServiceImpl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Incorporated kinuko's comments. Created 6 years, 9 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_host.h" 5 #include "content/browser/shared_worker/shared_worker_host.h"
6 6
7 #include "content/browser/message_port_service.h"
7 #include "content/browser/shared_worker/shared_worker_instance.h" 8 #include "content/browser/shared_worker/shared_worker_instance.h"
8 #include "content/browser/shared_worker/shared_worker_message_filter.h" 9 #include "content/browser/shared_worker/shared_worker_message_filter.h"
10 #include "content/common/view_messages.h"
11 #include "content/common/worker_messages.h"
9 #include "content/public/browser/browser_thread.h" 12 #include "content/public/browser/browser_thread.h"
10 13
11 namespace content { 14 namespace content {
12 15
13 SharedWorkerHost::SharedWorkerHost(SharedWorkerInstance* instance) 16 SharedWorkerHost::SharedWorkerHost(SharedWorkerInstance* instance)
14 : instance_(instance), 17 : instance_(instance),
18 container_render_filter_(NULL),
15 worker_route_id_(MSG_ROUTING_NONE) { 19 worker_route_id_(MSG_ROUTING_NONE) {
16 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 20 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
17 } 21 }
18 22
19 SharedWorkerHost::~SharedWorkerHost() { 23 SharedWorkerHost::~SharedWorkerHost() {
20 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 24 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
21 } 25 }
22 26
27 bool SharedWorkerHost::Send(IPC::Message* message) {
28 if (!container_render_filter_) {
29 delete message;
30 return false;
31 }
32 return container_render_filter_->Send(message);
33 }
34
23 void SharedWorkerHost::Init(SharedWorkerMessageFilter* filter) { 35 void SharedWorkerHost::Init(SharedWorkerMessageFilter* filter) {
36 CHECK(instance_);
24 DCHECK(worker_route_id_ == MSG_ROUTING_NONE); 37 DCHECK(worker_route_id_ == MSG_ROUTING_NONE);
38 container_render_filter_ = filter;
25 worker_route_id_ = filter->GetNextRoutingID(); 39 worker_route_id_ = filter->GetNextRoutingID();
40
41 WorkerProcessMsg_CreateWorker_Params params;
42 params.url = instance_->url();
43 params.name = instance_->name();
44 params.content_security_policy = instance_->content_security_policy();
45 params.security_policy_type = instance_->security_policy_type();
46 params.route_id = worker_route_id_;
47 Send(new WorkerProcessMsg_CreateWorker(params));
48
49 for (SharedWorkerInstance::FilterList::const_iterator i =
50 instance_->filters().begin();
51 i != instance_->filters().end(); ++i) {
52 i->filter()->Send(new ViewMsg_WorkerCreated(i->route_id()));
53 }
54 }
55
56 bool SharedWorkerHost::FilterMessage(const IPC::Message& message,
57 SharedWorkerMessageFilter* filter) {
58 if (!instance_)
59 return false;
60
61 if (!instance_->closed() &&
62 instance_->HasFilter(filter, message.routing_id())) {
63 RelayMessage(message, filter);
64 return true;
65 }
66
67 return false;
68 }
69
70 void SharedWorkerHost::FilterShutdown(SharedWorkerMessageFilter* filter) {
71 if (!instance_)
72 return;
73 instance_->RemoveFilters(filter);
74 instance_->worker_document_set()->RemoveAll(filter);
75 if (instance_->worker_document_set()->IsEmpty()) {
76 // This worker has no more associated documents - shut it down.
77 Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_));
78 }
79 }
80
81 void SharedWorkerHost::DocumentDetached(SharedWorkerMessageFilter* filter,
82 unsigned long long document_id) {
83 if (!instance_)
84 return;
85 // Walk all instances and remove the document from their document set.
86 instance_->worker_document_set()->Remove(filter, document_id);
87 if (instance_->worker_document_set()->IsEmpty()) {
88 // This worker has no more associated documents - shut it down.
89 Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_));
90 }
91 }
92
93 void SharedWorkerHost::WorkerContextClosed() {
94 // Set the closed flag - this will stop any further messages from
95 // being sent to the worker (messages can still be sent from the worker,
96 // for exception reporting, etc).
97 instance_->set_closed(true);
98 }
99
100 void SharedWorkerHost::WorkerContextDestroyed() {
101 instance_.reset();
102 }
103
104 void SharedWorkerHost::WorkerScriptLoaded() {
26 // TODO(horo): implement this. 105 // TODO(horo): implement this.
27 NOTIMPLEMENTED(); 106 NOTIMPLEMENTED();
28 } 107 }
29 108
109 void SharedWorkerHost::WorkerScriptLoadFailed() {
110 instance_->set_load_failed(true);
111 for (SharedWorkerInstance::FilterList::const_iterator i =
112 instance_->filters().begin();
113 i != instance_->filters().end(); ++i) {
114 i->filter()->Send(new ViewMsg_WorkerScriptLoadFailed(i->route_id()));
115 }
116 }
117
118 void SharedWorkerHost::WorkerConnected(int message_port_id) {
119 for (SharedWorkerInstance::FilterList::const_iterator i =
120 instance_->filters().begin();
121 i != instance_->filters().end(); ++i) {
122 if (i->message_port_id() != message_port_id)
123 continue;
124 i->filter()->Send(new ViewMsg_WorkerConnected(i->route_id()));
125 return;
126 }
127 }
128
129 void SharedWorkerHost::AllowDatabase(const GURL& url,
130 const base::string16& name,
131 const base::string16& display_name,
132 unsigned long estimated_size,
133 bool* result) {
134 // TODO(horo): implement this.
135 NOTIMPLEMENTED();
136 }
137
138 void SharedWorkerHost::AllowFileSystem(const GURL& url,
139 bool* result) {
140 // TODO(horo): implement this.
141 NOTIMPLEMENTED();
142 }
143
144 void SharedWorkerHost::AllowIndexedDB(const GURL& url,
145 const base::string16& name,
146 bool* result) {
147 // TODO(horo): implement this.
148 NOTIMPLEMENTED();
149 }
150
151 void SharedWorkerHost::RelayMessage(
152 const IPC::Message& message,
153 SharedWorkerMessageFilter* incoming_filter) {
154 if (message.type() == WorkerMsg_Connect::ID) {
155 // Crack the SharedWorker Connect message to setup routing for the port.
156 int sent_message_port_id;
157 int new_routing_id;
158 if (!WorkerMsg_Connect::Read(
159 &message, &sent_message_port_id, &new_routing_id)) {
160 return;
161 }
162 DCHECK(container_render_filter_);
163 new_routing_id = container_render_filter_->GetNextRoutingID();
164 MessagePortService::GetInstance()->UpdateMessagePort(
165 sent_message_port_id,
166 container_render_filter_->message_port_message_filter(),
167 new_routing_id);
168 instance_->SetMessagePortID(incoming_filter,
169 message.routing_id(),
170 sent_message_port_id);
171 // Resend the message with the new routing id.
172 Send(new WorkerMsg_Connect(
173 worker_route_id_, sent_message_port_id, new_routing_id));
174
175 // Send any queued messages for the sent port.
176 MessagePortService::GetInstance()->SendQueuedMessagesIfPossible(
177 sent_message_port_id);
178 } else {
179 IPC::Message* new_message = new IPC::Message(message);
180 new_message->set_routing_id(worker_route_id_);
181 Send(new_message);
182 return;
183 }
184 }
185
30 } // namespace content 186 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698