| OLD | NEW |
| (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(), ¶m)); |
| 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 |
| OLD | NEW |