Index: content/browser/background_sync/background_sync_browsertest.cc |
diff --git a/content/browser/background_sync/background_sync_browsertest.cc b/content/browser/background_sync/background_sync_browsertest.cc |
index 8fc9da1e59a36c11538a76e63aea629784921f84..30263458bb02b0ff9d6a29cb662f1b8c7963a516 100644 |
--- a/content/browser/background_sync/background_sync_browsertest.cc |
+++ b/content/browser/background_sync/background_sync_browsertest.cc |
@@ -109,10 +109,14 @@ class BackgroundSyncBrowserTest : public ContentBrowserTest { |
shell_ = incognito ? CreateOffTheRecordBrowser() : shell(); |
} |
- BackgroundSyncContext* GetSyncContextFromShell(Shell* shell) { |
- StoragePartition* storage = BrowserContext::GetDefaultStoragePartition( |
- shell_->web_contents()->GetBrowserContext()); |
- return storage->GetBackgroundSyncContext(); |
+ StoragePartition* GetStorage() { |
+ WebContents* web_contents = shell_->web_contents(); |
+ return BrowserContext::GetStoragePartition( |
+ web_contents->GetBrowserContext(), web_contents->GetSiteInstance()); |
+ } |
+ |
+ BackgroundSyncContext* GetSyncContext() { |
+ return GetStorage()->GetBackgroundSyncContext(); |
} |
void SetUpCommandLine(base::CommandLine* command_line) override { |
@@ -162,6 +166,8 @@ class BackgroundSyncBrowserTest : public ContentBrowserTest { |
// (assertion failure) if the tag isn't registered. |
bool OneShotPending(const std::string& tag); |
+ void ClearStoragePartitionData(); |
+ |
std::string PopConsoleString(); |
bool PopConsole(const std::string& expected_msg); |
bool RegisterServiceWorker(); |
@@ -194,8 +200,8 @@ void BackgroundSyncBrowserTest::SetOnline(bool online) { |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |
base::Bind(&BackgroundSyncBrowserTest::SetOnlineOnIOThread, |
- base::Unretained(this), |
- base::Unretained(GetSyncContextFromShell(shell_)), online)); |
+ base::Unretained(this), base::Unretained(GetSyncContext()), |
+ online)); |
base::RunLoop().RunUntilIdle(); |
} |
@@ -206,10 +212,10 @@ void BackgroundSyncBrowserTest::SetOnlineOnIOThread( |
BackgroundSyncNetworkObserver* network_observer = |
sync_manager->GetNetworkObserverForTesting(); |
if (online) { |
- network_observer->NotifyManagerIfNetworkChanged( |
+ network_observer->NotifyManagerIfNetworkChangedForTesting( |
NetworkChangeNotifier::CONNECTION_WIFI); |
} else { |
- network_observer->NotifyManagerIfNetworkChanged( |
+ network_observer->NotifyManagerIfNetworkChangedForTesting( |
NetworkChangeNotifier::CONNECTION_NONE); |
} |
} |
@@ -218,8 +224,7 @@ bool BackgroundSyncBrowserTest::OneShotPending(const std::string& tag) { |
bool is_pending; |
base::RunLoop run_loop; |
- StoragePartition* storage = BrowserContext::GetDefaultStoragePartition( |
- shell_->web_contents()->GetBrowserContext()); |
+ StoragePartition* storage = GetStorage(); |
BackgroundSyncContext* sync_context = storage->GetBackgroundSyncContext(); |
ServiceWorkerContextWrapper* service_worker_context = |
static_cast<ServiceWorkerContextWrapper*>( |
@@ -240,6 +245,27 @@ bool BackgroundSyncBrowserTest::OneShotPending(const std::string& tag) { |
return is_pending; |
} |
+void BackgroundSyncBrowserTest::ClearStoragePartitionData() { |
+ // Clear data from the storage partition. Parameters are set to clear data |
+ // for service workers, for all origins, for an unbounded time range. |
+ StoragePartition* storage = GetStorage(); |
+ |
+ uint32 storage_partition_mask = |
+ StoragePartition::REMOVE_DATA_MASK_SERVICE_WORKERS; |
+ uint32 quota_storage_mask = StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL; |
+ const GURL& delete_origin = GURL(); |
+ const base::Time delete_begin = base::Time(); |
+ base::Time delete_end = base::Time::Max(); |
+ |
+ base::RunLoop run_loop; |
+ |
+ storage->ClearData(storage_partition_mask, quota_storage_mask, delete_origin, |
+ StoragePartition::OriginMatcherFunction(), delete_begin, |
+ delete_end, run_loop.QuitClosure()); |
+ |
+ run_loop.Run(); |
+} |
+ |
std::string BackgroundSyncBrowserTest::PopConsoleString() { |
std::string script_result; |
EXPECT_TRUE(RunScript("resultQueue.pop()", &script_result)); |
@@ -597,7 +623,7 @@ IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, CallFinishedBeforeSyncFails) { |
} |
IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, |
- CallFinishedAfterSyncSuceeds) { |
+ CallFinishedAfterSyncSucceeds) { |
EXPECT_TRUE(RegisterServiceWorker()); |
EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. |
@@ -638,4 +664,99 @@ IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, CallFinishedAfterSyncFails) { |
EXPECT_TRUE(NotifyWhenFinishedImmediateOneShot("ok - delay result: false")); |
} |
+// Verify that a background sync registration is deleted when site data is |
+// cleared. |
+IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, |
+ SyncRegistrationDeletedWhenClearingSiteData) { |
+ EXPECT_TRUE(RegisterServiceWorker()); |
+ EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. |
+ |
+ // Prevent firing by going offline. |
+ SetOnline(false); |
+ EXPECT_TRUE(RegisterOneShot("foo")); |
+ EXPECT_TRUE(GetRegistrationOneShot("foo")); |
+ EXPECT_TRUE(OneShotPending("foo")); |
+ |
+ // Simulate a user clearing site data (including Service Workers, crucially), |
+ // by clearing data from the storage partition. |
+ ClearStoragePartitionData(); |
+ |
+ EXPECT_FALSE(GetRegistrationOneShot("foo")); |
+} |
+ |
+// Verify that a background sync registration, from a service worker, is deleted |
+// when site data is cleared. |
+IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, |
+ SyncRegistrationFromSWDeletedWhenClearingSiteData) { |
+ EXPECT_TRUE(RegisterServiceWorker()); |
+ EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. |
+ |
+ std::vector<std::string> registered_tags; |
+ EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); |
+ |
+ SetOnline(false); |
+ |
+ EXPECT_TRUE(RegisterOneShotFromServiceWorker("foo_sw")); |
+ EXPECT_TRUE(PopConsole("ok - foo_sw registered in SW")); |
+ EXPECT_TRUE(GetRegistrationOneShotFromServiceWorker("foo_sw")); |
+ |
+ // Simulate a user clearing site data (including Service Workers, crucially), |
+ // by clearing data from the storage partition. |
+ ClearStoragePartitionData(); |
+ |
+ EXPECT_FALSE(GetRegistrationOneShotFromServiceWorker("foo")); |
+} |
+ |
+// Verify that multiple background sync registrations are deleted when site |
+// data is cleared. |
+IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, |
+ SyncRegistrationsDeletedWhenClearingSiteData) { |
+ EXPECT_TRUE(RegisterServiceWorker()); |
+ EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. |
+ |
+ std::vector<std::string> registered_tags; |
+ EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); |
+ |
+ SetOnline(false); |
+ registered_tags.push_back("foo"); |
+ registered_tags.push_back("bar"); |
+ |
+ for (const std::string& tag : registered_tags) |
+ EXPECT_TRUE(RegisterOneShot(tag)); |
+ |
+ EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); |
+ |
+ for (const std::string& tag : registered_tags) |
+ EXPECT_TRUE(OneShotPending(tag)); |
+ |
+ // Simulate a user clearing site data (including Service Workers, crucially), |
+ // by clearing data from the storage partition. |
+ ClearStoragePartitionData(); |
+ |
+ for (const std::string& tag : registered_tags) |
+ EXPECT_FALSE(GetRegistrationOneShot(tag)); |
+} |
+ |
+// Verify that a sync event that is currently firing is deleted when site |
+// data is cleared. |
+IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, |
+ FiringSyncEventDeletedWhenClearingSiteData) { |
+ EXPECT_TRUE(RegisterServiceWorker()); |
+ EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. |
+ |
+ SetOnline(true); |
+ EXPECT_TRUE(RegisterOneShot("delay")); |
+ |
+ // Verify that it is firing. |
+ EXPECT_TRUE(GetRegistrationOneShot("delay")); |
+ EXPECT_FALSE(OneShotPending("delay")); |
+ |
+ // Simulate a user clearing site data (including Service Workers, crucially), |
+ // by clearing data from the storage partition. |
+ ClearStoragePartitionData(); |
+ |
+ // Verify that it was deleted. |
+ EXPECT_FALSE(GetRegistrationOneShot("delay")); |
+} |
+ |
} // namespace content |