| 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 |