| 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 <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 scoped_refptr<ServiceWorkerContextWrapper> wrapper_; | 377 scoped_refptr<ServiceWorkerContextWrapper> wrapper_; |
| 378 }; | 378 }; |
| 379 | 379 |
| 380 class ConsoleListener : public EmbeddedWorkerInstance::Listener { | 380 class ConsoleListener : public EmbeddedWorkerInstance::Listener { |
| 381 public: | 381 public: |
| 382 void OnReportConsoleMessage(int source_identifier, | 382 void OnReportConsoleMessage(int source_identifier, |
| 383 int message_level, | 383 int message_level, |
| 384 const base::string16& message, | 384 const base::string16& message, |
| 385 int line_number, | 385 int line_number, |
| 386 const GURL& source_url) override { | 386 const GURL& source_url) override { |
| 387 messages_.push_back(message); | 387 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 388 if (!quit_.is_null() && messages_.size() == expected_message_count_) { | 388 BrowserThread::PostTask( |
| 389 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit_); | 389 BrowserThread::UI, FROM_HERE, |
| 390 quit_.Reset(); | 390 base::Bind(&ConsoleListener::OnReportConsoleMessageOnUI, |
| 391 } | 391 base::Unretained(this), message)); |
| 392 } | 392 } |
| 393 | 393 |
| 394 void WaitForConsoleMessages(size_t expected_message_count) { | 394 void WaitForConsoleMessages(size_t expected_message_count) { |
| 395 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 395 if (messages_.size() >= expected_message_count) | 396 if (messages_.size() >= expected_message_count) |
| 396 return; | 397 return; |
| 397 | 398 |
| 398 expected_message_count_ = expected_message_count; | 399 expected_message_count_ = expected_message_count; |
| 399 base::RunLoop console_run_loop; | 400 base::RunLoop console_run_loop; |
| 400 quit_ = console_run_loop.QuitClosure(); | 401 quit_ = console_run_loop.QuitClosure(); |
| 401 console_run_loop.Run(); | 402 console_run_loop.Run(); |
| 402 | 403 |
| 403 ASSERT_EQ(messages_.size(), expected_message_count); | 404 ASSERT_EQ(messages_.size(), expected_message_count); |
| 404 } | 405 } |
| 405 | 406 |
| 406 bool OnMessageReceived(const IPC::Message& message) override { return false; } | 407 bool OnMessageReceived(const IPC::Message& message) override { return false; } |
| 407 const std::vector<base::string16>& messages() const { return messages_; } | 408 const std::vector<base::string16>& messages() const { return messages_; } |
| 408 | 409 |
| 409 private: | 410 private: |
| 411 void OnReportConsoleMessageOnUI(const base::string16& message) { |
| 412 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 413 messages_.push_back(message); |
| 414 if (messages_.size() == expected_message_count_) |
| 415 quit_.Run(); |
| 416 } |
| 417 |
| 418 // These parameters must be accessed on the UI thread. |
| 410 std::vector<base::string16> messages_; | 419 std::vector<base::string16> messages_; |
| 411 size_t expected_message_count_; | 420 size_t expected_message_count_; |
| 412 base::Closure quit_; | 421 base::Closure quit_; |
| 413 }; | 422 }; |
| 414 | 423 |
| 415 class ServiceWorkerVersionBrowserTest : public ServiceWorkerBrowserTest { | 424 class ServiceWorkerVersionBrowserTest : public ServiceWorkerBrowserTest { |
| 416 public: | 425 public: |
| 417 using self = ServiceWorkerVersionBrowserTest; | 426 using self = ServiceWorkerVersionBrowserTest; |
| 418 | 427 |
| 419 ~ServiceWorkerVersionBrowserTest() override {} | 428 ~ServiceWorkerVersionBrowserTest() override {} |
| (...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 932 ActivateTestHelper("/service_worker/worker_activate_rejected.js", | 941 ActivateTestHelper("/service_worker/worker_activate_rejected.js", |
| 933 SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED); | 942 SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED); |
| 934 } | 943 } |
| 935 | 944 |
| 936 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, | 945 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, |
| 937 InstallWithWaitUntil_Rejected) { | 946 InstallWithWaitUntil_Rejected) { |
| 938 InstallTestHelper("/service_worker/worker_install_rejected.js", | 947 InstallTestHelper("/service_worker/worker_install_rejected.js", |
| 939 SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED); | 948 SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED); |
| 940 } | 949 } |
| 941 | 950 |
| 942 // Has errors under TSan. See https://crbug.com/631323. | |
| 943 #if defined(THREAD_SANITIZER) | |
| 944 #define MAYBE_InstallWithWaitUntil_RejectConsoleMessage \ | |
| 945 DISABLED_InstallWithWaitUntil_RejectConsoleMessage | |
| 946 #else | |
| 947 #define MAYBE_InstallWithWaitUntil_RejectConsoleMessage \ | |
| 948 InstallWithWaitUntil_RejectConsoleMessage | |
| 949 #endif | |
| 950 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, | 951 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, |
| 951 MAYBE_InstallWithWaitUntil_RejectConsoleMessage) { | 952 InstallWithWaitUntil_RejectConsoleMessage) { |
| 952 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, | 953 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, |
| 953 base::Unretained(this), | 954 base::Unretained(this), |
| 954 "/service_worker/worker_install_rejected.js")); | 955 "/service_worker/worker_install_rejected.js")); |
| 955 | 956 |
| 956 ConsoleListener console_listener; | 957 ConsoleListener console_listener; |
| 957 version_->embedded_worker()->AddListener(&console_listener); | 958 RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::AddListener, |
| 959 base::Unretained(version_->embedded_worker()), |
| 960 &console_listener)); |
| 958 | 961 |
| 959 // Dispatch install on a worker. | 962 // Dispatch install on a worker. |
| 960 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 963 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 961 base::RunLoop install_run_loop; | 964 base::RunLoop install_run_loop; |
| 962 BrowserThread::PostTask( | 965 BrowserThread::PostTask( |
| 963 BrowserThread::IO, FROM_HERE, | 966 BrowserThread::IO, FROM_HERE, |
| 964 base::Bind(&self::InstallOnIOThread, base::Unretained(this), | 967 base::Bind(&self::InstallOnIOThread, base::Unretained(this), |
| 965 install_run_loop.QuitClosure(), &status)); | 968 install_run_loop.QuitClosure(), &status)); |
| 966 install_run_loop.Run(); | 969 install_run_loop.Run(); |
| 967 ASSERT_EQ(SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, status); | 970 ASSERT_EQ(SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, status); |
| 968 | 971 |
| 969 const base::string16 expected = | 972 const base::string16 expected = |
| 970 base::ASCIIToUTF16("Rejecting oninstall event"); | 973 base::ASCIIToUTF16("Rejecting oninstall event"); |
| 971 console_listener.WaitForConsoleMessages(1); | 974 console_listener.WaitForConsoleMessages(1); |
| 972 ASSERT_NE(base::string16::npos, | 975 ASSERT_NE(base::string16::npos, |
| 973 console_listener.messages()[0].find(expected)); | 976 console_listener.messages()[0].find(expected)); |
| 974 version_->embedded_worker()->RemoveListener(&console_listener); | 977 RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::RemoveListener, |
| 978 base::Unretained(version_->embedded_worker()), |
| 979 &console_listener)); |
| 975 } | 980 } |
| 976 | 981 |
| 977 class WaitForLoaded : public EmbeddedWorkerInstance::Listener { | 982 class WaitForLoaded : public EmbeddedWorkerInstance::Listener { |
| 978 public: | 983 public: |
| 979 explicit WaitForLoaded(const base::Closure& quit) : quit_(quit) {} | 984 explicit WaitForLoaded(const base::Closure& quit) : quit_(quit) {} |
| 980 | 985 |
| 981 void OnThreadStarted() override { | 986 void OnThreadStarted() override { |
| 987 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 982 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit_); | 988 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit_); |
| 983 } | 989 } |
| 984 bool OnMessageReceived(const IPC::Message& message) override { return false; } | 990 bool OnMessageReceived(const IPC::Message& message) override { return false; } |
| 985 | 991 |
| 986 private: | 992 private: |
| 987 base::Closure quit_; | 993 base::Closure quit_; |
| 988 }; | 994 }; |
| 989 | 995 |
| 990 // Has errors under TSan. See https://crbug.com/631323. | 996 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, TimeoutStartingWorker) { |
| 991 #if defined(THREAD_SANITIZER) | |
| 992 #define MAYBE_TimeoutStartingWorker DISABLED_TimeoutStartingWorker | |
| 993 #else | |
| 994 #define MAYBE_TimeoutStartingWorker TimeoutStartingWorker | |
| 995 #endif | |
| 996 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, | |
| 997 MAYBE_TimeoutStartingWorker) { | |
| 998 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, | 997 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, |
| 999 base::Unretained(this), | 998 base::Unretained(this), |
| 1000 "/service_worker/while_true_worker.js")); | 999 "/service_worker/while_true_worker.js")); |
| 1001 | 1000 |
| 1002 // Start a worker, waiting until the script is loaded. | 1001 // Start a worker, waiting until the script is loaded. |
| 1003 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 1002 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 1004 base::RunLoop start_run_loop; | 1003 base::RunLoop start_run_loop; |
| 1005 base::RunLoop load_run_loop; | 1004 base::RunLoop load_run_loop; |
| 1006 WaitForLoaded wait_for_load(load_run_loop.QuitClosure()); | 1005 WaitForLoaded wait_for_load(load_run_loop.QuitClosure()); |
| 1007 version_->embedded_worker()->AddListener(&wait_for_load); | 1006 RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::AddListener, |
| 1007 base::Unretained(version_->embedded_worker()), |
| 1008 &wait_for_load)); |
| 1008 BrowserThread::PostTask( | 1009 BrowserThread::PostTask( |
| 1009 BrowserThread::IO, FROM_HERE, | 1010 BrowserThread::IO, FROM_HERE, |
| 1010 base::Bind(&self::StartOnIOThread, base::Unretained(this), | 1011 base::Bind(&self::StartOnIOThread, base::Unretained(this), |
| 1011 start_run_loop.QuitClosure(), &status)); | 1012 start_run_loop.QuitClosure(), &status)); |
| 1012 load_run_loop.Run(); | 1013 load_run_loop.Run(); |
| 1013 version_->embedded_worker()->RemoveListener(&wait_for_load); | 1014 RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::RemoveListener, |
| 1015 base::Unretained(version_->embedded_worker()), |
| 1016 &wait_for_load)); |
| 1014 | 1017 |
| 1015 // The script has loaded but start has not completed yet. | 1018 // The script has loaded but start has not completed yet. |
| 1016 ASSERT_EQ(SERVICE_WORKER_ERROR_FAILED, status); | 1019 ASSERT_EQ(SERVICE_WORKER_ERROR_FAILED, status); |
| 1017 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, version_->running_status()); | 1020 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, version_->running_status()); |
| 1018 | 1021 |
| 1019 // Simulate execution timeout. Use a delay to prevent killing the worker | 1022 // Simulate execution timeout. Use a delay to prevent killing the worker |
| 1020 // before it's started execution. | 1023 // before it's started execution. |
| 1021 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); | 1024 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); |
| 1022 RunOnIOThreadWithDelay( | 1025 RunOnIOThreadWithDelay( |
| 1023 base::Bind(&self::TimeoutWorkerOnIOThread, base::Unretained(this)), | 1026 base::Bind(&self::TimeoutWorkerOnIOThread, base::Unretained(this)), |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1105 | 1108 |
| 1106 FetchOnRegisteredWorker(&result, &response2, &blob_data_handle); | 1109 FetchOnRegisteredWorker(&result, &response2, &blob_data_handle); |
| 1107 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, result); | 1110 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, result); |
| 1108 EXPECT_EQ(200, response2.status_code); | 1111 EXPECT_EQ(200, response2.status_code); |
| 1109 EXPECT_EQ("OK", response2.status_text); | 1112 EXPECT_EQ("OK", response2.status_text); |
| 1110 EXPECT_EQ(response1.response_time, response2.response_time); | 1113 EXPECT_EQ(response1.response_time, response2.response_time); |
| 1111 EXPECT_TRUE(response2.is_in_cache_storage); | 1114 EXPECT_TRUE(response2.is_in_cache_storage); |
| 1112 EXPECT_EQ("cache_name", response2.cache_storage_cache_name); | 1115 EXPECT_EQ("cache_name", response2.cache_storage_cache_name); |
| 1113 } | 1116 } |
| 1114 | 1117 |
| 1115 // Has errors under TSan. See https://crbug.com/631323. | |
| 1116 #if defined(THREAD_SANITIZER) | |
| 1117 #define MAYBE_FetchEvent_respondWithRejection \ | |
| 1118 DISABLED_FetchEvent_respondWithRejection | |
| 1119 #else | |
| 1120 #define MAYBE_FetchEvent_respondWithRejection FetchEvent_respondWithRejection | |
| 1121 #endif | |
| 1122 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, | 1118 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, |
| 1123 MAYBE_FetchEvent_respondWithRejection) { | 1119 FetchEvent_respondWithRejection) { |
| 1124 ServiceWorkerFetchEventResult result; | 1120 ServiceWorkerFetchEventResult result; |
| 1125 ServiceWorkerResponse response; | 1121 ServiceWorkerResponse response; |
| 1126 std::unique_ptr<storage::BlobDataHandle> blob_data_handle; | 1122 std::unique_ptr<storage::BlobDataHandle> blob_data_handle; |
| 1127 | 1123 |
| 1128 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, | 1124 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, |
| 1129 base::Unretained(this), | 1125 base::Unretained(this), |
| 1130 "/service_worker/fetch_event_rejected.js")); | 1126 "/service_worker/fetch_event_rejected.js")); |
| 1131 | 1127 |
| 1132 ConsoleListener console_listener; | 1128 ConsoleListener console_listener; |
| 1133 version_->embedded_worker()->AddListener(&console_listener); | 1129 RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::AddListener, |
| 1130 base::Unretained(version_->embedded_worker()), |
| 1131 &console_listener)); |
| 1134 | 1132 |
| 1135 FetchOnRegisteredWorker(&result, &response, &blob_data_handle); | 1133 FetchOnRegisteredWorker(&result, &response, &blob_data_handle); |
| 1136 const base::string16 expected1 = base::ASCIIToUTF16( | 1134 const base::string16 expected1 = base::ASCIIToUTF16( |
| 1137 "resulted in a network error response: the promise was rejected."); | 1135 "resulted in a network error response: the promise was rejected."); |
| 1138 const base::string16 expected2 = | 1136 const base::string16 expected2 = |
| 1139 base::ASCIIToUTF16("Uncaught (in promise) Rejecting respondWith promise"); | 1137 base::ASCIIToUTF16("Uncaught (in promise) Rejecting respondWith promise"); |
| 1140 console_listener.WaitForConsoleMessages(2); | 1138 console_listener.WaitForConsoleMessages(2); |
| 1141 ASSERT_NE(base::string16::npos, | 1139 ASSERT_NE(base::string16::npos, |
| 1142 console_listener.messages()[0].find(expected1)); | 1140 console_listener.messages()[0].find(expected1)); |
| 1143 ASSERT_EQ(0u, console_listener.messages()[1].find(expected2)); | 1141 ASSERT_EQ(0u, console_listener.messages()[1].find(expected2)); |
| 1144 version_->embedded_worker()->RemoveListener(&console_listener); | 1142 RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::RemoveListener, |
| 1143 base::Unretained(version_->embedded_worker()), |
| 1144 &console_listener)); |
| 1145 | 1145 |
| 1146 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, result); | 1146 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, result); |
| 1147 EXPECT_EQ(0, response.status_code); | 1147 EXPECT_EQ(0, response.status_code); |
| 1148 | 1148 |
| 1149 ASSERT_FALSE(blob_data_handle); | 1149 ASSERT_FALSE(blob_data_handle); |
| 1150 } | 1150 } |
| 1151 | 1151 |
| 1152 class MockContentBrowserClient : public TestContentBrowserClient { | 1152 class MockContentBrowserClient : public TestContentBrowserClient { |
| 1153 public: | 1153 public: |
| 1154 MockContentBrowserClient() | 1154 MockContentBrowserClient() |
| (...skipping 853 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2008 | 2008 |
| 2009 IN_PROC_BROWSER_TEST_F(ServiceWorkerDisableWebSecurityTest, UpdateNoCrash) { | 2009 IN_PROC_BROWSER_TEST_F(ServiceWorkerDisableWebSecurityTest, UpdateNoCrash) { |
| 2010 const char kPageUrl[] = "/service_worker/disable_web_security_update.html"; | 2010 const char kPageUrl[] = "/service_worker/disable_web_security_update.html"; |
| 2011 const char kScopeUrl[] = "/service_worker/scope/"; | 2011 const char kScopeUrl[] = "/service_worker/scope/"; |
| 2012 const char kWorkerUrl[] = "/service_worker/fetch_event_blob.js"; | 2012 const char kWorkerUrl[] = "/service_worker/fetch_event_blob.js"; |
| 2013 RegisterServiceWorkerOnCrossOriginServer(kScopeUrl, kWorkerUrl); | 2013 RegisterServiceWorkerOnCrossOriginServer(kScopeUrl, kWorkerUrl); |
| 2014 RunTestWithCrossOriginURL(kPageUrl, kScopeUrl); | 2014 RunTestWithCrossOriginURL(kPageUrl, kScopeUrl); |
| 2015 } | 2015 } |
| 2016 | 2016 |
| 2017 } // namespace content | 2017 } // namespace content |
| OLD | NEW |