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

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

Issue 1314793010: Support fragment URLs for all kinds of SVG images (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Update DEPS to match Created 5 years, 3 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 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 // FIXME: If both previous load and this one got blocked with an error, we can receive one error event instead of two. 372 // FIXME: If both previous load and this one got blocked with an error, we can receive one error event instead of two.
373 if (m_hasPendingErrorEvent && newImage) { 373 if (m_hasPendingErrorEvent && newImage) {
374 errorEventSender().cancelEvent(this); 374 errorEventSender().cancelEvent(this);
375 m_hasPendingErrorEvent = false; 375 m_hasPendingErrorEvent = false;
376 } 376 }
377 377
378 m_image = newImage; 378 m_image = newImage;
379 m_hasPendingLoadEvent = newImage; 379 m_hasPendingLoadEvent = newImage;
380 m_imageComplete = !newImage; 380 m_imageComplete = !newImage;
381 381
382 updateLayoutObject(); 382 updateLayoutObject(url);
383 // If newImage exists and is cached, addClient() will result in the load event 383 // If newImage exists and is cached, addClient() will result in the load event
384 // being queued to fire. Ensure this happens after beforeload is dispatc hed. 384 // being queued to fire. Ensure this happens after beforeload is dispatc hed.
385 if (newImage) 385 if (newImage)
386 newImage->addClient(this); 386 newImage->addClient(this);
387 387
388 if (oldImage) 388 if (oldImage)
389 oldImage->removeClient(this); 389 oldImage->removeClient(this);
390 } 390 }
391 391
392 if (LayoutImageResource* imageResource = layoutImageResource()) 392 if (LayoutImageResource* imageResource = layoutImageResource())
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 475
476 ASSERT(m_failedLoadURL.isEmpty()); 476 ASSERT(m_failedLoadURL.isEmpty());
477 ASSERT(resource == m_image.get()); 477 ASSERT(resource == m_image.get());
478 478
479 m_imageComplete = true; 479 m_imageComplete = true;
480 480
481 // Update ImageAnimationPolicy for m_image. 481 // Update ImageAnimationPolicy for m_image.
482 if (m_image) 482 if (m_image)
483 m_image->updateImageAnimationPolicy(); 483 m_image->updateImageAnimationPolicy();
484 484
485 updateLayoutObject(); 485 updateLayoutObject(imageSourceToKURL(m_element->imageSourceURL()));
486 486
487 if (m_image && m_image->image() && m_image->image()->isSVGImage()) 487 if (m_image && m_image->image() && m_image->image()->isSVGImage())
488 toSVGImage(m_image->image())->updateUseCounters(element()->document()); 488 toSVGImage(m_image->image())->updateUseCounters(element()->document());
489 489
490 if (!m_hasPendingLoadEvent) 490 if (!m_hasPendingLoadEvent)
491 return; 491 return;
492 492
493 if (resource->errorOccurred()) { 493 if (resource->errorOccurred()) {
494 loadEventSender().cancelEvent(this); 494 loadEventSender().cancelEvent(this);
495 m_hasPendingLoadEvent = false; 495 m_hasPendingLoadEvent = false;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 531
532 if (layoutObject->isSVGImage()) 532 if (layoutObject->isSVGImage())
533 return toLayoutSVGImage(layoutObject)->imageResource(); 533 return toLayoutSVGImage(layoutObject)->imageResource();
534 534
535 if (layoutObject->isVideo()) 535 if (layoutObject->isVideo())
536 return toLayoutVideo(layoutObject)->imageResource(); 536 return toLayoutVideo(layoutObject)->imageResource();
537 537
538 return 0; 538 return 0;
539 } 539 }
540 540
541 void ImageLoader::updateLayoutObject() 541 void ImageLoader::updateLayoutObject(const KURL& urlWithFragment)
542 { 542 {
543 LayoutImageResource* imageResource = layoutImageResource(); 543 LayoutImageResource* imageResource = layoutImageResource();
544 544
545 if (!imageResource) 545 if (!imageResource)
546 return; 546 return;
547 547
548 // Only update the layoutObject if it doesn't have an image or if what we ha ve 548 // Only update the layoutObject if it doesn't have an image or if what we ha ve
549 // is a complete image. This prevents flickering in the case where a dynami c 549 // is a complete image. This prevents flickering in the case where a dynami c
550 // change is happening between two images. 550 // change is happening between two images.
551 ImageResource* cachedImage = imageResource->cachedImage(); 551 ImageResource* cachedImage = imageResource->cachedImage();
552 if (m_image != cachedImage && (m_imageComplete || !cachedImage)) 552 if (m_image != cachedImage && (m_imageComplete || !cachedImage))
553 imageResource->setImageResource(m_image.get()); 553 imageResource->setImageResource(m_image.get(), urlWithFragment);
554 } 554 }
555 555
556 void ImageLoader::updatedHasPendingEvent() 556 void ImageLoader::updatedHasPendingEvent()
557 { 557 {
558 // If an Element that does image loading is removed from the DOM the load/er ror event for the image is still observable. 558 // If an Element that does image loading is removed from the DOM the load/er ror event for the image is still observable.
559 // As long as the ImageLoader is actively loading, the Element itself needs to be ref'ed to keep it from being 559 // As long as the ImageLoader is actively loading, the Element itself needs to be ref'ed to keep it from being
560 // destroyed by DOM manipulation or garbage collection. 560 // destroyed by DOM manipulation or garbage collection.
561 // If such an Element wishes for the load to stop when removed from the DOM it needs to stop the ImageLoader explicitly. 561 // If such an Element wishes for the load to stop when removed from the DOM it needs to stop the ImageLoader explicitly.
562 bool wasProtected = m_elementIsProtected; 562 bool wasProtected = m_elementIsProtected;
563 m_elementIsProtected = m_hasPendingLoadEvent || m_hasPendingErrorEvent; 563 m_elementIsProtected = m_hasPendingLoadEvent || m_hasPendingErrorEvent;
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 674
675 void ImageLoader::sourceImageChanged() 675 void ImageLoader::sourceImageChanged()
676 { 676 {
677 for (auto& client : m_clients) { 677 for (auto& client : m_clients) {
678 ImageLoaderClient* handle = client; 678 ImageLoaderClient* handle = client;
679 handle->notifyImageSourceChanged(); 679 handle->notifyImageSourceChanged();
680 } 680 }
681 } 681 }
682 682
683 } // namespace blink 683 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698