diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-08-24 12:15:48 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-08-28 13:30:04 +0000 |
commit | b014812705fc80bff0a5c120dfcef88f349816dc (patch) | |
tree | 25a2e2d9fa285f1add86aa333389a839f81a39ae /chromium/third_party/blink/renderer/core/loader/resource | |
parent | 9f4560b1027ae06fdb497023cdcaf91b8511fa74 (diff) | |
download | qtwebengine-chromium-b014812705fc80bff0a5c120dfcef88f349816dc.tar.gz |
BASELINE: Update Chromium to 68.0.3440.125
Change-Id: I23f19369e01f688e496f5bf179abb521ad73874f
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/third_party/blink/renderer/core/loader/resource')
10 files changed, 100 insertions, 38 deletions
diff --git a/chromium/third_party/blink/renderer/core/loader/resource/font_resource.cc b/chromium/third_party/blink/renderer/core/loader/resource/font_resource.cc index 5691f6eadb8..28ac34cc174 100644 --- a/chromium/third_party/blink/renderer/core/loader/resource/font_resource.cc +++ b/chromium/third_party/blink/renderer/core/loader/resource/font_resource.cc @@ -119,10 +119,12 @@ void FontResource::SetRevalidatingRequest(const ResourceRequest& request) { Resource::SetRevalidatingRequest(request); } -void FontResource::StartLoadLimitTimers( +void FontResource::StartLoadLimitTimersIfNecessary( base::SingleThreadTaskRunner* task_runner) { - DCHECK(IsLoading()); - DCHECK_EQ(load_limit_state_, kLoadNotStarted); + if (!IsLoading() || load_limit_state_ != kLoadNotStarted) + return; + DCHECK(!font_load_short_limit_.IsActive()); + DCHECK(!font_load_long_limit_.IsActive()); load_limit_state_ = kUnderLimit; font_load_short_limit_ = PostDelayedCancellableTask( diff --git a/chromium/third_party/blink/renderer/core/loader/resource/font_resource.h b/chromium/third_party/blink/renderer/core/loader/resource/font_resource.h index d64559e8b04..faae82b62c7 100644 --- a/chromium/third_party/blink/renderer/core/loader/resource/font_resource.h +++ b/chromium/third_party/blink/renderer/core/loader/resource/font_resource.h @@ -54,7 +54,7 @@ class CORE_EXPORT FontResource final : public Resource { void SetRevalidatingRequest(const ResourceRequest&) override; void AllClientsAndObserversRemoved() override; - void StartLoadLimitTimers(base::SingleThreadTaskRunner*); + void StartLoadLimitTimersIfNecessary(base::SingleThreadTaskRunner*); String OtsParsingMessage() const { return ots_parsing_message_; } diff --git a/chromium/third_party/blink/renderer/core/loader/resource/image_resource.cc b/chromium/third_party/blink/renderer/core/loader/resource/image_resource.cc index b869c662aaf..941af988447 100644 --- a/chromium/third_party/blink/renderer/core/loader/resource/image_resource.cc +++ b/chromium/third_party/blink/renderer/core/loader/resource/image_resource.cc @@ -111,10 +111,10 @@ class ImageResource::ImageResourceInfoImpl final bool HasCacheControlNoStoreHeader() const override { return resource_->HasCacheControlNoStoreHeader(); } - Optional<ResourceError> GetResourceError() const override { + base::Optional<ResourceError> GetResourceError() const override { if (resource_->LoadFailedOrCanceled()) return resource_->GetResourceError(); - return WTF::nullopt; + return base::nullopt; } void SetDecodedSize(size_t size) override { resource_->SetDecodedSize(size); } @@ -382,8 +382,7 @@ void ImageResource::DecodeError(bool all_data_received) { if (!all_data_received && Loader()) { // Observers are notified via ImageResource::finish(). // TODO(hiroshige): Do not call didFinishLoading() directly. - Loader()->DidFinishLoading(CurrentTimeTicksInSeconds(), size, size, size, - false); + Loader()->DidFinishLoading(CurrentTimeTicks(), size, size, size, false); } else { auto result = GetContent()->UpdateImage( nullptr, GetStatus(), @@ -405,7 +404,7 @@ void ImageResource::NotifyStartLoad() { GetContent()->NotifyStartLoad(); } -void ImageResource::Finish(double load_finish_time, +void ImageResource::Finish(TimeTicks load_finish_time, base::SingleThreadTaskRunner* task_runner) { if (multipart_parser_) { if (!ErrorOccurred()) diff --git a/chromium/third_party/blink/renderer/core/loader/resource/image_resource.h b/chromium/third_party/blink/renderer/core/loader/resource/image_resource.h index 5f9de3fa72b..2fedb175215 100644 --- a/chromium/third_party/blink/renderer/core/loader/resource/image_resource.h +++ b/chromium/third_party/blink/renderer/core/loader/resource/image_resource.h @@ -88,7 +88,7 @@ class CORE_EXPORT ImageResource final void ResponseReceived(const ResourceResponse&, std::unique_ptr<WebDataConsumerHandle>) override; void AppendData(const char*, size_t) override; - void Finish(double finish_time, base::SingleThreadTaskRunner*) override; + void Finish(TimeTicks finish_time, base::SingleThreadTaskRunner*) override; void FinishAsError(const ResourceError&, base::SingleThreadTaskRunner*) override; diff --git a/chromium/third_party/blink/renderer/core/loader/resource/image_resource_content.cc b/chromium/third_party/blink/renderer/core/loader/resource/image_resource_content.cc index d87d87ea33c..cea5599d458 100644 --- a/chromium/third_party/blink/renderer/core/loader/resource/image_resource_content.cc +++ b/chromium/third_party/blink/renderer/core/loader/resource/image_resource_content.cc @@ -16,6 +16,7 @@ #include "third_party/blink/renderer/platform/histogram.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" #include "third_party/blink/renderer/platform/network/http_parsers.h" +#include "third_party/blink/renderer/platform/network/mime/mime_type_registry.h" #include "third_party/blink/renderer/platform/shared_buffer.h" #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h" #include "third_party/blink/renderer/platform/wtf/vector.h" @@ -52,8 +53,8 @@ class NullImageResourceInfo final return true; } bool HasCacheControlNoStoreHeader() const override { return false; } - Optional<ResourceError> GetResourceError() const override { - return WTF::nullopt; + base::Optional<ResourceError> GetResourceError() const override { + return base::nullopt; } void SetDecodedSize(size_t) override {} @@ -420,7 +421,7 @@ ImageResourceContent::UpdateImageResult ImageResourceContent::UpdateImage( #if DCHECK_IS_ON() DCHECK(!is_update_image_being_called_); - AutoReset<bool> scope(&is_update_image_being_called_, true); + base::AutoReset<bool> scope(&is_update_image_being_called_, true); #endif CHECK_NE(GetContentStatus(), ResourceStatus::kNotStarted); @@ -509,6 +510,32 @@ ImageResourceContent::UpdateImageResult ImageResourceContent::UpdateImage( return UpdateImageResult::kNoDecodeError; } +// Return true if the image type is one of the hard-coded 'modern' image +// formats. +// TODO(crbug.com/838263): Support site-defined list of acceptable formats +// through feature policy declarations. +bool ImageResourceContent::IsAcceptableContentType() { + AtomicString mime_type = GetResponse().HttpContentType(); + // If this was loaded from disk, there is no mime type. Return true for now. + if (mime_type.IsNull()) + return true; + return MIMETypeRegistry::IsModernImageMIMEType(mime_type); +} + +// Return true if the image content is well-compressed (and not full of +// extraneous metadata). This is currently defined as no using more than 10 bits +// per pixel of image data. +// TODO(crbug.com/838263): Support site-defined bit-per-pixel ratio through +// feature policy declarations. +bool ImageResourceContent::IsAcceptableCompressionRatio() { + uint64_t pixels = IntrinsicSize(kDoNotRespectImageOrientation).Area(); + if (!pixels) + return true; + long long resource_length = GetResponse().DecodedBodyLength(); + // Allow no more than 10 bits per compressed pixel + return (double)resource_length / pixels <= 1.25; +} + void ImageResourceContent::DecodedSizeChangedTo(const blink::Image* image, size_t new_size) { if (!image || image != image_) @@ -628,7 +655,7 @@ const ResourceResponse& ImageResourceContent::GetResponse() const { return info_->GetResponse(); } -Optional<ResourceError> ImageResourceContent::GetResourceError() const { +base::Optional<ResourceError> ImageResourceContent::GetResourceError() const { return info_->GetResourceError(); } diff --git a/chromium/third_party/blink/renderer/core/loader/resource/image_resource_content.h b/chromium/third_party/blink/renderer/core/loader/resource/image_resource_content.h index 66b8c3f0569..ab956561062 100644 --- a/chromium/third_party/blink/renderer/core/loader/resource/image_resource_content.h +++ b/chromium/third_party/blink/renderer/core/loader/resource/image_resource_content.h @@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_RESOURCE_IMAGE_RESOURCE_CONTENT_H_ #include <memory> +#include "base/auto_reset.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/loader/resource/image_resource_observer.h" #include "third_party/blink/renderer/platform/geometry/int_rect.h" @@ -16,7 +17,6 @@ #include "third_party/blink/renderer/platform/loader/fetch/resource_load_priority.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_status.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" -#include "third_party/blink/renderer/platform/wtf/auto_reset.h" #include "third_party/blink/renderer/platform/wtf/hash_counted_set.h" #include "third_party/blink/renderer/platform/wtf/hash_map.h" @@ -112,7 +112,7 @@ class CORE_EXPORT ImageResourceContent final const KURL& Url() const; bool IsAccessAllowed(const SecurityOrigin*); const ResourceResponse& GetResponse() const; - Optional<ResourceError> GetResourceError() const; + base::Optional<ResourceError> GetResourceError() const; // DEPRECATED: ImageResourceContents consumers shouldn't need to worry about // whether the underlying Resource is being revalidated. bool IsCacheValidator() const; @@ -176,6 +176,12 @@ class CORE_EXPORT ImageResourceContent final return is_refetchable_data_from_disk_cache_; } + // Optimized image policies: These methods are used to determine whether the + // image resource violates any of the image policies in effect on the current + // page. + bool IsAcceptableContentType(); + bool IsAcceptableCompressionRatio(); + private: using CanDeferInvalidation = ImageResourceObserver::CanDeferInvalidation; @@ -200,7 +206,7 @@ class CORE_EXPORT ImageResourceContent final void MarkObserverFinished(ImageResourceObserver*); void UpdateToLoadedContentStatus(ResourceStatus); - class ProhibitAddRemoveObserverInScope : public AutoReset<bool> { + class ProhibitAddRemoveObserverInScope : public base::AutoReset<bool> { public: ProhibitAddRemoveObserverInScope(const ImageResourceContent* content) : AutoReset(&content->is_add_remove_observer_prohibited_, true) {} diff --git a/chromium/third_party/blink/renderer/core/loader/resource/image_resource_info.h b/chromium/third_party/blink/renderer/core/loader/resource/image_resource_info.h index bedf300abe6..bd48546a49b 100644 --- a/chromium/third_party/blink/renderer/core/loader/resource/image_resource_info.h +++ b/chromium/third_party/blink/renderer/core/loader/resource/image_resource_info.h @@ -5,6 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_RESOURCE_IMAGE_RESOURCE_INFO_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_RESOURCE_IMAGE_RESOURCE_INFO_H_ +#include "base/optional.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/heap/heap.h" @@ -12,7 +13,6 @@ #include "third_party/blink/renderer/platform/loader/fetch/resource_status.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" #include "third_party/blink/renderer/platform/wtf/forward.h" -#include "third_party/blink/renderer/platform/wtf/optional.h" namespace blink { @@ -43,7 +43,7 @@ class CORE_EXPORT ImageResourceInfo : public GarbageCollectedMixin { const SecurityOrigin*, DoesCurrentFrameHaveSingleSecurityOrigin) const = 0; virtual bool HasCacheControlNoStoreHeader() const = 0; - virtual Optional<ResourceError> GetResourceError() const = 0; + virtual base::Optional<ResourceError> GetResourceError() const = 0; // TODO(hiroshige): Remove this once MemoryCache becomes further weaker. virtual void SetDecodedSize(size_t) = 0; diff --git a/chromium/third_party/blink/renderer/core/loader/resource/image_resource_test.cc b/chromium/third_party/blink/renderer/core/loader/resource/image_resource_test.cc index 5cdb96946ac..75553a8bfa9 100644 --- a/chromium/third_party/blink/renderer/core/loader/resource/image_resource_test.cc +++ b/chromium/third_party/blink/renderer/core/loader/resource/image_resource_test.cc @@ -226,8 +226,8 @@ void TestThatReloadIsStartedThenServeReload( image_resource->Loader()->DidReceiveResponse(WrappedResourceResponse( ResourceResponse(test_url, "image/jpeg", kDataLength))); image_resource->Loader()->DidReceiveData(data, kDataLength); - image_resource->Loader()->DidFinishLoading(0.0, kDataLength, kDataLength, - kDataLength, false); + image_resource->Loader()->DidFinishLoading(TimeTicks(), kDataLength, + kDataLength, kDataLength, false); // Checks |imageResource|'s status after reloading. EXPECT_EQ(ResourceStatus::kCached, image_resource->GetStatus()); @@ -281,7 +281,7 @@ void TestThatIsPlaceholderRequestAndServeResponse( reinterpret_cast<const char*>(kJpegImage), kJpegImageSubrangeWithDimensionsLength); image_resource->Loader()->DidFinishLoading( - 0.0, kJpegImageSubrangeWithDimensionsLength, + TimeTicks(), kJpegImageSubrangeWithDimensionsLength, kJpegImageSubrangeWithDimensionsLength, kJpegImageSubrangeWithDimensionsLength, false); @@ -320,8 +320,9 @@ void TestThatIsNotPlaceholderRequestAndServeResponse( ResourceResponse(url, "image/jpeg", sizeof(kJpegImage)))); image_resource->Loader()->DidReceiveData( reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); - image_resource->Loader()->DidFinishLoading( - 0.0, sizeof(kJpegImage), sizeof(kJpegImage), sizeof(kJpegImage), false); + image_resource->Loader()->DidFinishLoading(TimeTicks(), sizeof(kJpegImage), + sizeof(kJpegImage), + sizeof(kJpegImage), false); // Checks that |imageResource| is successfully loaded, // showing a non-placeholder image. @@ -414,7 +415,7 @@ TEST(ImageResourceTest, MultipartImage) { // This part finishes. The image is created, callbacks are sent, and the data // buffer is cleared. - image_resource->Loader()->DidFinishLoading(0.0, 0, 0, 0, false); + image_resource->Loader()->DidFinishLoading(TimeTicks(), 0, 0, 0, false); EXPECT_TRUE(image_resource->ResourceBuffer()); EXPECT_FALSE(image_resource->ErrorOccurred()); ASSERT_TRUE(image_resource->GetContent()->HasImage()); @@ -456,7 +457,7 @@ TEST(ImageResourceTest, BitmapMultipartImage) { image_resource->AppendData(reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); image_resource->AppendData(kBoundary, strlen(kBoundary)); - image_resource->Loader()->DidFinishLoading(0.0, 0, 0, 0, false); + image_resource->Loader()->DidFinishLoading(TimeTicks(), 0, 0, 0, false); EXPECT_TRUE(image_resource->GetContent()->HasImage()); EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); EXPECT_TRUE(image_resource->GetContent() @@ -512,7 +513,7 @@ class MockFinishObserver : public GarbageCollectedFinalized<MockFinishObserver>, MOCK_METHOD0(NotifyFinished, void()); String DebugName() const override { return "MockFinishObserver"; } - virtual void Trace(blink::Visitor* visitor) { + void Trace(blink::Visitor* visitor) override { blink::ResourceFinishObserver::Trace(visitor); } @@ -796,8 +797,9 @@ TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderViaResourceFetcher) { WrappedResourceResponse(resource_response)); image_resource->Loader()->DidReceiveData( reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); - image_resource->Loader()->DidFinishLoading( - 0.0, sizeof(kJpegImage), sizeof(kJpegImage), sizeof(kJpegImage), false); + image_resource->Loader()->DidFinishLoading(TimeTicks(), sizeof(kJpegImage), + sizeof(kJpegImage), + sizeof(kJpegImage), false); EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); EXPECT_EQ(image_resource, fetcher->CachedResource(test_url)); @@ -1296,7 +1298,7 @@ TEST(ImageResourceTest, DecodeErrorWithEmptyBody) { EXPECT_FALSE(observer->ImageNotifyFinishedCalled()); EXPECT_EQ(0, observer->ImageChangedCount()); - image_resource->Loader()->DidFinishLoading(0.0, 0, 0, 0, false); + image_resource->Loader()->DidFinishLoading(TimeTicks(), 0, 0, 0, false); EXPECT_EQ(ResourceStatus::kDecodeError, image_resource->GetStatus()); EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); @@ -1339,7 +1341,7 @@ TEST(ImageResourceTest, PartialContentWithoutDimensions) { EXPECT_EQ(0, observer->ImageChangedCount()); image_resource->Loader()->DidFinishLoading( - 0.0, kJpegImageSubrangeWithoutDimensionsLength, + TimeTicks(), kJpegImageSubrangeWithoutDimensionsLength, kJpegImageSubrangeWithoutDimensionsLength, kJpegImageSubrangeWithoutDimensionsLength, false); @@ -1567,7 +1569,7 @@ TEST(ImageResourceTest, FetchAllowPlaceholderPartialContentWithoutDimensions) { EXPECT_EQ(0, observer->ImageChangedCount()); image_resource->Loader()->DidFinishLoading( - 0.0, kJpegImageSubrangeWithoutDimensionsLength, + TimeTicks(), kJpegImageSubrangeWithoutDimensionsLength, kJpegImageSubrangeWithoutDimensionsLength, kJpegImageSubrangeWithoutDimensionsLength, false); @@ -1706,8 +1708,9 @@ TEST(ImageResourceTest, FetchAllowPlaceholderFullResponseDecodeSuccess) { WrappedResourceResponse(response)); image_resource->Loader()->DidReceiveData( reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); - image_resource->Loader()->DidFinishLoading( - 0.0, sizeof(kJpegImage), sizeof(kJpegImage), sizeof(kJpegImage), false); + image_resource->Loader()->DidFinishLoading(TimeTicks(), sizeof(kJpegImage), + sizeof(kJpegImage), + sizeof(kJpegImage), false); EXPECT_EQ(ResourceStatus::kCached, image_resource->GetStatus()); EXPECT_EQ(sizeof(kJpegImage), image_resource->EncodedSize()); @@ -1935,7 +1938,7 @@ TEST(ImageResourceTest, DeferredInvalidation) { class ImageResourceCounterTest : public testing::Test { public: ImageResourceCounterTest() = default; - ~ImageResourceCounterTest() = default; + ~ImageResourceCounterTest() override = default; void CreateImageResource(const char* url_part, bool ua_resource) { // Create a unique fake data url. diff --git a/chromium/third_party/blink/renderer/core/loader/resource/multipart_image_resource_parser_test.cc b/chromium/third_party/blink/renderer/core/loader/resource/multipart_image_resource_parser_test.cc index 233892d029f..03f2cd9b6fd 100644 --- a/chromium/third_party/blink/renderer/core/loader/resource/multipart_image_resource_parser_test.cc +++ b/chromium/third_party/blink/renderer/core/loader/resource/multipart_image_resource_parser_test.cc @@ -48,7 +48,7 @@ TEST(MultipartResponseTest, SkippableLength) { {"\rLine", 0, 0}, {"Line\r\nLine", 4, 2}, {"Line\nLine", 4, 1}, {"Line\n\nLine", 4, 1}, {"Line\rLine", 4, 0}, {"Line\r\rLine", 4, 0}, }; - for (size_t i = 0; i < WTF_ARRAY_LENGTH(line_tests); ++i) { + for (size_t i = 0; i < arraysize(line_tests); ++i) { Vector<char> input; input.Append(line_tests[i].input, strlen(line_tests[i].input)); EXPECT_EQ(line_tests[i].expected, @@ -68,7 +68,7 @@ TEST(MultipartResponseTest, FindBoundary) { {"foo", "bound", kNotFound}, {"bound", "--boundbound", 0}, }; - for (size_t i = 0; i < WTF_ARRAY_LENGTH(boundary_tests); ++i) { + for (size_t i = 0; i < arraysize(boundary_tests); ++i) { Vector<char> boundary, data; boundary.Append(boundary_tests[i].boundary, strlen(boundary_tests[i].boundary)); diff --git a/chromium/third_party/blink/renderer/core/loader/resource/script_resource.cc b/chromium/third_party/blink/renderer/core/loader/resource/script_resource.cc index 91c831fed3a..8c9cab8de67 100644 --- a/chromium/third_party/blink/renderer/core/loader/resource/script_resource.cc +++ b/chromium/third_party/blink/renderer/core/loader/resource/script_resource.cc @@ -43,6 +43,30 @@ namespace blink { +namespace { + +// Returns true if the given request context is a script-like destination +// defined in the Fetch spec: +// https://fetch.spec.whatwg.org/#request-destination-script-like +bool IsRequestContextSupported(WebURLRequest::RequestContext request_context) { + // TODO(nhiroki): Support |kRequestContextSharedWorker| for module loading for + // shared workers (https://crbug.com/824646). + // TODO(nhiroki): Support |kRequestContextServiceWorker| for module loading + // for service workers (https://crbug.com/824647). + // TODO(nhiroki): Support "audioworklet" and "paintworklet" destinations. + switch (request_context) { + case WebURLRequest::kRequestContextScript: + case WebURLRequest::kRequestContextWorker: + return true; + default: + break; + } + NOTREACHED() << "Incompatible request context type: " << request_context; + return false; +} + +} // namespace + // SingleCachedMetadataHandlerImpl should be created when a response is // received, and can be used independently from Resource. - It doesn't have any // references to Resource. Necessary data are captured @@ -151,7 +175,8 @@ ScriptResource* ScriptResource::Fetch(FetchParameters& params, ResourceClient* client) { DCHECK_EQ(params.GetResourceRequest().GetFrameType(), network::mojom::RequestContextFrameType::kNone); - params.SetRequestContext(WebURLRequest::kRequestContextScript); + DCHECK(IsRequestContextSupported( + params.GetResourceRequest().GetRequestContext())); return ToScriptResource( fetcher->RequestResource(params, ScriptResourceFactory(), client)); } |