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/service_worker/service_worker_version.h" | 5 #include "content/browser/service_worker/service_worker_version.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 #include <tuple> | 8 #include <tuple> |
9 | 9 |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerVersionTest); | 300 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerVersionTest); |
301 }; | 301 }; |
302 | 302 |
303 class MessageReceiverDisallowStart : public MessageReceiver { | 303 class MessageReceiverDisallowStart : public MessageReceiver { |
304 public: | 304 public: |
305 MessageReceiverDisallowStart() : MessageReceiver() {} | 305 MessageReceiverDisallowStart() : MessageReceiver() {} |
306 ~MessageReceiverDisallowStart() override {} | 306 ~MessageReceiverDisallowStart() override {} |
307 | 307 |
308 enum class StartMode { STALL, FAIL, SUCCEED }; | 308 enum class StartMode { STALL, FAIL, SUCCEED }; |
309 | 309 |
310 void OnStartWorker(int embedded_worker_id, | 310 void OnStartWorker( |
311 int64_t service_worker_version_id, | 311 int embedded_worker_id, |
312 const GURL& scope, | 312 int64_t service_worker_version_id, |
313 const GURL& script_url, | 313 const GURL& scope, |
314 bool pause_after_download) override { | 314 const GURL& script_url, |
| 315 bool pause_after_download, |
| 316 mojom::ServiceWorkerEventDispatcherRequest request) override { |
315 switch (mode_) { | 317 switch (mode_) { |
316 case StartMode::STALL: | 318 case StartMode::STALL: |
317 break; // Do nothing. | 319 break; // Do nothing. |
318 case StartMode::FAIL: | 320 case StartMode::FAIL: |
319 ASSERT_EQ(current_mock_instance_index_ + 1, | 321 ASSERT_EQ(current_mock_instance_index_ + 1, |
320 mock_instance_clients()->size()); | 322 mock_instance_clients()->size()); |
321 // Remove the connection by peer | 323 // Remove the connection by peer |
322 mock_instance_clients()->at(current_mock_instance_index_).reset(); | 324 mock_instance_clients()->at(current_mock_instance_index_).reset(); |
323 break; | 325 break; |
324 case StartMode::SUCCEED: | 326 case StartMode::SUCCEED: |
325 MessageReceiver::OnStartWorker(embedded_worker_id, | 327 MessageReceiver::OnStartWorker( |
326 service_worker_version_id, scope, | 328 embedded_worker_id, service_worker_version_id, scope, script_url, |
327 script_url, pause_after_download); | 329 pause_after_download, std::move(request)); |
328 break; | 330 break; |
329 } | 331 } |
330 current_mock_instance_index_++; | 332 current_mock_instance_index_++; |
331 } | 333 } |
332 | 334 |
333 void set_start_mode(StartMode mode) { mode_ = mode; } | 335 void set_start_mode(StartMode mode) { mode_ = mode; } |
334 | 336 |
335 private: | 337 private: |
336 uint32_t current_mock_instance_index_ = 0; | 338 uint32_t current_mock_instance_index_ = 0; |
337 StartMode mode_ = StartMode::STALL; | 339 StartMode mode_ = StartMode::STALL; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 }; | 383 }; |
382 | 384 |
383 class MessageReceiverDisallowStop : public MessageReceiver { | 385 class MessageReceiverDisallowStop : public MessageReceiver { |
384 public: | 386 public: |
385 MessageReceiverDisallowStop() : MessageReceiver() { | 387 MessageReceiverDisallowStop() : MessageReceiver() { |
386 CreateAndRegisterMockInstanceClient< | 388 CreateAndRegisterMockInstanceClient< |
387 NoOpStopWorkerEmbeddedWorkerInstanceClient>(AsWeakPtr()); | 389 NoOpStopWorkerEmbeddedWorkerInstanceClient>(AsWeakPtr()); |
388 } | 390 } |
389 ~MessageReceiverDisallowStop() override {} | 391 ~MessageReceiverDisallowStop() override {} |
390 | 392 |
391 void OnStopWorker(int embedded_worker_id) override { | 393 void OnStopWorker( |
| 394 const mojom::EmbeddedWorkerInstanceClient::StopWorkerCallback& callback) |
| 395 override { |
392 // Do nothing. | 396 // Do nothing. |
393 } | 397 } |
394 | 398 |
395 private: | 399 private: |
396 DISALLOW_COPY_AND_ASSIGN(MessageReceiverDisallowStop); | 400 DISALLOW_COPY_AND_ASSIGN(MessageReceiverDisallowStop); |
397 }; | 401 }; |
398 | 402 |
399 class ServiceWorkerStallInStoppingTest : public ServiceWorkerVersionTest { | 403 class ServiceWorkerStallInStoppingTest : public ServiceWorkerVersionTest { |
400 protected: | 404 protected: |
401 ServiceWorkerStallInStoppingTest() : ServiceWorkerVersionTest() {} | 405 ServiceWorkerStallInStoppingTest() : ServiceWorkerVersionTest() {} |
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
823 // Update timer is not deferred. | 827 // Update timer is not deferred. |
824 base::TimeTicks run_time = version_->update_timer_.desired_run_time(); | 828 base::TimeTicks run_time = version_->update_timer_.desired_run_time(); |
825 SimulateDispatchEvent(ServiceWorkerMetrics::EventType::PUSH); | 829 SimulateDispatchEvent(ServiceWorkerMetrics::EventType::PUSH); |
826 SimulateDispatchEvent(ServiceWorkerMetrics::EventType::PUSH); | 830 SimulateDispatchEvent(ServiceWorkerMetrics::EventType::PUSH); |
827 SimulateDispatchEvent(ServiceWorkerMetrics::EventType::PUSH); | 831 SimulateDispatchEvent(ServiceWorkerMetrics::EventType::PUSH); |
828 base::RunLoop().RunUntilIdle(); | 832 base::RunLoop().RunUntilIdle(); |
829 EXPECT_TRUE(version_->stale_time_.is_null()); | 833 EXPECT_TRUE(version_->stale_time_.is_null()); |
830 EXPECT_EQ(run_time, version_->update_timer_.desired_run_time()); | 834 EXPECT_EQ(run_time, version_->update_timer_.desired_run_time()); |
831 } | 835 } |
832 | 836 |
833 TEST_F(ServiceWorkerVersionTest, RequestTimeout) { | 837 class MessageReceiverControlEvents : public MessageReceiver { |
834 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value | 838 public: |
| 839 MessageReceiverControlEvents() : MessageReceiver() {} |
| 840 ~MessageReceiverControlEvents() override {} |
| 841 |
| 842 void OnExtendableMessageEvent( |
| 843 mojom::ExtendableMessageEventPtr event, |
| 844 const mojom::ServiceWorkerEventDispatcher:: |
| 845 DispatchExtendableMessageEventCallback& callback) override { |
| 846 EXPECT_FALSE(extendable_message_event_callback_); |
| 847 extendable_message_event_callback_ = callback; |
| 848 } |
| 849 |
| 850 void OnStopWorker( |
| 851 const mojom::EmbeddedWorkerInstanceClient::StopWorkerCallback& callback) |
| 852 override { |
| 853 EXPECT_FALSE(stop_worker_callback_); |
| 854 stop_worker_callback_ = callback; |
| 855 } |
| 856 |
| 857 const mojom::ServiceWorkerEventDispatcher:: |
| 858 DispatchExtendableMessageEventCallback& |
| 859 extendable_message_event_callback() { |
| 860 return extendable_message_event_callback_; |
| 861 } |
| 862 |
| 863 const mojom::EmbeddedWorkerInstanceClient::StopWorkerCallback& |
| 864 stop_worker_callback() { |
| 865 return stop_worker_callback_; |
| 866 } |
| 867 |
| 868 private: |
| 869 mojom::ServiceWorkerEventDispatcher::DispatchExtendableMessageEventCallback |
| 870 extendable_message_event_callback_; |
| 871 mojom::EmbeddedWorkerInstanceClient::StopWorkerCallback stop_worker_callback_; |
| 872 }; |
| 873 |
| 874 class ServiceWorkerRequestTimeoutTest : public ServiceWorkerVersionTest { |
| 875 protected: |
| 876 ServiceWorkerRequestTimeoutTest() : ServiceWorkerVersionTest() {} |
| 877 |
| 878 std::unique_ptr<MessageReceiver> GetMessageReceiver() override { |
| 879 return base::MakeUnique<MessageReceiverControlEvents>(); |
| 880 } |
| 881 |
| 882 const mojom::ServiceWorkerEventDispatcher:: |
| 883 DispatchExtendableMessageEventCallback& |
| 884 extendable_message_event_callback() { |
| 885 return static_cast<MessageReceiverControlEvents*>(helper_.get()) |
| 886 ->extendable_message_event_callback(); |
| 887 } |
| 888 |
| 889 const mojom::EmbeddedWorkerInstanceClient::StopWorkerCallback& |
| 890 stop_worker_callback() { |
| 891 return static_cast<MessageReceiverControlEvents*>(helper_.get()) |
| 892 ->stop_worker_callback(); |
| 893 } |
| 894 |
| 895 private: |
| 896 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRequestTimeoutTest); |
| 897 }; |
| 898 |
| 899 TEST_F(ServiceWorkerRequestTimeoutTest, RequestTimeout) { |
| 900 ServiceWorkerStatusCode error_status = |
| 901 SERVICE_WORKER_ERROR_NETWORK; // dummy value |
835 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 902 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
836 | 903 |
837 version_->StartWorker(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME, | 904 version_->StartWorker(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME, |
838 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 905 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
839 base::RunLoop().RunUntilIdle(); | 906 base::RunLoop().RunUntilIdle(); |
840 | 907 |
841 // Create a request. | 908 // Create a request. |
842 int request_id = | 909 int request_id = |
843 version_->StartRequest(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME, | 910 version_->StartRequest(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME, |
844 CreateReceiverOnCurrentThread(&status)); | 911 CreateReceiverOnCurrentThread(&error_status)); |
| 912 |
| 913 // Dispatch a dummy event whose response will be received by SWVersion. |
| 914 EXPECT_FALSE(extendable_message_event_callback()); |
| 915 version_->event_dispatcher()->DispatchExtendableMessageEvent( |
| 916 mojom::ExtendableMessageEvent::New(), |
| 917 base::Bind(&ServiceWorkerVersion::OnSimpleEventFinished, version_, |
| 918 request_id)); |
845 base::RunLoop().RunUntilIdle(); | 919 base::RunLoop().RunUntilIdle(); |
| 920 // The renderer should have received an ExtendableMessageEvent request. |
| 921 EXPECT_TRUE(extendable_message_event_callback()); |
846 | 922 |
847 // Callback has not completed yet. | 923 // Callback has not completed yet. |
848 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, status); | 924 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, error_status); |
849 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); | 925 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); |
850 | 926 |
851 // Simulate timeout. | 927 // Simulate timeout. |
| 928 EXPECT_FALSE(stop_worker_callback()); |
852 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); | 929 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); |
853 version_->SetAllRequestExpirations(base::TimeTicks::Now()); | 930 version_->SetAllRequestExpirations(base::TimeTicks::Now()); |
854 version_->timeout_timer_.user_task().Run(); | 931 version_->timeout_timer_.user_task().Run(); |
855 base::RunLoop().RunUntilIdle(); | 932 base::RunLoop().RunUntilIdle(); |
856 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); | 933 |
857 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); | 934 // The renderer should have received a StopWorker request. |
| 935 EXPECT_TRUE(stop_worker_callback()); |
| 936 // The request should have timed out. |
| 937 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, error_status); |
| 938 // Calling FinishRequest should be no-op, since the request timed out. |
858 EXPECT_FALSE(version_->FinishRequest(request_id, true /* was_handled */, | 939 EXPECT_FALSE(version_->FinishRequest(request_id, true /* was_handled */, |
859 base::Time::Now())); | 940 base::Time::Now())); |
| 941 |
| 942 // Simulate the renderer aborting the pending event. |
| 943 // This should not crash: https://crbug.com/676984. |
| 944 extendable_message_event_callback().Run(SERVICE_WORKER_ERROR_ABORT, |
| 945 base::Time::Now()); |
| 946 base::RunLoop().RunUntilIdle(); |
| 947 |
| 948 // Simulate the renderer stopping the worker. |
| 949 stop_worker_callback().Run(); |
| 950 base::RunLoop().RunUntilIdle(); |
| 951 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); |
860 } | 952 } |
861 | 953 |
862 TEST_F(ServiceWorkerVersionTest, RequestNowTimeout) { | 954 TEST_F(ServiceWorkerVersionTest, RequestNowTimeout) { |
863 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value | 955 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
864 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 956 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
865 | 957 |
866 version_->StartWorker(ServiceWorkerMetrics::EventType::SYNC, | 958 version_->StartWorker(ServiceWorkerMetrics::EventType::SYNC, |
867 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 959 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
868 base::RunLoop().RunUntilIdle(); | 960 base::RunLoop().RunUntilIdle(); |
869 | 961 |
(...skipping 893 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1763 histogram_tester_.ExpectTotalCount(kLinkMouseDown, 1); | 1855 histogram_tester_.ExpectTotalCount(kLinkMouseDown, 1); |
1764 histogram_tester_.ExpectTotalCount(kLinkTapDown, 0); | 1856 histogram_tester_.ExpectTotalCount(kLinkTapDown, 0); |
1765 EXPECT_EQ(SERVICE_WORKER_OK, status); | 1857 EXPECT_EQ(SERVICE_WORKER_OK, status); |
1766 StopWorker(); | 1858 StopWorker(); |
1767 // The UMA for kLinkMouseDown must be recorded when the worker stopped. | 1859 // The UMA for kLinkMouseDown must be recorded when the worker stopped. |
1768 histogram_tester_.ExpectTotalCount(kLinkMouseDown, 1); | 1860 histogram_tester_.ExpectTotalCount(kLinkMouseDown, 1); |
1769 histogram_tester_.ExpectTotalCount(kLinkTapDown, 1); | 1861 histogram_tester_.ExpectTotalCount(kLinkTapDown, 1); |
1770 } | 1862 } |
1771 | 1863 |
1772 } // namespace content | 1864 } // namespace content |
OLD | NEW |