| 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..7ec8cdf67c119986b28674213b620cd011e06b19 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"
|
| #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"
|
| #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;
|
| +};
|
| +
|
| 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,9 @@ void ImageResource::checkNotify() {
|
| Resource::checkNotify();
|
| }
|
|
|
| -void ImageResource::markObserverFinished(ImageResourceObserver* observer) {
|
| - if (m_observers.contains(observer)) {
|
| - m_finishedObservers.add(observer);
|
| - m_observers.remove(observer);
|
| - }
|
| -}
|
| -
|
| 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 +232,33 @@ 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, ImageResourceContentInterface::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(&ImageResourceContentInterface::doResetAnimation,
|
| + wrapWeakPersistent(getContent())));
|
| + } else {
|
| + getContent()->doResetAnimation();
|
| }
|
| if (m_multipartParser)
|
| m_multipartParser->cancel();
|
| @@ -282,8 +268,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 +284,12 @@ 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(), ImageResourceContentInterface::KeepExistingImage,
|
| + false);
|
| return;
|
| }
|
|
|
| @@ -328,193 +317,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(), ImageResourceContentInterface::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;
|
| +void ImageResource::decodeError(bool allDataReceived) {
|
| + size_t size = encodedSize();
|
|
|
| - 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::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(), ImageResourceContentInterface::ClearExistingImage, true);
|
| clearData();
|
| }
|
|
|
| @@ -524,7 +354,8 @@ void ImageResource::finish(double loadFinishTime) {
|
| if (data())
|
| updateImageAndClearBuffer();
|
| } else {
|
| - updateImage(true);
|
| + getContent()->updateImage(
|
| + data(), ImageResourceContentInterface::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 +369,10 @@ void ImageResource::finish(double loadFinishTime) {
|
| void ImageResource::error(const ResourceError& error) {
|
| if (m_multipartParser)
|
| m_multipartParser->cancel();
|
| - clear();
|
| + clearData();
|
| Resource::error(error);
|
| - notifyObservers(ShouldNotifyFinish);
|
| + getContent()->updateImage(
|
| + nullptr, ImageResourceContentInterface::ClearExistingImage, true);
|
| }
|
|
|
| void ImageResource::responseReceived(
|
| @@ -567,59 +399,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 +436,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, ImageResourceContentInterface::ClearExistingImage, false);
|
| }
|
|
|
| setStatus(NotStarted);
|
| @@ -669,13 +450,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 +481,30 @@ 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());
|
| }
|
|
|
| +ImageResourceContentInterface* ImageResource::getContent() const {
|
| + return m_content;
|
| +}
|
| +
|
| +ImageResourceContent* ImageResource::getRealContent() const {
|
| + return m_content;
|
| +}
|
| +
|
| +ResourcePriority ImageResource::priorityFromObservers() {
|
| + return getContent()->priorityFromObservers();
|
| +}
|
| +
|
| } // namespace blink
|
|
|