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

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

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

Powered by Google App Engine
This is Rietveld 408576698