Chromium Code Reviews| Index: third_party/WebKit/Source/core/fetch/ImageResource.cpp |
| diff --git a/third_party/WebKit/Source/core/fetch/ImageResource.cpp b/third_party/WebKit/Source/core/fetch/ImageResource.cpp |
| index 0a454391815e5909ea81d4e931931a92341c7884..7e04c4e4b68bf074b032cf960663411322bf8ba8 100644 |
| --- a/third_party/WebKit/Source/core/fetch/ImageResource.cpp |
| +++ b/third_party/WebKit/Source/core/fetch/ImageResource.cpp |
| @@ -23,22 +23,19 @@ |
| #include "core/fetch/ImageResource.h" |
| +#include "core/fetch/ImageResourceContent.h" |
| +#include "core/fetch/ImageResourceInfo.h" |
| #include "core/fetch/ImageResourceObserver.h" |
|
yhirano
2016/12/05 09:02:03
Is this needed?
hiroshige
2016/12/06 09:32:50
Done.
|
| #include "core/fetch/MemoryCache.h" |
| #include "core/fetch/ResourceClient.h" |
| #include "core/fetch/ResourceFetcher.h" |
| #include "core/fetch/ResourceLoader.h" |
| #include "core/fetch/ResourceLoadingLog.h" |
| -#include "core/svg/graphics/SVGImage.h" |
| #include "platform/Histogram.h" |
| #include "platform/RuntimeEnabledFeatures.h" |
| #include "platform/SharedBuffer.h" |
| -#include "platform/geometry/IntSize.h" |
| -#include "platform/graphics/BitmapImage.h" |
| -#include "platform/graphics/PlaceholderImage.h" |
| #include "platform/tracing/TraceEvent.h" |
| #include "public/platform/Platform.h" |
| -#include "public/platform/WebCachePolicy.h" |
| #include "wtf/CurrentTime.h" |
| #include "wtf/HashCountedSet.h" |
|
yhirano
2016/12/05 09:02:03
Not needed?
hiroshige
2016/12/06 09:32:50
Done.
|
| #include "wtf/StdLibExtras.h" |
| @@ -54,6 +51,82 @@ namespace { |
| constexpr double kFlushDelaySeconds = 1.; |
| } // namespace |
| +class ImageResource::ImageResourceInfoImpl final |
| + : public GarbageCollectedFinalized<ImageResourceInfoImpl>, |
| + public ImageResourceInfo { |
| + USING_GARBAGE_COLLECTED_MIXIN(ImageResourceInfoImpl); |
| + |
| + public: |
| + ImageResourceInfoImpl(ImageResource* resource) : m_resource(resource) { |
| + DCHECK(m_resource); |
| + } |
| + DEFINE_INLINE_VIRTUAL_TRACE() { |
| + visitor->trace(m_resource); |
| + ImageResourceInfo::trace(visitor); |
| + } |
| + |
| + private: |
| + const KURL& url() const override { return m_resource->url(); } |
| + bool isSchedulingReload() const override { |
| + return m_resource->m_isSchedulingReload; |
| + } |
| + bool hasDevicePixelRatioHeaderValue() const override { |
| + return m_resource->m_hasDevicePixelRatioHeaderValue; |
| + } |
| + float devicePixelRatioHeaderValue() const override { |
| + return m_resource->m_devicePixelRatioHeaderValue; |
| + } |
| + const ResourceResponse& response() const override { |
| + return m_resource->response(); |
| + } |
| + Resource::Status getStatus() const override { |
| + return m_resource->getStatus(); |
| + } |
| + bool isPlaceholder() const override { return m_resource->isPlaceholder(); } |
| + bool isCacheValidator() const override { |
| + return m_resource->isCacheValidator(); |
| + } |
| + bool schedulingReloadOrShouldReloadBrokenPlaceholder() const override { |
| + return m_resource->m_isSchedulingReload || |
| + m_resource->shouldReloadBrokenPlaceholder(); |
| + } |
| + bool isAccessAllowed( |
| + SecurityOrigin* securityOrigin, |
| + bool doesCurrentFrameHasSingleSecurityOrigin) const override { |
| + return m_resource->isAccessAllowed(securityOrigin, |
| + doesCurrentFrameHasSingleSecurityOrigin); |
| + } |
| + bool hasCacheControlNoStoreHeader() const override { |
| + return m_resource->hasCacheControlNoStoreHeader(); |
| + } |
| + const ResourceError& resourceError() const override { |
| + return m_resource->resourceError(); |
| + } |
| + |
| + void decodeError(bool allDataReceived) override { |
| + m_resource->decodeError(allDataReceived); |
| + } |
| + void setDecodedSize(size_t size) override { |
| + m_resource->setDecodedSize(size); |
| + } |
| + void willAddClientOrObserver() override { |
| + m_resource->willAddClientOrObserver(Resource::MarkAsReferenced); |
| + } |
| + void didRemoveClientOrObserver() override { |
| + m_resource->didRemoveClientOrObserver(); |
| + } |
| + void emulateLoadStartedForInspector( |
| + ResourceFetcher* fetcher, |
| + const KURL& url, |
| + const AtomicString& initiatorName) override { |
| + fetcher->emulateLoadStartedForInspector(m_resource.get(), url, |
| + WebURLRequest::RequestContextImage, |
| + initiatorName); |
| + } |
| + |
| + Member<ImageResource> m_resource; |
|
yhirano
2016/12/05 09:02:03
[optional] const Member<ImageResource> m_resource;
hiroshige
2016/12/06 09:32:50
Done.
|
| +}; |
| + |
| class ImageResource::ImageResourceFactory : public ResourceFactory { |
| STACK_ALLOCATED(); |
| @@ -64,7 +137,7 @@ class ImageResource::ImageResourceFactory : public ResourceFactory { |
| Resource* create(const ResourceRequest& request, |
| const ResourceLoaderOptions& options, |
| const String&) const override { |
| - return new ImageResource(request, options, |
| + return new ImageResource(request, options, ImageResourceContent::create(), |
| m_fetchRequest->placeholderImageRequestType() == |
| FetchRequest::AllowPlaceholder); |
| } |
| @@ -106,43 +179,35 @@ ImageResource* ImageResource::fetch(FetchRequest& request, |
| return resource; |
| } |
| +ImageResource* ImageResource::create(const ResourceRequest& request) { |
| + return new ImageResource(request, ResourceLoaderOptions(), |
| + ImageResourceContent::create(), false); |
| +} |
| + |
| ImageResource::ImageResource(const ResourceRequest& resourceRequest, |
| const ResourceLoaderOptions& options, |
| + ImageResourceContent* content, |
| bool isPlaceholder) |
| : Resource(resourceRequest, Image, options), |
| + m_content(content), |
| m_devicePixelRatioHeaderValue(1.0), |
| - m_image(nullptr), |
| m_hasDevicePixelRatioHeaderValue(false), |
| m_isSchedulingReload(false), |
| m_isPlaceholder(isPlaceholder), |
| - m_flushTimer(this, &ImageResource::flushImageIfNeeded), |
| - m_isRefetchableDataFromDiskCache(true) { |
| + m_flushTimer(this, &ImageResource::flushImageIfNeeded) { |
| + DCHECK(getContent()); |
| RESOURCE_LOADING_DVLOG(1) << "new ImageResource(ResourceRequest) " << this; |
| -} |
| - |
| -ImageResource::ImageResource(blink::Image* image, |
| - const ResourceLoaderOptions& options) |
| - : Resource(ResourceRequest(""), Image, options), |
| - m_devicePixelRatioHeaderValue(1.0), |
| - m_image(image), |
| - m_hasDevicePixelRatioHeaderValue(false), |
| - m_isSchedulingReload(false), |
| - m_isPlaceholder(false), |
| - m_flushTimer(this, &ImageResource::flushImageIfNeeded), |
| - m_isRefetchableDataFromDiskCache(true) { |
| - RESOURCE_LOADING_DVLOG(1) << "new ImageResource(Image) " << this; |
| - setStatus(Cached); |
| + getContent()->setImageResourceInfo(new ImageResourceInfoImpl(this)); |
| } |
| ImageResource::~ImageResource() { |
| RESOURCE_LOADING_DVLOG(1) << "~ImageResource " << this; |
| - clearImage(); |
| } |
| DEFINE_TRACE(ImageResource) { |
| visitor->trace(m_multipartParser); |
| + visitor->trace(m_content); |
| Resource::trace(visitor); |
| - ImageObserver::trace(visitor); |
| MultipartImageResourceParser::Client::trace(visitor); |
| } |
| @@ -155,15 +220,13 @@ void ImageResource::checkNotify() { |
| Resource::checkNotify(); |
| } |
| -void ImageResource::markObserverFinished(ImageResourceObserver* observer) { |
| - if (m_observers.contains(observer)) { |
| - m_finishedObservers.add(observer); |
| - m_observers.remove(observer); |
| - } |
| +bool ImageResource::hasClientsOrObservers() const { |
| + return Resource::hasClientsOrObservers() || getContent()->hasObservers(); |
| } |
| void ImageResource::didAddClient(ResourceClient* client) { |
| - DCHECK((m_multipartParser && isLoading()) || !data() || m_image); |
| + DCHECK((m_multipartParser && isLoading()) || !data() || |
| + getContent()->hasImage()); |
| // Don't notify observers and clients of completion if this ImageResource is |
| // about to be reloaded. |
| @@ -173,106 +236,32 @@ void ImageResource::didAddClient(ResourceClient* client) { |
| Resource::didAddClient(client); |
| } |
| -void ImageResource::addObserver(ImageResourceObserver* observer) { |
| - willAddClientOrObserver(MarkAsReferenced); |
| - |
| - m_observers.add(observer); |
| - |
| - if (isCacheValidator()) |
| - return; |
| - |
| - // When the response is not multipart, if |data()| exists, |m_image| must be |
| - // created. This is assured that |updateImage()| is called when |appendData()| |
| - // is called. |
| - // |
| - // On the other hand, when the response is multipart, |updateImage()| is not |
| - // called in |appendData()|, which means |m_image| might not be created even |
| - // when |data()| exists. This is intentional since creating a |m_image| on |
| - // receiving data might destroy an existing image in a previous part. |
| - DCHECK((m_multipartParser && isLoading()) || !data() || m_image); |
| - |
| - if (m_image && !m_image->isNull()) { |
| - observer->imageChanged(this); |
| - } |
| - |
| - if (isLoaded() && m_observers.contains(observer) && !m_isSchedulingReload && |
| - !shouldReloadBrokenPlaceholder()) { |
| - markObserverFinished(observer); |
| - observer->imageNotifyFinished(this); |
| - } |
| -} |
| - |
| -void ImageResource::removeObserver(ImageResourceObserver* observer) { |
| - DCHECK(observer); |
| - |
| - if (m_observers.contains(observer)) |
| - m_observers.remove(observer); |
| - else if (m_finishedObservers.contains(observer)) |
| - m_finishedObservers.remove(observer); |
| - else |
| - NOTREACHED(); |
| - |
| - didRemoveClientOrObserver(); |
| -} |
| - |
| -static void priorityFromObserver(const ImageResourceObserver* observer, |
| - ResourcePriority& priority) { |
| - ResourcePriority nextPriority = observer->computeResourcePriority(); |
| - if (nextPriority.visibility == ResourcePriority::NotVisible) |
| - return; |
| - priority.visibility = ResourcePriority::Visible; |
| - priority.intraPriorityValue += nextPriority.intraPriorityValue; |
| -} |
| - |
| -ResourcePriority ImageResource::priorityFromObservers() { |
| - ResourcePriority priority; |
| - |
| - for (auto* observer : m_finishedObservers.asVector()) { |
| - if (m_finishedObservers.contains(observer)) |
| - priorityFromObserver(observer, priority); |
| - } |
| - for (auto* observer : m_observers.asVector()) { |
| - if (m_observers.contains(observer)) |
| - priorityFromObserver(observer, priority); |
| - } |
| - |
| - return priority; |
| -} |
| - |
| void ImageResource::destroyDecodedDataForFailedRevalidation() { |
| - clearImage(); |
| + getContent()->updateImage(nullptr, ImageResourceContent::ClearExistingImage, |
| + false); |
| setDecodedSize(0); |
| } |
| void ImageResource::destroyDecodedDataIfPossible() { |
| - if (!m_image) |
| - return; |
| - CHECK(!errorOccurred()); |
| - m_image->destroyDecodedData(); |
| - if (!isPreloaded() && m_isRefetchableDataFromDiskCache) { |
| + getContent()->destroyDecodedData(); |
| + if (getContent()->hasImage() && !isPreloaded() && |
| + getContent()->isRefetchableDataFromDiskCache()) { |
| UMA_HISTOGRAM_MEMORY_KB("Memory.Renderer.EstimatedDroppableEncodedSize", |
| encodedSize() / 1024); |
| } |
| } |
| -void ImageResource::doResetAnimation() { |
| - if (m_image) |
| - m_image->resetAnimation(); |
| -} |
| - |
| void ImageResource::allClientsAndObserversRemoved() { |
| - if (m_image) { |
| - CHECK(!errorOccurred()); |
| - // If possible, delay the resetting until back at the event loop. Doing so |
| - // after a conservative GC prevents resetAnimation() from upsetting ongoing |
| - // animation updates (crbug.com/613709) |
| - if (!ThreadHeap::willObjectBeLazilySwept(this)) { |
| - Platform::current()->currentThread()->getWebTaskRunner()->postTask( |
| - BLINK_FROM_HERE, WTF::bind(&ImageResource::doResetAnimation, |
| - wrapWeakPersistent(this))); |
| - } else { |
| - m_image->resetAnimation(); |
| - } |
| + CHECK(!getContent()->hasImage() || !errorOccurred()); |
| + // If possible, delay the resetting until back at the event loop. Doing so |
| + // after a conservative GC prevents resetAnimation() from upsetting ongoing |
| + // animation updates (crbug.com/613709) |
| + if (!ThreadHeap::willObjectBeLazilySwept(this)) { |
| + Platform::current()->currentThread()->getWebTaskRunner()->postTask( |
| + BLINK_FROM_HERE, WTF::bind(&ImageResourceContent::doResetAnimation, |
| + wrapWeakPersistent(getContent()))); |
| + } else { |
| + getContent()->doResetAnimation(); |
| } |
| if (m_multipartParser) |
| m_multipartParser->cancel(); |
| @@ -282,8 +271,8 @@ void ImageResource::allClientsAndObserversRemoved() { |
| PassRefPtr<const SharedBuffer> ImageResource::resourceBuffer() const { |
| if (data()) |
| return data(); |
| - if (m_image) |
| - return m_image->data(); |
| + if (getContent()->hasImage()) |
| + return getContent()->getImage()->data(); |
| return nullptr; |
| } |
| @@ -298,9 +287,11 @@ void ImageResource::appendData(const char* data, size_t length) { |
| // we need to know the image size as soon as possible. Likewise for |
| // animated images, update right away since we shouldn't throttle animated |
| // images. |
| - if (m_sizeAvailable == Image::SizeUnavailable || |
| - (m_image && m_image->maybeAnimated())) { |
| - updateImage(false); |
| + if (!getContent()->isSizeAvailable() || |
| + (getContent()->hasImage() && |
| + getContent()->getImage()->maybeAnimated())) { |
| + getContent()->updateImage(this->data(), |
| + ImageResourceContent::KeepExistingImage, false); |
| return; |
| } |
| @@ -328,193 +319,34 @@ void ImageResource::flushImageIfNeeded(TimerBase*) { |
| // to call |updateImage()|. |
| if (isLoading()) { |
| m_lastFlushTime = WTF::monotonicallyIncreasingTime(); |
| - updateImage(false); |
| - } |
| -} |
| - |
| -std::pair<blink::Image*, float> ImageResource::brokenImage( |
| - float deviceScaleFactor) { |
| - if (deviceScaleFactor >= 2) { |
| - DEFINE_STATIC_REF(blink::Image, brokenImageHiRes, |
| - (blink::Image::loadPlatformResource("missingImage@2x"))); |
| - return std::make_pair(brokenImageHiRes, 2); |
| + getContent()->updateImage(this->data(), |
| + ImageResourceContent::KeepExistingImage, false); |
| } |
| - |
| - DEFINE_STATIC_REF(blink::Image, brokenImageLoRes, |
| - (blink::Image::loadPlatformResource("missingImage"))); |
| - return std::make_pair(brokenImageLoRes, 1); |
| } |
| bool ImageResource::willPaintBrokenImage() const { |
| return errorOccurred(); |
| } |
| -blink::Image* ImageResource::getImage() { |
| - if (errorOccurred()) { |
| - // Returning the 1x broken image is non-ideal, but we cannot reliably access |
| - // the appropriate deviceScaleFactor from here. It is critical that callers |
| - // use ImageResource::brokenImage() when they need the real, |
| - // deviceScaleFactor-appropriate broken image icon. |
| - return brokenImage(1).first; |
| - } |
| - |
| - if (m_image) |
| - return m_image.get(); |
| - |
| - return blink::Image::nullImage(); |
| -} |
| - |
| -bool ImageResource::usesImageContainerSize() const { |
| - if (m_image) |
| - return m_image->usesContainerSize(); |
| - |
| - return false; |
| -} |
| - |
| -bool ImageResource::imageHasRelativeSize() const { |
| - if (m_image) |
| - return m_image->hasRelativeSize(); |
| - |
| - return false; |
| -} |
| - |
| -LayoutSize ImageResource::imageSize( |
| - RespectImageOrientationEnum shouldRespectImageOrientation, |
| - float multiplier, |
| - SizeType sizeType) { |
| - if (!m_image) |
| - return LayoutSize(); |
| - |
| - LayoutSize size; |
| - |
| - if (m_image->isBitmapImage() && |
| - shouldRespectImageOrientation == RespectImageOrientation) { |
| - size = |
| - LayoutSize(toBitmapImage(m_image.get())->sizeRespectingOrientation()); |
| - } else { |
| - size = LayoutSize(m_image->size()); |
| - } |
| - |
| - if (sizeType == IntrinsicCorrectedToDPR && m_hasDevicePixelRatioHeaderValue && |
| - m_devicePixelRatioHeaderValue > 0) |
| - multiplier = 1 / m_devicePixelRatioHeaderValue; |
| - |
| - if (multiplier == 1 || m_image->hasRelativeSize()) |
| - return size; |
| - |
| - // Don't let images that have a width/height >= 1 shrink below 1 when zoomed. |
| - LayoutSize minimumSize( |
| - size.width() > LayoutUnit() ? LayoutUnit(1) : LayoutUnit(), |
| - LayoutUnit(size.height() > LayoutUnit() ? LayoutUnit(1) : LayoutUnit())); |
| - size.scale(multiplier); |
| - size.clampToMinimumSize(minimumSize); |
| - return size; |
| -} |
| - |
| -void ImageResource::notifyObservers(NotifyFinishOption notifyingFinishOption, |
| - const IntRect* changeRect) { |
| - for (auto* observer : m_finishedObservers.asVector()) { |
| - if (m_finishedObservers.contains(observer)) |
| - observer->imageChanged(this, changeRect); |
| - } |
| - for (auto* observer : m_observers.asVector()) { |
| - if (m_observers.contains(observer)) { |
| - observer->imageChanged(this, changeRect); |
| - if (notifyingFinishOption == ShouldNotifyFinish && |
| - m_observers.contains(observer) && !m_isSchedulingReload && |
| - !shouldReloadBrokenPlaceholder()) { |
| - markObserverFinished(observer); |
| - observer->imageNotifyFinished(this); |
| - } |
| - } |
| - } |
| -} |
| +void ImageResource::decodeError(bool allDataReceived) { |
| + size_t size = encodedSize(); |
| -void ImageResource::clear() { |
| - clearImage(); |
| clearData(); |
| setEncodedSize(0); |
| -} |
| - |
| -inline void ImageResource::createImage() { |
| - // Create the image if it doesn't yet exist. |
| - if (m_image) |
| - return; |
| - |
| - if (response().mimeType() == "image/svg+xml") { |
| - m_image = SVGImage::create(this); |
| - } else { |
| - m_image = BitmapImage::create(this); |
| - } |
| -} |
| - |
| -inline void ImageResource::clearImage() { |
| - if (!m_image) |
| - return; |
| - int64_t length = m_image->data() ? m_image->data()->size() : 0; |
| - v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(-length); |
| - |
| - // If our Image has an observer, it's always us so we need to clear the back |
| - // pointer before dropping our reference. |
| - m_image->clearImageObserver(); |
| - m_image.clear(); |
| - m_sizeAvailable = Image::SizeUnavailable; |
| -} |
| - |
| -void ImageResource::updateImage(bool allDataReceived) { |
| - TRACE_EVENT0("blink", "ImageResource::updateImage"); |
| - |
| - if (data()) |
| - createImage(); |
| - |
| - // Have the image update its data from its internal buffer. It will not do |
| - // anything now, but will delay decoding until queried for info (like size or |
| - // specific image frames). |
| - if (data()) { |
| - DCHECK(m_image); |
| - m_sizeAvailable = m_image->setData(data(), allDataReceived); |
| - } |
| - |
| - // Go ahead and tell our observers to try to draw if we have either received |
| - // all the data or the size is known. Each chunk from the network causes |
| - // observers to repaint, which will force that chunk to decode. |
| - if (m_sizeAvailable == Image::SizeUnavailable && !allDataReceived) |
| - return; |
| - |
| - if (m_isPlaceholder && allDataReceived && m_image && !m_image->isNull()) { |
| - if (m_sizeAvailable == Image::SizeAvailable) { |
| - // TODO(sclittle): Show the original image if the response consists of the |
| - // entire image, such as if the entire image response body is smaller than |
| - // the requested range. |
| - IntSize dimensions = m_image->size(); |
| - clearImage(); |
| - m_image = PlaceholderImage::create(this, dimensions); |
| - } else { |
| - // Clear the image so that it gets treated like a decoding error, since |
| - // the attempt to build a placeholder image failed. |
| - clearImage(); |
| - } |
| - } |
| + if (!errorOccurred()) |
| + setStatus(DecodeError); |
| - if (!m_image || m_image->isNull()) { |
| - size_t size = encodedSize(); |
| - clear(); |
| - if (!errorOccurred()) |
| - setStatus(DecodeError); |
| - if (!allDataReceived && loader()) { |
| - loader()->didFinishLoading(monotonicallyIncreasingTime(), size, size); |
| - } |
| - memoryCache()->remove(this); |
| + if (!allDataReceived && loader()) { |
| + // TODO(hiroshige): Do not call didFinishLoading() directly. |
| + loader()->didFinishLoading(monotonicallyIncreasingTime(), size, size); |
| } |
| - // It would be nice to only redraw the decoded band of the image, but with the |
| - // current design (decoding delayed until painting) that seems hard. |
| - notifyObservers(allDataReceived ? ShouldNotifyFinish : DoNotNotifyFinish); |
| + memoryCache()->remove(this); |
| } |
| void ImageResource::updateImageAndClearBuffer() { |
| - clearImage(); |
| - updateImage(true); |
| + getContent()->updateImage(data(), ImageResourceContent::ClearExistingImage, |
| + true); |
| clearData(); |
| } |
| @@ -524,7 +356,8 @@ void ImageResource::finish(double loadFinishTime) { |
| if (data()) |
| updateImageAndClearBuffer(); |
| } else { |
| - updateImage(true); |
| + getContent()->updateImage(data(), ImageResourceContent::KeepExistingImage, |
| + true); |
| // As encoded image data can be created from m_image (see |
| // ImageResource::resourceBuffer(), we don't have to keep m_data. Let's |
| // clear this. As for the lifetimes of m_image and m_data, see this |
| @@ -538,9 +371,10 @@ void ImageResource::finish(double loadFinishTime) { |
| void ImageResource::error(const ResourceError& error) { |
| if (m_multipartParser) |
| m_multipartParser->cancel(); |
| - clear(); |
| + clearData(); |
|
yhirano
2016/12/05 09:02:03
Resource::error calls clearData().
yhirano
2016/12/05 09:02:03
+setEncodedSize(0)?
hiroshige
2016/12/06 09:32:50
Done to keep the current behavior.
But I'm not so
hiroshige
2016/12/06 09:32:50
Done.
|
| Resource::error(error); |
| - notifyObservers(ShouldNotifyFinish); |
| + getContent()->updateImage(nullptr, ImageResourceContent::ClearExistingImage, |
| + true); |
| } |
| void ImageResource::responseReceived( |
| @@ -567,59 +401,6 @@ void ImageResource::responseReceived( |
| } |
| } |
| -void ImageResource::decodedSizeChangedTo(const blink::Image* image, |
| - size_t newSize) { |
| - if (!image || image != m_image) |
| - return; |
| - |
| - setDecodedSize(newSize); |
| -} |
| - |
| -bool ImageResource::shouldPauseAnimation(const blink::Image* image) { |
| - if (!image || image != m_image) |
| - return false; |
| - |
| - for (auto* observer : m_finishedObservers.asVector()) { |
| - if (m_finishedObservers.contains(observer) && observer->willRenderImage()) |
| - return false; |
| - } |
| - |
| - for (auto* observer : m_observers.asVector()) { |
| - if (m_observers.contains(observer) && observer->willRenderImage()) |
| - return false; |
| - } |
| - |
| - return true; |
| -} |
| - |
| -void ImageResource::animationAdvanced(const blink::Image* image) { |
| - if (!image || image != m_image) |
| - return; |
| - notifyObservers(DoNotNotifyFinish); |
| -} |
| - |
| -void ImageResource::updateImageAnimationPolicy() { |
| - if (!m_image) |
| - return; |
| - |
| - ImageAnimationPolicy newPolicy = ImageAnimationPolicyAllowed; |
| - for (auto* observer : m_finishedObservers.asVector()) { |
| - if (m_finishedObservers.contains(observer) && |
| - observer->getImageAnimationPolicy(newPolicy)) |
| - break; |
| - } |
| - for (auto* observer : m_observers.asVector()) { |
| - if (m_observers.contains(observer) && |
| - observer->getImageAnimationPolicy(newPolicy)) |
| - break; |
| - } |
| - |
| - if (m_image->animationPolicy() != newPolicy) { |
| - m_image->resetAnimation(); |
| - m_image->setAnimationPolicy(newPolicy); |
| - } |
| -} |
| - |
| static bool isLoFiImage(const ImageResource& resource) { |
| if (resource.resourceRequest().loFiState() != WebURLRequest::LoFiOn) |
| return false; |
| @@ -657,8 +438,10 @@ void ImageResource::reloadIfLoFiOrPlaceholder( |
| // clear() and notifyObservers(), so there's no need to call these again |
| // here. |
| } else { |
| - clear(); |
| - notifyObservers(DoNotNotifyFinish); |
| + clearData(); |
| + setEncodedSize(0); |
| + getContent()->updateImage(nullptr, ImageResourceContent::ClearExistingImage, |
| + false); |
| } |
| setStatus(NotStarted); |
| @@ -669,13 +452,6 @@ void ImageResource::reloadIfLoFiOrPlaceholder( |
| fetcher->startLoad(this); |
| } |
| -void ImageResource::changedInRect(const blink::Image* image, |
| - const IntRect& rect) { |
| - if (!image || image != m_image) |
| - return; |
| - notifyObservers(DoNotNotifyFinish, &rect); |
| -} |
| - |
| void ImageResource::onePartInMultipartReceived( |
| const ResourceResponse& response) { |
| DCHECK(m_multipartParser); |
| @@ -707,16 +483,26 @@ void ImageResource::multipartDataReceived(const char* bytes, size_t size) { |
| Resource::appendData(bytes, size); |
| } |
| -bool ImageResource::isAccessAllowed(SecurityOrigin* securityOrigin) { |
| +bool ImageResource::isAccessAllowed( |
| + SecurityOrigin* securityOrigin, |
| + bool doesCurrentFrameHasSingleSecurityOrigin) const { |
| if (response().wasFetchedViaServiceWorker()) { |
| return response().serviceWorkerResponseType() != |
| WebServiceWorkerResponseTypeOpaque; |
| } |
| - if (!getImage()->currentFrameHasSingleSecurityOrigin()) |
| + if (!doesCurrentFrameHasSingleSecurityOrigin) |
| return false; |
| if (passesAccessControlCheck(securityOrigin)) |
| return true; |
| return !securityOrigin->taintsCanvas(response().url()); |
| } |
| +ImageResourceContent* ImageResource::getContent() const { |
| + return m_content; |
| +} |
| + |
| +ResourcePriority ImageResource::priorityFromObservers() { |
| + return getContent()->priorityFromObservers(); |
| +} |
| + |
| } // namespace blink |