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

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: fix 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/MultipartImageResourceParser.h" 27 #include "core/fetch/MultipartImageResourceParser.h"
28 #include "core/fetch/Resource.h" 28 #include "core/fetch/Resource.h"
yhirano 2016/12/05 09:02:03 +platform/Timer.h +platform/heap/Handle.h
hiroshige 2016/12/06 09:32:50 Done.
29 #include "platform/geometry/IntRect.h"
30 #include "platform/geometry/IntSizeHash.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> 29 #include <memory>
37 30
38 namespace blink { 31 namespace blink {
39 32
40 class FetchRequest; 33 class FetchRequest;
41 class ImageResourceObserver;
42 class MemoryCache;
43 class ResourceClient; 34 class ResourceClient;
44 class ResourceFetcher; 35 class ResourceFetcher;
45 class SecurityOrigin; 36 class SecurityOrigin;
37 class ImageResourceContent;
yhirano 2016/12/05 09:02:03 alphabetical order?
hiroshige 2016/12/06 09:32:51 Done.
46 38
47 // ImageResource class represents an image type resource. 39 // ImageResource is the resource-related part of image loading.
kouhei (in TOK) 2016/12/05 07:13:06 ImageResource implements blink::Resource interface
hiroshige 2016/12/05 09:11:19 Done.
40 // Image-related things (blink::Image and ImageResourceObserver) are handled by
41 // ImageResourceContent.
42 // Most users should use ImageResourceContent instead of ImageResource.
43 // https://docs.google.com/document/d/1O-fB83mrE0B_V8gzXNqHgmRLCvstTB4MMi3RnVLr8 bE/edit?usp=sharing
48 // 44 //
49 // As for the lifetimes of m_image and m_data, see this document: 45 // As for the lifetimes of ImageResourceContent::m_image and m_data, see this
46 // document:
50 // https://docs.google.com/document/d/1v0yTAZ6wkqX2U_M6BNIGUJpM1s0TIw1VsqpxoL7ac iY/edit?usp=sharing 47 // https://docs.google.com/document/d/1v0yTAZ6wkqX2U_M6BNIGUJpM1s0TIw1VsqpxoL7ac iY/edit?usp=sharing
51 class CORE_EXPORT ImageResource final 48 class CORE_EXPORT ImageResource final
52 : public Resource, 49 : public Resource,
53 public ImageObserver,
54 public MultipartImageResourceParser::Client { 50 public MultipartImageResourceParser::Client {
55 friend class MemoryCache;
56 USING_GARBAGE_COLLECTED_MIXIN(ImageResource); 51 USING_GARBAGE_COLLECTED_MIXIN(ImageResource);
57 52
58 public: 53 public:
59 using ClientType = ResourceClient; 54 using ClientType = ResourceClient;
60 55
56 // Use ImageResourceContent::fetch() unless ImageResource is required.
kouhei (in TOK) 2016/12/05 07:13:06 Can we make this private && friend ImageResourceCo
hiroshige 2016/12/05 09:11:19 Currently No, because this is used from e.g. Docum
kouhei (in TOK) 2016/12/05 09:22:05 Optional: Please consider adding TODO(hiroshige) t
hiroshige 2016/12/06 09:32:50 Done.
61 static ImageResource* fetch(FetchRequest&, ResourceFetcher*); 57 static ImageResource* fetch(FetchRequest&, ResourceFetcher*);
62 58
63 static ImageResource* create(blink::Image* image) { 59 // TODO(hiroshige): Make create() test-only by refactoring ImageDocument.
64 return new ImageResource(image, ResourceLoaderOptions()); 60 static ImageResource* create(const ResourceRequest&);
65 }
66
67 static ImageResource* create(const ResourceRequest& request) {
68 return new ImageResource(request, ResourceLoaderOptions(), false);
69 }
70 61
71 ~ImageResource() override; 62 ~ImageResource() override;
72 63
73 blink::Image* 64 ImageResourceContent* getContent() const;
74 getImage(); // Returns the nullImage() if the image is not available yet.
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 65
111 enum class ReloadCachePolicy { 66 enum class ReloadCachePolicy {
112 UseExistingPolicy = 0, // Don't modify the request's cache policy. 67 UseExistingPolicy = 0, // Don't modify the request's cache policy.
113 BypassCache, // Modify the request so that the reload bypasses the cache. 68 BypassCache, // Modify the request so that the reload bypasses the cache.
114 }; 69 };
115 70
116 // If this ImageResource has the Lo-Fi response headers or is a placeholder, 71 // 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 72 // reload the full original image with the Lo-Fi state set to off and
118 // optionally bypassing the cache. 73 // optionally bypassing the cache.
119 void reloadIfLoFiOrPlaceholder( 74 void reloadIfLoFiOrPlaceholder(
120 ResourceFetcher*, 75 ResourceFetcher*,
121 ReloadCachePolicy = ReloadCachePolicy::BypassCache); 76 ReloadCachePolicy = ReloadCachePolicy::BypassCache);
122 77
123 void didAddClient(ResourceClient*) override; 78 void didAddClient(ResourceClient*) override;
124 79
125 void addObserver(ImageResourceObserver*);
126 void removeObserver(ImageResourceObserver*);
127
128 ResourcePriority priorityFromObservers() override; 80 ResourcePriority priorityFromObservers() override;
129 81
130 void allClientsAndObserversRemoved() override; 82 void allClientsAndObserversRemoved() override;
131 83
132 PassRefPtr<const SharedBuffer> resourceBuffer() const override; 84 PassRefPtr<const SharedBuffer> resourceBuffer() const override;
133 void appendData(const char*, size_t) override; 85 void appendData(const char*, size_t) override;
134 void error(const ResourceError&) override; 86 void error(const ResourceError&) override;
135 void responseReceived(const ResourceResponse&, 87 void responseReceived(const ResourceResponse&,
136 std::unique_ptr<WebDataConsumerHandle>) override; 88 std::unique_ptr<WebDataConsumerHandle>) override;
137 void finish(double finishTime = 0.0) override; 89 void finish(double finishTime = 0.0) override;
138 90
139 // For compatibility, images keep loading even if there are HTTP errors. 91 // For compatibility, images keep loading even if there are HTTP errors.
140 bool shouldIgnoreHTTPStatusCodeErrors() const override { return true; } 92 bool shouldIgnoreHTTPStatusCodeErrors() const override { return true; }
141 93
142 bool isImage() const override { return true; } 94 bool isImage() const override { return true; }
143 95
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 96 // MultipartImageResourceParser::Client
152 void onePartInMultipartReceived(const ResourceResponse&) final; 97 void onePartInMultipartReceived(const ResourceResponse&) final;
153 void multipartDataReceived(const char*, size_t) final; 98 void multipartDataReceived(const char*, size_t) final;
154 99
155 // Used by tests. 100 // Used by tests.
156 bool isPlaceholder() const { return m_isPlaceholder; } 101 bool isPlaceholder() const { return m_isPlaceholder; }
157 102
158 bool shouldReloadBrokenPlaceholder() const { 103 bool shouldReloadBrokenPlaceholder() const {
159 return m_isPlaceholder && willPaintBrokenImage(); 104 return m_isPlaceholder && willPaintBrokenImage();
160 } 105 }
161 106
162 void setNotRefetchableDataFromDiskCache() {
163 m_isRefetchableDataFromDiskCache = false;
164 }
165
166 DECLARE_VIRTUAL_TRACE(); 107 DECLARE_VIRTUAL_TRACE();
167 108
168 private: 109 private:
169 explicit ImageResource(blink::Image*, const ResourceLoaderOptions&); 110 // Only for ImageResourceInfoImpl.
yhirano 2016/12/05 09:02:03 Can you move these functions declarations below th
hiroshige 2016/12/06 09:32:50 Done.
111 void decodeError(bool allDataReceived);
112 bool isAccessAllowed(SecurityOrigin*,
113 bool doesCurrentFrameHasSingleSecurityOrigin) const;
170 114
171 enum class MultipartParsingState : uint8_t { 115 enum class MultipartParsingState : uint8_t {
172 WaitingForFirstPart, 116 WaitingForFirstPart,
173 ParsingFirstPart, 117 ParsingFirstPart,
174 FinishedParsingFirstPart, 118 FinishedParsingFirstPart,
175 }; 119 };
176 120
121 class ImageResourceInfoImpl;
177 class ImageResourceFactory; 122 class ImageResourceFactory;
178 123
179 ImageResource(const ResourceRequest&, 124 ImageResource(const ResourceRequest&,
180 const ResourceLoaderOptions&, 125 const ResourceLoaderOptions&,
126 ImageResourceContent*,
181 bool isPlaceholder); 127 bool isPlaceholder);
182 128
183 bool hasClientsOrObservers() const override { 129 bool hasClientsOrObservers() const override;
184 return Resource::hasClientsOrObservers() || !m_observers.isEmpty() ||
185 !m_finishedObservers.isEmpty();
186 }
187 void clear();
188 130
189 void createImage();
190 void updateImage(bool allDataReceived);
191 void updateImageAndClearBuffer(); 131 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 132
199 void checkNotify() override; 133 void checkNotify() override;
200 void notifyObserversInternal();
201 void markObserverFinished(ImageResourceObserver*);
202
203 void doResetAnimation();
204 134
205 void destroyDecodedDataIfPossible() override; 135 void destroyDecodedDataIfPossible() override;
206 void destroyDecodedDataForFailedRevalidation() override; 136 void destroyDecodedDataForFailedRevalidation() override;
207 137
208 void flushImageIfNeeded(TimerBase*); 138 void flushImageIfNeeded(TimerBase*);
209 139
140 bool willPaintBrokenImage() const;
141
142 Member<ImageResourceContent> m_content;
yhirano 2016/12/05 09:02:03 [optional] const Member<ImageResourceContent> m_co
hiroshige 2016/12/06 09:32:51 I'll keep |m_content| non-const because it will be
143
210 float m_devicePixelRatioHeaderValue; 144 float m_devicePixelRatioHeaderValue;
yhirano 2016/12/05 09:02:03 Is it desirable to move this member variable to Im
hiroshige 2016/12/06 09:32:50 Moving |m_devicePixelRatioHeaderValue| to ImageRes
211 145
212 Member<MultipartImageResourceParser> m_multipartParser; 146 Member<MultipartImageResourceParser> m_multipartParser;
213 RefPtr<blink::Image> m_image;
214 MultipartParsingState m_multipartParsingState = 147 MultipartParsingState m_multipartParsingState =
215 MultipartParsingState::WaitingForFirstPart; 148 MultipartParsingState::WaitingForFirstPart;
216 bool m_hasDevicePixelRatioHeaderValue; 149 bool m_hasDevicePixelRatioHeaderValue;
yhirano 2016/12/05 09:02:03 ditto
hiroshige 2016/12/06 09:32:50 ditto.
217 HashCountedSet<ImageResourceObserver*> m_observers;
218 HashCountedSet<ImageResourceObserver*> m_finishedObservers;
219 150
220 // Indicates if the ImageResource is currently scheduling a reload, e.g. 151 // Indicates if the ImageResource is currently scheduling a reload, e.g.
221 // because reloadIfLoFi() was called. 152 // because reloadIfLoFi() was called.
222 bool m_isSchedulingReload; 153 bool m_isSchedulingReload;
223 154
224 // Indicates if this ImageResource is either attempting to load a placeholder 155 // Indicates if this ImageResource is either attempting to load a placeholder
225 // image, or is a (possibly broken) placeholder image. 156 // image, or is a (possibly broken) placeholder image.
226 bool m_isPlaceholder; 157 bool m_isPlaceholder;
227 158
228 Timer<ImageResource> m_flushTimer; 159 Timer<ImageResource> m_flushTimer;
229 double m_lastFlushTime = 0.; 160 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 }; 161 };
236 162
237 DEFINE_RESOURCE_TYPE_CASTS(Image); 163 DEFINE_RESOURCE_TYPE_CASTS(Image);
238 164
239 } // namespace blink 165 } // namespace blink
240 166
241 #endif 167 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698