Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1791)

Unified Diff: chrome/browser/installable/installable_checker_browsertest.cc

Issue 2160513002: Extract AppBannerDataFetcher into an InstallableManager. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use pending_tasks_ vector and invoke callbacks directly Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698