OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 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 |
| 5 #include "chrome/browser/installable/installable_checker.h" |
| 6 |
| 7 #include "base/command_line.h" |
| 8 #include "base/run_loop.h" |
| 9 #include "base/threading/thread_task_runner_handle.h" |
| 10 #include "chrome/browser/ui/browser.h" |
| 11 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 12 #include "chrome/common/chrome_switches.h" |
| 13 #include "chrome/test/base/in_process_browser_test.h" |
| 14 #include "chrome/test/base/ui_test_utils.h" |
| 15 #include "net/test/embedded_test_server/embedded_test_server.h" |
| 16 |
| 17 namespace { |
| 18 |
| 19 InstallableParams GetManifestParams() { |
| 20 InstallableParams params; |
| 21 params.check_valid_webapp_manifest = false; |
| 22 params.check_service_worker = false; |
| 23 params.check_valid_icon = false; |
| 24 return params; |
| 25 } |
| 26 |
| 27 InstallableParams GetWebAppParams() { |
| 28 InstallableParams params = GetManifestParams(); |
| 29 params.ideal_icon_size_in_dp = 48; |
| 30 params.minimum_icon_size_in_dp = 48; |
| 31 params.check_valid_webapp_manifest = true; |
| 32 params.check_service_worker = true; |
| 33 params.check_valid_icon = true; |
| 34 return params; |
| 35 } |
| 36 |
| 37 InstallableParams GetValidManifestParams() { |
| 38 InstallableParams params = GetManifestParams(); |
| 39 params.check_valid_webapp_manifest = true; |
| 40 return params; |
| 41 } |
| 42 |
| 43 InstallableParams GetIconParams() { |
| 44 InstallableParams params = GetManifestParams(); |
| 45 params.ideal_icon_size_in_dp = 48; |
| 46 params.minimum_icon_size_in_dp = 48; |
| 47 params.check_valid_icon = true; |
| 48 return params; |
| 49 } |
| 50 |
| 51 } // anonymous namespace |
| 52 |
| 53 class CallbackTester { |
| 54 public: |
| 55 explicit CallbackTester(base::Closure quit_closure) |
| 56 : quit_closure_(quit_closure) { } |
| 57 |
| 58 void OnDidFinishInstallableCheck(const InstallableResult& result) { |
| 59 error_code_ = result.error_code; |
| 60 manifest_url_ = result.manifest_url; |
| 61 manifest_ = result.manifest; |
| 62 icon_url_ = result.icon_url; |
| 63 if (result.icon) |
| 64 icon_.reset(new SkBitmap(*result.icon)); |
| 65 has_valid_webapp_manifest_ = result.has_valid_webapp_manifest; |
| 66 has_service_worker_ = result.has_service_worker; |
| 67 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, quit_closure_); |
| 68 } |
| 69 |
| 70 InstallableErrorCode error_code() const { return error_code_; } |
| 71 const GURL& manifest_url() const { return manifest_url_; } |
| 72 const content::Manifest& manifest() const { return manifest_; } |
| 73 const GURL& icon_url() const { return icon_url_; } |
| 74 const SkBitmap* icon() const { return icon_.get(); } |
| 75 bool has_valid_webapp_manifest() const { return has_valid_webapp_manifest_; } |
| 76 bool has_service_worker() const { return has_service_worker_; } |
| 77 |
| 78 private: |
| 79 base::Closure quit_closure_; |
| 80 InstallableErrorCode error_code_; |
| 81 GURL manifest_url_; |
| 82 content::Manifest manifest_; |
| 83 GURL icon_url_; |
| 84 std::unique_ptr<SkBitmap> icon_; |
| 85 bool has_valid_webapp_manifest_; |
| 86 bool has_service_worker_; |
| 87 }; |
| 88 |
| 89 class InstallableCheckerBrowserTest : public InProcessBrowserTest { |
| 90 public: |
| 91 void SetUpOnMainThread() override { |
| 92 InProcessBrowserTest::SetUpOnMainThread(); |
| 93 ASSERT_TRUE(embedded_test_server()->Start()); |
| 94 } |
| 95 |
| 96 void NavigateAndRunInstallableChecker(CallbackTester* tester, |
| 97 const InstallableParams& params, |
| 98 const std::string& url) { |
| 99 GURL test_url = embedded_test_server()->GetURL(url); |
| 100 ui_test_utils::NavigateToURL(browser(), test_url); |
| 101 RunInstallableChecker(tester, params); |
| 102 } |
| 103 |
| 104 void RunInstallableChecker(CallbackTester* tester, |
| 105 const InstallableParams& params) { |
| 106 InstallableChecker* checker = GetChecker(); |
| 107 checker->Start(params, |
| 108 base::Bind(&CallbackTester::OnDidFinishInstallableCheck, |
| 109 base::Unretained(tester))); |
| 110 } |
| 111 |
| 112 void SetUpCommandLine(base::CommandLine* command_line) override { |
| 113 // Make sure app banners are disabled in the browser so they do not |
| 114 // interfere with the test. |
| 115 command_line->AppendSwitch(switches::kDisableAddToShelf); |
| 116 } |
| 117 |
| 118 InstallableChecker* GetChecker() { |
| 119 content::WebContents* web_contents = |
| 120 browser()->tab_strip_model()->GetActiveWebContents(); |
| 121 InstallableChecker::CreateForWebContents(web_contents); |
| 122 InstallableChecker* checker = |
| 123 InstallableChecker::FromWebContents(web_contents); |
| 124 CHECK(checker); |
| 125 |
| 126 return checker; |
| 127 } |
| 128 |
| 129 }; |
| 130 |
| 131 IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, |
| 132 CheckerBeginsInEmptyState) { |
| 133 // Ensure that the InstallableChecker starts off with everything null. |
| 134 InstallableChecker* checker = GetChecker(); |
| 135 |
| 136 EXPECT_TRUE(checker->manifest_.IsEmpty()); |
| 137 EXPECT_TRUE(checker->manifest_url_.is_empty()); |
| 138 EXPECT_TRUE(checker->icon_url_.is_empty()); |
| 139 EXPECT_EQ(nullptr, checker->icon_.get()); |
| 140 EXPECT_FALSE(checker->has_valid_webapp_manifest_); |
| 141 EXPECT_FALSE(checker->has_service_worker_); |
| 142 |
| 143 EXPECT_EQ(checker->ideal_icon_size_in_dp_, -1); |
| 144 EXPECT_EQ(checker->minimum_icon_size_in_dp_, -1); |
| 145 |
| 146 EXPECT_EQ(InstallableChecker::DORMANT, checker->status_); |
| 147 EXPECT_EQ(NO_ERROR_DETECTED, checker->manifest_error_); |
| 148 EXPECT_EQ(NO_ERROR_DETECTED, checker->valid_webapp_manifest_error_); |
| 149 EXPECT_EQ(NO_ERROR_DETECTED, checker->service_worker_error_); |
| 150 EXPECT_EQ(NO_ERROR_DETECTED, checker->icon_error_); |
| 151 EXPECT_TRUE(checker->tasks_.empty()); |
| 152 EXPECT_TRUE(checker->pending_tasks_.empty()); |
| 153 } |
| 154 |
| 155 IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, CheckNoManifest) { |
| 156 // Ensure that a page with no manifest returns the appropriate error and with |
| 157 // null fields for everything. |
| 158 base::RunLoop run_loop; |
| 159 std::unique_ptr<CallbackTester> tester( |
| 160 new CallbackTester(run_loop.QuitClosure())); |
| 161 |
| 162 NavigateAndRunInstallableChecker(tester.get(), GetManifestParams(), |
| 163 "/banners/no_manifest_test_page.html"); |
| 164 run_loop.Run(); |
| 165 |
| 166 // If there is no manifest, everything should be empty. |
| 167 EXPECT_TRUE(tester->manifest().IsEmpty()); |
| 168 EXPECT_TRUE(tester->manifest_url().is_empty()); |
| 169 EXPECT_TRUE(tester->icon_url().is_empty()); |
| 170 EXPECT_EQ(nullptr, tester->icon()); |
| 171 EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
| 172 EXPECT_FALSE(tester->has_service_worker()); |
| 173 EXPECT_EQ(NO_MANIFEST, tester->error_code()); |
| 174 } |
| 175 |
| 176 IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, CheckManifest404) { |
| 177 base::RunLoop run_loop; |
| 178 std::unique_ptr<CallbackTester> tester( |
| 179 new CallbackTester(run_loop.QuitClosure())); |
| 180 |
| 181 NavigateAndRunInstallableChecker(tester.get(), GetManifestParams(), |
| 182 "/banners/manifest_bad_link.html"); |
| 183 run_loop.Run(); |
| 184 |
| 185 // The installable checker should return a manifest URL even if it 404s. |
| 186 // However, the check should fail with a ManifestEmpty error. |
| 187 EXPECT_TRUE(tester->manifest().IsEmpty()); |
| 188 |
| 189 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 190 EXPECT_TRUE(tester->icon_url().is_empty()); |
| 191 EXPECT_EQ(nullptr, tester->icon()); |
| 192 EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
| 193 EXPECT_FALSE(tester->has_service_worker()); |
| 194 EXPECT_EQ(MANIFEST_EMPTY, tester->error_code()); |
| 195 } |
| 196 |
| 197 IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, CheckManifestOnly) { |
| 198 // Verify that asking for just the manifest works as expected. |
| 199 base::RunLoop run_loop; |
| 200 std::unique_ptr<CallbackTester> tester( |
| 201 new CallbackTester(run_loop.QuitClosure())); |
| 202 |
| 203 NavigateAndRunInstallableChecker(tester.get(), GetManifestParams(), |
| 204 "/banners/manifest_test_page.html"); |
| 205 run_loop.Run(); |
| 206 |
| 207 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 208 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 209 |
| 210 EXPECT_TRUE(tester->icon_url().is_empty()); |
| 211 EXPECT_EQ(nullptr, tester->icon()); |
| 212 EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
| 213 EXPECT_FALSE(tester->has_service_worker()); |
| 214 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); |
| 215 } |
| 216 |
| 217 IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, |
| 218 CheckInstallableParamsDefaultConstructor) { |
| 219 // Verify that using InstallableParams' default constructor is equivalent to |
| 220 // just asking for the manifest alone. |
| 221 base::RunLoop run_loop; |
| 222 std::unique_ptr<CallbackTester> tester( |
| 223 new CallbackTester(run_loop.QuitClosure())); |
| 224 |
| 225 InstallableParams params; |
| 226 NavigateAndRunInstallableChecker(tester.get(), params, |
| 227 "/banners/manifest_test_page.html"); |
| 228 run_loop.Run(); |
| 229 |
| 230 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 231 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 232 |
| 233 EXPECT_TRUE(tester->icon_url().is_empty()); |
| 234 EXPECT_EQ(nullptr, tester->icon()); |
| 235 EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
| 236 EXPECT_FALSE(tester->has_service_worker()); |
| 237 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); |
| 238 } |
| 239 |
| 240 IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, |
| 241 CheckManifestWithOnlyRelatedApplications) { |
| 242 // This page has a manifest with only related applications specified. Asking |
| 243 // for just the manifest should succeed. |
| 244 { |
| 245 base::RunLoop run_loop; |
| 246 std::unique_ptr<CallbackTester> tester( |
| 247 new CallbackTester(run_loop.QuitClosure())); |
| 248 |
| 249 NavigateAndRunInstallableChecker(tester.get(), GetManifestParams(), |
| 250 "/banners/play_app_test_page.html"); |
| 251 run_loop.Run(); |
| 252 |
| 253 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 254 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 255 EXPECT_TRUE(tester->manifest().prefer_related_applications); |
| 256 |
| 257 EXPECT_TRUE(tester->icon_url().is_empty()); |
| 258 EXPECT_EQ(nullptr, tester->icon()); |
| 259 EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
| 260 EXPECT_FALSE(tester->has_service_worker()); |
| 261 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); |
| 262 } |
| 263 |
| 264 // Ask whether it's valid for a webapp (but don't navigate). This should fail |
| 265 // with StartUrlNotValid. |
| 266 { |
| 267 base::RunLoop run_loop; |
| 268 std::unique_ptr<CallbackTester> tester( |
| 269 new CallbackTester(run_loop.QuitClosure())); |
| 270 |
| 271 RunInstallableChecker(tester.get(), GetValidManifestParams()); |
| 272 run_loop.Run(); |
| 273 |
| 274 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 275 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 276 EXPECT_TRUE(tester->manifest().prefer_related_applications); |
| 277 |
| 278 EXPECT_TRUE(tester->icon_url().is_empty()); |
| 279 EXPECT_EQ(nullptr, tester->icon()); |
| 280 EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
| 281 EXPECT_FALSE(tester->has_service_worker()); |
| 282 EXPECT_EQ(START_URL_NOT_VALID, tester->error_code()); |
| 283 } |
| 284 |
| 285 // Ask for everything. This should still fail with StartUrlNotValid. |
| 286 { |
| 287 base::RunLoop run_loop; |
| 288 std::unique_ptr<CallbackTester> tester( |
| 289 new CallbackTester(run_loop.QuitClosure())); |
| 290 |
| 291 RunInstallableChecker(tester.get(), GetWebAppParams()); |
| 292 run_loop.Run(); |
| 293 |
| 294 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 295 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 296 EXPECT_TRUE(tester->manifest().prefer_related_applications); |
| 297 |
| 298 EXPECT_TRUE(tester->icon_url().is_empty()); |
| 299 EXPECT_EQ(nullptr, tester->icon()); |
| 300 EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
| 301 EXPECT_FALSE(tester->has_service_worker()); |
| 302 EXPECT_EQ(START_URL_NOT_VALID, tester->error_code()); |
| 303 } |
| 304 } |
| 305 |
| 306 IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, CheckValidManifest) { |
| 307 // Check for a manifest that's valid for a webapp. |
| 308 base::RunLoop run_loop; |
| 309 std::unique_ptr<CallbackTester> tester( |
| 310 new CallbackTester(run_loop.QuitClosure())); |
| 311 |
| 312 NavigateAndRunInstallableChecker(tester.get(), GetValidManifestParams(), |
| 313 "/banners/manifest_test_page.html"); |
| 314 run_loop.Run(); |
| 315 |
| 316 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 317 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 318 |
| 319 EXPECT_TRUE(tester->icon_url().is_empty()); |
| 320 EXPECT_EQ(nullptr, tester->icon()); |
| 321 |
| 322 EXPECT_TRUE(tester->has_valid_webapp_manifest()); |
| 323 EXPECT_FALSE(tester->has_service_worker()); |
| 324 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); |
| 325 } |
| 326 |
| 327 IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, CheckManifestAndIcon) { |
| 328 // Add to homescreen checks for manifest + icon. |
| 329 base::RunLoop run_loop; |
| 330 std::unique_ptr<CallbackTester> tester( |
| 331 new CallbackTester(run_loop.QuitClosure())); |
| 332 |
| 333 NavigateAndRunInstallableChecker(tester.get(), GetIconParams(), |
| 334 "/banners/manifest_test_page.html"); |
| 335 run_loop.Run(); |
| 336 |
| 337 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 338 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 339 |
| 340 EXPECT_FALSE(tester->icon_url().is_empty()); |
| 341 EXPECT_NE(nullptr, tester->icon()); |
| 342 |
| 343 EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
| 344 EXPECT_FALSE(tester->has_service_worker()); |
| 345 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); |
| 346 } |
| 347 |
| 348 IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, CheckWebapp) { |
| 349 // Request everything. |
| 350 { |
| 351 base::RunLoop run_loop; |
| 352 std::unique_ptr<CallbackTester> tester( |
| 353 new CallbackTester(run_loop.QuitClosure())); |
| 354 |
| 355 NavigateAndRunInstallableChecker(tester.get(), GetWebAppParams(), |
| 356 "/banners/manifest_test_page.html"); |
| 357 run_loop.Run(); |
| 358 |
| 359 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 360 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 361 EXPECT_TRUE(tester->has_valid_webapp_manifest()); |
| 362 EXPECT_TRUE(tester->has_service_worker()); |
| 363 EXPECT_FALSE(tester->icon_url().is_empty()); |
| 364 EXPECT_NE(nullptr, tester->icon()); |
| 365 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); |
| 366 |
| 367 // Verify result state matches checker internal state. |
| 368 InstallableChecker* checker = GetChecker(); |
| 369 |
| 370 EXPECT_FALSE(checker->manifest_.IsEmpty()); |
| 371 EXPECT_FALSE(checker->manifest_url_.is_empty()); |
| 372 EXPECT_TRUE(checker->has_valid_webapp_manifest_); |
| 373 EXPECT_TRUE(checker->has_service_worker_); |
| 374 EXPECT_FALSE(checker->icon_url_.is_empty()); |
| 375 EXPECT_NE(nullptr, checker->icon_.get()); |
| 376 EXPECT_TRUE(checker->HasFlag(InstallableChecker::MANIFEST_FETCHED)); |
| 377 EXPECT_TRUE(checker->HasFlag(InstallableChecker::MANIFEST_VALIDATED)); |
| 378 EXPECT_TRUE(checker->HasFlag(InstallableChecker::SERVICE_WORKER_CHECKED)); |
| 379 EXPECT_TRUE(checker->HasFlag(InstallableChecker::ICON_FETCHED)); |
| 380 EXPECT_EQ(48, checker->ideal_icon_size_in_dp_); |
| 381 EXPECT_EQ(48, checker->minimum_icon_size_in_dp_); |
| 382 EXPECT_EQ(NO_ERROR_DETECTED, checker->processing_error_); |
| 383 EXPECT_EQ(NO_ERROR_DETECTED, checker->manifest_error_); |
| 384 EXPECT_EQ(NO_ERROR_DETECTED, checker->valid_webapp_manifest_error_); |
| 385 EXPECT_EQ(NO_ERROR_DETECTED, checker->service_worker_error_); |
| 386 EXPECT_EQ(NO_ERROR_DETECTED, checker->icon_error_); |
| 387 EXPECT_TRUE(checker->tasks_.empty()); |
| 388 EXPECT_TRUE(checker->pending_tasks_.empty()); |
| 389 } |
| 390 |
| 391 // Request everything again without navigating away. This should work fine. |
| 392 { |
| 393 base::RunLoop run_loop; |
| 394 std::unique_ptr<CallbackTester> tester( |
| 395 new CallbackTester(run_loop.QuitClosure())); |
| 396 |
| 397 RunInstallableChecker(tester.get(), GetWebAppParams()); |
| 398 run_loop.Run(); |
| 399 |
| 400 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 401 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 402 EXPECT_TRUE(tester->has_valid_webapp_manifest()); |
| 403 EXPECT_TRUE(tester->has_service_worker()); |
| 404 EXPECT_FALSE(tester->icon_url().is_empty()); |
| 405 EXPECT_NE(nullptr, tester->icon()); |
| 406 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); |
| 407 |
| 408 // Verify result state matches checker internal state. |
| 409 InstallableChecker* checker = GetChecker(); |
| 410 |
| 411 EXPECT_FALSE(checker->manifest_.IsEmpty()); |
| 412 EXPECT_FALSE(checker->manifest_url_.is_empty()); |
| 413 EXPECT_TRUE(checker->has_valid_webapp_manifest_); |
| 414 EXPECT_TRUE(checker->has_service_worker_); |
| 415 EXPECT_FALSE(checker->icon_url_.is_empty()); |
| 416 EXPECT_NE(nullptr, checker->icon_.get()); |
| 417 EXPECT_TRUE(checker->HasFlag(InstallableChecker::MANIFEST_FETCHED)); |
| 418 EXPECT_TRUE(checker->HasFlag(InstallableChecker::MANIFEST_VALIDATED)); |
| 419 EXPECT_TRUE(checker->HasFlag(InstallableChecker::SERVICE_WORKER_CHECKED)); |
| 420 EXPECT_TRUE(checker->HasFlag(InstallableChecker::ICON_FETCHED)); |
| 421 EXPECT_EQ(48, checker->ideal_icon_size_in_dp_); |
| 422 EXPECT_EQ(48, checker->minimum_icon_size_in_dp_); |
| 423 EXPECT_EQ(NO_ERROR_DETECTED, checker->processing_error_); |
| 424 EXPECT_EQ(NO_ERROR_DETECTED, checker->manifest_error_); |
| 425 EXPECT_EQ(NO_ERROR_DETECTED, checker->valid_webapp_manifest_error_); |
| 426 EXPECT_EQ(NO_ERROR_DETECTED, checker->service_worker_error_); |
| 427 EXPECT_EQ(NO_ERROR_DETECTED, checker->icon_error_); |
| 428 EXPECT_TRUE(checker->tasks_.empty()); |
| 429 EXPECT_TRUE(checker->pending_tasks_.empty()); |
| 430 } |
| 431 |
| 432 { |
| 433 // Check that a subsequent navigation resets state. |
| 434 ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); |
| 435 InstallableChecker* checker = GetChecker(); |
| 436 |
| 437 EXPECT_TRUE(checker->manifest_.IsEmpty()); |
| 438 EXPECT_TRUE(checker->manifest_url_.is_empty()); |
| 439 EXPECT_FALSE(checker->has_service_worker_); |
| 440 EXPECT_FALSE(checker->has_valid_webapp_manifest_); |
| 441 EXPECT_TRUE(checker->icon_url_.is_empty()); |
| 442 EXPECT_EQ(nullptr, checker->icon_.get()); |
| 443 EXPECT_EQ(InstallableChecker::DORMANT, checker->status_); |
| 444 EXPECT_FALSE(checker->HasFlag(InstallableChecker::MANIFEST_FETCHED)); |
| 445 EXPECT_FALSE(checker->HasFlag(InstallableChecker::MANIFEST_VALIDATED)); |
| 446 EXPECT_FALSE(checker->HasFlag(InstallableChecker::SERVICE_WORKER_CHECKED)); |
| 447 EXPECT_FALSE(checker->HasFlag(InstallableChecker::ICON_FETCHED)); |
| 448 EXPECT_EQ(-1, checker->ideal_icon_size_in_dp_); |
| 449 EXPECT_EQ(-1, checker->minimum_icon_size_in_dp_); |
| 450 EXPECT_EQ(NO_ERROR_DETECTED, checker->processing_error_); |
| 451 EXPECT_EQ(NO_ERROR_DETECTED, checker->manifest_error_); |
| 452 EXPECT_EQ(NO_ERROR_DETECTED, checker->valid_webapp_manifest_error_); |
| 453 EXPECT_EQ(NO_ERROR_DETECTED, checker->service_worker_error_); |
| 454 EXPECT_EQ(NO_ERROR_DETECTED, checker->icon_error_); |
| 455 EXPECT_TRUE(checker->tasks_.empty()); |
| 456 EXPECT_TRUE(checker->pending_tasks_.empty()); |
| 457 } |
| 458 } |
| 459 |
| 460 IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, CheckWebappInIframe) { |
| 461 base::RunLoop run_loop; |
| 462 std::unique_ptr<CallbackTester> tester( |
| 463 new CallbackTester(run_loop.QuitClosure())); |
| 464 |
| 465 NavigateAndRunInstallableChecker(tester.get(), GetWebAppParams(), |
| 466 "/banners/iframe_test_page.html"); |
| 467 run_loop.Run(); |
| 468 |
| 469 // The installable checker should only retrieve items in the main frame; |
| 470 // everything should be empty here. |
| 471 EXPECT_TRUE(tester->manifest().IsEmpty()); |
| 472 EXPECT_TRUE(tester->manifest_url().is_empty()); |
| 473 EXPECT_TRUE(tester->icon_url().is_empty()); |
| 474 EXPECT_EQ(nullptr, tester->icon()); |
| 475 EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
| 476 EXPECT_FALSE(tester->has_service_worker()); |
| 477 EXPECT_EQ(NO_MANIFEST, tester->error_code()); |
| 478 } |
| 479 |
| 480 IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, |
| 481 CheckPageWithManifestAndNoServiceWorker) { |
| 482 // Just fetch the manifest. This should have no error. |
| 483 { |
| 484 base::RunLoop run_loop; |
| 485 std::unique_ptr<CallbackTester> tester( |
| 486 new CallbackTester(run_loop.QuitClosure())); |
| 487 |
| 488 NavigateAndRunInstallableChecker( |
| 489 tester.get(), GetManifestParams(), |
| 490 "/banners/manifest_no_service_worker.html"); |
| 491 run_loop.Run(); |
| 492 |
| 493 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 494 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 495 EXPECT_FALSE(tester->has_valid_webapp_manifest()); |
| 496 |
| 497 EXPECT_TRUE(tester->icon_url().is_empty()); |
| 498 EXPECT_EQ(nullptr, tester->icon()); |
| 499 EXPECT_FALSE(tester->has_service_worker()); |
| 500 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); |
| 501 } |
| 502 |
| 503 // Fetch the full criteria should fail. |
| 504 { |
| 505 base::RunLoop run_loop; |
| 506 std::unique_ptr<CallbackTester> tester( |
| 507 new CallbackTester(run_loop.QuitClosure())); |
| 508 |
| 509 RunInstallableChecker(tester.get(), GetWebAppParams()); |
| 510 run_loop.Run(); |
| 511 |
| 512 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 513 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 514 EXPECT_TRUE(tester->has_valid_webapp_manifest()); |
| 515 |
| 516 EXPECT_TRUE(tester->icon_url().is_empty()); |
| 517 EXPECT_EQ(nullptr, tester->icon()); |
| 518 EXPECT_FALSE(tester->has_service_worker()); |
| 519 EXPECT_EQ(NO_MATCHING_SERVICE_WORKER, tester->error_code()); |
| 520 } |
| 521 } |
| 522 |
| 523 IN_PROC_BROWSER_TEST_F(InstallableCheckerBrowserTest, |
| 524 CheckChangeInIconDimensions) { |
| 525 // Verify that a follow-up request for an icon with a different size resets |
| 526 // the icon state. |
| 527 { |
| 528 base::RunLoop run_loop; |
| 529 std::unique_ptr<CallbackTester> tester( |
| 530 new CallbackTester(run_loop.QuitClosure())); |
| 531 |
| 532 NavigateAndRunInstallableChecker(tester.get(), GetWebAppParams(), |
| 533 "/banners/manifest_test_page.html"); |
| 534 run_loop.Run(); |
| 535 |
| 536 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 537 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 538 EXPECT_TRUE(tester->has_valid_webapp_manifest()); |
| 539 EXPECT_TRUE(tester->has_service_worker()); |
| 540 EXPECT_FALSE(tester->icon_url().is_empty()); |
| 541 EXPECT_NE(nullptr, tester->icon()); |
| 542 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); |
| 543 } |
| 544 |
| 545 { |
| 546 base::RunLoop run_loop; |
| 547 std::unique_ptr<CallbackTester> tester( |
| 548 new CallbackTester(run_loop.QuitClosure())); |
| 549 |
| 550 // Dial up the icon size requirements to something that isn't available. |
| 551 // This should now fail with NoIconMatchingRequirements. |
| 552 InstallableParams params = GetWebAppParams(); |
| 553 params.ideal_icon_size_in_dp = 2000; |
| 554 params.minimum_icon_size_in_dp = 2000; |
| 555 RunInstallableChecker(tester.get(), params); |
| 556 run_loop.Run(); |
| 557 |
| 558 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 559 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 560 EXPECT_TRUE(tester->has_valid_webapp_manifest()); |
| 561 EXPECT_TRUE(tester->has_service_worker()); |
| 562 EXPECT_TRUE(tester->icon_url().is_empty()); |
| 563 EXPECT_EQ(nullptr, tester->icon()); |
| 564 EXPECT_EQ(NO_ACCEPTABLE_ICON, tester->error_code()); |
| 565 } |
| 566 |
| 567 // Navigate and verify the reverse: an overly large icon requested first |
| 568 // fails, but a smaller icon requested second passes. |
| 569 { |
| 570 base::RunLoop run_loop; |
| 571 std::unique_ptr<CallbackTester> tester( |
| 572 new CallbackTester(run_loop.QuitClosure())); |
| 573 |
| 574 // This should fail with NoIconMatchingRequirements. |
| 575 InstallableParams params = GetWebAppParams(); |
| 576 params.ideal_icon_size_in_dp = 2000; |
| 577 params.minimum_icon_size_in_dp = 2000; |
| 578 NavigateAndRunInstallableChecker(tester.get(), params, |
| 579 "/banners/manifest_test_page.html"); |
| 580 run_loop.Run(); |
| 581 |
| 582 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 583 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 584 EXPECT_TRUE(tester->has_valid_webapp_manifest()); |
| 585 EXPECT_TRUE(tester->has_service_worker()); |
| 586 EXPECT_TRUE(tester->icon_url().is_empty()); |
| 587 EXPECT_EQ(nullptr, tester->icon()); |
| 588 EXPECT_EQ(NO_ACCEPTABLE_ICON, tester->error_code()); |
| 589 } |
| 590 |
| 591 { |
| 592 base::RunLoop run_loop; |
| 593 std::unique_ptr<CallbackTester> tester( |
| 594 new CallbackTester(run_loop.QuitClosure())); |
| 595 RunInstallableChecker(tester.get(), GetWebAppParams()); |
| 596 |
| 597 run_loop.Run(); |
| 598 |
| 599 // The smaller icon requirements should allow this to pass. |
| 600 EXPECT_FALSE(tester->manifest_url().is_empty()); |
| 601 EXPECT_FALSE(tester->manifest().IsEmpty()); |
| 602 EXPECT_TRUE(tester->has_valid_webapp_manifest()); |
| 603 EXPECT_TRUE(tester->has_service_worker()); |
| 604 EXPECT_FALSE(tester->icon_url().is_empty()); |
| 605 EXPECT_NE(nullptr, tester->icon()); |
| 606 EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); |
| 607 } |
| 608 } |
OLD | NEW |