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 // The renderer should have received a StopWorker request. |
857 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); | 934 EXPECT_TRUE(stop_worker_callback()); |
falken
2017/01/12 04:14:47
I'd put the empty line at 933 instead of 935, all
shimazu
2017/01/12 05:25:21
Done.
| |
935 | |
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 |