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 <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 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 376 scoped_refptr<ServiceWorkerContextWrapper> wrapper_; | 376 scoped_refptr<ServiceWorkerContextWrapper> wrapper_; |
| 377 }; | 377 }; |
| 378 | 378 |
| 379 class ConsoleListener : public EmbeddedWorkerInstance::Listener { | 379 class ConsoleListener : public EmbeddedWorkerInstance::Listener { |
| 380 public: | 380 public: |
| 381 void OnReportConsoleMessage(int source_identifier, | 381 void OnReportConsoleMessage(int source_identifier, |
| 382 int message_level, | 382 int message_level, |
| 383 const base::string16& message, | 383 const base::string16& message, |
| 384 int line_number, | 384 int line_number, |
| 385 const GURL& source_url) override { | 385 const GURL& source_url) override { |
| 386 messages_.push_back(message); | 386 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 387 if (!quit_.is_null() && messages_.size() == expected_message_count_) { | 387 BrowserThread::PostTask( |
| 388 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit_); | 388 BrowserThread::UI, FROM_HERE, |
| 389 quit_.Reset(); | 389 base::Bind(&ConsoleListener::OnReportCOnsoleMessageOnUI, |
| 390 } | 390 base::Unretained(this), message)); |
| 391 } | 391 } |
| 392 | 392 |
| 393 void WaitForConsoleMessages(size_t expected_message_count) { | 393 void WaitForConsoleMessages(size_t expected_message_count) { |
| 394 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 394 if (messages_.size() >= expected_message_count) | 395 if (messages_.size() >= expected_message_count) |
| 395 return; | 396 return; |
| 396 | 397 |
| 397 expected_message_count_ = expected_message_count; | 398 expected_message_count_ = expected_message_count; |
| 398 base::RunLoop console_run_loop; | 399 base::RunLoop console_run_loop; |
| 399 quit_ = console_run_loop.QuitClosure(); | 400 quit_ = console_run_loop.QuitClosure(); |
| 400 console_run_loop.Run(); | 401 console_run_loop.Run(); |
| 401 | 402 |
| 402 ASSERT_EQ(messages_.size(), expected_message_count); | 403 ASSERT_EQ(messages_.size(), expected_message_count); |
| 403 } | 404 } |
| 404 | 405 |
| 405 bool OnMessageReceived(const IPC::Message& message) override { return false; } | 406 bool OnMessageReceived(const IPC::Message& message) override { return false; } |
| 406 const std::vector<base::string16>& messages() const { return messages_; } | 407 const std::vector<base::string16>& messages() const { return messages_; } |
| 407 | 408 |
| 408 private: | 409 private: |
| 410 void OnReportCOnsoleMessageOnUI(const base::string16& message) { | |
|
nhiroki
2016/08/03 00:00:58
s/COnsole/Console/
shimazu
2016/08/03 00:15:58
Done.
| |
| 411 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 412 messages_.push_back(message); | |
| 413 if (!quit_.is_null() && messages_.size() == expected_message_count_) { | |
| 414 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit_); | |
|
nhiroki
2016/08/03 00:00:58
This PostTask wouldn't be necessary because we're
shimazu
2016/08/03 00:15:58
Done, and also removed unnecessary check (messages
| |
| 415 quit_.Reset(); | |
| 416 } | |
| 417 } | |
| 418 | |
| 419 // These parameters must be accessed on the UI thread. | |
| 409 std::vector<base::string16> messages_; | 420 std::vector<base::string16> messages_; |
| 410 size_t expected_message_count_; | 421 size_t expected_message_count_; |
| 411 base::Closure quit_; | 422 base::Closure quit_; |
| 412 }; | 423 }; |
| 413 | 424 |
| 414 class ServiceWorkerVersionBrowserTest : public ServiceWorkerBrowserTest { | 425 class ServiceWorkerVersionBrowserTest : public ServiceWorkerBrowserTest { |
| 415 public: | 426 public: |
| 416 using self = ServiceWorkerVersionBrowserTest; | 427 using self = ServiceWorkerVersionBrowserTest; |
| 417 | 428 |
| 418 ~ServiceWorkerVersionBrowserTest() override {} | 429 ~ServiceWorkerVersionBrowserTest() override {} |
| (...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 923 ActivateTestHelper("/service_worker/worker_activate_rejected.js", | 934 ActivateTestHelper("/service_worker/worker_activate_rejected.js", |
| 924 SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED); | 935 SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED); |
| 925 } | 936 } |
| 926 | 937 |
| 927 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, | 938 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, |
| 928 InstallWithWaitUntil_Rejected) { | 939 InstallWithWaitUntil_Rejected) { |
| 929 InstallTestHelper("/service_worker/worker_install_rejected.js", | 940 InstallTestHelper("/service_worker/worker_install_rejected.js", |
| 930 SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED); | 941 SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED); |
| 931 } | 942 } |
| 932 | 943 |
| 933 // Has errors under TSan. See https://crbug.com/631323. | |
| 934 #if defined(THREAD_SANITIZER) | |
| 935 #define MAYBE_InstallWithWaitUntil_RejectConsoleMessage \ | |
| 936 DISABLED_InstallWithWaitUntil_RejectConsoleMessage | |
| 937 #else | |
| 938 #define MAYBE_InstallWithWaitUntil_RejectConsoleMessage \ | |
| 939 InstallWithWaitUntil_RejectConsoleMessage | |
| 940 #endif | |
| 941 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, | 944 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, |
| 942 MAYBE_InstallWithWaitUntil_RejectConsoleMessage) { | 945 InstallWithWaitUntil_RejectConsoleMessage) { |
| 943 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this, | 946 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this, |
| 944 "/service_worker/worker_install_rejected.js")); | 947 "/service_worker/worker_install_rejected.js")); |
| 945 | 948 |
| 946 ConsoleListener console_listener; | 949 ConsoleListener console_listener; |
| 947 version_->embedded_worker()->AddListener(&console_listener); | 950 RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::AddListener, |
| 951 base::Unretained(version_->embedded_worker()), | |
| 952 &console_listener)); | |
| 948 | 953 |
| 949 // Dispatch install on a worker. | 954 // Dispatch install on a worker. |
| 950 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 955 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 951 base::RunLoop install_run_loop; | 956 base::RunLoop install_run_loop; |
| 952 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 957 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 953 base::Bind(&self::InstallOnIOThread, this, | 958 base::Bind(&self::InstallOnIOThread, this, |
| 954 install_run_loop.QuitClosure(), &status)); | 959 install_run_loop.QuitClosure(), &status)); |
| 955 install_run_loop.Run(); | 960 install_run_loop.Run(); |
| 956 ASSERT_EQ(SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, status); | 961 ASSERT_EQ(SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, status); |
| 957 | 962 |
| 958 const base::string16 expected = | 963 const base::string16 expected = |
| 959 base::ASCIIToUTF16("Rejecting oninstall event"); | 964 base::ASCIIToUTF16("Rejecting oninstall event"); |
| 960 console_listener.WaitForConsoleMessages(1); | 965 console_listener.WaitForConsoleMessages(1); |
| 961 ASSERT_NE(base::string16::npos, | 966 ASSERT_NE(base::string16::npos, |
| 962 console_listener.messages()[0].find(expected)); | 967 console_listener.messages()[0].find(expected)); |
| 963 version_->embedded_worker()->RemoveListener(&console_listener); | 968 RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::RemoveListener, |
| 969 base::Unretained(version_->embedded_worker()), | |
| 970 &console_listener)); | |
| 964 } | 971 } |
| 965 | 972 |
| 966 class WaitForLoaded : public EmbeddedWorkerInstance::Listener { | 973 class WaitForLoaded : public EmbeddedWorkerInstance::Listener { |
| 967 public: | 974 public: |
| 968 explicit WaitForLoaded(const base::Closure& quit) : quit_(quit) {} | 975 explicit WaitForLoaded(const base::Closure& quit) : quit_(quit) {} |
| 969 | 976 |
| 970 void OnThreadStarted() override { | 977 void OnThreadStarted() override { |
| 978 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 971 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit_); | 979 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit_); |
| 972 } | 980 } |
| 973 bool OnMessageReceived(const IPC::Message& message) override { return false; } | 981 bool OnMessageReceived(const IPC::Message& message) override { return false; } |
| 974 | 982 |
| 975 private: | 983 private: |
| 976 base::Closure quit_; | 984 base::Closure quit_; |
| 977 }; | 985 }; |
| 978 | 986 |
| 979 // Has errors under TSan. See https://crbug.com/631323. | 987 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, TimeoutStartingWorker) { |
| 980 #if defined(THREAD_SANITIZER) | |
| 981 #define MAYBE_TimeoutStartingWorker DISABLED_TimeoutStartingWorker | |
| 982 #else | |
| 983 #define MAYBE_TimeoutStartingWorker TimeoutStartingWorker | |
| 984 #endif | |
| 985 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, | |
| 986 MAYBE_TimeoutStartingWorker) { | |
| 987 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this, | 988 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this, |
| 988 "/service_worker/while_true_worker.js")); | 989 "/service_worker/while_true_worker.js")); |
| 989 | 990 |
| 990 // Start a worker, waiting until the script is loaded. | 991 // Start a worker, waiting until the script is loaded. |
| 991 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 992 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 992 base::RunLoop start_run_loop; | 993 base::RunLoop start_run_loop; |
| 993 base::RunLoop load_run_loop; | 994 base::RunLoop load_run_loop; |
| 994 WaitForLoaded wait_for_load(load_run_loop.QuitClosure()); | 995 WaitForLoaded wait_for_load(load_run_loop.QuitClosure()); |
| 995 version_->embedded_worker()->AddListener(&wait_for_load); | 996 RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::AddListener, |
| 997 base::Unretained(version_->embedded_worker()), | |
| 998 &wait_for_load)); | |
| 996 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 999 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 997 base::Bind(&self::StartOnIOThread, this, | 1000 base::Bind(&self::StartOnIOThread, this, |
| 998 start_run_loop.QuitClosure(), &status)); | 1001 start_run_loop.QuitClosure(), &status)); |
| 999 load_run_loop.Run(); | 1002 load_run_loop.Run(); |
| 1000 version_->embedded_worker()->RemoveListener(&wait_for_load); | 1003 RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::RemoveListener, |
| 1004 base::Unretained(version_->embedded_worker()), | |
| 1005 &wait_for_load)); | |
| 1001 | 1006 |
| 1002 // The script has loaded but start has not completed yet. | 1007 // The script has loaded but start has not completed yet. |
| 1003 ASSERT_EQ(SERVICE_WORKER_ERROR_FAILED, status); | 1008 ASSERT_EQ(SERVICE_WORKER_ERROR_FAILED, status); |
| 1004 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, version_->running_status()); | 1009 EXPECT_EQ(EmbeddedWorkerStatus::STARTING, version_->running_status()); |
| 1005 | 1010 |
| 1006 // Simulate execution timeout. Use a delay to prevent killing the worker | 1011 // Simulate execution timeout. Use a delay to prevent killing the worker |
| 1007 // before it's started execution. | 1012 // before it's started execution. |
| 1008 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); | 1013 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); |
| 1009 RunOnIOThreadWithDelay(base::Bind(&self::TimeoutWorkerOnIOThread, this), | 1014 RunOnIOThreadWithDelay(base::Bind(&self::TimeoutWorkerOnIOThread, this), |
| 1010 base::TimeDelta::FromMilliseconds(100)); | 1015 base::TimeDelta::FromMilliseconds(100)); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1087 | 1092 |
| 1088 FetchOnRegisteredWorker(&result, &response2, &blob_data_handle); | 1093 FetchOnRegisteredWorker(&result, &response2, &blob_data_handle); |
| 1089 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, result); | 1094 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, result); |
| 1090 EXPECT_EQ(200, response2.status_code); | 1095 EXPECT_EQ(200, response2.status_code); |
| 1091 EXPECT_EQ("OK", response2.status_text); | 1096 EXPECT_EQ("OK", response2.status_text); |
| 1092 EXPECT_EQ(response1.response_time, response2.response_time); | 1097 EXPECT_EQ(response1.response_time, response2.response_time); |
| 1093 EXPECT_TRUE(response2.is_in_cache_storage); | 1098 EXPECT_TRUE(response2.is_in_cache_storage); |
| 1094 EXPECT_EQ("cache_name", response2.cache_storage_cache_name); | 1099 EXPECT_EQ("cache_name", response2.cache_storage_cache_name); |
| 1095 } | 1100 } |
| 1096 | 1101 |
| 1097 // Has errors under TSan. See https://crbug.com/631323. | |
| 1098 #if defined(THREAD_SANITIZER) | |
| 1099 #define MAYBE_FetchEvent_respondWithRejection \ | |
| 1100 DISABLED_FetchEvent_respondWithRejection | |
| 1101 #else | |
| 1102 #define MAYBE_FetchEvent_respondWithRejection FetchEvent_respondWithRejection | |
| 1103 #endif | |
| 1104 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, | 1102 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, |
| 1105 MAYBE_FetchEvent_respondWithRejection) { | 1103 FetchEvent_respondWithRejection) { |
| 1106 ServiceWorkerFetchEventResult result; | 1104 ServiceWorkerFetchEventResult result; |
| 1107 ServiceWorkerResponse response; | 1105 ServiceWorkerResponse response; |
| 1108 std::unique_ptr<storage::BlobDataHandle> blob_data_handle; | 1106 std::unique_ptr<storage::BlobDataHandle> blob_data_handle; |
| 1109 | 1107 |
| 1110 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this, | 1108 RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this, |
| 1111 "/service_worker/fetch_event_rejected.js")); | 1109 "/service_worker/fetch_event_rejected.js")); |
| 1112 | 1110 |
| 1113 ConsoleListener console_listener; | 1111 ConsoleListener console_listener; |
| 1114 version_->embedded_worker()->AddListener(&console_listener); | 1112 RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::AddListener, |
| 1113 base::Unretained(version_->embedded_worker()), | |
| 1114 &console_listener)); | |
| 1115 | 1115 |
| 1116 FetchOnRegisteredWorker(&result, &response, &blob_data_handle); | 1116 FetchOnRegisteredWorker(&result, &response, &blob_data_handle); |
| 1117 const base::string16 expected1 = base::ASCIIToUTF16( | 1117 const base::string16 expected1 = base::ASCIIToUTF16( |
| 1118 "resulted in a network error response: the promise was rejected."); | 1118 "resulted in a network error response: the promise was rejected."); |
| 1119 const base::string16 expected2 = | 1119 const base::string16 expected2 = |
| 1120 base::ASCIIToUTF16("Uncaught (in promise) Rejecting respondWith promise"); | 1120 base::ASCIIToUTF16("Uncaught (in promise) Rejecting respondWith promise"); |
| 1121 console_listener.WaitForConsoleMessages(2); | 1121 console_listener.WaitForConsoleMessages(2); |
| 1122 ASSERT_NE(base::string16::npos, | 1122 ASSERT_NE(base::string16::npos, |
| 1123 console_listener.messages()[0].find(expected1)); | 1123 console_listener.messages()[0].find(expected1)); |
| 1124 ASSERT_EQ(0u, console_listener.messages()[1].find(expected2)); | 1124 ASSERT_EQ(0u, console_listener.messages()[1].find(expected2)); |
| 1125 version_->embedded_worker()->RemoveListener(&console_listener); | 1125 RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::RemoveListener, |
| 1126 base::Unretained(version_->embedded_worker()), | |
| 1127 &console_listener)); | |
| 1126 | 1128 |
| 1127 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, result); | 1129 ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, result); |
| 1128 EXPECT_EQ(0, response.status_code); | 1130 EXPECT_EQ(0, response.status_code); |
| 1129 | 1131 |
| 1130 ASSERT_FALSE(blob_data_handle); | 1132 ASSERT_FALSE(blob_data_handle); |
| 1131 } | 1133 } |
| 1132 | 1134 |
| 1133 class MockContentBrowserClient : public TestContentBrowserClient { | 1135 class MockContentBrowserClient : public TestContentBrowserClient { |
| 1134 public: | 1136 public: |
| 1135 MockContentBrowserClient() | 1137 MockContentBrowserClient() |
| (...skipping 852 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1988 | 1990 |
| 1989 IN_PROC_BROWSER_TEST_F(ServiceWorkerDisableWebSecurityTest, UpdateNoCrash) { | 1991 IN_PROC_BROWSER_TEST_F(ServiceWorkerDisableWebSecurityTest, UpdateNoCrash) { |
| 1990 const char kPageUrl[] = "/service_worker/disable_web_security_update.html"; | 1992 const char kPageUrl[] = "/service_worker/disable_web_security_update.html"; |
| 1991 const char kScopeUrl[] = "/service_worker/scope/"; | 1993 const char kScopeUrl[] = "/service_worker/scope/"; |
| 1992 const char kWorkerUrl[] = "/service_worker/fetch_event_blob.js"; | 1994 const char kWorkerUrl[] = "/service_worker/fetch_event_blob.js"; |
| 1993 RegisterServiceWorkerOnCrossOriginServer(kScopeUrl, kWorkerUrl); | 1995 RegisterServiceWorkerOnCrossOriginServer(kScopeUrl, kWorkerUrl); |
| 1994 RunTestWithCrossOriginURL(kPageUrl, kScopeUrl); | 1996 RunTestWithCrossOriginURL(kPageUrl, kScopeUrl); |
| 1995 } | 1997 } |
| 1996 | 1998 |
| 1997 } // namespace content | 1999 } // namespace content |
| OLD | NEW |