Chromium Code Reviews| 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 |