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

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: 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 // 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/ResourceStatus.h"
28 #include "core/fetch/Resource.h"
29 #include "platform/geometry/IntRect.h" 10 #include "platform/geometry/IntRect.h"
30 #include "platform/geometry/IntSizeHash.h" 11 #include "platform/geometry/IntSizeHash.h"
31 #include "platform/geometry/LayoutSize.h" 12 #include "platform/geometry/LayoutSize.h"
32 #include "platform/graphics/Image.h" 13 #include "platform/graphics/Image.h"
33 #include "platform/graphics/ImageObserver.h" 14 #include "platform/graphics/ImageObserver.h"
34 #include "platform/graphics/ImageOrientation.h" 15 #include "platform/graphics/ImageOrientation.h"
16 #include "platform/network/ResourceLoadPriority.h"
17 #include "platform/weborigin/KURL.h"
yhirano 2016/12/05 09:02:03 +wtf/HashCountedSet.h
hiroshige 2016/12/06 09:32:51 Done.
35 #include "wtf/HashMap.h" 18 #include "wtf/HashMap.h"
36 #include <memory> 19 #include <memory>
37 20
38 namespace blink { 21 namespace blink {
39 22
40 class FetchRequest; 23 class FetchRequest;
24 class ImageResourceInfo;
41 class ImageResourceObserver; 25 class ImageResourceObserver;
42 class MemoryCache; 26 class ResourceError;
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
kouhei (in TOK) 2016/12/05 07:13:06 ImageResourceContent is a container that holds fet
hiroshige 2016/12/05 09:11:19 Done.
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 ImageObserver {
54 public MultipartImageResourceParser::Client { 38 USING_GARBAGE_COLLECTED_MIXIN(ImageResourceContent);
55 friend class MemoryCache;
56 USING_GARBAGE_COLLECTED_MIXIN(ImageResource);
57 39
58 public: 40 public:
59 using ClientType = ResourceClient; 41 static ImageResourceContent* create(
42 PassRefPtr<blink::Image> image = nullptr) {
43 return new ImageResourceContent(std::move(image));
44 }
45 static ImageResourceContent* fetch(FetchRequest&, ResourceFetcher*);
60 46
61 static ImageResource* fetch(FetchRequest&, ResourceFetcher*); 47 // Returns the nullImage() if the image is not available yet.
62 48 blink::Image* getImage() const;
63 static ImageResource* create(blink::Image* image) {
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(); } 49 bool hasImage() const { return m_image.get(); }
76 50
77 static std::pair<blink::Image*, float> brokenImage( 51 static std::pair<blink::Image*, float> brokenImage(
78 float deviceScaleFactor); // Returns an image and the image's resolution 52 float deviceScaleFactor); // Returns an image and the image's resolution
79 // scale factor. 53 // scale factor.
80 bool willPaintBrokenImage() const;
81 54
82 bool usesImageContainerSize() const; 55 bool usesImageContainerSize() const;
83 bool imageHasRelativeSize() const; 56 bool imageHasRelativeSize() const;
84 // The device pixel ratio we got from the server for this image, or 1.0. 57 // The device pixel ratio we got from the server for this image, or 1.0.
85 float devicePixelRatioHeaderValue() const { 58 float devicePixelRatioHeaderValue() const;
86 return m_devicePixelRatioHeaderValue; 59 bool hasDevicePixelRatioHeaderValue() const;
87 }
88 bool hasDevicePixelRatioHeaderValue() const {
89 return m_hasDevicePixelRatioHeaderValue;
90 }
91 60
92 enum SizeType { 61 enum SizeType {
93 // Report the intrinsic size. 62 // Report the intrinsic size.
94 IntrinsicSize, 63 IntrinsicSize,
95 64
96 // Report the intrinsic size corrected to account for image density. 65 // Report the intrinsic size corrected to account for image density.
97 IntrinsicCorrectedToDPR, 66 IntrinsicCorrectedToDPR,
98 }; 67 };
99 68
100 // This method takes a zoom multiplier that can be used to increase the 69 // This method takes a zoom multiplier that can be used to increase the
101 // natural size of the image by the zoom. 70 // natural size of the image by the zoom.
102 LayoutSize imageSize( 71 LayoutSize imageSize(
103 RespectImageOrientationEnum shouldRespectImageOrientation, 72 RespectImageOrientationEnum shouldRespectImageOrientation,
104 float multiplier, 73 float multiplier,
105 SizeType = IntrinsicSize); 74 SizeType = IntrinsicSize);
106 75
107 bool isAccessAllowed(SecurityOrigin*);
108
109 void updateImageAnimationPolicy(); 76 void updateImageAnimationPolicy();
110 77
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*); 78 void addObserver(ImageResourceObserver*);
126 void removeObserver(ImageResourceObserver*); 79 void removeObserver(ImageResourceObserver*);
127 80
128 ResourcePriority priorityFromObservers() override; 81 DECLARE_TRACE();
129 82
130 void allClientsAndObserversRemoved() override; 83 // Redirecting methods to Resource.
84 const KURL& url() const;
85 bool isAccessAllowed(SecurityOrigin*) const;
86 const ResourceResponse& response() const;
87 bool isLoaded() const;
88 bool isLoading() const;
89 bool errorOccurred() const;
90 bool loadFailedOrCanceled() const;
91 ResourceStatus getStatus() const;
92 const ResourceError& resourceError() 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 // For ImageResource only.
106 void setImageResourceInfo(ImageResourceInfo*);
107 enum ClearImageOption { ClearExistingImage, KeepExistingImage };
108 void updateImage(PassRefPtr<SharedBuffer>,
109 ClearImageOption,
110 bool allDataReceived);
111 ResourcePriority priorityFromObservers() const;
112 void destroyDecodedData();
113 bool hasObservers() const {
114 return !m_observers.isEmpty() || !m_finishedObservers.isEmpty();
115 }
116 bool isSizeAvailable() const {
117 return m_sizeAvailable == Image::SizeAvailable;
118 }
119 bool isRefetchableDataFromDiskCache() const {
120 return m_isRefetchableDataFromDiskCache;
121 }
122 void doResetAnimation();
167 123
168 private: 124 private:
169 explicit ImageResource(blink::Image*, const ResourceLoaderOptions&); 125 ImageResourceContent(PassRefPtr<blink::Image> = nullptr);
170 126
171 enum class MultipartParsingState : uint8_t { 127 // ImageObserver
172 WaitingForFirstPart, 128 void decodedSizeChangedTo(const blink::Image*, size_t newSize) override;
173 ParsingFirstPart, 129 bool shouldPauseAnimation(const blink::Image*) override;
174 FinishedParsingFirstPart, 130 void animationAdvanced(const blink::Image*) override;
175 }; 131 void changedInRect(const blink::Image*, const IntRect&) override;
176 132
177 class ImageResourceFactory; 133 PassRefPtr<Image> createImage();
134 void clearImage();
178 135
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 }; 136 enum NotifyFinishOption { ShouldNotifyFinish, DoNotNotifyFinish };
194 // If not null, changeRect is the changed part of the image. 137 // If not null, changeRect is the changed part of the image.
195 void notifyObservers(NotifyFinishOption, const IntRect* changeRect = nullptr); 138 void notifyObservers(NotifyFinishOption, const IntRect* changeRect = nullptr);
196
197 void ensureImage();
198
199 void checkNotify() override;
200 void notifyObserversInternal();
201 void markObserverFinished(ImageResourceObserver*); 139 void markObserverFinished(ImageResourceObserver*);
202 140
203 void doResetAnimation(); 141 Member<ImageResourceInfo> m_info;
204 142
205 void destroyDecodedDataIfPossible() override; 143 RefPtr<blink::Image> m_image;
206 void destroyDecodedDataForFailedRevalidation() override;
207 144
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; 145 HashCountedSet<ImageResourceObserver*> m_observers;
218 HashCountedSet<ImageResourceObserver*> m_finishedObservers; 146 HashCountedSet<ImageResourceObserver*> m_finishedObservers;
219 147
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; 148 Image::SizeAvailability m_sizeAvailable = Image::SizeUnavailable;
231 149
232 // Indicates if this resource's encoded image data can be purged and refetched 150 // Indicates if this resource's encoded image data can be purged and refetched
233 // from disk cache to save memory usage. See crbug/664437. 151 // from disk cache to save memory usage. See crbug/664437.
234 bool m_isRefetchableDataFromDiskCache; 152 bool m_isRefetchableDataFromDiskCache;
235 }; 153 };
236 154
237 DEFINE_RESOURCE_TYPE_CASTS(Image);
238
239 } // namespace blink 155 } // namespace blink
240 156
241 #endif 157 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698