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

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: Revert to a non-refcounted implementation 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 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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698