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