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

Side by Side Diff: third_party/WebKit/Source/core/loader/ImageLoader.cpp

Issue 1667843003: Make Resource RefCountedWillBeGarbageCollectedFinalized, attempt #2 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase + address review comments Created 4 years, 10 months 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) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010 Apple Inc. All rights reserv ed. 4 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010 Apple Inc. All rights reserv ed.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 RawPtrWillBeWeakPersistent<ImageLoader> m_loader; 135 RawPtrWillBeWeakPersistent<ImageLoader> m_loader;
136 BypassMainWorldBehavior m_shouldBypassMainWorldCSP; 136 BypassMainWorldBehavior m_shouldBypassMainWorldCSP;
137 UpdateFromElementBehavior m_updateBehavior; 137 UpdateFromElementBehavior m_updateBehavior;
138 RefPtr<ScriptState> m_scriptState; 138 RefPtr<ScriptState> m_scriptState;
139 WeakPtrFactory<Task> m_weakFactory; 139 WeakPtrFactory<Task> m_weakFactory;
140 ReferrerPolicy m_referrerPolicy; 140 ReferrerPolicy m_referrerPolicy;
141 }; 141 };
142 142
143 ImageLoader::ImageLoader(Element* element) 143 ImageLoader::ImageLoader(Element* element)
144 : m_element(element) 144 : m_element(element)
145 , m_image(0)
146 , m_derefElementTimer(this, &ImageLoader::timerFired) 145 , m_derefElementTimer(this, &ImageLoader::timerFired)
147 , m_hasPendingLoadEvent(false) 146 , m_hasPendingLoadEvent(false)
148 , m_hasPendingErrorEvent(false) 147 , m_hasPendingErrorEvent(false)
149 , m_imageComplete(true) 148 , m_imageComplete(true)
150 , m_loadingImageDocument(false) 149 , m_loadingImageDocument(false)
151 , m_elementIsProtected(false) 150 , m_elementIsProtected(false)
152 , m_suppressErrorEvents(false) 151 , m_suppressErrorEvents(false)
153 , m_highPriorityClientCount(0) 152 , m_highPriorityClientCount(0)
154 { 153 {
155 WTF_LOG(Timers, "new ImageLoader %p", this); 154 WTF_LOG(Timers, "new ImageLoader %p", this);
(...skipping 17 matching lines...) Expand all
173 #if !ENABLE(OILPAN) 172 #if !ENABLE(OILPAN)
174 if (m_pendingTask) 173 if (m_pendingTask)
175 m_pendingTask->clearLoader(); 174 m_pendingTask->clearLoader();
176 #endif 175 #endif
177 176
178 #if ENABLE(OILPAN) 177 #if ENABLE(OILPAN)
179 for (const auto& client : m_clients) 178 for (const auto& client : m_clients)
180 willRemoveClient(*client); 179 willRemoveClient(*client);
181 #endif 180 #endif
182 181
183 if (m_image) 182 if (m_image) {
184 m_image->removeClient(this); 183 m_image->removeClient(this);
184 m_image = nullptr;
185 }
185 186
186 #if !ENABLE(OILPAN) 187 #if !ENABLE(OILPAN)
187 ASSERT(m_hasPendingLoadEvent || !loadEventSender().hasPendingEvents(this)); 188 ASSERT(m_hasPendingLoadEvent || !loadEventSender().hasPendingEvents(this));
188 if (m_hasPendingLoadEvent) 189 if (m_hasPendingLoadEvent)
189 loadEventSender().cancelEvent(this); 190 loadEventSender().cancelEvent(this);
190 191
191 ASSERT(m_hasPendingErrorEvent || !errorEventSender().hasPendingEvents(this)) ; 192 ASSERT(m_hasPendingErrorEvent || !errorEventSender().hasPendingEvents(this)) ;
192 if (m_hasPendingErrorEvent) 193 if (m_hasPendingErrorEvent)
193 errorEventSender().cancelEvent(this); 194 errorEventSender().cancelEvent(this);
194 #endif 195 #endif
195 } 196 }
196 197
197 #if ENABLE(OILPAN) 198 #if ENABLE(OILPAN)
198 void ImageLoader::clearWeakMembers(Visitor* visitor) 199 void ImageLoader::clearWeakMembers(Visitor* visitor)
199 { 200 {
200 Vector<UntracedMember<ImageLoaderClient>> deadClients; 201 Vector<UntracedMember<ImageLoaderClient>> deadClients;
201 for (const auto& client : m_clients) { 202 for (const auto& client : m_clients) {
202 if (!Heap::isHeapObjectAlive(client)) { 203 if (!Heap::isHeapObjectAlive(client)) {
203 willRemoveClient(*client); 204 willRemoveClient(*client);
204 deadClients.append(client); 205 deadClients.append(client);
205 } 206 }
206 } 207 }
207 for (unsigned i = 0; i < deadClients.size(); ++i) 208 for (unsigned i = 0; i < deadClients.size(); ++i)
208 m_clients.remove(deadClients[i]); 209 m_clients.remove(deadClients[i]);
209 } 210 }
210 #endif 211 #endif
211 212
212 DEFINE_TRACE(ImageLoader) 213 DEFINE_TRACE(ImageLoader)
213 { 214 {
215 visitor->trace(m_image);
214 visitor->trace(m_element); 216 visitor->trace(m_element);
215 #if ENABLE(OILPAN) 217 #if ENABLE(OILPAN)
216 visitor->template registerWeakMembers<ImageLoader, &ImageLoader::clearWeakMe mbers>(this); 218 visitor->template registerWeakMembers<ImageLoader, &ImageLoader::clearWeakMe mbers>(this);
217 #endif 219 #endif
218 } 220 }
219 221
220 void ImageLoader::setImage(ImageResource* newImage) 222 void ImageLoader::setImage(ImageResource* newImage)
221 { 223 {
222 setImageWithoutConsideringPendingLoadEvent(newImage); 224 setImageWithoutConsideringPendingLoadEvent(newImage);
223 225
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 // Make sure to only decrement the count when we exit this function 305 // Make sure to only decrement the count when we exit this function
304 OwnPtr<IncrementLoadEventDelayCount> loadDelayCounter; 306 OwnPtr<IncrementLoadEventDelayCount> loadDelayCounter;
305 loadDelayCounter.swap(m_loadDelayCounter); 307 loadDelayCounter.swap(m_loadDelayCounter);
306 308
307 Document& document = m_element->document(); 309 Document& document = m_element->document();
308 if (!document.isActive()) 310 if (!document.isActive())
309 return; 311 return;
310 312
311 AtomicString imageSourceURL = m_element->imageSourceURL(); 313 AtomicString imageSourceURL = m_element->imageSourceURL();
312 KURL url = imageSourceToKURL(imageSourceURL); 314 KURL url = imageSourceToKURL(imageSourceURL);
313 ResourcePtr<ImageResource> newImage = 0; 315 RefPtrWillBeRawPtr<ImageResource> newImage = nullptr;
314 RefPtrWillBeRawPtr<Element> protectElement(m_element.get()); 316 RefPtrWillBeRawPtr<Element> protectElement(m_element.get());
315 if (!url.isNull()) { 317 if (!url.isNull()) {
316 // Unlike raw <img>, we block mixed content inside of <picture> or <img srcset>. 318 // Unlike raw <img>, we block mixed content inside of <picture> or <img srcset>.
317 ResourceLoaderOptions resourceLoaderOptions = ResourceFetcher::defaultRe sourceOptions(); 319 ResourceLoaderOptions resourceLoaderOptions = ResourceFetcher::defaultRe sourceOptions();
318 ResourceRequest resourceRequest(url); 320 ResourceRequest resourceRequest(url);
319 resourceRequest.setFetchCredentialsMode(WebURLRequest::FetchCredentialsM odeSameOrigin); 321 resourceRequest.setFetchCredentialsMode(WebURLRequest::FetchCredentialsM odeSameOrigin);
320 if (updateBehavior == UpdateForcedReload) { 322 if (updateBehavior == UpdateForcedReload) {
321 resourceRequest.setCachePolicy(ResourceRequestCachePolicy::ReloadByp assingCache); 323 resourceRequest.setCachePolicy(ResourceRequestCachePolicy::ReloadByp assingCache);
322 resourceRequest.setLoFiState(WebURLRequest::LoFiOff); 324 resourceRequest.setLoFiState(WebURLRequest::LoFiOff);
323 // ImageLoader defers the load of images when in an ImageDocument. 325 // ImageLoader defers the load of images when in an ImageDocument.
(...skipping 29 matching lines...) Expand all
353 clearFailedLoadURL(); 355 clearFailedLoadURL();
354 } 356 }
355 } else { 357 } else {
356 if (!imageSourceURL.isNull()) { 358 if (!imageSourceURL.isNull()) {
357 // Fire an error event if the url string is not empty, but the KURL is. 359 // Fire an error event if the url string is not empty, but the KURL is.
358 dispatchErrorEvent(); 360 dispatchErrorEvent();
359 } 361 }
360 noImageResourceToLoad(); 362 noImageResourceToLoad();
361 } 363 }
362 364
363 ImageResource* oldImage = m_image.get(); 365 RefPtrWillBeRawPtr<ImageResource> oldImage = m_image.get();
364 if (updateBehavior == UpdateSizeChanged && m_element->layoutObject() && m_el ement->layoutObject()->isImage() && newImage == oldImage) { 366 if (updateBehavior == UpdateSizeChanged && m_element->layoutObject() && m_el ement->layoutObject()->isImage() && newImage == oldImage) {
365 toLayoutImage(m_element->layoutObject())->intrinsicSizeChanged(); 367 toLayoutImage(m_element->layoutObject())->intrinsicSizeChanged();
366 } else { 368 } else {
367 if (newImage != oldImage) 369 if (newImage != oldImage)
368 sourceImageChanged(); 370 sourceImageChanged();
369 371
370 if (m_hasPendingLoadEvent) { 372 if (m_hasPendingLoadEvent) {
371 loadEventSender().cancelEvent(this); 373 loadEventSender().cancelEvent(this);
372 m_hasPendingLoadEvent = false; 374 m_hasPendingLoadEvent = false;
373 } 375 }
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
680 682
681 void ImageLoader::sourceImageChanged() 683 void ImageLoader::sourceImageChanged()
682 { 684 {
683 for (auto& client : m_clients) { 685 for (auto& client : m_clients) {
684 ImageLoaderClient* handle = client; 686 ImageLoaderClient* handle = client;
685 handle->notifyImageSourceChanged(); 687 handle->notifyImageSourceChanged();
686 } 688 }
687 } 689 }
688 690
689 } // namespace blink 691 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/loader/ImageLoader.h ('k') | third_party/WebKit/Source/core/loader/LinkLoader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698