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

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: comments 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;
43 class ResourceClient;
44 class ResourceFetcher; 27 class ResourceFetcher;
28 class ResourceResponse;
45 class SecurityOrigin; 29 class SecurityOrigin;
46 30
47 // ImageResource class represents an image type resource. 31 // ImageResourceContent is the image-related part of image loading that
48 // 32 // - Stores decoded data (blink::Image) of ImageResource, and
49 // As for the lifetimes of m_image and m_data, see this document: 33 // - Handles ImageResourceObserver.
50 // https://docs.google.com/document/d/1v0yTAZ6wkqX2U_M6BNIGUJpM1s0TIw1VsqpxoL7ac iY/edit?usp=sharing 34 // https://docs.google.com/document/d/1O-fB83mrE0B_V8gzXNqHgmRLCvstTB4MMi3RnVLr8 bE/edit?usp=sharing
51 class CORE_EXPORT ImageResource final 35 class CORE_EXPORT ImageResourceContent final
52 : public Resource, 36 : public GarbageCollectedFinalized<ImageResourceContent>,
53 public ImageObserver, 37 public ImageResourceContentInterface,
54 public MultipartImageResourceParser::Client { 38 public ImageObserver {
55 friend class MemoryCache; 39 USING_GARBAGE_COLLECTED_MIXIN(ImageResourceContent);
56 USING_GARBAGE_COLLECTED_MIXIN(ImageResource);
57 40
58 public: 41 public:
59 using ClientType = ResourceClient; 42 static ImageResourceContent* create(
43 PassRefPtr<blink::Image> image = nullptr) {
44 return new ImageResourceContent(std::move(image));
45 }
46 static ImageResourceContent* fetch(FetchRequest&, ResourceFetcher*);
60 47
61 static ImageResource* fetch(FetchRequest&, ResourceFetcher*); 48 // Returns the nullImage() if the image is not available yet.
62 49 blink::Image* getImage() const override;
63 static ImageResource* create(blink::Image* image) { 50 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 51
77 static std::pair<blink::Image*, float> brokenImage( 52 static std::pair<blink::Image*, float> brokenImage(
78 float deviceScaleFactor); // Returns an image and the image's resolution 53 float deviceScaleFactor); // Returns an image and the image's resolution
79 // scale factor. 54 // scale factor.
80 bool willPaintBrokenImage() const;
81 55
82 bool usesImageContainerSize() const; 56 bool usesImageContainerSize() const;
83 bool imageHasRelativeSize() const; 57 bool imageHasRelativeSize() const;
84 // The device pixel ratio we got from the server for this image, or 1.0. 58 // The device pixel ratio we got from the server for this image, or 1.0.
85 float devicePixelRatioHeaderValue() const { 59 float devicePixelRatioHeaderValue() const;
86 return m_devicePixelRatioHeaderValue; 60 bool hasDevicePixelRatioHeaderValue() const;
87 }
88 bool hasDevicePixelRatioHeaderValue() const {
89 return m_hasDevicePixelRatioHeaderValue;
90 }
91 61
92 enum SizeType { 62 enum SizeType {
93 // Report the intrinsic size. 63 // Report the intrinsic size.
94 IntrinsicSize, 64 IntrinsicSize,
95 65
96 // Report the intrinsic size corrected to account for image density. 66 // Report the intrinsic size corrected to account for image density.
97 IntrinsicCorrectedToDPR, 67 IntrinsicCorrectedToDPR,
98 }; 68 };
99 69
100 // This method takes a zoom multiplier that can be used to increase the 70 // This method takes a zoom multiplier that can be used to increase the
101 // natural size of the image by the zoom. 71 // natural size of the image by the zoom.
102 LayoutSize imageSize( 72 LayoutSize imageSize(
103 RespectImageOrientationEnum shouldRespectImageOrientation, 73 RespectImageOrientationEnum shouldRespectImageOrientation,
104 float multiplier, 74 float multiplier,
105 SizeType = IntrinsicSize); 75 SizeType = IntrinsicSize);
106 76
107 bool isAccessAllowed(SecurityOrigin*);
108
109 void updateImageAnimationPolicy(); 77 void updateImageAnimationPolicy();
110 78
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*); 79 void addObserver(ImageResourceObserver*);
126 void removeObserver(ImageResourceObserver*); 80 void removeObserver(ImageResourceObserver*);
127 81
128 ResourcePriority priorityFromObservers() override; 82 DECLARE_TRACE();
129 83
130 void allClientsAndObserversRemoved() override; 84 // Redirecting methods to Resource.
85 const KURL& url() const;
86 bool isAccessAllowed(SecurityOrigin*) const;
87 const ResourceResponse& response() const;
88 bool isLoaded() const;
89 bool isLoading() const;
90 bool errorOccurred() const;
91 bool loadFailedOrCanceled() const;
92 ResourceStatus getStatus() const;
131 93
132 PassRefPtr<const SharedBuffer> resourceBuffer() const override; 94 // For FrameSerializer.
133 void appendData(const char*, size_t) override; 95 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 96
139 // For compatibility, images keep loading even if there are HTTP errors. 97 void emulateLoadStartedForInspector(ResourceFetcher*,
140 bool shouldIgnoreHTTPStatusCodeErrors() const override { return true; } 98 const KURL&,
141 99 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 100
162 void setNotRefetchableDataFromDiskCache() { 101 void setNotRefetchableDataFromDiskCache() {
163 m_isRefetchableDataFromDiskCache = false; 102 m_isRefetchableDataFromDiskCache = false;
164 } 103 }
165 104
166 DECLARE_VIRTUAL_TRACE(); 105 private:
106 ImageResourceContent(PassRefPtr<blink::Image> = nullptr);
167 107
168 private: 108 // ImageObserver
169 explicit ImageResource(blink::Image*, const ResourceLoaderOptions&); 109 void decodedSizeChangedTo(const blink::Image*, size_t newSize) override;
110 bool shouldPauseAnimation(const blink::Image*) override;
111 void animationAdvanced(const blink::Image*) override;
112 void changedInRect(const blink::Image*, const IntRect&) override;
170 113
171 enum class MultipartParsingState : uint8_t { 114 // ImageResourceContentInterface.
172 WaitingForFirstPart, 115 void setImageResourceInfo(ImageResourceInfo*) override;
173 ParsingFirstPart, 116 void updateImage(PassRefPtr<SharedBuffer>,
174 FinishedParsingFirstPart, 117 ClearImageOption,
175 }; 118 bool allDataReceived) override;
119 ResourcePriority priorityFromObservers() const override;
120 void destroyDecodedData() override;
121 bool hasObservers() const override {
122 return !m_observers.isEmpty() || !m_finishedObservers.isEmpty();
123 }
124 bool isSizeAvailable() const override {
125 return m_sizeAvailable == Image::SizeAvailable;
126 }
127 bool isRefetchableDataFromDiskCache() const override {
128 return m_isRefetchableDataFromDiskCache;
129 }
130 void doResetAnimation() override;
176 131
177 class ImageResourceFactory; 132 PassRefPtr<Image> createImage();
133 void clearImage();
178 134
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 }; 135 enum NotifyFinishOption { ShouldNotifyFinish, DoNotNotifyFinish };
194 // If not null, changeRect is the changed part of the image. 136 // If not null, changeRect is the changed part of the image.
195 void notifyObservers(NotifyFinishOption, const IntRect* changeRect = nullptr); 137 void notifyObservers(NotifyFinishOption, const IntRect* changeRect = nullptr);
196
197 void ensureImage();
198
199 void checkNotify() override;
200 void notifyObserversInternal();
201 void markObserverFinished(ImageResourceObserver*); 138 void markObserverFinished(ImageResourceObserver*);
202 139
203 void doResetAnimation(); 140 Member<ImageResourceInfo> m_info;
204 141
205 void destroyDecodedDataIfPossible() override; 142 RefPtr<blink::Image> m_image;
206 void destroyDecodedDataForFailedRevalidation() override;
207 143
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; 144 HashCountedSet<ImageResourceObserver*> m_observers;
218 HashCountedSet<ImageResourceObserver*> m_finishedObservers; 145 HashCountedSet<ImageResourceObserver*> m_finishedObservers;
219 146
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; 147 Image::SizeAvailability m_sizeAvailable = Image::SizeUnavailable;
231 148
232 // Indicates if this resource's encoded image data can be purged and refetched 149 // Indicates if this resource's encoded image data can be purged and refetched
233 // from disk cache to save memory usage. See crbug/664437. 150 // from disk cache to save memory usage. See crbug/664437.
234 bool m_isRefetchableDataFromDiskCache; 151 bool m_isRefetchableDataFromDiskCache;
235 }; 152 };
236 153
237 DEFINE_RESOURCE_TYPE_CASTS(Image);
238
239 } // namespace blink 154 } // namespace blink
240 155
241 #endif 156 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698