Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 <set> | 5 #include <set> |
| 6 #include <string> | 6 #include <string> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/strings/string_split.h" | 10 #include "base/strings/string_split.h" |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 102 | 102 |
| 103 void SetUp() override { | 103 void SetUp() override { |
| 104 BackgroundSyncNetworkObserver::SetIgnoreNetworkChangeNotifierForTests(true); | 104 BackgroundSyncNetworkObserver::SetIgnoreNetworkChangeNotifierForTests(true); |
| 105 ContentBrowserTest::SetUp(); | 105 ContentBrowserTest::SetUp(); |
| 106 } | 106 } |
| 107 | 107 |
| 108 void SetIncognitoMode(bool incognito) { | 108 void SetIncognitoMode(bool incognito) { |
| 109 shell_ = incognito ? CreateOffTheRecordBrowser() : shell(); | 109 shell_ = incognito ? CreateOffTheRecordBrowser() : shell(); |
| 110 } | 110 } |
| 111 | 111 |
| 112 BackgroundSyncContext* GetSyncContextFromShell(Shell* shell) { | 112 StoragePartition* GetStorage() { |
| 113 StoragePartition* storage = BrowserContext::GetDefaultStoragePartition( | 113 WebContents* web_contents = shell_->web_contents(); |
| 114 shell_->web_contents()->GetBrowserContext()); | 114 return BrowserContext::GetStoragePartition( |
| 115 return storage->GetBackgroundSyncContext(); | 115 web_contents->GetBrowserContext(), web_contents->GetSiteInstance()); |
| 116 } | |
| 117 | |
| 118 BackgroundSyncContext* GetSyncContext() { | |
| 119 return GetStorage()->GetBackgroundSyncContext(); | |
| 116 } | 120 } |
| 117 | 121 |
| 118 void SetUpCommandLine(base::CommandLine* command_line) override { | 122 void SetUpCommandLine(base::CommandLine* command_line) override { |
| 119 // TODO(jkarlin): Remove this once background sync is no longer | 123 // TODO(jkarlin): Remove this once background sync is no longer |
| 120 // experimental. | 124 // experimental. |
| 121 command_line->AppendSwitch( | 125 command_line->AppendSwitch( |
| 122 switches::kEnableExperimentalWebPlatformFeatures); | 126 switches::kEnableExperimentalWebPlatformFeatures); |
| 123 } | 127 } |
| 124 | 128 |
| 125 void SetUpOnMainThread() override { | 129 void SetUpOnMainThread() override { |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 155 // run on the IO thread. | 159 // run on the IO thread. |
| 156 void SetOnline(bool online); | 160 void SetOnline(bool online); |
| 157 void SetOnlineOnIOThread( | 161 void SetOnlineOnIOThread( |
| 158 const scoped_refptr<BackgroundSyncContext>& sync_context, | 162 const scoped_refptr<BackgroundSyncContext>& sync_context, |
| 159 bool online); | 163 bool online); |
| 160 | 164 |
| 161 // Returns true if the one-shot sync with tag is currently pending. Fails | 165 // Returns true if the one-shot sync with tag is currently pending. Fails |
| 162 // (assertion failure) if the tag isn't registered. | 166 // (assertion failure) if the tag isn't registered. |
| 163 bool OneShotPending(const std::string& tag); | 167 bool OneShotPending(const std::string& tag); |
| 164 | 168 |
| 169 void ClearStoragePartitionData(); | |
| 170 | |
| 165 std::string PopConsoleString(); | 171 std::string PopConsoleString(); |
| 166 bool PopConsole(const std::string& expected_msg); | 172 bool PopConsole(const std::string& expected_msg); |
| 167 bool RegisterServiceWorker(); | 173 bool RegisterServiceWorker(); |
| 168 bool RegisterOneShot(const std::string& tag); | 174 bool RegisterOneShot(const std::string& tag); |
| 169 bool RegisterOneShotFromServiceWorker(const std::string& tag); | 175 bool RegisterOneShotFromServiceWorker(const std::string& tag); |
| 170 bool UnregisterOneShot(const std::string& tag); | 176 bool UnregisterOneShot(const std::string& tag); |
| 171 bool UnregisterOneShotTwice(const std::string& tag); | 177 bool UnregisterOneShotTwice(const std::string& tag); |
| 172 bool GetRegistrationOneShot(const std::string& tag); | 178 bool GetRegistrationOneShot(const std::string& tag); |
| 173 bool GetRegistrationOneShotFromServiceWorker(const std::string& tag); | 179 bool GetRegistrationOneShotFromServiceWorker(const std::string& tag); |
| 174 bool MatchRegistrations(const std::string& script_result, | 180 bool MatchRegistrations(const std::string& script_result, |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 187 Shell* shell_ = nullptr; | 193 Shell* shell_ = nullptr; |
| 188 | 194 |
| 189 DISALLOW_COPY_AND_ASSIGN(BackgroundSyncBrowserTest); | 195 DISALLOW_COPY_AND_ASSIGN(BackgroundSyncBrowserTest); |
| 190 }; | 196 }; |
| 191 | 197 |
| 192 void BackgroundSyncBrowserTest::SetOnline(bool online) { | 198 void BackgroundSyncBrowserTest::SetOnline(bool online) { |
| 193 ASSERT_TRUE(shell_); | 199 ASSERT_TRUE(shell_); |
| 194 BrowserThread::PostTask( | 200 BrowserThread::PostTask( |
| 195 BrowserThread::IO, FROM_HERE, | 201 BrowserThread::IO, FROM_HERE, |
| 196 base::Bind(&BackgroundSyncBrowserTest::SetOnlineOnIOThread, | 202 base::Bind(&BackgroundSyncBrowserTest::SetOnlineOnIOThread, |
| 197 base::Unretained(this), | 203 base::Unretained(this), base::Unretained(GetSyncContext()), |
| 198 base::Unretained(GetSyncContextFromShell(shell_)), online)); | 204 online)); |
| 199 base::RunLoop().RunUntilIdle(); | 205 base::RunLoop().RunUntilIdle(); |
| 200 } | 206 } |
| 201 | 207 |
| 202 void BackgroundSyncBrowserTest::SetOnlineOnIOThread( | 208 void BackgroundSyncBrowserTest::SetOnlineOnIOThread( |
| 203 const scoped_refptr<BackgroundSyncContext>& sync_context, | 209 const scoped_refptr<BackgroundSyncContext>& sync_context, |
| 204 bool online) { | 210 bool online) { |
| 205 BackgroundSyncManager* sync_manager = sync_context->background_sync_manager(); | 211 BackgroundSyncManager* sync_manager = sync_context->background_sync_manager(); |
| 206 BackgroundSyncNetworkObserver* network_observer = | 212 BackgroundSyncNetworkObserver* network_observer = |
| 207 sync_manager->GetNetworkObserverForTesting(); | 213 sync_manager->GetNetworkObserverForTesting(); |
| 208 if (online) { | 214 if (online) { |
| 209 network_observer->NotifyManagerIfNetworkChanged( | 215 network_observer->NotifyManagerIfNetworkChangedForTesting( |
| 210 NetworkChangeNotifier::CONNECTION_WIFI); | 216 NetworkChangeNotifier::CONNECTION_WIFI); |
| 211 } else { | 217 } else { |
| 212 network_observer->NotifyManagerIfNetworkChanged( | 218 network_observer->NotifyManagerIfNetworkChangedForTesting( |
| 213 NetworkChangeNotifier::CONNECTION_NONE); | 219 NetworkChangeNotifier::CONNECTION_NONE); |
| 214 } | 220 } |
| 215 } | 221 } |
| 216 | 222 |
| 217 bool BackgroundSyncBrowserTest::OneShotPending(const std::string& tag) { | 223 bool BackgroundSyncBrowserTest::OneShotPending(const std::string& tag) { |
| 218 bool is_pending; | 224 bool is_pending; |
| 219 base::RunLoop run_loop; | 225 base::RunLoop run_loop; |
| 220 | 226 |
| 221 StoragePartition* storage = BrowserContext::GetDefaultStoragePartition( | 227 StoragePartition* storage = GetStorage(); |
| 222 shell_->web_contents()->GetBrowserContext()); | |
| 223 BackgroundSyncContext* sync_context = storage->GetBackgroundSyncContext(); | 228 BackgroundSyncContext* sync_context = storage->GetBackgroundSyncContext(); |
| 224 ServiceWorkerContextWrapper* service_worker_context = | 229 ServiceWorkerContextWrapper* service_worker_context = |
| 225 static_cast<ServiceWorkerContextWrapper*>( | 230 static_cast<ServiceWorkerContextWrapper*>( |
| 226 storage->GetServiceWorkerContext()); | 231 storage->GetServiceWorkerContext()); |
| 227 | 232 |
| 228 base::Callback<void(bool)> callback = | 233 base::Callback<void(bool)> callback = |
| 229 base::Bind(&OneShotPendingCallback, run_loop.QuitClosure(), | 234 base::Bind(&OneShotPendingCallback, run_loop.QuitClosure(), |
| 230 base::ThreadTaskRunnerHandle::Get(), &is_pending); | 235 base::ThreadTaskRunnerHandle::Get(), &is_pending); |
| 231 | 236 |
| 232 BrowserThread::PostTask( | 237 BrowserThread::PostTask( |
| 233 BrowserThread::IO, FROM_HERE, | 238 BrowserThread::IO, FROM_HERE, |
| 234 base::Bind(&OneShotPendingOnIOThread, make_scoped_refptr(sync_context), | 239 base::Bind(&OneShotPendingOnIOThread, make_scoped_refptr(sync_context), |
| 235 make_scoped_refptr(service_worker_context), tag, | 240 make_scoped_refptr(service_worker_context), tag, |
| 236 https_server_->GetURL(kDefaultTestURL), callback)); | 241 https_server_->GetURL(kDefaultTestURL), callback)); |
| 237 | 242 |
| 238 run_loop.Run(); | 243 run_loop.Run(); |
| 239 | 244 |
| 240 return is_pending; | 245 return is_pending; |
| 241 } | 246 } |
| 242 | 247 |
| 248 void BackgroundSyncBrowserTest::ClearStoragePartitionData() { | |
| 249 // Clear data from the storage partition. Parameters are set to clear data | |
| 250 // for service workers, for all origins, for an unbounded time range. | |
| 251 StoragePartition* storage = GetStorage(); | |
| 252 | |
| 253 uint32 storage_partition_mask = | |
| 254 StoragePartition::REMOVE_DATA_MASK_SERVICE_WORKERS; | |
| 255 uint32 quota_storage_mask = StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL; | |
| 256 const GURL& delete_origin = GURL(); | |
| 257 const base::Time delete_begin = base::Time(); | |
| 258 base::Time delete_end = base::Time::Max(); | |
| 259 | |
| 260 base::RunLoop run_loop; | |
| 261 | |
| 262 storage->ClearData(storage_partition_mask, quota_storage_mask, delete_origin, | |
| 263 StoragePartition::OriginMatcherFunction(), delete_begin, | |
| 264 delete_end, run_loop.QuitClosure()); | |
| 265 | |
| 266 run_loop.Run(); | |
| 267 } | |
| 268 | |
| 243 std::string BackgroundSyncBrowserTest::PopConsoleString() { | 269 std::string BackgroundSyncBrowserTest::PopConsoleString() { |
| 244 std::string script_result; | 270 std::string script_result; |
| 245 EXPECT_TRUE(RunScript("resultQueue.pop()", &script_result)); | 271 EXPECT_TRUE(RunScript("resultQueue.pop()", &script_result)); |
| 246 return script_result; | 272 return script_result; |
| 247 } | 273 } |
| 248 | 274 |
| 249 bool BackgroundSyncBrowserTest::PopConsole(const std::string& expected_msg) { | 275 bool BackgroundSyncBrowserTest::PopConsole(const std::string& expected_msg) { |
| 250 std::string script_result = PopConsoleString(); | 276 std::string script_result = PopConsoleString(); |
| 251 return script_result == expected_msg; | 277 return script_result == expected_msg; |
| 252 } | 278 } |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 631 SetOnline(true); | 657 SetOnline(true); |
| 632 EXPECT_TRUE(RegisterOneShot("delay")); | 658 EXPECT_TRUE(RegisterOneShot("delay")); |
| 633 EXPECT_FALSE(OneShotPending("delay")); | 659 EXPECT_FALSE(OneShotPending("delay")); |
| 634 EXPECT_TRUE(StoreRegistrationOneShot("delay")); | 660 EXPECT_TRUE(StoreRegistrationOneShot("delay")); |
| 635 | 661 |
| 636 EXPECT_TRUE(RejectDelayedOneShot()); | 662 EXPECT_TRUE(RejectDelayedOneShot()); |
| 637 EXPECT_TRUE(PopConsole("ok - delay rejected")); | 663 EXPECT_TRUE(PopConsole("ok - delay rejected")); |
| 638 EXPECT_TRUE(NotifyWhenFinishedImmediateOneShot("ok - delay result: false")); | 664 EXPECT_TRUE(NotifyWhenFinishedImmediateOneShot("ok - delay result: false")); |
| 639 } | 665 } |
| 640 | 666 |
| 667 // Verify that a background sync registration is deleted when site data is | |
| 668 // cleared. | |
| 669 IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, | |
| 670 SyncRegistrationDeletedWhenClearingSiteData) { | |
| 671 EXPECT_TRUE(RegisterServiceWorker()); | |
| 672 EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. | |
| 673 | |
| 674 // Prevent firing by going offline. | |
| 675 SetOnline(false); | |
| 676 EXPECT_TRUE(RegisterOneShot("foo")); | |
| 677 EXPECT_TRUE(GetRegistrationOneShot("foo")); | |
| 678 EXPECT_TRUE(OneShotPending("foo")); | |
| 679 | |
| 680 // Simulate a user clearing site data (including Service Workers, crucially), | |
| 681 // by clearing data from the storage partition. | |
| 682 ClearStoragePartitionData(); | |
| 683 | |
| 684 EXPECT_FALSE(GetRegistrationOneShot("foo")); | |
| 685 } | |
| 686 | |
| 687 // Verify that a background sync registration, from a service worker, is deleted | |
| 688 // when site data is cleared. | |
| 689 IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, | |
| 690 SyncRegistrationFromSWDeletedWhenClearingSiteData) { | |
| 691 EXPECT_TRUE(RegisterServiceWorker()); | |
| 692 EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. | |
| 693 | |
| 694 std::vector<std::string> registered_tags; | |
| 695 EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); | |
| 696 | |
| 697 SetOnline(false); | |
| 698 | |
| 699 EXPECT_TRUE(RegisterOneShotFromServiceWorker("foo_sw")); | |
| 700 EXPECT_TRUE(PopConsole("ok - foo_sw registered in SW")); | |
| 701 EXPECT_TRUE(GetRegistrationOneShotFromServiceWorker("foo_sw")); | |
| 702 | |
| 703 // Simulate a user clearing site data (including Service Workers, crucially), | |
| 704 // by clearing data from the storage partition. | |
| 705 ClearStoragePartitionData(); | |
| 706 | |
| 707 EXPECT_FALSE(GetRegistrationOneShotFromServiceWorker("foo")); | |
| 708 } | |
| 709 | |
| 710 // Verify that multiple background sync registrations are deleted when site | |
| 711 // data is cleared. | |
| 712 IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, | |
| 713 SyncRegistrationsDeletedWhenClearingSiteData) { | |
| 714 EXPECT_TRUE(RegisterServiceWorker()); | |
| 715 EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. | |
| 716 | |
| 717 std::vector<std::string> registered_tags; | |
| 718 EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); | |
| 719 | |
| 720 SetOnline(false); | |
| 721 registered_tags.push_back("foo"); | |
| 722 registered_tags.push_back("bar"); | |
| 723 | |
| 724 for (const std::string& tag : registered_tags) | |
| 725 EXPECT_TRUE(RegisterOneShot(tag)); | |
| 726 | |
| 727 EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); | |
| 728 | |
| 729 for (const std::string& tag : registered_tags) | |
| 730 EXPECT_TRUE(OneShotPending(tag)); | |
| 731 | |
| 732 // Simulate a user clearing site data (including Service Workers, crucially), | |
| 733 // by clearing data from the storage partition. | |
| 734 ClearStoragePartitionData(); | |
| 735 | |
| 736 for (const std::string& tag : registered_tags) | |
| 737 EXPECT_FALSE(GetRegistrationOneShot(tag)); | |
| 738 } | |
| 739 | |
| 740 // Verify that a sync event that is currently firing is deleted when site | |
| 741 // data is cleared. | |
| 742 IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, | |
| 743 FiringSyncEventDeletedWhenClearingSiteData) { | |
| 744 EXPECT_TRUE(RegisterServiceWorker()); | |
| 745 EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. | |
| 746 | |
| 747 SetOnline(true); | |
| 748 EXPECT_TRUE(RegisterOneShot("delay")); | |
| 749 | |
| 750 // Verify that it is firing. | |
| 751 EXPECT_TRUE(GetRegistrationOneShot("delay")); | |
| 752 EXPECT_FALSE(OneShotPending("delay")); | |
| 753 | |
| 754 // Simulate a user clearing site data (including Service Workers, crucially), | |
| 755 // by clearing data from the storage partition. | |
| 756 ClearStoragePartitionData(); | |
| 757 | |
| 758 // Verify that it was deleted. | |
| 759 // TODO(jkarlin): Use registration.finished to verify that the event actually | |
|
jkarlin
2015/10/30 16:37:38
registration.finished exists now, you can use that
chasej
2015/10/30 18:13:28
As discussed, this test shouldn't verify the behav
jkarlin
2015/10/30 18:13:43
Actually, the result of .finished shouldn't be tes
| |
| 760 // was deleted. | |
| 761 EXPECT_FALSE(GetRegistrationOneShot("delay")); | |
| 762 } | |
| 763 | |
| 641 } // namespace content | 764 } // namespace content |
| OLD | NEW |