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

Side by Side Diff: third_party/WebKit/Source/core/fetch/ImageResourceContent.h

Issue 2469873002: [ImageResource 4] Split ImageResource into Resource and Image parts (Closed)
Patch Set: Rebase. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) 2 // Use of this source code is governed by a BSD-style license that can be
3 Copyright (C) 2001 Dirk Mueller <mueller@kde.org> 3 // found in the LICENSE file.
4 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
5 Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
6 4
7 This library is free software; you can redistribute it and/or 5 #ifndef ImageResourceContent_h
8 modify it under the terms of the GNU Library General Public 6 #define ImageResourceContent_h
9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details.
16
17 You should have received a copy of the GNU Library General Public License
18 along with this library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA.
21 */
22
23 #ifndef ImageResource_h
24 #define ImageResource_h
25 7
26 #include "core/CoreExport.h" 8 #include "core/CoreExport.h"
27 #include "core/fetch/MultipartImageResourceParser.h" 9 #include "core/fetch/ImageResourceContentInterface.h"
28 #include "core/fetch/Resource.h" 10 #include "core/fetch/ImageResourceInfo.h"
11 #include "core/fetch/ResourceStatus.h"
29 #include "platform/geometry/IntRect.h" 12 #include "platform/geometry/IntRect.h"
30 #include "platform/geometry/IntSizeHash.h" 13 #include "platform/geometry/IntSizeHash.h"
31 #include "platform/geometry/LayoutSize.h" 14 #include "platform/geometry/LayoutSize.h"
32 #include "platform/graphics/Image.h" 15 #include "platform/graphics/Image.h"
33 #include "platform/graphics/ImageObserver.h" 16 #include "platform/graphics/ImageObserver.h"
34 #include "platform/graphics/ImageOrientation.h" 17 #include "platform/graphics/ImageOrientation.h"
18 #include "platform/network/ResourceLoadPriority.h"
19 #include "platform/weborigin/KURL.h"
35 #include "wtf/HashMap.h" 20 #include "wtf/HashMap.h"
36 #include <memory> 21 #include <memory>
37 22
38 namespace blink { 23 namespace blink {
39 24
40 class FetchRequest; 25 class FetchRequest;
41 class ImageResourceObserver; 26 class ImageResourceObserver;
42 class MemoryCache; 27 class ResourceError;
43 class ResourceClient;
44 class ResourceFetcher; 28 class ResourceFetcher;
29 class ResourceResponse;
45 class SecurityOrigin; 30 class SecurityOrigin;
46 31
47 // ImageResource class represents an image type resource. 32 // ImageResourceContent is the image-related part of image loading that
48 // 33 // - Stores decoded data (blink::Image) of ImageResource, and
49 // As for the lifetimes of m_image and m_data, see this document: 34 // - Handles ImageResourceObserver.
50 // https://docs.google.com/document/d/1v0yTAZ6wkqX2U_M6BNIGUJpM1s0TIw1VsqpxoL7ac iY/edit?usp=sharing 35 // https://docs.google.com/document/d/1O-fB83mrE0B_V8gzXNqHgmRLCvstTB4MMi3RnVLr8 bE/edit?usp=sharing
51 class CORE_EXPORT ImageResource final 36 class CORE_EXPORT ImageResourceContent final
52 : public Resource, 37 : public GarbageCollectedFinalized<ImageResourceContent>,
53 public ImageObserver, 38 public ImageResourceContentInterface,
54 public MultipartImageResourceParser::Client { 39 public ImageObserver {
55 friend class MemoryCache; 40 USING_GARBAGE_COLLECTED_MIXIN(ImageResourceContent);
56 USING_GARBAGE_COLLECTED_MIXIN(ImageResource);
57 41
58 public: 42 public:
59 using ClientType = ResourceClient; 43 static ImageResourceContent* create(
44 PassRefPtr<blink::Image> image = nullptr) {
45 return new ImageResourceContent(std::move(image));
46 }
47 static ImageResourceContent* fetch(FetchRequest&, ResourceFetcher*);
60 48
61 static ImageResource* fetch(FetchRequest&, ResourceFetcher*); 49 // Returns the nullImage() if the image is not available yet.
62 50 blink::Image* getImage() const override;
63 static ImageResource* create(blink::Image* image) { 51 bool hasImage() const override { return m_image.get(); }
64 return new ImageResource(image, ResourceLoaderOptions());
65 }
66
67 static ImageResource* create(const ResourceRequest& request) {
68 return new ImageResource(request, ResourceLoaderOptions(), false);
69 }
70
71 ~ImageResource() override;
72
73 blink::Image*
74 getImage(); // Returns the nullImage() if the image is not available yet.
75 bool hasImage() const { return m_image.get(); }
76 52
77 static std::pair<blink::Image*, float> brokenImage( 53 static std::pair<blink::Image*, float> brokenImage(
78 float deviceScaleFactor); // Returns an image and the image's resolution 54 float deviceScaleFactor); // Returns an image and the image's resolution
79 // scale factor. 55 // scale factor.
80 bool willPaintBrokenImage() const;
81 56
82 bool usesImageContainerSize() const; 57 bool usesImageContainerSize() const;
83 bool imageHasRelativeSize() const; 58 bool imageHasRelativeSize() const;
84 // The device pixel ratio we got from the server for this image, or 1.0. 59 // The device pixel ratio we got from the server for this image, or 1.0.
85 float devicePixelRatioHeaderValue() const { 60 float devicePixelRatioHeaderValue() const;
86 return m_devicePixelRatioHeaderValue; 61 bool hasDevicePixelRatioHeaderValue() const;
87 }
88 bool hasDevicePixelRatioHeaderValue() const {
89 return m_hasDevicePixelRatioHeaderValue;
90 }
91 62
92 enum SizeType { 63 enum SizeType {
93 // Report the intrinsic size. 64 // Report the intrinsic size.
94 IntrinsicSize, 65 IntrinsicSize,
95 66
96 // Report the intrinsic size corrected to account for image density. 67 // Report the intrinsic size corrected to account for image density.
97 IntrinsicCorrectedToDPR, 68 IntrinsicCorrectedToDPR,
98 }; 69 };
99 70
100 // This method takes a zoom multiplier that can be used to increase the 71 // This method takes a zoom multiplier that can be used to increase the
101 // natural size of the image by the zoom. 72 // natural size of the image by the zoom.
102 LayoutSize imageSize( 73 LayoutSize imageSize(
103 RespectImageOrientationEnum shouldRespectImageOrientation, 74 RespectImageOrientationEnum shouldRespectImageOrientation,
104 float multiplier, 75 float multiplier,
105 SizeType = IntrinsicSize); 76 SizeType = IntrinsicSize);
106 77
107 bool isAccessAllowed(SecurityOrigin*);
108
109 void updateImageAnimationPolicy(); 78 void updateImageAnimationPolicy();
110 79
111 enum class ReloadCachePolicy {
112 UseExistingPolicy = 0, // Don't modify the request's cache policy.
113 BypassCache, // Modify the request so that the reload bypasses the cache.
114 };
115
116 // If this ImageResource has the Lo-Fi response headers or is a placeholder,
117 // reload the full original image with the Lo-Fi state set to off and
118 // optionally bypassing the cache.
119 void reloadIfLoFiOrPlaceholder(
120 ResourceFetcher*,
121 ReloadCachePolicy = ReloadCachePolicy::BypassCache);
122
123 void didAddClient(ResourceClient*) override;
124
125 void addObserver(ImageResourceObserver*); 80 void addObserver(ImageResourceObserver*);
126 void removeObserver(ImageResourceObserver*); 81 void removeObserver(ImageResourceObserver*);
127 82
128 ResourcePriority priorityFromObservers() override; 83 DECLARE_TRACE();
129 84
130 void allClientsAndObserversRemoved() override; 85 // Redirecting methods to Resource.
86 const KURL& url() const;
87 bool isAccessAllowed(SecurityOrigin*) const;
88 const ResourceResponse& response() const;
89 bool isLoaded() const;
90 bool isLoading() const;
91 bool errorOccurred() const;
92 bool loadFailedOrCanceled() const;
93 ResourceStatus getStatus() const;
94 const ResourceError& resourceError() const;
131 95
132 PassRefPtr<const SharedBuffer> resourceBuffer() const override; 96 // For FrameSerializer.
133 void appendData(const char*, size_t) override; 97 bool hasCacheControlNoStoreHeader() const;
134 void error(const ResourceError&) override;
135 void responseReceived(const ResourceResponse&,
136 std::unique_ptr<WebDataConsumerHandle>) override;
137 void finish(double finishTime = 0.0) override;
138 98
139 // For compatibility, images keep loading even if there are HTTP errors. 99 void emulateLoadStartedForInspector(ResourceFetcher*,
140 bool shouldIgnoreHTTPStatusCodeErrors() const override { return true; } 100 const KURL&,
141 101 const AtomicString& initiatorName);
142 bool isImage() const override { return true; }
143
144 // ImageObserver
145 void decodedSizeChangedTo(const blink::Image*, size_t newSize) override;
146
147 bool shouldPauseAnimation(const blink::Image*) override;
148 void animationAdvanced(const blink::Image*) override;
149 void changedInRect(const blink::Image*, const IntRect&) override;
150
151 // MultipartImageResourceParser::Client
152 void onePartInMultipartReceived(const ResourceResponse&) final;
153 void multipartDataReceived(const char*, size_t) final;
154
155 // Used by tests.
156 bool isPlaceholder() const { return m_isPlaceholder; }
157
158 bool shouldReloadBrokenPlaceholder() const {
159 return m_isPlaceholder && willPaintBrokenImage();
160 }
161 102
162 void setNotRefetchableDataFromDiskCache() { 103 void setNotRefetchableDataFromDiskCache() {
163 m_isRefetchableDataFromDiskCache = false; 104 m_isRefetchableDataFromDiskCache = false;
164 } 105 }
165 106
166 DECLARE_VIRTUAL_TRACE(); 107 private:
108 ImageResourceContent(PassRefPtr<blink::Image> = nullptr);
167 109
168 private: 110 // ImageObserver
169 explicit ImageResource(blink::Image*, const ResourceLoaderOptions&); 111 void decodedSizeChangedTo(const blink::Image*, size_t newSize) override;
112 bool shouldPauseAnimation(const blink::Image*) override;
113 void animationAdvanced(const blink::Image*) override;
114 void changedInRect(const blink::Image*, const IntRect&) override;
170 115
171 enum class MultipartParsingState : uint8_t { 116 // ImageResourceContentInterface.
172 WaitingForFirstPart, 117 void setImageResourceInfo(ImageResourceInfo*) override;
173 ParsingFirstPart, 118 void updateImage(PassRefPtr<SharedBuffer>,
174 FinishedParsingFirstPart, 119 ClearImageOption,
175 }; 120 bool allDataReceived) override;
121 ResourcePriority priorityFromObservers() const override;
122 void destroyDecodedData() override;
123 bool hasObservers() const override {
124 return !m_observers.isEmpty() || !m_finishedObservers.isEmpty();
125 }
126 bool isSizeAvailable() const override {
127 return m_sizeAvailable == Image::SizeAvailable;
128 }
129 bool isRefetchableDataFromDiskCache() const override {
130 return m_isRefetchableDataFromDiskCache;
131 }
132 void doResetAnimation() override;
176 133
177 class ImageResourceFactory; 134 PassRefPtr<Image> createImage();
135 void clearImage();
178 136
179 ImageResource(const ResourceRequest&,
180 const ResourceLoaderOptions&,
181 bool isPlaceholder);
182
183 bool hasClientsOrObservers() const override {
184 return Resource::hasClientsOrObservers() || !m_observers.isEmpty() ||
185 !m_finishedObservers.isEmpty();
186 }
187 void clear();
188
189 void createImage();
190 void updateImage(bool allDataReceived);
191 void updateImageAndClearBuffer();
192 void clearImage();
193 enum NotifyFinishOption { ShouldNotifyFinish, DoNotNotifyFinish }; 137 enum NotifyFinishOption { ShouldNotifyFinish, DoNotNotifyFinish };
194 // If not null, changeRect is the changed part of the image. 138 // If not null, changeRect is the changed part of the image.
195 void notifyObservers(NotifyFinishOption, const IntRect* changeRect = nullptr); 139 void notifyObservers(NotifyFinishOption, const IntRect* changeRect = nullptr);
196
197 void ensureImage();
198
199 void checkNotify() override;
200 void notifyObserversInternal();
201 void markObserverFinished(ImageResourceObserver*); 140 void markObserverFinished(ImageResourceObserver*);
202 141
203 void doResetAnimation(); 142 Member<ImageResourceInfo> m_info;
204 143
205 void destroyDecodedDataIfPossible() override; 144 RefPtr<blink::Image> m_image;
206 void destroyDecodedDataForFailedRevalidation() override;
207 145
208 void flushImageIfNeeded(TimerBase*);
209
210 float m_devicePixelRatioHeaderValue;
211
212 Member<MultipartImageResourceParser> m_multipartParser;
213 RefPtr<blink::Image> m_image;
214 MultipartParsingState m_multipartParsingState =
215 MultipartParsingState::WaitingForFirstPart;
216 bool m_hasDevicePixelRatioHeaderValue;
217 HashCountedSet<ImageResourceObserver*> m_observers; 146 HashCountedSet<ImageResourceObserver*> m_observers;
218 HashCountedSet<ImageResourceObserver*> m_finishedObservers; 147 HashCountedSet<ImageResourceObserver*> m_finishedObservers;
219 148
220 // Indicates if the ImageResource is currently scheduling a reload, e.g.
221 // because reloadIfLoFi() was called.
222 bool m_isSchedulingReload;
223
224 // Indicates if this ImageResource is either attempting to load a placeholder
225 // image, or is a (possibly broken) placeholder image.
226 bool m_isPlaceholder;
227
228 Timer<ImageResource> m_flushTimer;
229 double m_lastFlushTime = 0.;
230 Image::SizeAvailability m_sizeAvailable = Image::SizeUnavailable; 149 Image::SizeAvailability m_sizeAvailable = Image::SizeUnavailable;
231 150
232 // Indicates if this resource's encoded image data can be purged and refetched 151 // Indicates if this resource's encoded image data can be purged and refetched
233 // from disk cache to save memory usage. See crbug/664437. 152 // from disk cache to save memory usage. See crbug/664437.
234 bool m_isRefetchableDataFromDiskCache; 153 bool m_isRefetchableDataFromDiskCache;
235 }; 154 };
236 155
237 DEFINE_RESOURCE_TYPE_CASTS(Image);
238
239 } // namespace blink 156 } // namespace blink
240 157
241 #endif 158 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698