OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013, Google Inc. All rights reserved. | 2 * Copyright (c) 2013, Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 14 matching lines...) Expand all Loading... |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | 30 |
31 #include "core/loader/resource/ImageResource.h" | 31 #include "core/loader/resource/ImageResource.h" |
32 | 32 |
33 #include <memory> | 33 #include <memory> |
34 #include "core/loader/resource/MockImageResourceObserver.h" | 34 #include "core/loader/resource/MockImageResourceObserver.h" |
| 35 #include "platform/RuntimeEnabledFeatures.h" |
35 #include "platform/SharedBuffer.h" | 36 #include "platform/SharedBuffer.h" |
36 #include "platform/exported/WrappedResourceResponse.h" | 37 #include "platform/exported/WrappedResourceResponse.h" |
37 #include "platform/graphics/BitmapImage.h" | 38 #include "platform/graphics/BitmapImage.h" |
38 #include "platform/graphics/Image.h" | 39 #include "platform/graphics/Image.h" |
39 #include "platform/loader/fetch/FetchInitiatorInfo.h" | 40 #include "platform/loader/fetch/FetchInitiatorInfo.h" |
40 #include "platform/loader/fetch/FetchParameters.h" | 41 #include "platform/loader/fetch/FetchParameters.h" |
41 #include "platform/loader/fetch/MemoryCache.h" | 42 #include "platform/loader/fetch/MemoryCache.h" |
42 #include "platform/loader/fetch/ResourceFetcher.h" | 43 #include "platform/loader/fetch/ResourceFetcher.h" |
43 #include "platform/loader/fetch/ResourceLoader.h" | 44 #include "platform/loader/fetch/ResourceLoader.h" |
44 #include "platform/loader/fetch/UniqueIdentifier.h" | 45 #include "platform/loader/fetch/UniqueIdentifier.h" |
45 #include "platform/loader/testing/MockFetchContext.h" | 46 #include "platform/loader/testing/MockFetchContext.h" |
46 #include "platform/loader/testing/MockResourceClient.h" | 47 #include "platform/loader/testing/MockResourceClient.h" |
47 #include "platform/scheduler/test/fake_web_task_runner.h" | 48 #include "platform/scheduler/test/fake_web_task_runner.h" |
| 49 #include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h" |
48 #include "platform/testing/ScopedMockedURL.h" | 50 #include "platform/testing/ScopedMockedURL.h" |
49 #include "platform/testing/TestingPlatformSupport.h" | 51 #include "platform/testing/TestingPlatformSupport.h" |
50 #include "platform/testing/UnitTestHelpers.h" | 52 #include "platform/testing/UnitTestHelpers.h" |
51 #include "platform/wtf/PtrUtil.h" | 53 #include "platform/wtf/PtrUtil.h" |
52 #include "platform/wtf/text/Base64.h" | 54 #include "platform/wtf/text/Base64.h" |
53 #include "public/platform/Platform.h" | 55 #include "public/platform/Platform.h" |
54 #include "public/platform/WebCachePolicy.h" | 56 #include "public/platform/WebCachePolicy.h" |
55 #include "public/platform/WebURL.h" | 57 #include "public/platform/WebURL.h" |
56 #include "public/platform/WebURLLoaderMockFactory.h" | 58 #include "public/platform/WebURLLoaderMockFactory.h" |
57 #include "public/platform/WebURLResponse.h" | 59 #include "public/platform/WebURLResponse.h" |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); | 338 EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); |
337 EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsSVGImage()); | 339 EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsSVGImage()); |
338 } | 340 } |
339 | 341 |
340 ResourceFetcher* CreateFetcher() { | 342 ResourceFetcher* CreateFetcher() { |
341 auto* context = | 343 auto* context = |
342 MockFetchContext::Create(MockFetchContext::kShouldLoadNewResource); | 344 MockFetchContext::Create(MockFetchContext::kShouldLoadNewResource); |
343 return ResourceFetcher::Create(context, context->GetTaskRunner()); | 345 return ResourceFetcher::Create(context, context->GetTaskRunner()); |
344 } | 346 } |
345 | 347 |
| 348 using ScopedClientPlaceholderForServerLoFiForTest = |
| 349 ScopedRuntimeEnabledFeatureForTest< |
| 350 RuntimeEnabledFeatures::ClientPlaceholdersForServerLoFiEnabled, |
| 351 RuntimeEnabledFeatures::SetClientPlaceholdersForServerLoFiEnabled>; |
| 352 |
346 TEST(ImageResourceTest, MultipartImage) { | 353 TEST(ImageResourceTest, MultipartImage) { |
347 ResourceFetcher* fetcher = CreateFetcher(); | 354 ResourceFetcher* fetcher = CreateFetcher(); |
348 KURL test_url(kParsedURLString, kTestURL); | 355 KURL test_url(kParsedURLString, kTestURL); |
349 ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); | 356 ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); |
350 | 357 |
351 // Emulate starting a real load, but don't expect any "real" | 358 // Emulate starting a real load, but don't expect any "real" |
352 // WebURLLoaderClient callbacks. | 359 // WebURLLoaderClient callbacks. |
353 ImageResource* image_resource = ImageResource::CreateForTest(test_url); | 360 ImageResource* image_resource = ImageResource::CreateForTest(test_url); |
354 image_resource->SetIdentifier(CreateUniqueIdentifier()); | 361 image_resource->SetIdentifier(CreateUniqueIdentifier()); |
355 fetcher->StartLoad(image_resource); | 362 fetcher->StartLoad(image_resource); |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
553 sizeof(kJpegImage)); | 560 sizeof(kJpegImage)); |
554 image_resource->Finish(); | 561 image_resource->Finish(); |
555 EXPECT_FALSE(image_resource->ErrorOccurred()); | 562 EXPECT_FALSE(image_resource->ErrorOccurred()); |
556 ASSERT_TRUE(image_resource->GetContent()->HasImage()); | 563 ASSERT_TRUE(image_resource->GetContent()->HasImage()); |
557 EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsNull()); | 564 EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsNull()); |
558 EXPECT_EQ(2, observer->ImageChangedCount()); | 565 EXPECT_EQ(2, observer->ImageChangedCount()); |
559 EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); | 566 EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); |
560 EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); | 567 EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); |
561 } | 568 } |
562 | 569 |
563 TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderAfterFinished) { | 570 class ImageResourceReloadTest : public ::testing::TestWithParam<bool> { |
| 571 public: |
| 572 ~ImageResourceReloadTest() override {} |
| 573 |
| 574 bool IsClientPlaceholderForServerLoFiEnabled() const { return GetParam(); } |
| 575 |
| 576 void SetUp() override { |
| 577 scoped_show_placeholder_.reset( |
| 578 new ScopedClientPlaceholderForServerLoFiForTest(GetParam())); |
| 579 } |
| 580 |
| 581 private: |
| 582 std::unique_ptr<ScopedClientPlaceholderForServerLoFiForTest> |
| 583 scoped_show_placeholder_; |
| 584 }; |
| 585 |
| 586 TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderAfterFinished) { |
564 KURL test_url(kParsedURLString, kTestURL); | 587 KURL test_url(kParsedURLString, kTestURL); |
565 ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); | 588 ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); |
566 ImageResource* image_resource = ImageResource::CreateForTest(test_url); | 589 ImageResource* image_resource = ImageResource::CreateForTest(test_url); |
567 image_resource->SetStatus(ResourceStatus::kPending); | 590 image_resource->SetStatus(ResourceStatus::kPending); |
568 image_resource->NotifyStartLoad(); | 591 image_resource->NotifyStartLoad(); |
569 | 592 |
570 std::unique_ptr<MockImageResourceObserver> observer = | 593 std::unique_ptr<MockImageResourceObserver> observer = |
571 MockImageResourceObserver::Create(image_resource->GetContent()); | 594 MockImageResourceObserver::Create(image_resource->GetContent()); |
572 ResourceFetcher* fetcher = CreateFetcher(); | 595 ResourceFetcher* fetcher = CreateFetcher(); |
573 | 596 |
574 // Send the image response. | 597 // Send the image response. |
575 ResourceResponse resource_response(NullURL(), "image/jpeg", | 598 ResourceResponse resource_response(NullURL(), "image/jpeg", |
576 sizeof(kJpegImage), g_null_atom); | 599 sizeof(kJpegImage), g_null_atom); |
577 resource_response.AddHTTPHeaderField("chrome-proxy-content-transform", | 600 resource_response.AddHTTPHeaderField("chrome-proxy-content-transform", |
578 "empty-image"); | 601 "empty-image"); |
579 | 602 |
580 image_resource->ResponseReceived(resource_response, nullptr); | 603 image_resource->ResponseReceived(resource_response, nullptr); |
581 image_resource->AppendData(reinterpret_cast<const char*>(kJpegImage), | 604 image_resource->AppendData(reinterpret_cast<const char*>(kJpegImage), |
582 sizeof(kJpegImage)); | 605 sizeof(kJpegImage)); |
583 image_resource->Finish(); | 606 image_resource->Finish(); |
584 EXPECT_FALSE(image_resource->ErrorOccurred()); | 607 EXPECT_FALSE(image_resource->ErrorOccurred()); |
585 ASSERT_TRUE(image_resource->GetContent()->HasImage()); | 608 ASSERT_TRUE(image_resource->GetContent()->HasImage()); |
586 EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsNull()); | 609 EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsNull()); |
587 EXPECT_EQ(2, observer->ImageChangedCount()); | 610 EXPECT_EQ(2, observer->ImageChangedCount()); |
588 EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnLastImageChanged()); | 611 EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnLastImageChanged()); |
589 // The observer should have been notified that the image load completed. | 612 // The observer should have been notified that the image load completed. |
590 EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); | 613 EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); |
591 EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnImageNotifyFinished()); | 614 EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnImageNotifyFinished()); |
592 EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); | 615 EXPECT_NE(IsClientPlaceholderForServerLoFiEnabled(), |
| 616 image_resource->GetContent()->GetImage()->IsBitmapImage()); |
| 617 EXPECT_EQ(IsClientPlaceholderForServerLoFiEnabled(), |
| 618 image_resource->ShouldShowPlaceholder()); |
593 EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); | 619 EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); |
594 EXPECT_EQ(kJpegImageHeight, | 620 EXPECT_EQ(kJpegImageHeight, |
595 image_resource->GetContent()->GetImage()->height()); | 621 image_resource->GetContent()->GetImage()->height()); |
596 | 622 |
597 // Call reloadIfLoFiOrPlaceholderImage() after the image has finished loading. | 623 // Call reloadIfLoFiOrPlaceholderImage() after the image has finished loading. |
598 image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, | 624 image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, |
599 Resource::kReloadAlways); | 625 Resource::kReloadAlways); |
600 | 626 |
601 EXPECT_EQ(3, observer->ImageChangedCount()); | 627 EXPECT_EQ(3, observer->ImageChangedCount()); |
602 TestThatReloadIsStartedThenServeReload( | 628 TestThatReloadIsStartedThenServeReload( |
603 test_url, image_resource, image_resource->GetContent(), observer.get(), | 629 test_url, image_resource, image_resource->GetContent(), observer.get(), |
604 WebCachePolicy::kBypassingCache, false); | 630 WebCachePolicy::kBypassingCache, false); |
605 } | 631 } |
606 | 632 |
607 TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderAfterFinishedWithOldHeaders) { | 633 TEST_P(ImageResourceReloadTest, |
| 634 ReloadIfLoFiOrPlaceholderAfterFinishedWithOldHeaders) { |
608 KURL test_url(kParsedURLString, kTestURL); | 635 KURL test_url(kParsedURLString, kTestURL); |
609 ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); | 636 ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); |
610 ImageResource* image_resource = ImageResource::CreateForTest(test_url); | 637 ImageResource* image_resource = ImageResource::CreateForTest(test_url); |
611 image_resource->SetStatus(ResourceStatus::kPending); | 638 image_resource->SetStatus(ResourceStatus::kPending); |
612 image_resource->NotifyStartLoad(); | 639 image_resource->NotifyStartLoad(); |
613 | 640 |
614 std::unique_ptr<MockImageResourceObserver> observer = | 641 std::unique_ptr<MockImageResourceObserver> observer = |
615 MockImageResourceObserver::Create(image_resource->GetContent()); | 642 MockImageResourceObserver::Create(image_resource->GetContent()); |
616 ResourceFetcher* fetcher = CreateFetcher(); | 643 ResourceFetcher* fetcher = CreateFetcher(); |
617 | 644 |
618 // Send the image response. | 645 // Send the image response. |
619 ResourceResponse resource_response(NullURL(), "image/jpeg", | 646 ResourceResponse resource_response(NullURL(), "image/jpeg", |
620 sizeof(kJpegImage), g_null_atom); | 647 sizeof(kJpegImage), g_null_atom); |
621 resource_response.AddHTTPHeaderField("chrome-proxy", "q=low"); | 648 resource_response.AddHTTPHeaderField("chrome-proxy", "q=low"); |
622 | 649 |
623 image_resource->ResponseReceived(resource_response, nullptr); | 650 image_resource->ResponseReceived(resource_response, nullptr); |
624 image_resource->AppendData(reinterpret_cast<const char*>(kJpegImage), | 651 image_resource->AppendData(reinterpret_cast<const char*>(kJpegImage), |
625 sizeof(kJpegImage)); | 652 sizeof(kJpegImage)); |
626 image_resource->Finish(); | 653 image_resource->Finish(); |
627 EXPECT_FALSE(image_resource->ErrorOccurred()); | 654 EXPECT_FALSE(image_resource->ErrorOccurred()); |
628 ASSERT_TRUE(image_resource->GetContent()->HasImage()); | 655 ASSERT_TRUE(image_resource->GetContent()->HasImage()); |
629 EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsNull()); | 656 EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsNull()); |
630 EXPECT_EQ(2, observer->ImageChangedCount()); | 657 EXPECT_EQ(2, observer->ImageChangedCount()); |
631 EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnLastImageChanged()); | 658 EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnLastImageChanged()); |
632 // The observer should have been notified that the image load completed. | 659 // The observer should have been notified that the image load completed. |
633 EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); | 660 EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); |
634 EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnImageNotifyFinished()); | 661 EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnImageNotifyFinished()); |
635 EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); | 662 EXPECT_NE(IsClientPlaceholderForServerLoFiEnabled(), |
| 663 image_resource->GetContent()->GetImage()->IsBitmapImage()); |
| 664 EXPECT_EQ(IsClientPlaceholderForServerLoFiEnabled(), |
| 665 image_resource->ShouldShowPlaceholder()); |
636 EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); | 666 EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); |
637 EXPECT_EQ(kJpegImageHeight, | 667 EXPECT_EQ(kJpegImageHeight, |
638 image_resource->GetContent()->GetImage()->height()); | 668 image_resource->GetContent()->GetImage()->height()); |
639 | 669 |
640 // Call reloadIfLoFiOrPlaceholderImage() after the image has finished loading. | 670 // Call reloadIfLoFiOrPlaceholderImage() after the image has finished loading. |
641 image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, | 671 image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, |
642 Resource::kReloadAlways); | 672 Resource::kReloadAlways); |
643 | 673 |
644 EXPECT_EQ(3, observer->ImageChangedCount()); | 674 EXPECT_EQ(3, observer->ImageChangedCount()); |
645 TestThatReloadIsStartedThenServeReload( | 675 TestThatReloadIsStartedThenServeReload( |
646 test_url, image_resource, image_resource->GetContent(), observer.get(), | 676 test_url, image_resource, image_resource->GetContent(), observer.get(), |
647 WebCachePolicy::kBypassingCache, false); | 677 WebCachePolicy::kBypassingCache, false); |
648 } | 678 } |
649 | 679 |
650 TEST(ImageResourceTest, | 680 TEST_P(ImageResourceReloadTest, |
651 ReloadIfLoFiOrPlaceholderAfterFinishedWithoutLoFiHeaders) { | 681 ReloadIfLoFiOrPlaceholderAfterFinishedWithoutLoFiHeaders) { |
652 KURL test_url(kParsedURLString, kTestURL); | 682 KURL test_url(kParsedURLString, kTestURL); |
653 ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); | 683 ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); |
654 ResourceRequest request(test_url); | 684 ResourceRequest request(test_url); |
655 request.SetPreviewsState(WebURLRequest::kServerLoFiOn); | 685 request.SetPreviewsState(WebURLRequest::kServerLoFiOn); |
656 request.SetFetchCredentialsMode(WebURLRequest::kFetchCredentialsModeOmit); | 686 request.SetFetchCredentialsMode(WebURLRequest::kFetchCredentialsModeOmit); |
657 ImageResource* image_resource = ImageResource::Create(request); | 687 ImageResource* image_resource = ImageResource::Create(request); |
658 image_resource->SetStatus(ResourceStatus::kPending); | 688 image_resource->SetStatus(ResourceStatus::kPending); |
659 image_resource->NotifyStartLoad(); | 689 image_resource->NotifyStartLoad(); |
660 | 690 |
661 std::unique_ptr<MockImageResourceObserver> observer = | 691 std::unique_ptr<MockImageResourceObserver> observer = |
(...skipping 24 matching lines...) Expand all Loading... |
686 // Call reloadIfLoFiOrPlaceholderImage() after the image has finished loading. | 716 // Call reloadIfLoFiOrPlaceholderImage() after the image has finished loading. |
687 image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, | 717 image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, |
688 Resource::kReloadAlways); | 718 Resource::kReloadAlways); |
689 | 719 |
690 // The image should not have been reloaded, since it didn't have the LoFi | 720 // The image should not have been reloaded, since it didn't have the LoFi |
691 // image response headers. | 721 // image response headers. |
692 EXPECT_EQ(2, observer->ImageChangedCount()); | 722 EXPECT_EQ(2, observer->ImageChangedCount()); |
693 EXPECT_TRUE(image_resource->IsLoaded()); | 723 EXPECT_TRUE(image_resource->IsLoaded()); |
694 } | 724 } |
695 | 725 |
696 TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderViaResourceFetcher) { | 726 TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderViaResourceFetcher) { |
697 ResourceFetcher* fetcher = CreateFetcher(); | 727 ResourceFetcher* fetcher = CreateFetcher(); |
698 | 728 |
699 KURL test_url(kParsedURLString, kTestURL); | 729 KURL test_url(kParsedURLString, kTestURL); |
700 ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); | 730 ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); |
701 | 731 |
702 ResourceRequest request = ResourceRequest(test_url); | 732 ResourceRequest request = ResourceRequest(test_url); |
703 request.SetPreviewsState(WebURLRequest::kServerLoFiOn); | 733 request.SetPreviewsState(WebURLRequest::kServerLoFiOn); |
704 FetchParameters fetch_params(request); | 734 FetchParameters fetch_params(request); |
705 ImageResource* image_resource = ImageResource::Fetch(fetch_params, fetcher); | 735 ImageResource* image_resource = ImageResource::Fetch(fetch_params, fetcher); |
706 ImageResourceContent* content = image_resource->GetContent(); | 736 ImageResourceContent* content = image_resource->GetContent(); |
(...skipping 21 matching lines...) Expand all Loading... |
728 | 758 |
729 EXPECT_EQ(3, observer->ImageChangedCount()); | 759 EXPECT_EQ(3, observer->ImageChangedCount()); |
730 | 760 |
731 TestThatReloadIsStartedThenServeReload( | 761 TestThatReloadIsStartedThenServeReload( |
732 test_url, image_resource, content, observer.get(), | 762 test_url, image_resource, content, observer.get(), |
733 WebCachePolicy::kBypassingCache, false); | 763 WebCachePolicy::kBypassingCache, false); |
734 | 764 |
735 GetMemoryCache()->Remove(image_resource); | 765 GetMemoryCache()->Remove(image_resource); |
736 } | 766 } |
737 | 767 |
738 TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderDuringFetch) { | 768 TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderBeforeResponse) { |
739 KURL test_url(kParsedURLString, kTestURL); | 769 KURL test_url(kParsedURLString, kTestURL); |
740 ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); | 770 ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); |
741 | 771 |
| 772 ResourceRequest request(test_url); |
| 773 request.SetPreviewsState(WebURLRequest::kServerLoFiOn); |
| 774 FetchParameters fetch_params(request); |
| 775 ResourceFetcher* fetcher = CreateFetcher(); |
| 776 |
| 777 ImageResource* image_resource = ImageResource::Fetch(fetch_params, fetcher); |
| 778 std::unique_ptr<MockImageResourceObserver> observer = |
| 779 MockImageResourceObserver::Create(image_resource->GetContent()); |
| 780 |
| 781 EXPECT_FALSE(image_resource->ErrorOccurred()); |
| 782 EXPECT_EQ(IsClientPlaceholderForServerLoFiEnabled(), |
| 783 image_resource->ShouldShowPlaceholder()); |
| 784 |
| 785 // Call reloadIfLoFiOrPlaceholderImage() while the image is still loading. |
| 786 image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, |
| 787 Resource::kReloadAlways); |
| 788 |
| 789 EXPECT_EQ(1, observer->ImageChangedCount()); |
| 790 EXPECT_EQ(0, observer->ImageWidthOnLastImageChanged()); |
| 791 // The observer should not have been notified of completion yet, since the |
| 792 // image is still loading. |
| 793 EXPECT_FALSE(observer->ImageNotifyFinishedCalled()); |
| 794 |
| 795 TestThatReloadIsStartedThenServeReload( |
| 796 test_url, image_resource, image_resource->GetContent(), observer.get(), |
| 797 WebCachePolicy::kBypassingCache, false); |
| 798 } |
| 799 |
| 800 TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderDuringResponse) { |
| 801 KURL test_url(kParsedURLString, kTestURL); |
| 802 ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); |
| 803 |
742 ResourceRequest request(test_url); | 804 ResourceRequest request(test_url); |
743 request.SetPreviewsState(WebURLRequest::kServerLoFiOn); | 805 request.SetPreviewsState(WebURLRequest::kServerLoFiOn); |
744 FetchParameters fetch_params(request); | 806 FetchParameters fetch_params(request); |
745 ResourceFetcher* fetcher = CreateFetcher(); | 807 ResourceFetcher* fetcher = CreateFetcher(); |
746 | 808 |
747 ImageResource* image_resource = ImageResource::Fetch(fetch_params, fetcher); | 809 ImageResource* image_resource = ImageResource::Fetch(fetch_params, fetcher); |
748 std::unique_ptr<MockImageResourceObserver> observer = | 810 std::unique_ptr<MockImageResourceObserver> observer = |
749 MockImageResourceObserver::Create(image_resource->GetContent()); | 811 MockImageResourceObserver::Create(image_resource->GetContent()); |
750 | 812 |
751 // Send the image response. | 813 // Send the image response. |
| 814 ResourceResponse resource_response(test_url, "image/jpeg", sizeof(kJpegImage), |
| 815 g_null_atom); |
| 816 resource_response.AddHTTPHeaderField("chrome-proxy-content-transform", |
| 817 "empty-image"); |
| 818 |
752 image_resource->Loader()->DidReceiveResponse( | 819 image_resource->Loader()->DidReceiveResponse( |
753 WrappedResourceResponse(ResourceResponse( | 820 WrappedResourceResponse(resource_response)); |
754 test_url, "image/jpeg", sizeof(kJpegImage), g_null_atom))); | |
755 image_resource->Loader()->DidReceiveData( | 821 image_resource->Loader()->DidReceiveData( |
756 reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); | 822 reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); |
757 | 823 |
758 EXPECT_FALSE(image_resource->ErrorOccurred()); | 824 EXPECT_FALSE(image_resource->ErrorOccurred()); |
759 ASSERT_TRUE(image_resource->GetContent()->HasImage()); | 825 ASSERT_TRUE(image_resource->GetContent()->HasImage()); |
760 EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsNull()); | 826 EXPECT_FALSE(image_resource->GetContent()->GetImage()->IsNull()); |
761 EXPECT_EQ(1, observer->ImageChangedCount()); | 827 EXPECT_EQ(1, observer->ImageChangedCount()); |
762 EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnLastImageChanged()); | 828 EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnLastImageChanged()); |
763 EXPECT_FALSE(observer->ImageNotifyFinishedCalled()); | 829 EXPECT_FALSE(observer->ImageNotifyFinishedCalled()); |
764 EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); | 830 EXPECT_EQ(IsClientPlaceholderForServerLoFiEnabled(), |
| 831 image_resource->ShouldShowPlaceholder()); |
765 EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); | 832 EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width()); |
766 EXPECT_EQ(kJpegImageHeight, | 833 EXPECT_EQ(kJpegImageHeight, |
767 image_resource->GetContent()->GetImage()->height()); | 834 image_resource->GetContent()->GetImage()->height()); |
768 | 835 |
769 // Call reloadIfLoFiOrPlaceholderImage() while the image is still loading. | 836 // Call reloadIfLoFiOrPlaceholderImage() while the image is still loading. |
770 image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, | 837 image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, |
771 Resource::kReloadAlways); | 838 Resource::kReloadAlways); |
772 | 839 |
773 EXPECT_EQ(2, observer->ImageChangedCount()); | 840 EXPECT_EQ(2, observer->ImageChangedCount()); |
774 EXPECT_EQ(0, observer->ImageWidthOnLastImageChanged()); | 841 EXPECT_EQ(0, observer->ImageWidthOnLastImageChanged()); |
775 // The observer should not have been notified of completion yet, since the | 842 // The observer should not have been notified of completion yet, since the |
776 // image is still loading. | 843 // image is still loading. |
777 EXPECT_FALSE(observer->ImageNotifyFinishedCalled()); | 844 EXPECT_FALSE(observer->ImageNotifyFinishedCalled()); |
778 | 845 |
779 TestThatReloadIsStartedThenServeReload( | 846 TestThatReloadIsStartedThenServeReload( |
780 test_url, image_resource, image_resource->GetContent(), observer.get(), | 847 test_url, image_resource, image_resource->GetContent(), observer.get(), |
781 WebCachePolicy::kBypassingCache, false); | 848 WebCachePolicy::kBypassingCache, false); |
782 } | 849 } |
783 | 850 |
784 TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderForPlaceholder) { | 851 TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderForPlaceholder) { |
785 KURL test_url(kParsedURLString, kTestURL); | 852 KURL test_url(kParsedURLString, kTestURL); |
786 ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); | 853 ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath()); |
787 | 854 |
788 ResourceFetcher* fetcher = CreateFetcher(); | 855 ResourceFetcher* fetcher = CreateFetcher(); |
789 FetchParameters params{ResourceRequest(test_url)}; | 856 FetchParameters params{ResourceRequest(test_url)}; |
790 params.SetAllowImagePlaceholder(); | 857 params.SetAllowImagePlaceholder(); |
791 ImageResource* image_resource = ImageResource::Fetch(params, fetcher); | 858 ImageResource* image_resource = ImageResource::Fetch(params, fetcher); |
792 EXPECT_EQ(FetchParameters::kAllowPlaceholder, | 859 EXPECT_EQ(FetchParameters::kAllowPlaceholder, |
793 params.GetPlaceholderImageRequestType()); | 860 params.GetPlaceholderImageRequestType()); |
794 std::unique_ptr<MockImageResourceObserver> observer = | 861 std::unique_ptr<MockImageResourceObserver> observer = |
795 MockImageResourceObserver::Create(image_resource->GetContent()); | 862 MockImageResourceObserver::Create(image_resource->GetContent()); |
796 | 863 |
797 TestThatIsPlaceholderRequestAndServeResponse(test_url, image_resource, | 864 TestThatIsPlaceholderRequestAndServeResponse(test_url, image_resource, |
798 observer.get()); | 865 observer.get()); |
799 | 866 |
800 image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, | 867 image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher, |
801 Resource::kReloadAlways); | 868 Resource::kReloadAlways); |
802 | 869 |
803 TestThatReloadIsStartedThenServeReload( | 870 TestThatReloadIsStartedThenServeReload( |
804 test_url, image_resource, image_resource->GetContent(), observer.get(), | 871 test_url, image_resource, image_resource->GetContent(), observer.get(), |
805 WebCachePolicy::kBypassingCache, false); | 872 WebCachePolicy::kBypassingCache, false); |
806 } | 873 } |
807 | 874 |
| 875 INSTANTIATE_TEST_CASE_P(/* no prefix */, |
| 876 ImageResourceReloadTest, |
| 877 ::testing::Bool()); |
| 878 |
808 TEST(ImageResourceTest, SVGImage) { | 879 TEST(ImageResourceTest, SVGImage) { |
809 KURL url(kParsedURLString, "http://127.0.0.1:8000/foo"); | 880 KURL url(kParsedURLString, "http://127.0.0.1:8000/foo"); |
810 ImageResource* image_resource = ImageResource::CreateForTest(url); | 881 ImageResource* image_resource = ImageResource::CreateForTest(url); |
811 std::unique_ptr<MockImageResourceObserver> observer = | 882 std::unique_ptr<MockImageResourceObserver> observer = |
812 MockImageResourceObserver::Create(image_resource->GetContent()); | 883 MockImageResourceObserver::Create(image_resource->GetContent()); |
813 | 884 |
814 ReceiveResponse(image_resource, url, "image/svg+xml", kSvgImage, | 885 ReceiveResponse(image_resource, url, "image/svg+xml", kSvgImage, |
815 strlen(kSvgImage)); | 886 strlen(kSvgImage)); |
816 | 887 |
817 EXPECT_FALSE(image_resource->ErrorOccurred()); | 888 EXPECT_FALSE(image_resource->ErrorOccurred()); |
(...skipping 871 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1689 ImageResource* image_resource = ImageResource::CreateForTest(test_url); | 1760 ImageResource* image_resource = ImageResource::CreateForTest(test_url); |
1690 image_resource->SetStatus(ResourceStatus::kPending); | 1761 image_resource->SetStatus(ResourceStatus::kPending); |
1691 image_resource->NotifyStartLoad(); | 1762 image_resource->NotifyStartLoad(); |
1692 | 1763 |
1693 std::unique_ptr<MockImageResourceObserver> observer = | 1764 std::unique_ptr<MockImageResourceObserver> observer = |
1694 MockImageResourceObserver::Create(image_resource->GetContent()); | 1765 MockImageResourceObserver::Create(image_resource->GetContent()); |
1695 | 1766 |
1696 // Send the image response. | 1767 // Send the image response. |
1697 ResourceResponse resource_response(NullURL(), "image/jpeg", | 1768 ResourceResponse resource_response(NullURL(), "image/jpeg", |
1698 sizeof(kJpegImage2), g_null_atom); | 1769 sizeof(kJpegImage2), g_null_atom); |
1699 resource_response.AddHTTPHeaderField("chrome-proxy", "q=low"); | |
1700 | 1770 |
1701 image_resource->ResponseReceived(resource_response, nullptr); | 1771 image_resource->ResponseReceived(resource_response, nullptr); |
1702 | 1772 |
1703 // This is number is sufficiently large amount of bytes necessary for the | 1773 // This is number is sufficiently large amount of bytes necessary for the |
1704 // image to be created (since the size is known). This was determined by | 1774 // image to be created (since the size is known). This was determined by |
1705 // appending one byte at a time (with flushes) until the image was decoded. | 1775 // appending one byte at a time (with flushes) until the image was decoded. |
1706 size_t meaningful_image_size = 280; | 1776 size_t meaningful_image_size = 280; |
1707 image_resource->AppendData(reinterpret_cast<const char*>(kJpegImage2), | 1777 image_resource->AppendData(reinterpret_cast<const char*>(kJpegImage2), |
1708 meaningful_image_size); | 1778 meaningful_image_size); |
1709 size_t bytes_sent = meaningful_image_size; | 1779 size_t bytes_sent = meaningful_image_size; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1762 EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); | 1832 EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); |
1763 EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); | 1833 EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); |
1764 EXPECT_EQ(50, image_resource->GetContent()->GetImage()->width()); | 1834 EXPECT_EQ(50, image_resource->GetContent()->GetImage()->width()); |
1765 EXPECT_EQ(50, image_resource->GetContent()->GetImage()->height()); | 1835 EXPECT_EQ(50, image_resource->GetContent()->GetImage()->height()); |
1766 | 1836 |
1767 WTF::SetTimeFunctionsForTesting(nullptr); | 1837 WTF::SetTimeFunctionsForTesting(nullptr); |
1768 } | 1838 } |
1769 | 1839 |
1770 } // namespace | 1840 } // namespace |
1771 } // namespace blink | 1841 } // namespace blink |
OLD | NEW |