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

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

Issue 196483003: Add SharedWorkerServiceImpl::CheckWorkerDependency(). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase 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
« no previous file with comments | « content/browser/shared_worker/shared_worker_service_impl.cc ('k') | content/content_tests.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include <map>
6 #include <vector>
7
8 #include "base/atomic_sequence_num.h"
9 #include "base/basictypes.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "base/memory/scoped_vector.h"
12 #include "base/strings/string16.h"
13 #include "base/strings/utf_string_conversions.h"
14 #include "content/browser/message_port_message_filter.h"
15 #include "content/browser/shared_worker/shared_worker_message_filter.h"
16 #include "content/browser/shared_worker/shared_worker_service_impl.h"
17 #include "content/browser/worker_host/worker_storage_partition.h"
18 #include "content/common/message_port_messages.h"
19 #include "content/common/view_messages.h"
20 #include "content/common/worker_messages.h"
21 #include "content/public/test/test_browser_context.h"
22 #include "content/public/test/test_browser_thread_bundle.h"
23 #include "ipc/ipc_sync_message.h"
24 #include "testing/gtest/include/gtest/gtest.h"
25
26 namespace content {
27 namespace {
28
29 class MockMessagePortMessageFilter : public MessagePortMessageFilter {
30 public:
31 MockMessagePortMessageFilter(const NextRoutingIDCallback& callback,
32 ScopedVector<IPC::Message>* message_queue)
33 : MessagePortMessageFilter(callback), message_queue_(message_queue) {}
34
35 virtual bool Send(IPC::Message* message) OVERRIDE {
36 if (!message_queue_) {
37 delete message;
38 return false;
39 }
40 message_queue_->push_back(message);
41 return true;
42 }
43
44 void Close() {
45 message_queue_ = NULL;
46 OnChannelClosing();
47 }
48
49 private:
50 virtual ~MockMessagePortMessageFilter() {}
51 ScopedVector<IPC::Message>* message_queue_;
52 };
53
54 class MockSharedWorkerMessageFilter : public SharedWorkerMessageFilter {
55 public:
56 MockSharedWorkerMessageFilter(int render_process_id,
57 ResourceContext* resource_context,
58 const WorkerStoragePartition& partition,
59 MessagePortMessageFilter* message_port_filter,
60 ScopedVector<IPC::Message>* message_queue)
61 : SharedWorkerMessageFilter(render_process_id,
62 resource_context,
63 partition,
64 message_port_filter),
65 message_queue_(message_queue) {}
66
67 virtual bool Send(IPC::Message* message) OVERRIDE {
68 if (!message_queue_) {
69 delete message;
70 return false;
71 }
72 message_queue_->push_back(message);
73 return true;
74 }
75
76 void Close() {
77 message_queue_ = NULL;
78 OnChannelClosing();
79 }
80
81 private:
82 virtual ~MockSharedWorkerMessageFilter() {}
83 ScopedVector<IPC::Message>* message_queue_;
84 };
85
86 class MockRendererProcessHost {
87 public:
88 MockRendererProcessHost(int process_id,
89 ResourceContext* resource_context,
90 const WorkerStoragePartition& partition)
91 : message_filter_(new MockMessagePortMessageFilter(
92 base::Bind(&base::AtomicSequenceNumber::GetNext,
93 base::Unretained(&next_routing_id_)),
94 &queued_messages_)),
95 worker_filter_(new MockSharedWorkerMessageFilter(process_id,
96 resource_context,
97 partition,
98 message_filter_.get(),
99 &queued_messages_)) {}
100
101 ~MockRendererProcessHost() {
102 message_filter_->Close();
103 worker_filter_->Close();
104 }
105
106 bool OnMessageReceived(IPC::Message* message) {
107 scoped_ptr<IPC::Message> msg(message);
108 bool message_was_ok = false;
109 const bool ret =
110 message_filter_->OnMessageReceived(*message, &message_was_ok) ||
111 worker_filter_->OnMessageReceived(*message, &message_was_ok);
112 if (message->is_sync()) {
113 CHECK(!queued_messages_.empty());
114 const IPC::Message* response_msg = queued_messages_.back();
115 IPC::SyncMessage* sync_msg = static_cast<IPC::SyncMessage*>(message);
116 scoped_ptr<IPC::MessageReplyDeserializer> reply_serializer(
117 sync_msg->GetReplyDeserializer());
118 bool result = reply_serializer->SerializeOutputParameters(*response_msg);
119 CHECK(result);
120 queued_messages_.pop_back();
121 }
122 return ret;
123 }
124
125 size_t QueuedMessageCount() const { return queued_messages_.size(); }
126
127 scoped_ptr<IPC::Message> PopMessage() {
128 CHECK(queued_messages_.size());
129 scoped_ptr<IPC::Message> msg(*queued_messages_.begin());
130 queued_messages_.weak_erase(queued_messages_.begin());
131 return msg.Pass();
132 }
133
134 private:
135 ScopedVector<IPC::Message> queued_messages_;
136 base::AtomicSequenceNumber next_routing_id_;
137 scoped_refptr<MockMessagePortMessageFilter> message_filter_;
138 scoped_refptr<MockSharedWorkerMessageFilter> worker_filter_;
139 };
140
141 void CreateMessagePortPair(MockRendererProcessHost* renderer,
142 int* route_1,
143 int* port_1,
144 int* route_2,
145 int* port_2) {
146 EXPECT_TRUE(renderer->OnMessageReceived(
147 new MessagePortHostMsg_CreateMessagePort(route_1, port_1)));
148 EXPECT_TRUE(renderer->OnMessageReceived(
149 new MessagePortHostMsg_CreateMessagePort(route_2, port_2)));
150 EXPECT_TRUE(renderer->OnMessageReceived(
151 new MessagePortHostMsg_Entangle(*port_1, *port_2)));
152 EXPECT_TRUE(renderer->OnMessageReceived(
153 new MessagePortHostMsg_Entangle(*port_2, *port_1)));
154 }
155
156 void PostCreateWorker(MockRendererProcessHost* renderer,
157 const std::string& url,
158 const std::string& name,
159 unsigned long long document_id,
160 int render_frame_route_id,
161 int* connector_route_id) {
162 ViewHostMsg_CreateWorker_Params params;
163 params.url = GURL(url);
164 params.name = base::ASCIIToUTF16(name);
165 params.content_security_policy = base::string16();
166 params.security_policy_type = blink::WebContentSecurityPolicyTypeReport;
167 params.document_id = document_id;
168 params.render_frame_route_id = render_frame_route_id;
169 EXPECT_TRUE(renderer->OnMessageReceived(
170 new ViewHostMsg_CreateWorker(params, connector_route_id)));
171 }
172
173 class MockSharedWorkerConnector {
174 public:
175 MockSharedWorkerConnector(MockRendererProcessHost* renderer_host)
176 : renderer_host_(renderer_host),
177 temporary_remote_port_route_id_(0),
178 remote_port_id_(0),
179 local_port_route_id_(0),
180 local_port_id_(0),
181 route_id_(0) {}
182 void Create(const std::string& url,
183 const std::string& name,
184 unsigned long long document_id,
185 int render_frame_route_id) {
186 CreateMessagePortPair(renderer_host_,
187 &temporary_remote_port_route_id_,
188 &remote_port_id_,
189 &local_port_route_id_,
190 &local_port_id_);
191 PostCreateWorker(renderer_host_,
192 url,
193 name,
194 document_id,
195 render_frame_route_id,
196 &route_id_);
197 }
198 void SendQueueMessages() {
199 EXPECT_TRUE(renderer_host_->OnMessageReceived(
200 new MessagePortHostMsg_QueueMessages(remote_port_id_)));
201 }
202 void SendPostMessage(std::string data) {
203 const std::vector<int> empty_ids;
204 EXPECT_TRUE(
205 renderer_host_->OnMessageReceived(new MessagePortHostMsg_PostMessage(
206 local_port_id_, base::ASCIIToUTF16(data), empty_ids)));
207 }
208 void SendConnect() {
209 EXPECT_TRUE(
210 renderer_host_->OnMessageReceived(new ViewHostMsg_ForwardToWorker(
211 WorkerMsg_Connect(route_id_, remote_port_id_, MSG_ROUTING_NONE))));
212 }
213 void SendSendQueuedMessages(
214 const std::vector<QueuedMessage>& queued_messages) {
215 EXPECT_TRUE(renderer_host_->OnMessageReceived(
216 new MessagePortHostMsg_SendQueuedMessages(remote_port_id_,
217 queued_messages)));
218 }
219 int temporary_remote_port_route_id() {
220 return temporary_remote_port_route_id_;
221 }
222 int remote_port_id() { return remote_port_id_; }
223 int local_port_route_id() { return local_port_route_id_; }
224 int local_port_id() { return local_port_id_; }
225 int route_id() { return route_id_; }
226
227 private:
228 MockRendererProcessHost* renderer_host_;
229 int temporary_remote_port_route_id_;
230 int remote_port_id_;
231 int local_port_route_id_;
232 int local_port_id_;
233 int route_id_;
234 };
235
236 void CheckWorkerProcessMsgCreateWorker(
237 MockRendererProcessHost* renderer_host,
238 const std::string& expected_url,
239 const std::string& expected_name,
240 blink::WebContentSecurityPolicyType expected_security_policy_type,
241 int* route_id) {
242 scoped_ptr<IPC::Message> msg(renderer_host->PopMessage());
243 EXPECT_EQ(WorkerProcessMsg_CreateWorker::ID, msg->type());
244 Tuple1<WorkerProcessMsg_CreateWorker_Params> param;
245 EXPECT_TRUE(WorkerProcessMsg_CreateWorker::Read(msg.get(), &param));
246 EXPECT_EQ(GURL(expected_url), param.a.url);
247 EXPECT_EQ(base::ASCIIToUTF16(expected_name), param.a.name);
248 EXPECT_EQ(expected_security_policy_type, param.a.security_policy_type);
249 *route_id = param.a.route_id;
250 }
251
252 void CheckViewMsgWorkerCreated(MockRendererProcessHost* renderer_host,
253 MockSharedWorkerConnector* connector) {
254 scoped_ptr<IPC::Message> msg(renderer_host->PopMessage());
255 EXPECT_EQ(ViewMsg_WorkerCreated::ID, msg->type());
256 EXPECT_EQ(connector->route_id(), msg->routing_id());
257 }
258
259 void CheckMessagePortMsgMessagesQueued(MockRendererProcessHost* renderer_host,
260 MockSharedWorkerConnector* connector) {
261 scoped_ptr<IPC::Message> msg(renderer_host->PopMessage());
262 EXPECT_EQ(MessagePortMsg_MessagesQueued::ID, msg->type());
263 EXPECT_EQ(connector->temporary_remote_port_route_id(), msg->routing_id());
264 }
265
266 void CheckWorkerMsgConnect(MockRendererProcessHost* renderer_host,
267 int expected_msg_route_id,
268 int expected_sent_message_port_id,
269 int* routing_id) {
270 scoped_ptr<IPC::Message> msg(renderer_host->PopMessage());
271 EXPECT_EQ(WorkerMsg_Connect::ID, msg->type());
272 EXPECT_EQ(expected_msg_route_id, msg->routing_id());
273 int port_id;
274 EXPECT_TRUE(WorkerMsg_Connect::Read(msg.get(), &port_id, routing_id));
275 EXPECT_EQ(expected_sent_message_port_id, port_id);
276 }
277
278 void CheckMessagePortMsgMessage(MockRendererProcessHost* renderer_host,
279 int expected_msg_route_id,
280 std::string expected_data) {
281 scoped_ptr<IPC::Message> msg(renderer_host->PopMessage());
282 EXPECT_EQ(MessagePortMsg_Message::ID, msg->type());
283 EXPECT_EQ(expected_msg_route_id, msg->routing_id());
284 base::string16 data;
285 std::vector<int> sent_message_port_ids;
286 std::vector<int> new_routing_ids;
287 EXPECT_TRUE(MessagePortMsg_Message::Read(
288 msg.get(), &data, &sent_message_port_ids, &new_routing_ids));
289 EXPECT_EQ(base::ASCIIToUTF16(expected_data), data);
290 }
291
292 void CheckViewMsgWorkerConnected(MockRendererProcessHost* renderer_host,
293 MockSharedWorkerConnector* connector) {
294 scoped_ptr<IPC::Message> msg(renderer_host->PopMessage());
295 EXPECT_EQ(ViewMsg_WorkerConnected::ID, msg->type());
296 EXPECT_EQ(connector->route_id(), msg->routing_id());
297 }
298
299 } // namespace
300
301 class SharedWorkerServiceImplTest : public testing::Test {
302 protected:
303 SharedWorkerServiceImplTest()
304 : browser_thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP),
305 browser_context_(new TestBrowserContext()),
306 partition_(
307 new WorkerStoragePartition(browser_context_->GetRequestContext(),
308 NULL,
309 NULL,
310 NULL,
311 NULL,
312 NULL,
313 NULL,
314 NULL)) {
315 SharedWorkerServiceImpl::GetInstance()
316 ->ChangeUpdateWorkerDependencyFuncForTesting(
317 &SharedWorkerServiceImplTest::MockUpdateWorkerDependency);
318 }
319
320 virtual void SetUp() OVERRIDE {}
321 virtual void TearDown() OVERRIDE {
322 s_update_worker_dependency_call_count_ = 0;
323 s_worker_dependency_added_ids_.clear();
324 s_worker_dependency_removed_ids_.clear();
325 SharedWorkerServiceImpl::GetInstance()->ResetForTesting();
326 }
327 static void MockUpdateWorkerDependency(const std::vector<int>& added_ids,
328 const std::vector<int>& removed_ids) {
329 ++s_update_worker_dependency_call_count_;
330 s_worker_dependency_added_ids_ = added_ids;
331 s_worker_dependency_removed_ids_ = removed_ids;
332 }
333
334 TestBrowserThreadBundle browser_thread_bundle_;
335 scoped_ptr<TestBrowserContext> browser_context_;
336 scoped_ptr<WorkerStoragePartition> partition_;
337 static int s_update_worker_dependency_call_count_;
338 static std::vector<int> s_worker_dependency_added_ids_;
339 static std::vector<int> s_worker_dependency_removed_ids_;
340 DISALLOW_COPY_AND_ASSIGN(SharedWorkerServiceImplTest);
341 };
342
343 // static
344 int SharedWorkerServiceImplTest::s_update_worker_dependency_call_count_;
345 std::vector<int> SharedWorkerServiceImplTest::s_worker_dependency_added_ids_;
346 std::vector<int> SharedWorkerServiceImplTest::s_worker_dependency_removed_ids_;
347
348 TEST_F(SharedWorkerServiceImplTest, BasicTest) {
349 scoped_ptr<MockRendererProcessHost> renderer_host(new MockRendererProcessHost(
350 100, browser_context_->GetResourceContext(), *partition_.get()));
351 scoped_ptr<MockSharedWorkerConnector> connector(
352 new MockSharedWorkerConnector(renderer_host.get()));
353 int worker_route_id;
354 int worker_msg_port_route_id;
355
356 // SharedWorkerConnector creates two message ports and sends
357 // ViewHostMsg_CreateWorker.
358 connector->Create("http://example.com/w.js", "name", 200, 300);
359 EXPECT_EQ(2U, renderer_host->QueuedMessageCount());
360 // WorkerProcessMsg_CreateWorker should be sent to the renderer in which
361 // SharedWorker will be created.
362 CheckWorkerProcessMsgCreateWorker(renderer_host.get(),
363 "http://example.com/w.js",
364 "name",
365 blink::WebContentSecurityPolicyTypeReport,
366 &worker_route_id);
367 // ViewMsg_WorkerCreated(1) should be sent back to SharedWorkerConnector side.
368 CheckViewMsgWorkerCreated(renderer_host.get(), connector.get());
369
370 // SharedWorkerConnector side sends MessagePortHostMsg_QueueMessages in
371 // WebSharedWorkerProxy::connect.
372 connector->SendQueueMessages();
373 EXPECT_EQ(1U, renderer_host->QueuedMessageCount());
374 // MessagePortMsg_MessagesQueued(2) should be sent back to
375 // SharedWorkerConnector side.
376 CheckMessagePortMsgMessagesQueued(renderer_host.get(), connector.get());
377
378 // When SharedWorkerConnector receives ViewMsg_WorkerCreated(1), it sends
379 // WorkerMsg_Connect wrapped in ViewHostMsg_ForwardToWorker.
380 connector->SendConnect();
381 EXPECT_EQ(1U, renderer_host->QueuedMessageCount());
382 // WorkerMsg_Connect should be sent to SharedWorker side.
383 CheckWorkerMsgConnect(renderer_host.get(),
384 worker_route_id,
385 connector->remote_port_id(),
386 &worker_msg_port_route_id);
387
388 // When SharedWorkerConnector receives MessagePortMsg_MessagesQueued(2), it
389 // sends MessagePortHostMsg_SendQueuedMessages.
390 std::vector<QueuedMessage> empty_messages;
391 connector->SendSendQueuedMessages(empty_messages);
392 EXPECT_EQ(0U, renderer_host->QueuedMessageCount());
393
394 // SharedWorker sends WorkerHostMsg_WorkerScriptLoaded in
395 // EmbeddedSharedWorkerStub::workerScriptLoaded().
396 EXPECT_TRUE(renderer_host->OnMessageReceived(
397 new WorkerHostMsg_WorkerScriptLoaded(worker_route_id)));
398 EXPECT_EQ(0U, renderer_host->QueuedMessageCount());
399
400 // SharedWorker sends WorkerHostMsg_WorkerConnected in
401 // EmbeddedSharedWorkerStub::workerScriptLoaded().
402 EXPECT_TRUE(
403 renderer_host->OnMessageReceived(new WorkerHostMsg_WorkerConnected(
404 connector->remote_port_id(), worker_route_id)));
405 EXPECT_EQ(1U, renderer_host->QueuedMessageCount());
406 // ViewMsg_WorkerConnected should be sent to SharedWorkerConnector side.
407 CheckViewMsgWorkerConnected(renderer_host.get(), connector.get());
408
409 // When SharedWorkerConnector side sends MessagePortHostMsg_PostMessage,
410 // SharedWorker side shuold receive MessagePortMsg_Message.
411 connector->SendPostMessage("test1");
412 EXPECT_EQ(1U, renderer_host->QueuedMessageCount());
413 CheckMessagePortMsgMessage(
414 renderer_host.get(), worker_msg_port_route_id, "test1");
415
416 // When SharedWorker side sends MessagePortHostMsg_PostMessage,
417 // SharedWorkerConnector side shuold receive MessagePortMsg_Message.
418 const std::vector<int> empty_ids;
419 EXPECT_TRUE(renderer_host->OnMessageReceived(
420 new MessagePortHostMsg_PostMessage(connector->remote_port_id(),
421 base::ASCIIToUTF16("test2"),
422 empty_ids)));
423 EXPECT_EQ(1U, renderer_host->QueuedMessageCount());
424 CheckMessagePortMsgMessage(
425 renderer_host.get(), connector->local_port_route_id(), "test2");
426
427 // UpdateWorkerDependency should not be called.
428 EXPECT_EQ(0, s_update_worker_dependency_call_count_);
429 }
430
431 TEST_F(SharedWorkerServiceImplTest, TwoRendererTest) {
432 // The first renderer host.
433 scoped_ptr<MockRendererProcessHost> renderer_host1(
434 new MockRendererProcessHost(
435 100, browser_context_->GetResourceContext(), *partition_.get()));
436 scoped_ptr<MockSharedWorkerConnector> connector1(
437 new MockSharedWorkerConnector(renderer_host1.get()));
438 int worker_route_id;
439 int worker_msg_port_route_id1;
440
441 // SharedWorkerConnector creates two message ports and sends
442 // ViewHostMsg_CreateWorker.
443 connector1->Create("http://example.com/w.js", "name", 200, 300);
444 EXPECT_EQ(2U, renderer_host1->QueuedMessageCount());
445 // WorkerProcessMsg_CreateWorker should be sent to the renderer in which
446 // SharedWorker will be created.
447 CheckWorkerProcessMsgCreateWorker(renderer_host1.get(),
448 "http://example.com/w.js",
449 "name",
450 blink::WebContentSecurityPolicyTypeReport,
451 &worker_route_id);
452 // ViewMsg_WorkerCreated(1) should be sent back to SharedWorkerConnector side.
453 CheckViewMsgWorkerCreated(renderer_host1.get(), connector1.get());
454
455 // SharedWorkerConnector side sends MessagePortHostMsg_QueueMessages in
456 // WebSharedWorkerProxy::connect.
457 connector1->SendQueueMessages();
458 EXPECT_EQ(1U, renderer_host1->QueuedMessageCount());
459 // MessagePortMsg_MessagesQueued(2) should be sent back to
460 // SharedWorkerConnector side.
461 CheckMessagePortMsgMessagesQueued(renderer_host1.get(), connector1.get());
462
463 // When SharedWorkerConnector receives ViewMsg_WorkerCreated(1), it sends
464 // WorkerMsg_Connect wrapped in ViewHostMsg_ForwardToWorker.
465 connector1->SendConnect();
466 EXPECT_EQ(1U, renderer_host1->QueuedMessageCount());
467 // WorkerMsg_Connect should be sent to SharedWorker side.
468 CheckWorkerMsgConnect(renderer_host1.get(),
469 worker_route_id,
470 connector1->remote_port_id(),
471 &worker_msg_port_route_id1);
472
473 // When SharedWorkerConnector receives MessagePortMsg_MessagesQueued(2), it
474 // sends MessagePortHostMsg_SendQueuedMessages.
475 std::vector<QueuedMessage> empty_messages;
476 connector1->SendSendQueuedMessages(empty_messages);
477 EXPECT_EQ(0U, renderer_host1->QueuedMessageCount());
478
479 // SharedWorker sends WorkerHostMsg_WorkerScriptLoaded in
480 // EmbeddedSharedWorkerStub::workerScriptLoaded().
481 EXPECT_TRUE(renderer_host1->OnMessageReceived(
482 new WorkerHostMsg_WorkerScriptLoaded(worker_route_id)));
483 EXPECT_EQ(0U, renderer_host1->QueuedMessageCount());
484
485 // SharedWorker sends WorkerHostMsg_WorkerConnected in
486 // EmbeddedSharedWorkerStub::workerScriptLoaded().
487 EXPECT_TRUE(
488 renderer_host1->OnMessageReceived(new WorkerHostMsg_WorkerConnected(
489 connector1->remote_port_id(), worker_route_id)));
490 EXPECT_EQ(1U, renderer_host1->QueuedMessageCount());
491 // ViewMsg_WorkerConnected should be sent to SharedWorkerConnector side.
492 CheckViewMsgWorkerConnected(renderer_host1.get(), connector1.get());
493
494 // When SharedWorkerConnector side sends MessagePortHostMsg_PostMessage,
495 // SharedWorker side shuold receive MessagePortMsg_Message.
496 connector1->SendPostMessage("test1");
497 EXPECT_EQ(1U, renderer_host1->QueuedMessageCount());
498 CheckMessagePortMsgMessage(
499 renderer_host1.get(), worker_msg_port_route_id1, "test1");
500
501 // When SharedWorker side sends MessagePortHostMsg_PostMessage,
502 // SharedWorkerConnector side shuold receive MessagePortMsg_Message.
503 const std::vector<int> empty_ids;
504 EXPECT_TRUE(renderer_host1->OnMessageReceived(
505 new MessagePortHostMsg_PostMessage(connector1->remote_port_id(),
506 base::ASCIIToUTF16("test2"),
507 empty_ids)));
508 EXPECT_EQ(1U, renderer_host1->QueuedMessageCount());
509 CheckMessagePortMsgMessage(
510 renderer_host1.get(), connector1->local_port_route_id(), "test2");
511
512 // The second renderer host.
513 scoped_ptr<MockRendererProcessHost> renderer_host2(
514 new MockRendererProcessHost(
515 400, browser_context_->GetResourceContext(), *partition_.get()));
516 scoped_ptr<MockSharedWorkerConnector> connector2(
517 new MockSharedWorkerConnector(renderer_host2.get()));
518 int worker_msg_port_route_id2;
519
520 // UpdateWorkerDependency should not be called yet.
521 EXPECT_EQ(0, s_update_worker_dependency_call_count_);
522
523 // SharedWorkerConnector creates two message ports and sends
524 // ViewHostMsg_CreateWorker.
525 connector2->Create("http://example.com/w.js", "name", 500, 600);
526 EXPECT_EQ(1U, renderer_host2->QueuedMessageCount());
527 // ViewMsg_WorkerCreated(3) should be sent back to SharedWorkerConnector side.
528 CheckViewMsgWorkerCreated(renderer_host2.get(), connector2.get());
529
530 // UpdateWorkerDependency should be called.
531 EXPECT_EQ(1, s_update_worker_dependency_call_count_);
532 EXPECT_EQ(1U, s_worker_dependency_added_ids_.size());
533 EXPECT_EQ(100, s_worker_dependency_added_ids_[0]);
534 EXPECT_EQ(0U, s_worker_dependency_removed_ids_.size());
535
536 // SharedWorkerConnector side sends MessagePortHostMsg_QueueMessages in
537 // WebSharedWorkerProxy::connect.
538 connector2->SendQueueMessages();
539 EXPECT_EQ(1U, renderer_host2->QueuedMessageCount());
540 // MessagePortMsg_MessagesQueued(4) should be sent back to
541 // SharedWorkerConnector side.
542 CheckMessagePortMsgMessagesQueued(renderer_host2.get(), connector2.get());
543
544 // When SharedWorkerConnector receives ViewMsg_WorkerCreated(3), it sends
545 // WorkerMsg_Connect wrapped in ViewHostMsg_ForwardToWorker.
546 connector2->SendConnect();
547 EXPECT_EQ(1U, renderer_host1->QueuedMessageCount());
548 // WorkerMsg_Connect should be sent to SharedWorker side.
549 CheckWorkerMsgConnect(renderer_host1.get(),
550 worker_route_id,
551 connector2->remote_port_id(),
552 &worker_msg_port_route_id2);
553
554 // When SharedWorkerConnector receives MessagePortMsg_MessagesQueued(4), it
555 // sends MessagePortHostMsg_SendQueuedMessages.
556 connector2->SendSendQueuedMessages(empty_messages);
557 EXPECT_EQ(0U, renderer_host2->QueuedMessageCount());
558
559 // SharedWorker sends WorkerHostMsg_WorkerConnected in
560 // EmbeddedSharedWorkerStub::OnConnect().
561 EXPECT_TRUE(
562 renderer_host1->OnMessageReceived(new WorkerHostMsg_WorkerConnected(
563 connector2->remote_port_id(), worker_route_id)));
564 EXPECT_EQ(1U, renderer_host2->QueuedMessageCount());
565 // ViewMsg_WorkerConnected should be sent to SharedWorkerConnector side.
566 CheckViewMsgWorkerConnected(renderer_host2.get(), connector2.get());
567
568 // When SharedWorkerConnector side sends MessagePortHostMsg_PostMessage,
569 // SharedWorker side shuold receive MessagePortMsg_Message.
570 connector2->SendPostMessage("test3");
571 EXPECT_EQ(1U, renderer_host1->QueuedMessageCount());
572 CheckMessagePortMsgMessage(
573 renderer_host1.get(), worker_msg_port_route_id2, "test3");
574
575 // When SharedWorker side sends MessagePortHostMsg_PostMessage,
576 // SharedWorkerConnector side shuold receive MessagePortMsg_Message.
577 EXPECT_TRUE(renderer_host1->OnMessageReceived(
578 new MessagePortHostMsg_PostMessage(connector2->remote_port_id(),
579 base::ASCIIToUTF16("test4"),
580 empty_ids)));
581 EXPECT_EQ(1U, renderer_host2->QueuedMessageCount());
582 CheckMessagePortMsgMessage(
583 renderer_host2.get(), connector2->local_port_route_id(), "test4");
584
585 EXPECT_EQ(1, s_update_worker_dependency_call_count_);
586 renderer_host2.reset();
587 // UpdateWorkerDependency should be called.
588 EXPECT_EQ(2, s_update_worker_dependency_call_count_);
589 EXPECT_EQ(0U, s_worker_dependency_added_ids_.size());
590 EXPECT_EQ(1U, s_worker_dependency_removed_ids_.size());
591 EXPECT_EQ(100, s_worker_dependency_removed_ids_[0]);
592 }
593
594 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/shared_worker/shared_worker_service_impl.cc ('k') | content/content_tests.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698