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

Side by Side Diff: Source/WebCore/loader/ImageLoader.cpp

Issue 11342010: Merge 131670 (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1271/
Patch Set: Created 8 years, 1 month 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
« no previous file with comments | « Source/WebCore/loader/ImageLoader.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 { 122 {
123 return client()->sourceElement()->document(); 123 return client()->sourceElement()->document();
124 } 124 }
125 125
126 void ImageLoader::setImage(CachedImage* newImage) 126 void ImageLoader::setImage(CachedImage* newImage)
127 { 127 {
128 setImageWithoutConsideringPendingLoadEvent(newImage); 128 setImageWithoutConsideringPendingLoadEvent(newImage);
129 129
130 // Only consider updating the protection ref-count of the Element immediatel y before returning 130 // Only consider updating the protection ref-count of the Element immediatel y before returning
131 // from this function as doing so might result in the destruction of this Im ageLoader. 131 // from this function as doing so might result in the destruction of this Im ageLoader.
132 updatedHasPendingLoadEvent(); 132 updatedHasPendingEvent();
133 } 133 }
134 134
135 void ImageLoader::setImageWithoutConsideringPendingLoadEvent(CachedImage* newIma ge) 135 void ImageLoader::setImageWithoutConsideringPendingLoadEvent(CachedImage* newIma ge)
136 { 136 {
137 ASSERT(m_failedLoadURL.isEmpty()); 137 ASSERT(m_failedLoadURL.isEmpty());
138 CachedImage* oldImage = m_image.get(); 138 CachedImage* oldImage = m_image.get();
139 if (newImage != oldImage) { 139 if (newImage != oldImage) {
140 m_image = newImage; 140 m_image = newImage;
141 if (m_hasPendingBeforeLoadEvent) { 141 if (m_hasPendingBeforeLoadEvent) {
142 beforeLoadEventSender().cancelEvent(this); 142 beforeLoadEventSender().cancelEvent(this);
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 } 241 }
242 if (oldImage) 242 if (oldImage)
243 oldImage->removeClient(this); 243 oldImage->removeClient(this);
244 } 244 }
245 245
246 if (RenderImageResource* imageResource = renderImageResource()) 246 if (RenderImageResource* imageResource = renderImageResource())
247 imageResource->resetAnimation(); 247 imageResource->resetAnimation();
248 248
249 // Only consider updating the protection ref-count of the Element immediatel y before returning 249 // Only consider updating the protection ref-count of the Element immediatel y before returning
250 // from this function as doing so might result in the destruction of this Im ageLoader. 250 // from this function as doing so might result in the destruction of this Im ageLoader.
251 updatedHasPendingLoadEvent(); 251 updatedHasPendingEvent();
252 } 252 }
253 253
254 void ImageLoader::updateFromElementIgnoringPreviousError() 254 void ImageLoader::updateFromElementIgnoringPreviousError()
255 { 255 {
256 // Clear previous error. 256 // Clear previous error.
257 m_failedLoadURL = AtomicString(); 257 m_failedLoadURL = AtomicString();
258 updateFromElement(); 258 updateFromElement();
259 } 259 }
260 260
261 void ImageLoader::notifyFinished(CachedResource* resource) 261 void ImageLoader::notifyFinished(CachedResource* resource)
(...skipping 17 matching lines...) Expand all
279 m_hasPendingErrorEvent = true; 279 m_hasPendingErrorEvent = true;
280 errorEventSender().dispatchEventSoon(this); 280 errorEventSender().dispatchEventSoon(this);
281 281
282 DEFINE_STATIC_LOCAL(String, consoleMessage, (ASCIILiteral("Cross-origin image load denied by Cross-Origin Resource Sharing policy."))); 282 DEFINE_STATIC_LOCAL(String, consoleMessage, (ASCIILiteral("Cross-origin image load denied by Cross-Origin Resource Sharing policy.")));
283 document()->addConsoleMessage(JSMessageSource, LogMessageType, ErrorMess ageLevel, consoleMessage); 283 document()->addConsoleMessage(JSMessageSource, LogMessageType, ErrorMess ageLevel, consoleMessage);
284 284
285 ASSERT(!m_hasPendingLoadEvent); 285 ASSERT(!m_hasPendingLoadEvent);
286 286
287 // Only consider updating the protection ref-count of the Element immedi ately before returning 287 // Only consider updating the protection ref-count of the Element immedi ately before returning
288 // from this function as doing so might result in the destruction of thi s ImageLoader. 288 // from this function as doing so might result in the destruction of thi s ImageLoader.
289 updatedHasPendingLoadEvent(); 289 updatedHasPendingEvent();
290 return; 290 return;
291 } 291 }
292 292
293 if (resource->wasCanceled()) { 293 if (resource->wasCanceled()) {
294 m_hasPendingLoadEvent = false; 294 m_hasPendingLoadEvent = false;
295 // Only consider updating the protection ref-count of the Element immedi ately before returning 295 // Only consider updating the protection ref-count of the Element immedi ately before returning
296 // from this function as doing so might result in the destruction of thi s ImageLoader. 296 // from this function as doing so might result in the destruction of thi s ImageLoader.
297 updatedHasPendingLoadEvent(); 297 updatedHasPendingEvent();
298 return; 298 return;
299 } 299 }
300 300
301 loadEventSender().dispatchEventSoon(this); 301 loadEventSender().dispatchEventSoon(this);
302 } 302 }
303 303
304 RenderImageResource* ImageLoader::renderImageResource() 304 RenderImageResource* ImageLoader::renderImageResource()
305 { 305 {
306 RenderObject* renderer = client()->imageElement()->renderer(); 306 RenderObject* renderer = client()->imageElement()->renderer();
307 307
(...skipping 26 matching lines...) Expand all
334 return; 334 return;
335 335
336 // Only update the renderer if it doesn't have an image or if what we have 336 // Only update the renderer if it doesn't have an image or if what we have
337 // is a complete image. This prevents flickering in the case where a dynami c 337 // is a complete image. This prevents flickering in the case where a dynami c
338 // change is happening between two images. 338 // change is happening between two images.
339 CachedImage* cachedImage = imageResource->cachedImage(); 339 CachedImage* cachedImage = imageResource->cachedImage();
340 if (m_image != cachedImage && (m_imageComplete || !cachedImage)) 340 if (m_image != cachedImage && (m_imageComplete || !cachedImage))
341 imageResource->setCachedImage(m_image.get()); 341 imageResource->setCachedImage(m_image.get());
342 } 342 }
343 343
344 void ImageLoader::updatedHasPendingLoadEvent() 344 void ImageLoader::updatedHasPendingEvent()
345 { 345 {
346 // If an Element that does image loading is removed from the DOM the load ev ent for the image is still observable. 346 // If an Element that does image loading is removed from the DOM the load/er ror event for the image is still observable.
347 // As long as the ImageLoader is actively loading, the Element itself needs to be ref'ed to keep it from being 347 // As long as the ImageLoader is actively loading, the Element itself needs to be ref'ed to keep it from being
348 // destroyed by DOM manipulation or garbage collection. 348 // destroyed by DOM manipulation or garbage collection.
349 // If such an Element wishes for the load to stop when removed from the DOM it needs to stop the ImageLoader explicitly. 349 // If such an Element wishes for the load to stop when removed from the DOM it needs to stop the ImageLoader explicitly.
350 350 bool wasProtected = m_elementIsProtected;
351 if (m_hasPendingLoadEvent == m_elementIsProtected) 351 m_elementIsProtected = m_hasPendingLoadEvent || m_hasPendingErrorEvent;
352 if (wasProtected == m_elementIsProtected)
352 return; 353 return;
353 354
354 m_elementIsProtected = m_hasPendingLoadEvent;
355
356 if (m_elementIsProtected) 355 if (m_elementIsProtected)
357 client()->refSourceElement(); 356 client()->refSourceElement();
358 else 357 else
359 client()->derefSourceElement(); 358 client()->derefSourceElement();
360 } 359 }
361 360
362 void ImageLoader::dispatchPendingEvent(ImageEventSender* eventSender) 361 void ImageLoader::dispatchPendingEvent(ImageEventSender* eventSender)
363 { 362 {
364 ASSERT(eventSender == &beforeLoadEventSender() || eventSender == &loadEventS ender() || eventSender == &errorEventSender()); 363 ASSERT(eventSender == &beforeLoadEventSender() || eventSender == &loadEventS ender() || eventSender == &errorEventSender());
365 const AtomicString& eventType = eventSender->eventType(); 364 const AtomicString& eventType = eventSender->eventType();
(...skipping 24 matching lines...) Expand all
390 } 389 }
391 390
392 loadEventSender().cancelEvent(this); 391 loadEventSender().cancelEvent(this);
393 m_hasPendingLoadEvent = false; 392 m_hasPendingLoadEvent = false;
394 393
395 if (client()->sourceElement()->hasTagName(HTMLNames::objectTag)) 394 if (client()->sourceElement()->hasTagName(HTMLNames::objectTag))
396 static_cast<HTMLObjectElement*>(client()->sourceElement())->renderFallba ckContent(); 395 static_cast<HTMLObjectElement*>(client()->sourceElement())->renderFallba ckContent();
397 396
398 // Only consider updating the protection ref-count of the Element immediatel y before returning 397 // Only consider updating the protection ref-count of the Element immediatel y before returning
399 // from this function as doing so might result in the destruction of this Im ageLoader. 398 // from this function as doing so might result in the destruction of this Im ageLoader.
400 updatedHasPendingLoadEvent(); 399 updatedHasPendingEvent();
401 } 400 }
402 401
403 void ImageLoader::dispatchPendingLoadEvent() 402 void ImageLoader::dispatchPendingLoadEvent()
404 { 403 {
405 if (!m_hasPendingLoadEvent) 404 if (!m_hasPendingLoadEvent)
406 return; 405 return;
407 if (!m_image) 406 if (!m_image)
408 return; 407 return;
409 if (!document()->attached()) 408 if (!document()->attached())
410 return; 409 return;
411 m_hasPendingLoadEvent = false; 410 m_hasPendingLoadEvent = false;
412 dispatchLoadEvent(); 411 dispatchLoadEvent();
413 412
414 // Only consider updating the protection ref-count of the Element immediatel y before returning 413 // Only consider updating the protection ref-count of the Element immediatel y before returning
415 // from this function as doing so might result in the destruction of this Im ageLoader. 414 // from this function as doing so might result in the destruction of this Im ageLoader.
416 updatedHasPendingLoadEvent(); 415 updatedHasPendingEvent();
417 } 416 }
418 417
419 void ImageLoader::dispatchPendingErrorEvent() 418 void ImageLoader::dispatchPendingErrorEvent()
420 { 419 {
421 if (!m_hasPendingErrorEvent) 420 if (!m_hasPendingErrorEvent)
422 return; 421 return;
423 if (!document()->attached()) 422 if (!document()->attached())
424 return; 423 return;
425 m_hasPendingErrorEvent = false; 424 m_hasPendingErrorEvent = false;
426 client()->imageElement()->dispatchEvent(Event::create(eventNames().errorEven t, false, false)); 425 client()->imageElement()->dispatchEvent(Event::create(eventNames().errorEven t, false, false));
(...skipping 13 matching lines...) Expand all
440 { 439 {
441 errorEventSender().dispatchPendingEvents(); 440 errorEventSender().dispatchPendingEvents();
442 } 441 }
443 442
444 void ImageLoader::elementDidMoveToNewDocument() 443 void ImageLoader::elementDidMoveToNewDocument()
445 { 444 {
446 setImage(0); 445 setImage(0);
447 } 446 }
448 447
449 } 448 }
OLDNEW
« no previous file with comments | « Source/WebCore/loader/ImageLoader.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698