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

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

Powered by Google App Engine
This is Rietveld 408576698