blob: 7a7572cae05645e3a5209588c410bbb51b3ff9de [file] [log] [blame]
Scott Violet87450ce2020-01-23 01:56:251// Copyright 2020 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Scott Violet9843d0a2020-02-11 22:38:075#include "weblayer/browser/persistence/browser_persister.h"
Scott Violet87450ce2020-01-23 01:56:256
Gabriel Charette9f60dd12020-03-06 20:48:047#include "base/bind_helpers.h"
Scott Violet87450ce2020-01-23 01:56:258#include "base/files/file_path.h"
Scott Violet95a6d682020-06-11 23:28:329#include "base/files/file_util.h"
Scott Violetb2e0cf12020-03-09 18:46:4310#include "base/guid.h"
Scott Violet87450ce2020-01-23 01:56:2511#include "base/path_service.h"
12#include "base/run_loop.h"
Scott Violet95a6d682020-06-11 23:28:3213#include "base/test/bind_test_util.h"
14#include "base/threading/thread_restrictions.h"
Colin Blundellbe1dc132020-01-29 09:54:0615#include "build/build_config.h"
Scott Violet87450ce2020-01-23 01:56:2516#include "components/sessions/core/command_storage_manager_test_helper.h"
17#include "content/public/test/browser_test_utils.h"
18#include "content/public/test/url_loader_interceptor.h"
19#include "net/base/filename_util.h"
20#include "net/test/embedded_test_server/embedded_test_server.h"
Clark DuVallb7c09942020-05-20 04:12:5121#include "testing/gmock/include/gmock/gmock.h"
Scott Violet87450ce2020-01-23 01:56:2522#include "weblayer/browser/browser_impl.h"
Scott Violet95a6d682020-06-11 23:28:3223#include "weblayer/browser/persistence/browser_persister_file_utils.h"
Scott Violet87450ce2020-01-23 01:56:2524#include "weblayer/browser/profile_impl.h"
25#include "weblayer/browser/tab_impl.h"
26#include "weblayer/common/weblayer_paths.h"
Scott Violetf251a022020-10-07 16:54:4327#include "weblayer/public/browser_restore_observer.h"
Scott Violet87450ce2020-01-23 01:56:2528#include "weblayer/public/navigation.h"
29#include "weblayer/public/navigation_controller.h"
30#include "weblayer/public/navigation_observer.h"
31#include "weblayer/public/tab.h"
32#include "weblayer/shell/browser/shell.h"
33#include "weblayer/test/interstitial_utils.h"
34#include "weblayer/test/test_navigation_observer.h"
35#include "weblayer/test/weblayer_browser_test.h"
36#include "weblayer/test/weblayer_browser_test_utils.h"
37
38namespace weblayer {
39
Scott Violet9843d0a2020-02-11 22:38:0740class BrowserPersisterTestHelper {
Scott Violet87450ce2020-01-23 01:56:2541 public:
42 static sessions::CommandStorageManager* GetCommandStorageManager(
Scott Violet9843d0a2020-02-11 22:38:0743 BrowserPersister* persister) {
44 return persister->command_storage_manager_.get();
Scott Violet87450ce2020-01-23 01:56:2545 }
46};
47
48namespace {
Clark DuVallb7c09942020-05-20 04:12:5149using testing::UnorderedElementsAre;
Scott Violet87450ce2020-01-23 01:56:2550
Scott Violetf251a022020-10-07 16:54:4351class BrowserNavigationObserverImpl : public BrowserRestoreObserver,
Scott Violet87450ce2020-01-23 01:56:2552 public NavigationObserver {
53 public:
54 static void WaitForNewTabToCompleteNavigation(Browser* browser,
55 const GURL& url,
Scott Violetf251a022020-10-07 16:54:4356 size_t tab_to_wait_for = 0) {
Scott Violet87450ce2020-01-23 01:56:2557 BrowserNavigationObserverImpl observer(browser, url, tab_to_wait_for);
58 observer.Wait();
59 }
60
61 private:
62 BrowserNavigationObserverImpl(Browser* browser,
63 const GURL& url,
Scott Violetf251a022020-10-07 16:54:4364 size_t tab_to_wait_for)
Scott Violet87450ce2020-01-23 01:56:2565 : browser_(browser), url_(url), tab_to_wait_for_(tab_to_wait_for) {
Scott Violetf251a022020-10-07 16:54:4366 browser_->AddBrowserRestoreObserver(this);
Scott Violet87450ce2020-01-23 01:56:2567 }
68 ~BrowserNavigationObserverImpl() override {
69 tab_->GetNavigationController()->RemoveObserver(this);
70 }
71
72 void Wait() { run_loop_.Run(); }
73
74 // NavigationObserver;
75 void NavigationCompleted(Navigation* navigation) override {
76 if (navigation->GetURL() == url_)
77 run_loop_.Quit();
78 }
79
Scott Violetf251a022020-10-07 16:54:4380 // BrowserRestoreObserver:
81 void OnRestoreCompleted() override {
82 browser_->RemoveBrowserRestoreObserver(this);
83 ASSERT_LT(tab_to_wait_for_, browser_->GetTabs().size());
84 ASSERT_EQ(nullptr, tab_);
85 tab_ = browser_->GetTabs()[tab_to_wait_for_];
Scott Violet87450ce2020-01-23 01:56:2586 tab_->GetNavigationController()->AddObserver(this);
87 }
88
89 Browser* browser_;
90 const GURL& url_;
91 Tab* tab_ = nullptr;
Scott Violetf251a022020-10-07 16:54:4392 const size_t tab_to_wait_for_;
Scott Violet87450ce2020-01-23 01:56:2593 std::unique_ptr<TestNavigationObserver> navigation_observer_;
94 base::RunLoop run_loop_;
95};
96
Scott Violet9843d0a2020-02-11 22:38:0797void ShutdownBrowserPersisterAndWait(BrowserImpl* browser) {
Scott Violet87450ce2020-01-23 01:56:2598 auto task_runner = sessions::CommandStorageManagerTestHelper(
Scott Violet9843d0a2020-02-11 22:38:0799 BrowserPersisterTestHelper::GetCommandStorageManager(
100 browser->browser_persister()))
Scott Violet87450ce2020-01-23 01:56:25101 .GetBackendTaskRunner();
102 browser->PrepareForShutdown();
103 base::RunLoop run_loop;
104 task_runner->PostTaskAndReply(FROM_HERE, base::DoNothing(),
105 run_loop.QuitClosure());
106 run_loop.Run();
107}
108
Scott Violetbf8b8aa72020-01-28 19:37:32109std::unique_ptr<BrowserImpl> CreateBrowser(ProfileImpl* profile,
110 const std::string& persistence_id) {
111 Browser::PersistenceInfo info;
112 info.id = persistence_id;
Scott Violetb7df9d62020-01-31 16:18:49113 auto browser = Browser::Create(profile, &info);
114 return std::unique_ptr<BrowserImpl>(
115 static_cast<BrowserImpl*>(browser.release()));
Scott Violetbf8b8aa72020-01-28 19:37:32116}
117
Scott Violet87450ce2020-01-23 01:56:25118} // namespace
119
Scott Violet9843d0a2020-02-11 22:38:07120using BrowserPersisterTest = WebLayerBrowserTest;
Scott Violet87450ce2020-01-23 01:56:25121
Scott Violet9843d0a2020-02-11 22:38:07122IN_PROC_BROWSER_TEST_F(BrowserPersisterTest, SingleTab) {
Scott Violet87450ce2020-01-23 01:56:25123 ASSERT_TRUE(embedded_test_server()->Start());
124
Scott Violetbf8b8aa72020-01-28 19:37:32125 std::unique_ptr<BrowserImpl> browser = CreateBrowser(GetProfile(), "x");
Clark DuVallb9658c12020-06-12 02:25:08126 Tab* tab = browser->CreateTab();
Scott Violetf251a022020-10-07 16:54:43127 EXPECT_TRUE(browser->IsRestoringPreviousState());
Scott Violet87450ce2020-01-23 01:56:25128 const GURL url = embedded_test_server()->GetURL("/simple_page.html");
Scott Violetbb6c84552020-01-29 23:35:24129 NavigateAndWaitForCompletion(url, tab);
Scott Violet9843d0a2020-02-11 22:38:07130 ShutdownBrowserPersisterAndWait(browser.get());
Scott Violetbb6c84552020-01-29 23:35:24131 tab = nullptr;
Scott Violet87450ce2020-01-23 01:56:25132 browser.reset();
133
Scott Violetbf8b8aa72020-01-28 19:37:32134 browser = CreateBrowser(GetProfile(), "x");
Scott Violet87450ce2020-01-23 01:56:25135 // Should be no tabs while waiting for restore.
136 EXPECT_TRUE(browser->GetTabs().empty());
Scott Violetf251a022020-10-07 16:54:43137 EXPECT_TRUE(browser->IsRestoringPreviousState());
Scott Violet87450ce2020-01-23 01:56:25138 // Wait for the restore and navigation to complete.
139 BrowserNavigationObserverImpl::WaitForNewTabToCompleteNavigation(
140 browser.get(), url);
141
142 ASSERT_EQ(1u, browser->GetTabs().size());
143 EXPECT_EQ(browser->GetTabs()[0], browser->GetActiveTab());
144 EXPECT_EQ(1, browser->GetTabs()[0]
145 ->GetNavigationController()
146 ->GetNavigationListSize());
Scott Violetf251a022020-10-07 16:54:43147 EXPECT_FALSE(browser->IsRestoringPreviousState());
Scott Violet87450ce2020-01-23 01:56:25148}
149
Scott Violetb2e0cf12020-03-09 18:46:43150IN_PROC_BROWSER_TEST_F(BrowserPersisterTest, RestoresGuid) {
151 ASSERT_TRUE(embedded_test_server()->Start());
152
153 std::unique_ptr<BrowserImpl> browser = CreateBrowser(GetProfile(), "x");
Clark DuVallb9658c12020-06-12 02:25:08154 Tab* tab = browser->CreateTab();
Scott Violetb2e0cf12020-03-09 18:46:43155 const std::string original_guid = tab->GetGuid();
156 EXPECT_FALSE(original_guid.empty());
157 EXPECT_TRUE(base::IsValidGUID(original_guid));
158 const GURL url = embedded_test_server()->GetURL("/simple_page.html");
159 NavigateAndWaitForCompletion(url, tab);
160 ShutdownBrowserPersisterAndWait(browser.get());
161 tab = nullptr;
162 browser.reset();
163
164 browser = CreateBrowser(GetProfile(), "x");
165 // Should be no tabs while waiting for restore.
166 EXPECT_TRUE(browser->GetTabs().empty());
167 // Wait for the restore and navigation to complete.
168 BrowserNavigationObserverImpl::WaitForNewTabToCompleteNavigation(
169 browser.get(), url);
170
171 ASSERT_EQ(1u, browser->GetTabs().size());
172 EXPECT_EQ(browser->GetTabs()[0], browser->GetActiveTab());
173 EXPECT_EQ(original_guid, browser->GetTabs()[0]->GetGuid());
174}
175
Clark DuVallb7c09942020-05-20 04:12:51176IN_PROC_BROWSER_TEST_F(BrowserPersisterTest, RestoresData) {
177 ASSERT_TRUE(embedded_test_server()->Start());
178
179 std::unique_ptr<BrowserImpl> browser = CreateBrowser(GetProfile(), "x");
Clark DuVallb9658c12020-06-12 02:25:08180 Tab* tab = browser->CreateTab();
Clark DuVallb7c09942020-05-20 04:12:51181 tab->SetData({{"abc", "efg"}});
182 const GURL url = embedded_test_server()->GetURL("/simple_page.html");
183 NavigateAndWaitForCompletion(url, tab);
184 ShutdownBrowserPersisterAndWait(browser.get());
185 tab = nullptr;
186 browser.reset();
187
188 browser = CreateBrowser(GetProfile(), "x");
189 // Should be no tabs while waiting for restore.
190 EXPECT_TRUE(browser->GetTabs().empty());
191 // Wait for the restore and navigation to complete.
192 BrowserNavigationObserverImpl::WaitForNewTabToCompleteNavigation(
193 browser.get(), url);
194
195 ASSERT_EQ(1u, browser->GetTabs().size());
196 EXPECT_EQ(browser->GetTabs()[0], browser->GetActiveTab());
197 EXPECT_THAT(browser->GetTabs()[0]->GetData(),
198 UnorderedElementsAre(std::make_pair("abc", "efg")));
199}
200
201IN_PROC_BROWSER_TEST_F(BrowserPersisterTest, RestoresMostRecentData) {
202 ASSERT_TRUE(embedded_test_server()->Start());
203
204 std::unique_ptr<BrowserImpl> browser = CreateBrowser(GetProfile(), "x");
Clark DuVallb9658c12020-06-12 02:25:08205 Tab* tab = browser->CreateTab();
Clark DuVallb7c09942020-05-20 04:12:51206 tab->SetData({{"xxx", "xxx"}});
207 const GURL url = embedded_test_server()->GetURL("/simple_page.html");
208 NavigateAndWaitForCompletion(url, tab);
209
210 // Make sure the data has been saved, then set different data on the tab.
211 BrowserPersisterTestHelper::GetCommandStorageManager(
212 browser->browser_persister())
213 ->Save();
214 tab->SetData({{"abc", "efg"}});
215
216 ShutdownBrowserPersisterAndWait(browser.get());
217 tab = nullptr;
218 browser.reset();
219
220 browser = CreateBrowser(GetProfile(), "x");
221 // Should be no tabs while waiting for restore.
222 EXPECT_TRUE(browser->GetTabs().empty());
223 // Wait for the restore and navigation to complete.
224 BrowserNavigationObserverImpl::WaitForNewTabToCompleteNavigation(
225 browser.get(), url);
226
227 ASSERT_EQ(1u, browser->GetTabs().size());
228 EXPECT_EQ(browser->GetTabs()[0], browser->GetActiveTab());
229 EXPECT_THAT(browser->GetTabs()[0]->GetData(),
230 UnorderedElementsAre(std::make_pair("abc", "efg")));
231}
232
Scott Violet9843d0a2020-02-11 22:38:07233IN_PROC_BROWSER_TEST_F(BrowserPersisterTest, TwoTabs) {
Scott Violet87450ce2020-01-23 01:56:25234 ASSERT_TRUE(embedded_test_server()->Start());
235
Scott Violetbf8b8aa72020-01-28 19:37:32236 std::unique_ptr<BrowserImpl> browser = CreateBrowser(GetProfile(), "x");
Clark DuVallb9658c12020-06-12 02:25:08237 Tab* tab1 = browser->CreateTab();
Scott Violet87450ce2020-01-23 01:56:25238 const GURL url1 = embedded_test_server()->GetURL("/simple_page.html");
Scott Violetbb6c84552020-01-29 23:35:24239 NavigateAndWaitForCompletion(url1, tab1);
Scott Violet87450ce2020-01-23 01:56:25240
Clark DuVallb9658c12020-06-12 02:25:08241 Tab* tab2 = browser->CreateTab();
Scott Violet87450ce2020-01-23 01:56:25242 const GURL url2 = embedded_test_server()->GetURL("/simple_page2.html");
Scott Violetbb6c84552020-01-29 23:35:24243 NavigateAndWaitForCompletion(url2, tab2);
244 browser->SetActiveTab(tab2);
Scott Violet87450ce2020-01-23 01:56:25245
Colin Blundellbe1dc132020-01-29 09:54:06246 // Shut down the service.
Scott Violet9843d0a2020-02-11 22:38:07247 ShutdownBrowserPersisterAndWait(browser.get());
Scott Violetbb6c84552020-01-29 23:35:24248 tab1 = tab2 = nullptr;
Colin Blundellbe1dc132020-01-29 09:54:06249 browser.reset();
250
251 // Recreate the browser and run the assertions twice to ensure we handle
Scott Violet87450ce2020-01-23 01:56:25252 // correctly storing state of tabs that need to be reloaded.
253 for (int i = 0; i < 2; ++i) {
Scott Violetbf8b8aa72020-01-28 19:37:32254 browser = CreateBrowser(GetProfile(), "x");
Scott Violet87450ce2020-01-23 01:56:25255 // Should be no tabs while waiting for restore.
256 EXPECT_TRUE(browser->GetTabs().empty()) << "iteration " << i;
257 // Wait for the restore and navigation to complete. This waits for the
258 // second tab as that was the active one.
259 BrowserNavigationObserverImpl::WaitForNewTabToCompleteNavigation(
Scott Violetf251a022020-10-07 16:54:43260 browser.get(), url2, 1);
Scott Violet87450ce2020-01-23 01:56:25261
262 ASSERT_EQ(2u, browser->GetTabs().size()) << "iteration " << i;
263 // The first tab shouldn't have loaded yet, as it's not active.
264 EXPECT_TRUE(static_cast<TabImpl*>(browser->GetTabs()[0])
265 ->web_contents()
266 ->GetController()
267 .NeedsReload())
268 << "iteration " << i;
269 EXPECT_EQ(browser->GetTabs()[1], browser->GetActiveTab())
270 << "iteration " << i;
271 EXPECT_EQ(1, browser->GetTabs()[1]
272 ->GetNavigationController()
273 ->GetNavigationListSize())
274 << "iteration " << i;
Colin Blundellbe1dc132020-01-29 09:54:06275
Scott Violet9843d0a2020-02-11 22:38:07276 ShutdownBrowserPersisterAndWait(browser.get());
Scott Violet87450ce2020-01-23 01:56:25277 }
278}
279
Scott Violet9843d0a2020-02-11 22:38:07280IN_PROC_BROWSER_TEST_F(BrowserPersisterTest, MoveBetweenBrowsers) {
Scott Violet87450ce2020-01-23 01:56:25281 ASSERT_TRUE(embedded_test_server()->Start());
282
283 // Create a browser with two tabs.
Scott Violetbf8b8aa72020-01-28 19:37:32284 std::unique_ptr<BrowserImpl> browser1 = CreateBrowser(GetProfile(), "x");
Clark DuVallb9658c12020-06-12 02:25:08285 Tab* tab1 = browser1->CreateTab();
Scott Violet87450ce2020-01-23 01:56:25286 const GURL url1 = embedded_test_server()->GetURL("/simple_page.html");
Scott Violetbb6c84552020-01-29 23:35:24287 NavigateAndWaitForCompletion(url1, tab1);
Scott Violet87450ce2020-01-23 01:56:25288
Clark DuVallb9658c12020-06-12 02:25:08289 Tab* tab2 = browser1->CreateTab();
Scott Violet87450ce2020-01-23 01:56:25290 const GURL url2 = embedded_test_server()->GetURL("/simple_page2.html");
Scott Violetbb6c84552020-01-29 23:35:24291 NavigateAndWaitForCompletion(url2, tab2);
292 browser1->SetActiveTab(tab2);
Scott Violet87450ce2020-01-23 01:56:25293
294 // Create another browser with a single tab.
Scott Violetbf8b8aa72020-01-28 19:37:32295 std::unique_ptr<BrowserImpl> browser2 = CreateBrowser(GetProfile(), "y");
Clark DuVallb9658c12020-06-12 02:25:08296 Tab* tab3 = browser2->CreateTab();
Scott Violet87450ce2020-01-23 01:56:25297 const GURL url3 = embedded_test_server()->GetURL("/simple_page3.html");
Scott Violetbb6c84552020-01-29 23:35:24298 NavigateAndWaitForCompletion(url3, tab3);
Scott Violet87450ce2020-01-23 01:56:25299
300 // Move |tab2| to |browser2|.
Clark DuVallb9658c12020-06-12 02:25:08301 browser2->AddTab(tab2);
Scott Violetbb6c84552020-01-29 23:35:24302 browser2->SetActiveTab(tab2);
Scott Violet87450ce2020-01-23 01:56:25303
Scott Violet9843d0a2020-02-11 22:38:07304 ShutdownBrowserPersisterAndWait(browser1.get());
305 ShutdownBrowserPersisterAndWait(browser2.get());
Scott Violetbb6c84552020-01-29 23:35:24306 tab1 = nullptr;
Scott Violet87450ce2020-01-23 01:56:25307 browser1.reset();
308
Scott Violetbb6c84552020-01-29 23:35:24309 tab2 = tab3 = nullptr;
Scott Violet87450ce2020-01-23 01:56:25310 browser2.reset();
311
312 // Restore the browsers.
Scott Violetbf8b8aa72020-01-28 19:37:32313 browser1 = CreateBrowser(GetProfile(), "x");
Scott Violet87450ce2020-01-23 01:56:25314 BrowserNavigationObserverImpl::WaitForNewTabToCompleteNavigation(
Scott Violetf251a022020-10-07 16:54:43315 browser1.get(), url1);
Scott Violet87450ce2020-01-23 01:56:25316 ASSERT_EQ(1u, browser1->GetTabs().size());
317 EXPECT_EQ(1, browser1->GetTabs()[0]
318 ->GetNavigationController()
319 ->GetNavigationListSize());
320
Scott Violetbf8b8aa72020-01-28 19:37:32321 browser2 = CreateBrowser(GetProfile(), "y");
Scott Violet87450ce2020-01-23 01:56:25322 BrowserNavigationObserverImpl::WaitForNewTabToCompleteNavigation(
Scott Violetf251a022020-10-07 16:54:43323 browser2.get(), url2, 1);
Scott Violet87450ce2020-01-23 01:56:25324 ASSERT_EQ(2u, browser2->GetTabs().size());
325 EXPECT_EQ(1, browser2->GetTabs()[1]
326 ->GetNavigationController()
327 ->GetNavigationListSize());
328
329 // As |tab3| isn't active it needs to be loaded. Force that now.
330 TabImpl* restored_tab_3 = static_cast<TabImpl*>(browser2->GetTabs()[0]);
331 EXPECT_TRUE(restored_tab_3->web_contents()->GetController().NeedsReload());
332 restored_tab_3->web_contents()->GetController().LoadIfNecessary();
Fergal Dalyf0522332020-07-18 06:09:46333 EXPECT_TRUE(content::WaitForLoadStop(restored_tab_3->web_contents()));
Scott Violet87450ce2020-01-23 01:56:25334}
335
Scott Violet95a6d682020-06-11 23:28:32336class BrowserPersisterTestWithTwoPersistedIds : public WebLayerBrowserTest {
337 public:
338 // WebLayerBrowserTest:
339 void SetUpOnMainThread() override {
340 WebLayerBrowserTest::SetUpOnMainThread();
341 // Configure two browsers with ids 'x' and 'y'.
342 ASSERT_TRUE(embedded_test_server()->Start());
343 std::unique_ptr<BrowserImpl> browser1 = CreateBrowser(GetProfile(), "x");
344 const GURL url1 = embedded_test_server()->GetURL("/simple_page.html");
Clark DuVallb9658c12020-06-12 02:25:08345 NavigateAndWaitForCompletion(url1, browser1->CreateTab());
Scott Violet95a6d682020-06-11 23:28:32346
347 std::unique_ptr<BrowserImpl> browser2 = CreateBrowser(GetProfile(), "y");
348 const GURL url2 = embedded_test_server()->GetURL("/simple_page3.html");
Clark DuVallb9658c12020-06-12 02:25:08349 NavigateAndWaitForCompletion(url2, browser2->CreateTab());
Scott Violet95a6d682020-06-11 23:28:32350
351 // Shut down the browsers.
352 ShutdownBrowserPersisterAndWait(browser1.get());
353 browser1.reset();
354 ShutdownBrowserPersisterAndWait(browser2.get());
355 browser2.reset();
356 }
357};
358
359IN_PROC_BROWSER_TEST_F(BrowserPersisterTestWithTwoPersistedIds,
360 GetBrowserPersistenceIds) {
361 {
362 // Create a file that has the name of a valid persistence file, but has
363 // invalid contents.
364 base::ScopedAllowBlockingForTesting allow_blocking;
365 base::WriteFile(BuildPathForBrowserPersister(
366 GetProfile()->GetBrowserPersisterDataBaseDir(), "z"),
367 "a bogus persistence file");
368 }
369
370 base::RunLoop run_loop;
371 base::flat_set<std::string> persistence_ids;
372 GetProfile()->GetBrowserPersistenceIds(
373 base::BindLambdaForTesting([&](base::flat_set<std::string> ids) {
374 persistence_ids = std::move(ids);
375 run_loop.Quit();
376 }));
377 run_loop.Run();
378 ASSERT_EQ(2u, persistence_ids.size());
379 EXPECT_TRUE(persistence_ids.contains("x"));
380 EXPECT_TRUE(persistence_ids.contains("y"));
381}
382
383IN_PROC_BROWSER_TEST_F(BrowserPersisterTestWithTwoPersistedIds,
384 RemoveBrowserPersistenceStorage) {
385 base::FilePath file_path1 = BuildPathForBrowserPersister(
386 GetProfile()->GetBrowserPersisterDataBaseDir(), "x");
387 base::FilePath file_path2 = BuildPathForBrowserPersister(
388 GetProfile()->GetBrowserPersisterDataBaseDir(), "y");
389
390 {
391 base::ScopedAllowBlockingForTesting allow_blocking;
392 ASSERT_TRUE(base::PathExists(file_path1));
393 ASSERT_TRUE(base::PathExists(file_path2));
394 }
395 base::RunLoop run_loop;
396 base::flat_set<std::string> persistence_ids;
397 persistence_ids.insert("x");
398 persistence_ids.insert("y");
399 GetProfile()->RemoveBrowserPersistenceStorage(
400 base::BindLambdaForTesting([&](bool result) {
401 EXPECT_TRUE(result);
402 run_loop.Quit();
403 }),
404 std::move(persistence_ids));
405 run_loop.Run();
406 {
407 base::ScopedAllowBlockingForTesting allow_blocking;
408 EXPECT_FALSE(base::PathExists(file_path1));
409 EXPECT_FALSE(base::PathExists(file_path2));
410 }
411}
412
Scott Violet87450ce2020-01-23 01:56:25413} // namespace weblayer