|  | // Copyright 2012 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include "base/command_line.h" | 
|  | #include "base/files/file_path.h" | 
|  | #include "base/functional/bind.h" | 
|  | #include "base/location.h" | 
|  | #include "base/memory/raw_ptr.h" | 
|  | #include "base/memory/ref_counted.h" | 
|  | #include "base/run_loop.h" | 
|  | #include "base/task/single_thread_task_runner.h" | 
|  | #include "base/test/bind.h" | 
|  | #include "base/test/thread_test_helper.h" | 
|  | #include "content/browser/web_contents/web_contents_impl.h" | 
|  | #include "content/public/browser/browser_context.h" | 
|  | #include "content/public/browser/browser_task_traits.h" | 
|  | #include "content/public/browser/browser_thread.h" | 
|  | #include "content/public/browser/storage_partition.h" | 
|  | #include "content/public/common/content_switches.h" | 
|  | #include "content/public/test/browser_test.h" | 
|  | #include "content/public/test/browser_test_utils.h" | 
|  | #include "content/public/test/content_browser_test.h" | 
|  | #include "content/public/test/content_browser_test_utils.h" | 
|  | #include "content/shell/browser/shell.h" | 
|  | #include "storage/browser/quota/quota_manager.h" | 
|  |  | 
|  | using storage::QuotaManager; | 
|  |  | 
|  | namespace content { | 
|  |  | 
|  | // This browser test is aimed towards exercising the File System API bindings | 
|  | // and the actual implementation that lives in the browser side. | 
|  | class FileSystemBrowserTest : public ContentBrowserTest, | 
|  | public testing::WithParamInterface<bool> { | 
|  | public: | 
|  | FileSystemBrowserTest() { is_incognito_ = GetParam(); } | 
|  |  | 
|  | void SetUpOnMainThread() override { | 
|  | ASSERT_TRUE(embedded_test_server()->Start()); | 
|  | browser_ = is_incognito() ? CreateOffTheRecordBrowser() : shell(); | 
|  | } | 
|  |  | 
|  | void TearDownOnMainThread() override { browser_ = nullptr; } | 
|  |  | 
|  | void SimpleTest(const GURL& test_url) { | 
|  | // The test page will perform tests on FileAPI, then navigate to either | 
|  | // a #pass or #fail ref. | 
|  | VLOG(0) << "Navigating to URL and blocking."; | 
|  | NavigateToURLBlockUntilNavigationsComplete(browser(), test_url, 2); | 
|  | VLOG(0) << "Navigation done."; | 
|  | std::string result = | 
|  | browser()->web_contents()->GetLastCommittedURL().GetRef(); | 
|  | if (result != "pass") { | 
|  | std::string js_result = EvalJs(browser(), "getLog()").ExtractString(); | 
|  | FAIL() << "Failed: " << js_result; | 
|  | } | 
|  | } | 
|  |  | 
|  | Shell* browser() { return browser_; } | 
|  |  | 
|  | bool is_incognito() { return is_incognito_; } | 
|  |  | 
|  | protected: | 
|  | bool is_incognito_; | 
|  | raw_ptr<Shell> browser_ = nullptr; | 
|  | }; | 
|  |  | 
|  | INSTANTIATE_TEST_SUITE_P(All, FileSystemBrowserTest, ::testing::Bool()); | 
|  |  | 
|  | class FileSystemBrowserTestWithLowQuota : public FileSystemBrowserTest { | 
|  | public: | 
|  | void SetUpOnMainThread() override { | 
|  | FileSystemBrowserTest::SetUpOnMainThread(); | 
|  | SetLowQuota(browser() | 
|  | ->web_contents() | 
|  | ->GetBrowserContext() | 
|  | ->GetDefaultStoragePartition() | 
|  | ->GetQuotaManager()); | 
|  | } | 
|  |  | 
|  | static void SetLowQuota(scoped_refptr<QuotaManager> qm) { | 
|  | DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
|  |  | 
|  | base::RunLoop run_loop; | 
|  | GetIOThreadTaskRunner({})->PostTaskAndReply( | 
|  | FROM_HERE, base::BindLambdaForTesting([&]() { | 
|  | DCHECK_CURRENTLY_ON(BrowserThread::IO); | 
|  | // These sizes must correspond with expectations in html and js. | 
|  | const int kMeg = 1000 * 1024; | 
|  | storage::QuotaSettings settings; | 
|  | settings.pool_size = 25 * kMeg; | 
|  | settings.per_storage_key_quota = 5 * kMeg; | 
|  | settings.must_remain_available = 10 * kMeg; | 
|  | settings.refresh_interval = base::TimeDelta::Max(); | 
|  | qm->SetQuotaSettings(settings); | 
|  | }), | 
|  | run_loop.QuitClosure()); | 
|  | run_loop.Run(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | INSTANTIATE_TEST_SUITE_P(All, | 
|  | FileSystemBrowserTestWithLowQuota, | 
|  | ::testing::Bool()); | 
|  |  | 
|  | IN_PROC_BROWSER_TEST_P(FileSystemBrowserTest, RequestTest) { | 
|  | SimpleTest(embedded_test_server()->GetURL("/fileapi/request_test.html")); | 
|  | } | 
|  |  | 
|  | IN_PROC_BROWSER_TEST_P(FileSystemBrowserTest, CreateTest) { | 
|  | SimpleTest(embedded_test_server()->GetURL("/fileapi/create_test.html")); | 
|  | } | 
|  |  | 
|  | IN_PROC_BROWSER_TEST_P(FileSystemBrowserTestWithLowQuota, QuotaTest) { | 
|  | SimpleTest(embedded_test_server()->GetURL("/fileapi/quota_test.html")); | 
|  | } | 
|  |  | 
|  | }  // namespace content |