Index: chrome/browser/installable/installable_checker_browsertest.cc |
diff --git a/chrome/browser/installable/installable_checker_browsertest.cc b/chrome/browser/installable/installable_checker_browsertest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..37f9fbcbdac1054bca9b2797941ef571338c8720 |
--- /dev/null |
+++ b/chrome/browser/installable/installable_checker_browsertest.cc |
@@ -0,0 +1,612 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/installable/installable_checker.h" |
+ |
+#include "base/command_line.h" |
+#include "base/run_loop.h" |
+#include "base/threading/thread_task_runner_handle.h" |
+#include "chrome/browser/ui/browser.h" |
+#include "chrome/browser/ui/tabs/tab_strip_model.h" |
+#include "chrome/common/chrome_switches.h" |
+#include "chrome/test/base/in_process_browser_test.h" |
+#include "chrome/test/base/ui_test_utils.h" |
+#include "net/test/embedded_test_server/embedded_test_server.h" |
+ |
+namespace { |
+ |
+installable::InstallableParams GetManifestParams() { |
+ installable::InstallableParams params; |
+ params.has_valid_webapp_manifest = false; |
+ params.has_service_worker = false; |
+ params.has_valid_icon = false; |
+ return params; |
+} |
+ |
+installable::InstallableParams GetWebAppParams() { |
+ installable::InstallableParams params = GetManifestParams(); |
+ params.ideal_icon_size_in_dp = 48; |
+ params.minimum_icon_size_in_dp = 48; |
+ params.has_valid_webapp_manifest = true; |
+ params.has_service_worker = true; |
+ params.has_valid_icon = true; |
+ return params; |
+} |
+ |
+installable::InstallableParams GetValidManifestParams() { |
+ installable::InstallableParams params = GetManifestParams(); |
+ params.has_valid_webapp_manifest = true; |
+ return params; |
+} |
+ |
+installable::InstallableParams GetIconParams() { |
+ installable::InstallableParams params = GetManifestParams(); |
+ params.ideal_icon_size_in_dp = 48; |
+ params.minimum_icon_size_in_dp = 48; |
+ params.has_valid_icon = true; |
+ return params; |
+} |
+ |
+} // anonymous namespace |
+ |
+namespace installable { |
+ |
+class CallbackTester { |
+ public: |
+ explicit CallbackTester(base::Closure quit_closure) |
+ : quit_closure_(quit_closure) { } |
+ |
+ void OnDidFinishInstallableCheck(const InstallableResult& result) { |
+ error_code_ = result.error_code; |
+ manifest_url_ = result.manifest_url; |
+ manifest_ = result.manifest; |
+ icon_url_ = result.icon_url; |
+ if (result.icon) |
+ icon_.reset(new SkBitmap(*result.icon)); |
+ has_valid_webapp_manifest_ = result.has_valid_webapp_manifest; |
+ has_service_worker_ = result.has_service_worker; |
+ base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, quit_closure_); |
+ } |
+ |
+ ErrorCode error_code() const { return error_code_; } |
+ const GURL& manifest_url() const { return manifest_url_; } |
+ const content::Manifest& manifest() const { return manifest_; } |
+ const GURL& icon_url() const { return icon_url_; } |
+ const SkBitmap* icon() const { return icon_.get(); } |
+ bool has_valid_webapp_manifest() const { return has_valid_webapp_manifest_; } |
+ bool has_service_worker() const { return has_service_worker_; } |
+ |
+ private: |
+ base::Closure quit_closure_; |
+ ErrorCode error_code_; |
+ GURL manifest_url_; |
+ content::Manifest manifest_; |
+ GURL icon_url_; |
+ std::unique_ptr<SkBitmap> icon_; |
+ bool has_valid_webapp_manifest_; |
+ bool has_service_worker_; |
+}; |
+ |
+class InstallableCheckerBrowserTest : public InProcessBrowserTest { |
+ public: |
+ void SetUpOnMainThread() override { |
+ InProcessBrowserTest::SetUpOnMainThread(); |
+ ASSERT_TRUE(embedded_test_server()->Start()); |
+ } |
+ |
+ void NavigateAndRunInstallableChecker(CallbackTester* tester, |
+ const InstallableParams& params, |
+ const std::string& url) { |
+ GURL test_url = embedded_test_server()->GetURL(url); |
+ ui_test_utils::NavigateToURL(browser(), test_url); |
+ RunInstallableChecker(tester, params); |
+ } |
+ |
+ void RunInstallableChecker(CallbackTester* tester, |
+ const InstallableParams& params) { |
+ InstallableChecker* checker = GetChecker(); |
+ checker->Start(params, |
+ base::Bind(&CallbackTester::OnDidFinishInstallableCheck, |
+ base::Unretained(tester))); |
+ } |
+ |
+ void SetUpCommandLine(base::CommandLine* command_line) override { |
+ // Make sure app banners are disabled in the browser so they do not |
+ // interfere with the test. |
+ command_line->AppendSwitch(switches::kDisableAddToShelf); |
+ } |
+ |
+ InstallableChecker* GetChecker() { |
+ content::WebContents* web_contents = |
+ browser()->tab_strip_model()->GetActiveWebContents(); |
+ InstallableChecker::CreateForWebContents(web_contents); |
+ InstallableChecker* checker = |
+ InstallableChecker::FromWebContents(web_contents); |
+ CHECK(checker); |
+ |
+ return checker; |
+ } |
+ |
+}; |
+ |
+IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, |
+ CheckerBeginsInEmptyState) { |
+ // Ensure that the InstallableChecker starts off with everything null. |
+ InstallableChecker* checker = GetChecker(); |
+ |
+ EXPECT_TRUE(checker->manifest_.IsEmpty()); |
+ EXPECT_TRUE(checker->manifest_url_.is_empty()); |
+ EXPECT_TRUE(checker->icon_url_.is_empty()); |
+ EXPECT_EQ(nullptr, checker->icon_.get()); |
+ EXPECT_FALSE(checker->has_valid_webapp_manifest_); |
+ EXPECT_FALSE(checker->has_service_worker_); |
+ |
+ EXPECT_EQ(checker->ideal_icon_size_in_dp_, -1); |
+ EXPECT_EQ(checker->minimum_icon_size_in_dp_, -1); |
+ |
+ EXPECT_EQ(InstallableChecker::DORMANT, checker->status_); |
+ EXPECT_EQ(NoErrorDetected, checker->manifest_error_); |
+ EXPECT_EQ(NoErrorDetected, checker->valid_webapp_manifest_error_); |
+ EXPECT_EQ(NoErrorDetected, checker->service_worker_error_); |
+ EXPECT_EQ(NoErrorDetected, checker->icon_error_); |
+ EXPECT_TRUE(checker->tasks_.empty()); |
+ EXPECT_TRUE(checker->pending_tasks_.empty()); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, CheckNoManifest) { |
+ // Ensure that a page with no manifest returns the appropriate error and with |
+ // null fields for everything. |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ NavigateAndRunInstallableChecker(tester.get(), GetManifestParams(), |
+ "/banners/no_manifest_test_page.html"); |
+ run_loop.Run(); |
+ |
+ // If there is no manifest, everything should be empty. |
+ EXPECT_TRUE(tester->manifest().IsEmpty()); |
+ EXPECT_TRUE(tester->manifest_url().is_empty()); |
+ EXPECT_TRUE(tester->icon_url().is_empty()); |
+ EXPECT_EQ(nullptr, tester->icon()); |
+ EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
+ EXPECT_FALSE(tester->has_service_worker()); |
+ EXPECT_EQ(NoManifest, tester->error_code()); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, CheckManifest404) { |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ NavigateAndRunInstallableChecker(tester.get(), GetManifestParams(), |
+ "/banners/manifest_bad_link.html"); |
+ run_loop.Run(); |
+ |
+ // The installable checker should return a manifest URL even if it 404s. |
+ // However, the check should fail with a ManifestEmpty error. |
+ EXPECT_TRUE(tester->manifest().IsEmpty()); |
+ |
+ EXPECT_FALSE(tester->manifest_url().is_empty()); |
+ EXPECT_TRUE(tester->icon_url().is_empty()); |
+ EXPECT_EQ(nullptr, tester->icon()); |
+ EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
+ EXPECT_FALSE(tester->has_service_worker()); |
+ EXPECT_EQ(ManifestEmpty, tester->error_code()); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, CheckManifestOnly) { |
+ // Verify that asking for just the manifest works as expected. |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ NavigateAndRunInstallableChecker(tester.get(), GetManifestParams(), |
+ "/banners/manifest_test_page.html"); |
+ run_loop.Run(); |
+ |
+ EXPECT_FALSE(tester->manifest().IsEmpty()); |
+ EXPECT_FALSE(tester->manifest_url().is_empty()); |
+ |
+ EXPECT_TRUE(tester->icon_url().is_empty()); |
+ EXPECT_EQ(nullptr, tester->icon()); |
+ EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
+ EXPECT_FALSE(tester->has_service_worker()); |
+ EXPECT_EQ(NoErrorDetected, tester->error_code()); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, |
+ CheckInstallableParamsDefaultConstructor) { |
+ // Verify that using InstallableParams' default constructor is equivalent to |
+ // just asking for the manifest alone. |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ InstallableParams params; |
+ NavigateAndRunInstallableChecker(tester.get(), params, |
+ "/banners/manifest_test_page.html"); |
+ run_loop.Run(); |
+ |
+ EXPECT_FALSE(tester->manifest().IsEmpty()); |
+ EXPECT_FALSE(tester->manifest_url().is_empty()); |
+ |
+ EXPECT_TRUE(tester->icon_url().is_empty()); |
+ EXPECT_EQ(nullptr, tester->icon()); |
+ EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
+ EXPECT_FALSE(tester->has_service_worker()); |
+ EXPECT_EQ(NoErrorDetected, tester->error_code()); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, |
+ CheckManifestWithOnlyRelatedApplications) { |
+ // This page has a manifest with only related applications specified. Asking |
+ // for just the manifest should succeed. |
+ { |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ NavigateAndRunInstallableChecker(tester.get(), GetManifestParams(), |
+ "/banners/play_app_test_page.html"); |
+ run_loop.Run(); |
+ |
+ EXPECT_FALSE(tester->manifest().IsEmpty()); |
+ EXPECT_FALSE(tester->manifest_url().is_empty()); |
+ EXPECT_TRUE(tester->manifest().prefer_related_applications); |
+ |
+ EXPECT_TRUE(tester->icon_url().is_empty()); |
+ EXPECT_EQ(nullptr, tester->icon()); |
+ EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
+ EXPECT_FALSE(tester->has_service_worker()); |
+ EXPECT_EQ(NoErrorDetected, tester->error_code()); |
+ } |
+ |
+ // Ask whether it's valid for a webapp (but don't navigate). This should fail |
+ // with StartUrlNotValid. |
+ { |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ RunInstallableChecker(tester.get(), GetValidManifestParams()); |
+ run_loop.Run(); |
+ |
+ EXPECT_FALSE(tester->manifest().IsEmpty()); |
+ EXPECT_FALSE(tester->manifest_url().is_empty()); |
+ EXPECT_TRUE(tester->manifest().prefer_related_applications); |
+ |
+ EXPECT_TRUE(tester->icon_url().is_empty()); |
+ EXPECT_EQ(nullptr, tester->icon()); |
+ EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
+ EXPECT_FALSE(tester->has_service_worker()); |
+ EXPECT_EQ(StartUrlNotValid, tester->error_code()); |
+ } |
+ |
+ // Ask for everything. This should still fail with StartUrlNotValid. |
+ { |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ RunInstallableChecker(tester.get(), GetWebAppParams()); |
+ run_loop.Run(); |
+ |
+ EXPECT_FALSE(tester->manifest().IsEmpty()); |
+ EXPECT_FALSE(tester->manifest_url().is_empty()); |
+ EXPECT_TRUE(tester->manifest().prefer_related_applications); |
+ |
+ EXPECT_TRUE(tester->icon_url().is_empty()); |
+ EXPECT_EQ(nullptr, tester->icon()); |
+ EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
+ EXPECT_FALSE(tester->has_service_worker()); |
+ EXPECT_EQ(StartUrlNotValid, tester->error_code()); |
+ } |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, CheckValidManifest) { |
+ // Check for a manifest that's valid for a webapp. |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ NavigateAndRunInstallableChecker(tester.get(), GetValidManifestParams(), |
+ "/banners/manifest_test_page.html"); |
+ run_loop.Run(); |
+ |
+ EXPECT_FALSE(tester->manifest().IsEmpty()); |
+ EXPECT_FALSE(tester->manifest_url().is_empty()); |
+ |
+ EXPECT_TRUE(tester->icon_url().is_empty()); |
+ EXPECT_EQ(nullptr, tester->icon()); |
+ |
+ EXPECT_TRUE(tester->has_valid_webapp_manifest()); |
+ EXPECT_FALSE(tester->has_service_worker()); |
+ EXPECT_EQ(NoErrorDetected, tester->error_code()); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, CheckManifestAndIcon) { |
+ // Add to homescreen checks for manifest + icon. |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ NavigateAndRunInstallableChecker(tester.get(), GetIconParams(), |
+ "/banners/manifest_test_page.html"); |
+ run_loop.Run(); |
+ |
+ EXPECT_FALSE(tester->manifest().IsEmpty()); |
+ EXPECT_FALSE(tester->manifest_url().is_empty()); |
+ |
+ EXPECT_FALSE(tester->icon_url().is_empty()); |
+ EXPECT_NE(nullptr, tester->icon()); |
+ |
+ EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
+ EXPECT_FALSE(tester->has_service_worker()); |
+ EXPECT_EQ(NoErrorDetected, tester->error_code()); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, CheckWebapp) { |
+ // Request everything. |
+ { |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ NavigateAndRunInstallableChecker(tester.get(), GetWebAppParams(), |
+ "/banners/manifest_test_page.html"); |
+ run_loop.Run(); |
+ |
+ EXPECT_FALSE(tester->manifest().IsEmpty()); |
+ EXPECT_FALSE(tester->manifest_url().is_empty()); |
+ EXPECT_TRUE(tester->has_valid_webapp_manifest()); |
+ EXPECT_TRUE(tester->has_service_worker()); |
+ EXPECT_FALSE(tester->icon_url().is_empty()); |
+ EXPECT_NE(nullptr, tester->icon()); |
+ EXPECT_EQ(NoErrorDetected, tester->error_code()); |
+ |
+ // Verify result state matches checker internal state. |
+ InstallableChecker* checker = GetChecker(); |
+ |
+ EXPECT_FALSE(checker->manifest_.IsEmpty()); |
+ EXPECT_FALSE(checker->manifest_url_.is_empty()); |
+ EXPECT_TRUE(checker->has_valid_webapp_manifest_); |
+ EXPECT_TRUE(checker->has_service_worker_); |
+ EXPECT_FALSE(checker->icon_url_.is_empty()); |
+ EXPECT_NE(nullptr, checker->icon_.get()); |
+ EXPECT_TRUE(checker->HasFlag(InstallableChecker::MANIFEST_FETCHED)); |
+ EXPECT_TRUE(checker->HasFlag(InstallableChecker::MANIFEST_VALIDATED)); |
+ EXPECT_TRUE(checker->HasFlag(InstallableChecker::SERVICE_WORKER_CHECKED)); |
+ EXPECT_TRUE(checker->HasFlag(InstallableChecker::ICON_FETCHED)); |
+ EXPECT_EQ(48, checker->ideal_icon_size_in_dp_); |
+ EXPECT_EQ(48, checker->minimum_icon_size_in_dp_); |
+ EXPECT_EQ(NoErrorDetected, checker->processing_error_); |
+ EXPECT_EQ(NoErrorDetected, checker->manifest_error_); |
+ EXPECT_EQ(NoErrorDetected, checker->valid_webapp_manifest_error_); |
+ EXPECT_EQ(NoErrorDetected, checker->service_worker_error_); |
+ EXPECT_EQ(NoErrorDetected, checker->icon_error_); |
+ EXPECT_TRUE(checker->tasks_.empty()); |
+ EXPECT_TRUE(checker->pending_tasks_.empty()); |
+ } |
+ |
+ // Request everything again without navigating away. This should work fine. |
+ { |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ RunInstallableChecker(tester.get(), GetWebAppParams()); |
+ run_loop.Run(); |
+ |
+ EXPECT_FALSE(tester->manifest().IsEmpty()); |
+ EXPECT_FALSE(tester->manifest_url().is_empty()); |
+ EXPECT_TRUE(tester->has_valid_webapp_manifest()); |
+ EXPECT_TRUE(tester->has_service_worker()); |
+ EXPECT_FALSE(tester->icon_url().is_empty()); |
+ EXPECT_NE(nullptr, tester->icon()); |
+ EXPECT_EQ(NoErrorDetected, tester->error_code()); |
+ |
+ // Verify result state matches checker internal state. |
+ InstallableChecker* checker = GetChecker(); |
+ |
+ EXPECT_FALSE(checker->manifest_.IsEmpty()); |
+ EXPECT_FALSE(checker->manifest_url_.is_empty()); |
+ EXPECT_TRUE(checker->has_valid_webapp_manifest_); |
+ EXPECT_TRUE(checker->has_service_worker_); |
+ EXPECT_FALSE(checker->icon_url_.is_empty()); |
+ EXPECT_NE(nullptr, checker->icon_.get()); |
+ EXPECT_TRUE(checker->HasFlag(InstallableChecker::MANIFEST_FETCHED)); |
+ EXPECT_TRUE(checker->HasFlag(InstallableChecker::MANIFEST_VALIDATED)); |
+ EXPECT_TRUE(checker->HasFlag(InstallableChecker::SERVICE_WORKER_CHECKED)); |
+ EXPECT_TRUE(checker->HasFlag(InstallableChecker::ICON_FETCHED)); |
+ EXPECT_EQ(48, checker->ideal_icon_size_in_dp_); |
+ EXPECT_EQ(48, checker->minimum_icon_size_in_dp_); |
+ EXPECT_EQ(NoErrorDetected, checker->processing_error_); |
+ EXPECT_EQ(NoErrorDetected, checker->manifest_error_); |
+ EXPECT_EQ(NoErrorDetected, checker->valid_webapp_manifest_error_); |
+ EXPECT_EQ(NoErrorDetected, checker->service_worker_error_); |
+ EXPECT_EQ(NoErrorDetected, checker->icon_error_); |
+ EXPECT_TRUE(checker->tasks_.empty()); |
+ EXPECT_TRUE(checker->pending_tasks_.empty()); |
+ } |
+ |
+ { |
+ // Check that a subsequent navigation resets state. |
+ ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); |
+ InstallableChecker* checker = GetChecker(); |
+ |
+ EXPECT_TRUE(checker->manifest_.IsEmpty()); |
+ EXPECT_TRUE(checker->manifest_url_.is_empty()); |
+ EXPECT_FALSE(checker->has_service_worker_); |
+ EXPECT_FALSE(checker->has_valid_webapp_manifest_); |
+ EXPECT_TRUE(checker->icon_url_.is_empty()); |
+ EXPECT_EQ(nullptr, checker->icon_.get()); |
+ EXPECT_EQ(InstallableChecker::DORMANT, checker->status_); |
+ EXPECT_FALSE(checker->HasFlag(InstallableChecker::MANIFEST_FETCHED)); |
+ EXPECT_FALSE(checker->HasFlag(InstallableChecker::MANIFEST_VALIDATED)); |
+ EXPECT_FALSE(checker->HasFlag(InstallableChecker::SERVICE_WORKER_CHECKED)); |
+ EXPECT_FALSE(checker->HasFlag(InstallableChecker::ICON_FETCHED)); |
+ EXPECT_EQ(-1, checker->ideal_icon_size_in_dp_); |
+ EXPECT_EQ(-1, checker->minimum_icon_size_in_dp_); |
+ EXPECT_EQ(NoErrorDetected, checker->processing_error_); |
+ EXPECT_EQ(NoErrorDetected, checker->manifest_error_); |
+ EXPECT_EQ(NoErrorDetected, checker->valid_webapp_manifest_error_); |
+ EXPECT_EQ(NoErrorDetected, checker->service_worker_error_); |
+ EXPECT_EQ(NoErrorDetected, checker->icon_error_); |
+ EXPECT_TRUE(checker->tasks_.empty()); |
+ EXPECT_TRUE(checker->pending_tasks_.empty()); |
+ } |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, CheckWebappInIframe) { |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ NavigateAndRunInstallableChecker(tester.get(), GetWebAppParams(), |
+ "/banners/iframe_test_page.html"); |
+ run_loop.Run(); |
+ |
+ // The installable checker should only retrieve items in the main frame; |
+ // everything should be empty here. |
+ EXPECT_TRUE(tester->manifest().IsEmpty()); |
+ EXPECT_TRUE(tester->manifest_url().is_empty()); |
+ EXPECT_TRUE(tester->icon_url().is_empty()); |
+ EXPECT_EQ(nullptr, tester->icon()); |
+ EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
+ EXPECT_FALSE(tester->has_service_worker()); |
+ EXPECT_EQ(NoManifest, tester->error_code()); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, |
+ CheckPageWithManifestAndNoServiceWorker) { |
+ // Just fetch the manifest. This should have no error. |
+ { |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ NavigateAndRunInstallableChecker( |
+ tester.get(), GetManifestParams(), |
+ "/banners/manifest_no_service_worker.html"); |
+ run_loop.Run(); |
+ |
+ EXPECT_FALSE(tester->manifest().IsEmpty()); |
+ EXPECT_FALSE(tester->manifest_url().is_empty()); |
+ EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
+ |
+ EXPECT_TRUE(tester->icon_url().is_empty()); |
+ EXPECT_EQ(nullptr, tester->icon()); |
+ EXPECT_FALSE(tester->has_service_worker()); |
+ EXPECT_EQ(NoErrorDetected, tester->error_code()); |
+ } |
+ |
+ // Fetch the full criteria should fail. |
+ { |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ RunInstallableChecker(tester.get(), GetWebAppParams()); |
+ run_loop.Run(); |
+ |
+ EXPECT_FALSE(tester->manifest().IsEmpty()); |
+ EXPECT_FALSE(tester->manifest_url().is_empty()); |
+ EXPECT_TRUE(tester->has_valid_webapp_manifest()); |
+ |
+ EXPECT_TRUE(tester->icon_url().is_empty()); |
+ EXPECT_EQ(nullptr, tester->icon()); |
+ EXPECT_FALSE(tester->has_service_worker()); |
+ EXPECT_EQ(NoMatchingServiceWorker, tester->error_code()); |
+ } |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, |
+ CheckChangeInIconDimensions) { |
+ // Verify that a follow-up request for an icon with a different size resets |
+ // the icon state. |
+ { |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ NavigateAndRunInstallableChecker(tester.get(), GetWebAppParams(), |
+ "/banners/manifest_test_page.html"); |
+ run_loop.Run(); |
+ |
+ EXPECT_FALSE(tester->manifest_url().is_empty()); |
+ EXPECT_FALSE(tester->manifest().IsEmpty()); |
+ EXPECT_TRUE(tester->has_valid_webapp_manifest()); |
+ EXPECT_TRUE(tester->has_service_worker()); |
+ EXPECT_FALSE(tester->icon_url().is_empty()); |
+ EXPECT_NE(nullptr, tester->icon()); |
+ EXPECT_EQ(NoErrorDetected, tester->error_code()); |
+ } |
+ |
+ { |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ // Dial up the icon size requirements to something that isn't available. |
+ // This should now fail with NoIconMatchingRequirements. |
+ InstallableParams params = GetWebAppParams(); |
+ params.ideal_icon_size_in_dp = 2000; |
+ params.minimum_icon_size_in_dp = 2000; |
+ RunInstallableChecker(tester.get(), params); |
+ run_loop.Run(); |
+ |
+ EXPECT_FALSE(tester->manifest_url().is_empty()); |
+ EXPECT_FALSE(tester->manifest().IsEmpty()); |
+ EXPECT_TRUE(tester->has_valid_webapp_manifest()); |
+ EXPECT_TRUE(tester->has_service_worker()); |
+ EXPECT_TRUE(tester->icon_url().is_empty()); |
+ EXPECT_EQ(nullptr, tester->icon()); |
+ EXPECT_EQ(NoIconMatchingRequirements, tester->error_code()); |
+ } |
+ |
+ // Navigate and verify the reverse: an overly large icon requested first |
+ // fails, but a smaller icon requested second passes. |
+ { |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ |
+ // This should fail with NoIconMatchingRequirements. |
+ InstallableParams params = GetWebAppParams(); |
+ params.ideal_icon_size_in_dp = 2000; |
+ params.minimum_icon_size_in_dp = 2000; |
+ NavigateAndRunInstallableChecker(tester.get(), params, |
+ "/banners/manifest_test_page.html"); |
+ run_loop.Run(); |
+ |
+ EXPECT_FALSE(tester->manifest_url().is_empty()); |
+ EXPECT_FALSE(tester->manifest().IsEmpty()); |
+ EXPECT_TRUE(tester->has_valid_webapp_manifest()); |
+ EXPECT_TRUE(tester->has_service_worker()); |
+ EXPECT_TRUE(tester->icon_url().is_empty()); |
+ EXPECT_EQ(nullptr, tester->icon()); |
+ EXPECT_EQ(NoIconMatchingRequirements, tester->error_code()); |
+ } |
+ |
+ { |
+ base::RunLoop run_loop; |
+ std::unique_ptr<CallbackTester> tester( |
+ new CallbackTester(run_loop.QuitClosure())); |
+ RunInstallableChecker(tester.get(), GetWebAppParams()); |
+ |
+ run_loop.Run(); |
+ |
+ // The smaller icon requirements should allow this to pass. |
+ EXPECT_FALSE(tester->manifest_url().is_empty()); |
+ EXPECT_FALSE(tester->manifest().IsEmpty()); |
+ EXPECT_TRUE(tester->has_valid_webapp_manifest()); |
+ EXPECT_TRUE(tester->has_service_worker()); |
+ EXPECT_FALSE(tester->icon_url().is_empty()); |
+ EXPECT_NE(nullptr, tester->icon()); |
+ EXPECT_EQ(NoErrorDetected, tester->error_code()); |
+ } |
+} |
+ |
+} // namespace installable |