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

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: 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"
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698