Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(265)

Side by Side Diff: content/browser/service_worker/service_worker_browsertest.cc

Issue 2204873002: ServiceWorker: Run functions in the browsertest on appropriate thread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698