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 816 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 EXPECT_EQ(run_time, version_->update_timer_.desired_run_time()); | 827 EXPECT_EQ(run_time, version_->update_timer_.desired_run_time()); |
828 } | 828 } |
829 | 829 |
830 class MessageReceiverControlEvents : public MessageReceiver { | 830 class MessageReceiverControlEvents : public MessageReceiver { |
831 public: | 831 public: |
832 MessageReceiverControlEvents() : MessageReceiver() {} | 832 MessageReceiverControlEvents() : MessageReceiver() {} |
833 ~MessageReceiverControlEvents() override {} | 833 ~MessageReceiverControlEvents() override {} |
834 | 834 |
835 void OnExtendableMessageEvent( | 835 void OnExtendableMessageEvent( |
836 mojom::ExtendableMessageEventPtr event, | 836 mojom::ExtendableMessageEventPtr event, |
837 const mojom::ServiceWorkerEventDispatcher:: | 837 mojom::ServiceWorkerEventDispatcher:: |
838 DispatchExtendableMessageEventCallback& callback) override { | 838 DispatchExtendableMessageEventCallback callback) override { |
839 EXPECT_FALSE(extendable_message_event_callback_); | 839 EXPECT_FALSE(extendable_message_event_callback_); |
840 extendable_message_event_callback_ = callback; | 840 extendable_message_event_callback_ = std::move(callback); |
841 } | 841 } |
842 | 842 |
843 void OnStopWorker(int embedded_worker_id) override { | 843 void OnStopWorker(int embedded_worker_id) override { |
844 EXPECT_FALSE(stop_worker_callback_); | 844 EXPECT_FALSE(stop_worker_callback_); |
845 stop_worker_callback_ = | 845 stop_worker_callback_ = |
846 base::Bind(&MessageReceiverControlEvents::SimulateWorkerStopped, | 846 base::Bind(&MessageReceiverControlEvents::SimulateWorkerStopped, |
847 base::Unretained(this), embedded_worker_id); | 847 base::Unretained(this), embedded_worker_id); |
848 } | 848 } |
849 | 849 |
850 const mojom::ServiceWorkerEventDispatcher:: | 850 bool has_extendable_message_event_callback() { |
851 DispatchExtendableMessageEventCallback& | 851 return !extendable_message_event_callback_.is_null(); |
852 extendable_message_event_callback() { | 852 } |
853 return extendable_message_event_callback_; | 853 |
| 854 mojom::ServiceWorkerEventDispatcher::DispatchExtendableMessageEventCallback |
| 855 TakeExtendableMessageEventCallback() { |
| 856 return std::move(extendable_message_event_callback_); |
854 } | 857 } |
855 | 858 |
856 const base::Closure& stop_worker_callback() { return stop_worker_callback_; } | 859 const base::Closure& stop_worker_callback() { return stop_worker_callback_; } |
857 | 860 |
858 private: | 861 private: |
859 mojom::ServiceWorkerEventDispatcher::DispatchExtendableMessageEventCallback | 862 mojom::ServiceWorkerEventDispatcher::DispatchExtendableMessageEventCallback |
860 extendable_message_event_callback_; | 863 extendable_message_event_callback_; |
861 base::Closure stop_worker_callback_; | 864 base::Closure stop_worker_callback_; |
862 }; | 865 }; |
863 | 866 |
864 class ServiceWorkerRequestTimeoutTest : public ServiceWorkerVersionTest { | 867 class ServiceWorkerRequestTimeoutTest : public ServiceWorkerVersionTest { |
865 protected: | 868 protected: |
866 ServiceWorkerRequestTimeoutTest() : ServiceWorkerVersionTest() {} | 869 ServiceWorkerRequestTimeoutTest() : ServiceWorkerVersionTest() {} |
867 | 870 |
868 std::unique_ptr<MessageReceiver> GetMessageReceiver() override { | 871 std::unique_ptr<MessageReceiver> GetMessageReceiver() override { |
869 return base::MakeUnique<MessageReceiverControlEvents>(); | 872 return base::MakeUnique<MessageReceiverControlEvents>(); |
870 } | 873 } |
871 | 874 |
872 const mojom::ServiceWorkerEventDispatcher:: | 875 bool has_extendable_message_event_callback() { |
873 DispatchExtendableMessageEventCallback& | |
874 extendable_message_event_callback() { | |
875 return static_cast<MessageReceiverControlEvents*>(helper_.get()) | 876 return static_cast<MessageReceiverControlEvents*>(helper_.get()) |
876 ->extendable_message_event_callback(); | 877 ->has_extendable_message_event_callback(); |
| 878 } |
| 879 |
| 880 mojom::ServiceWorkerEventDispatcher::DispatchExtendableMessageEventCallback |
| 881 TakeExtendableMessageEventCallback() { |
| 882 return static_cast<MessageReceiverControlEvents*>(helper_.get()) |
| 883 ->TakeExtendableMessageEventCallback(); |
877 } | 884 } |
878 | 885 |
879 const base::Closure& stop_worker_callback() { | 886 const base::Closure& stop_worker_callback() { |
880 return static_cast<MessageReceiverControlEvents*>(helper_.get()) | 887 return static_cast<MessageReceiverControlEvents*>(helper_.get()) |
881 ->stop_worker_callback(); | 888 ->stop_worker_callback(); |
882 } | 889 } |
883 | 890 |
884 private: | 891 private: |
885 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRequestTimeoutTest); | 892 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRequestTimeoutTest); |
886 }; | 893 }; |
887 | 894 |
888 TEST_F(ServiceWorkerRequestTimeoutTest, RequestTimeout) { | 895 TEST_F(ServiceWorkerRequestTimeoutTest, RequestTimeout) { |
889 ServiceWorkerStatusCode error_status = | 896 ServiceWorkerStatusCode error_status = |
890 SERVICE_WORKER_ERROR_NETWORK; // dummy value | 897 SERVICE_WORKER_ERROR_NETWORK; // dummy value |
891 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 898 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
892 | 899 |
893 version_->StartWorker(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME, | 900 version_->StartWorker(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME, |
894 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 901 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
895 base::RunLoop().RunUntilIdle(); | 902 base::RunLoop().RunUntilIdle(); |
896 | 903 |
897 // Create a request. | 904 // Create a request. |
898 int request_id = | 905 int request_id = |
899 version_->StartRequest(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME, | 906 version_->StartRequest(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME, |
900 CreateReceiverOnCurrentThread(&error_status)); | 907 CreateReceiverOnCurrentThread(&error_status)); |
901 | 908 |
902 // Dispatch a dummy event whose response will be received by SWVersion. | 909 // Dispatch a dummy event whose response will be received by SWVersion. |
903 EXPECT_FALSE(extendable_message_event_callback()); | 910 EXPECT_FALSE(has_extendable_message_event_callback()); |
904 version_->event_dispatcher()->DispatchExtendableMessageEvent( | 911 version_->event_dispatcher()->DispatchExtendableMessageEvent( |
905 mojom::ExtendableMessageEvent::New(), | 912 mojom::ExtendableMessageEvent::New(), |
906 version_->CreateSimpleEventCallback(request_id)); | 913 version_->CreateSimpleEventCallback(request_id)); |
907 | 914 |
908 base::RunLoop().RunUntilIdle(); | 915 base::RunLoop().RunUntilIdle(); |
909 // The renderer should have received an ExtendableMessageEvent request. | 916 // The renderer should have received an ExtendableMessageEvent request. |
910 EXPECT_TRUE(extendable_message_event_callback()); | 917 EXPECT_TRUE(has_extendable_message_event_callback()); |
911 | 918 |
912 // Callback has not completed yet. | 919 // Callback has not completed yet. |
913 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, error_status); | 920 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, error_status); |
914 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); | 921 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); |
915 | 922 |
916 // Simulate timeout. | 923 // Simulate timeout. |
917 EXPECT_FALSE(stop_worker_callback()); | 924 EXPECT_FALSE(stop_worker_callback()); |
918 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); | 925 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); |
919 version_->SetAllRequestExpirations(base::TimeTicks::Now()); | 926 version_->SetAllRequestExpirations(base::TimeTicks::Now()); |
920 version_->timeout_timer_.user_task().Run(); | 927 version_->timeout_timer_.user_task().Run(); |
921 base::RunLoop().RunUntilIdle(); | 928 base::RunLoop().RunUntilIdle(); |
922 | 929 |
923 // The renderer should have received a StopWorker request. | 930 // The renderer should have received a StopWorker request. |
924 EXPECT_TRUE(stop_worker_callback()); | 931 EXPECT_TRUE(stop_worker_callback()); |
925 // The request should have timed out. | 932 // The request should have timed out. |
926 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, error_status); | 933 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, error_status); |
927 // Calling FinishRequest should be no-op, since the request timed out. | 934 // Calling FinishRequest should be no-op, since the request timed out. |
928 EXPECT_FALSE(version_->FinishRequest(request_id, true /* was_handled */, | 935 EXPECT_FALSE(version_->FinishRequest(request_id, true /* was_handled */, |
929 base::Time::Now())); | 936 base::Time::Now())); |
930 | 937 |
931 // Simulate the renderer aborting the pending event. | 938 // Simulate the renderer aborting the pending event. |
932 // This should not crash: https://crbug.com/676984. | 939 // This should not crash: https://crbug.com/676984. |
933 extendable_message_event_callback().Run(SERVICE_WORKER_ERROR_ABORT, | 940 TakeExtendableMessageEventCallback().Run(SERVICE_WORKER_ERROR_ABORT, |
934 base::Time::Now()); | 941 base::Time::Now()); |
935 base::RunLoop().RunUntilIdle(); | 942 base::RunLoop().RunUntilIdle(); |
936 | 943 |
937 // Simulate the renderer stopping the worker. | 944 // Simulate the renderer stopping the worker. |
938 stop_worker_callback().Run(); | 945 stop_worker_callback().Run(); |
939 base::RunLoop().RunUntilIdle(); | 946 base::RunLoop().RunUntilIdle(); |
940 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); | 947 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); |
941 } | 948 } |
942 | 949 |
943 TEST_F(ServiceWorkerVersionTest, RequestNowTimeout) { | 950 TEST_F(ServiceWorkerVersionTest, RequestNowTimeout) { |
944 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value | 951 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
(...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1611 // Should not have timed out, so error callback should not have been | 1618 // Should not have timed out, so error callback should not have been |
1612 // called and FinishRequest should return true. | 1619 // called and FinishRequest should return true. |
1613 EXPECT_EQ(SERVICE_WORKER_OK, status); | 1620 EXPECT_EQ(SERVICE_WORKER_OK, status); |
1614 EXPECT_TRUE(version_->FinishRequest(request_id1, true /* was_handled */, | 1621 EXPECT_TRUE(version_->FinishRequest(request_id1, true /* was_handled */, |
1615 base::Time::Now())); | 1622 base::Time::Now())); |
1616 EXPECT_TRUE(version_->FinishRequest(request_id2, true /* was_handled */, | 1623 EXPECT_TRUE(version_->FinishRequest(request_id2, true /* was_handled */, |
1617 base::Time::Now())); | 1624 base::Time::Now())); |
1618 } | 1625 } |
1619 | 1626 |
1620 } // namespace content | 1627 } // namespace content |
OLD | NEW |