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

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: 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 /*
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() const;
kinuko 2016/12/09 10:42:24 nit: avoid returning non-const pointer from const
hiroshige 2016/12/11 19:17:01 Done.
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 70
111 enum class ReloadCachePolicy { 71 enum class ReloadCachePolicy {
112 UseExistingPolicy = 0, // Don't modify the request's cache policy. 72 UseExistingPolicy = 0, // Don't modify the request's cache policy.
113 BypassCache, // Modify the request so that the reload bypasses the cache. 73 BypassCache, // Modify the request so that the reload bypasses the cache.
114 }; 74 };
115 75
116 // If this ImageResource has the Lo-Fi response headers or is a placeholder, 76 // 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 77 // reload the full original image with the Lo-Fi state set to off and
118 // optionally bypassing the cache. 78 // optionally bypassing the cache.
119 void reloadIfLoFiOrPlaceholder( 79 void reloadIfLoFiOrPlaceholder(
120 ResourceFetcher*, 80 ResourceFetcher*,
121 ReloadCachePolicy = ReloadCachePolicy::BypassCache); 81 ReloadCachePolicy = ReloadCachePolicy::BypassCache);
122 82
123 void didAddClient(ResourceClient*) override; 83 void didAddClient(ResourceClient*) override;
124 84
125 void addObserver(ImageResourceObserver*);
126 void removeObserver(ImageResourceObserver*);
127
128 ResourcePriority priorityFromObservers() override; 85 ResourcePriority priorityFromObservers() override;
129 86
130 void allClientsAndObserversRemoved() override; 87 void allClientsAndObserversRemoved() override;
131 88
132 PassRefPtr<const SharedBuffer> resourceBuffer() const override; 89 PassRefPtr<const SharedBuffer> resourceBuffer() const override;
133 void appendData(const char*, size_t) override; 90 void appendData(const char*, size_t) override;
134 void error(const ResourceError&) override; 91 void error(const ResourceError&) override;
135 void responseReceived(const ResourceResponse&, 92 void responseReceived(const ResourceResponse&,
136 std::unique_ptr<WebDataConsumerHandle>) override; 93 std::unique_ptr<WebDataConsumerHandle>) override;
137 void finish(double finishTime = 0.0) override; 94 void finish(double finishTime = 0.0) override;
138 95
139 // For compatibility, images keep loading even if there are HTTP errors. 96 // For compatibility, images keep loading even if there are HTTP errors.
140 bool shouldIgnoreHTTPStatusCodeErrors() const override { return true; } 97 bool shouldIgnoreHTTPStatusCodeErrors() const override { return true; }
141 98
142 bool isImage() const override { return true; } 99 bool isImage() const override { return true; }
143 100
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 101 // MultipartImageResourceParser::Client
152 void onePartInMultipartReceived(const ResourceResponse&) final; 102 void onePartInMultipartReceived(const ResourceResponse&) final;
153 void multipartDataReceived(const char*, size_t) final; 103 void multipartDataReceived(const char*, size_t) final;
154 104
155 // Used by tests. 105 // Used by tests.
156 bool isPlaceholder() const { return m_isPlaceholder; } 106 bool isPlaceholder() const { return m_isPlaceholder; }
157 107
158 bool shouldReloadBrokenPlaceholder() const { 108 bool shouldReloadBrokenPlaceholder() const {
159 return m_isPlaceholder && willPaintBrokenImage(); 109 return m_isPlaceholder && willPaintBrokenImage();
160 } 110 }
161 111
162 void setNotRefetchableDataFromDiskCache() {
163 m_isRefetchableDataFromDiskCache = false;
164 }
165
166 DECLARE_VIRTUAL_TRACE(); 112 DECLARE_VIRTUAL_TRACE();
167 113
168 private: 114 private:
169 explicit ImageResource(blink::Image*, const ResourceLoaderOptions&);
170
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 // Only for ImageResourceInfoImpl.
184 return Resource::hasClientsOrObservers() || !m_observers.isEmpty() || 130 void decodeError(bool allDataReceived);
185 !m_finishedObservers.isEmpty(); 131 bool isAccessAllowed(
186 } 132 SecurityOrigin*,
187 void clear(); 133 ImageResourceInfo::DoesCurrentFrameHaveSingleSecurityOrigin) const;
188 134
189 void createImage(); 135 bool hasClientsOrObservers() const override;
190 void updateImage(bool allDataReceived); 136
191 void updateImageAndClearBuffer(); 137 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 138
199 void checkNotify() override; 139 void checkNotify() override;
200 void notifyObserversInternal();
201 void markObserverFinished(ImageResourceObserver*);
202
203 void doResetAnimation();
204 140
205 void destroyDecodedDataIfPossible() override; 141 void destroyDecodedDataIfPossible() override;
206 void destroyDecodedDataForFailedRevalidation() override; 142 void destroyDecodedDataForFailedRevalidation() override;
207 143
208 void flushImageIfNeeded(TimerBase*); 144 void flushImageIfNeeded(TimerBase*);
209 145
146 bool willPaintBrokenImage() const;
147
148 Member<ImageResourceContent> m_content;
149
150 // TODO(hiroshige): move |m_devicePixelRatioHeaderValue| and
151 // |m_hasDevicePixelRatioHeaderValue| to ImageResourceContent and update
152 // it via ImageResourceContent::updateImage().
210 float m_devicePixelRatioHeaderValue; 153 float m_devicePixelRatioHeaderValue;
211 154
212 Member<MultipartImageResourceParser> m_multipartParser; 155 Member<MultipartImageResourceParser> m_multipartParser;
213 RefPtr<blink::Image> m_image;
214 MultipartParsingState m_multipartParsingState = 156 MultipartParsingState m_multipartParsingState =
215 MultipartParsingState::WaitingForFirstPart; 157 MultipartParsingState::WaitingForFirstPart;
216 bool m_hasDevicePixelRatioHeaderValue; 158 bool m_hasDevicePixelRatioHeaderValue;
217 HashCountedSet<ImageResourceObserver*> m_observers;
218 HashCountedSet<ImageResourceObserver*> m_finishedObservers;
219 159
220 // Indicates if the ImageResource is currently scheduling a reload, e.g. 160 // Indicates if the ImageResource is currently scheduling a reload, e.g.
221 // because reloadIfLoFi() was called. 161 // because reloadIfLoFi() was called.
222 bool m_isSchedulingReload; 162 bool m_isSchedulingReload;
223 163
224 // Indicates if this ImageResource is either attempting to load a placeholder 164 // Indicates if this ImageResource is either attempting to load a placeholder
225 // image, or is a (possibly broken) placeholder image. 165 // image, or is a (possibly broken) placeholder image.
226 bool m_isPlaceholder; 166 bool m_isPlaceholder;
227 167
228 Timer<ImageResource> m_flushTimer; 168 Timer<ImageResource> m_flushTimer;
229 double m_lastFlushTime = 0.; 169 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 }; 170 };
236 171
237 DEFINE_RESOURCE_TYPE_CASTS(Image); 172 DEFINE_RESOURCE_TYPE_CASTS(Image);
238 173
239 } // namespace blink 174 } // namespace blink
240 175
241 #endif 176 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698