OLD | NEW |
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 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 } | 210 } |
211 if (oldImage) { | 211 if (oldImage) { |
212 oldImage->removeObserver(this); | 212 oldImage->removeObserver(this); |
213 } | 213 } |
214 } | 214 } |
215 | 215 |
216 if (LayoutImageResource* imageResource = layoutImageResource()) | 216 if (LayoutImageResource* imageResource = layoutImageResource()) |
217 imageResource->resetAnimation(); | 217 imageResource->resetAnimation(); |
218 } | 218 } |
219 | 219 |
220 void ImageLoader::setImagePending(ImageResource* newImage) | |
221 { | |
222 ImageResource* oldImage = m_image.get(); | |
223 if (m_hasPendingLoadEvent) { | |
224 loadEventSender().cancelEvent(this); | |
225 m_hasPendingLoadEvent = false; | |
226 } | |
227 | |
228 // Cancel error events that belong to the previous load, which is now cancel
led by changing the src attribute. | |
229 // If newImage is null and m_hasPendingErrorEvent is true, we know the error
event has been just posted by | |
230 // this load and we should not cancel the event. | |
231 // FIXME: If both previous load and this one got blocked with an error, we c
an receive one error event instead of two. | |
232 if (m_hasPendingErrorEvent && newImage) { | |
233 errorEventSender().cancelEvent(this); | |
234 m_hasPendingErrorEvent = false; | |
235 } | |
236 | |
237 m_image = newImage; | |
238 m_hasPendingLoadEvent = newImage; | |
239 m_imageComplete = !newImage; | |
240 | |
241 updateLayoutObject(); | |
242 // If newImage exists and is cached, addObserver() will result in the load e
vent | |
243 // being queued to fire. Ensure this happens after beforeload is dispatched. | |
244 if (newImage) { | |
245 newImage->addObserver(this); | |
246 } | |
247 if (oldImage) { | |
248 oldImage->removeObserver(this); | |
249 } | |
250 } | |
251 | |
252 static void configureRequest(FetchRequest& request, ImageLoader::BypassMainWorld
Behavior bypassBehavior, Element& element, const ClientHintsPreferences& clientH
intsPreferences) | 220 static void configureRequest(FetchRequest& request, ImageLoader::BypassMainWorld
Behavior bypassBehavior, Element& element, const ClientHintsPreferences& clientH
intsPreferences) |
253 { | 221 { |
254 if (bypassBehavior == ImageLoader::BypassMainWorldCSP) | 222 if (bypassBehavior == ImageLoader::BypassMainWorldCSP) |
255 request.setContentSecurityCheck(DoNotCheckContentSecurityPolicy); | 223 request.setContentSecurityCheck(DoNotCheckContentSecurityPolicy); |
256 | 224 |
257 CrossOriginAttributeValue crossOrigin = crossOriginAttributeValue(element.fa
stGetAttribute(HTMLNames::crossoriginAttr)); | 225 CrossOriginAttributeValue crossOrigin = crossOriginAttributeValue(element.fa
stGetAttribute(HTMLNames::crossoriginAttr)); |
258 if (crossOrigin != CrossOriginAttributeNotSet) | 226 if (crossOrigin != CrossOriginAttributeNotSet) |
259 request.setCrossOriginAccessControl(element.document().getSecurityOrigin
(), crossOrigin); | 227 request.setCrossOriginAccessControl(element.document().getSecurityOrigin
(), crossOrigin); |
260 | 228 |
261 if (clientHintsPreferences.shouldSendResourceWidth() && isHTMLImageElement(e
lement)) | 229 if (clientHintsPreferences.shouldSendResourceWidth() && isHTMLImageElement(e
lement)) |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 // Fire an error event if the url string is not empty, but the KURL
is. | 305 // Fire an error event if the url string is not empty, but the KURL
is. |
338 dispatchErrorEvent(); | 306 dispatchErrorEvent(); |
339 } | 307 } |
340 noImageResourceToLoad(); | 308 noImageResourceToLoad(); |
341 } | 309 } |
342 | 310 |
343 ImageResource* oldImage = m_image.get(); | 311 ImageResource* oldImage = m_image.get(); |
344 if (updateBehavior == UpdateSizeChanged && m_element->layoutObject() && m_el
ement->layoutObject()->isImage() && newImage == oldImage) { | 312 if (updateBehavior == UpdateSizeChanged && m_element->layoutObject() && m_el
ement->layoutObject()->isImage() && newImage == oldImage) { |
345 toLayoutImage(m_element->layoutObject())->intrinsicSizeChanged(); | 313 toLayoutImage(m_element->layoutObject())->intrinsicSizeChanged(); |
346 } else { | 314 } else { |
347 setImagePending(newImage); | 315 if (m_hasPendingLoadEvent) { |
| 316 loadEventSender().cancelEvent(this); |
| 317 m_hasPendingLoadEvent = false; |
| 318 } |
| 319 |
| 320 // Cancel error events that belong to the previous load, which is now ca
ncelled by changing the src attribute. |
| 321 // If newImage is null and m_hasPendingErrorEvent is true, we know the e
rror event has been just posted by |
| 322 // this load and we should not cancel the event. |
| 323 // FIXME: If both previous load and this one got blocked with an error,
we can receive one error event instead of two. |
| 324 if (m_hasPendingErrorEvent && newImage) { |
| 325 errorEventSender().cancelEvent(this); |
| 326 m_hasPendingErrorEvent = false; |
| 327 } |
| 328 |
| 329 m_image = newImage; |
| 330 m_hasPendingLoadEvent = newImage; |
| 331 m_imageComplete = !newImage; |
| 332 |
| 333 updateLayoutObject(); |
| 334 // If newImage exists and is cached, addObserver() will result in the lo
ad event |
| 335 // being queued to fire. Ensure this happens after beforeload is dispatc
hed. |
| 336 if (newImage) { |
| 337 newImage->addObserver(this); |
| 338 } |
| 339 if (oldImage) { |
| 340 oldImage->removeObserver(this); |
| 341 } |
348 } | 342 } |
349 | 343 |
350 if (LayoutImageResource* imageResource = layoutImageResource()) | 344 if (LayoutImageResource* imageResource = layoutImageResource()) |
351 imageResource->resetAnimation(); | 345 imageResource->resetAnimation(); |
352 | 346 |
353 // Only consider updating the protection ref-count of the Element immediatel
y before returning | 347 // Only consider updating the protection ref-count of the Element immediatel
y before returning |
354 // from this function as doing so might result in the destruction of this Im
ageLoader. | 348 // from this function as doing so might result in the destruction of this Im
ageLoader. |
355 updatedHasPendingEvent(); | 349 updatedHasPendingEvent(); |
356 } | 350 } |
357 | 351 |
358 void ImageLoader::updateFromElement(UpdateFromElementBehavior updateBehavior, Re
ferrerPolicy referrerPolicy) | 352 void ImageLoader::updateFromElement(UpdateFromElementBehavior updateBehavior, Re
ferrerPolicy referrerPolicy) |
359 { | 353 { |
360 AtomicString imageSourceURL = m_element->imageSourceURL(); | 354 AtomicString imageSourceURL = m_element->imageSourceURL(); |
361 m_suppressErrorEvents = (updateBehavior == UpdateSizeChanged); | 355 m_suppressErrorEvents = (updateBehavior == UpdateSizeChanged); |
362 | 356 |
363 if (updateBehavior == UpdateIgnorePreviousError) | 357 if (updateBehavior == UpdateIgnorePreviousError) |
364 clearFailedLoadURL(); | 358 clearFailedLoadURL(); |
365 | 359 |
366 if (!m_failedLoadURL.isEmpty() && imageSourceURL == m_failedLoadURL) | 360 if (!m_failedLoadURL.isEmpty() && imageSourceURL == m_failedLoadURL) |
367 return; | 361 return; |
368 | 362 |
369 // Prevent the creation of a ResourceLoader (and therefore a network | 363 // Prevent the creation of a ResourceLoader (and therefore a network |
370 // request) for ImageDocument loads. In this case, the image contents have a
lready | 364 // request) for ImageDocument loads. In this case, the image contents have a
lready |
371 // been requested as a main resource and ImageDocumentParser will take care
of | 365 // been requested as a main resource and ImageDocumentParser will take care
of |
372 // funneling the main resource bytes into m_image, so just create an ImageRe
source | 366 // funneling the main resource bytes into m_image, so just create an ImageRe
source |
373 // to be populated later. | 367 // to be populated later. |
374 if (m_loadingImageDocument && updateBehavior != UpdateForcedReload) { | 368 if (m_loadingImageDocument && updateBehavior != UpdateForcedReload) { |
375 setImagePending(ImageResource::create(imageSourceToKURL(m_element->image
SourceURL()))); | 369 setImage(ImageResource::create(imageSourceToKURL(m_element->imageSourceU
RL()))); |
376 m_image->setStatus(Resource::Pending); | 370 m_image->setStatus(Resource::Pending); |
377 // Only consider updating the protection ref-count of the Element immedi
ately before returning | |
378 // from this function as doing so might result in the destruction of thi
s ImageLoader. | |
379 updatedHasPendingEvent(); | |
380 return; | 371 return; |
381 } | 372 } |
382 | 373 |
383 // If we have a pending task, we have to clear it -- either we're | 374 // If we have a pending task, we have to clear it -- either we're |
384 // now loading immediately, or we need to reset the task's state. | 375 // now loading immediately, or we need to reset the task's state. |
385 if (m_pendingTask) { | 376 if (m_pendingTask) { |
386 m_pendingTask->clearLoader(); | 377 m_pendingTask->clearLoader(); |
387 m_pendingTask.clear(); | 378 m_pendingTask.clear(); |
388 } | 379 } |
389 | 380 |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
614 | 605 |
615 void ImageLoader::elementDidMoveToNewDocument() | 606 void ImageLoader::elementDidMoveToNewDocument() |
616 { | 607 { |
617 if (m_loadDelayCounter) | 608 if (m_loadDelayCounter) |
618 m_loadDelayCounter->documentChanged(m_element->document()); | 609 m_loadDelayCounter->documentChanged(m_element->document()); |
619 clearFailedLoadURL(); | 610 clearFailedLoadURL(); |
620 setImage(0); | 611 setImage(0); |
621 } | 612 } |
622 | 613 |
623 } // namespace blink | 614 } // namespace blink |
OLD | NEW |