Diff
Modified: trunk/Source/WebCore/ChangeLog (163456 => 163457)
--- trunk/Source/WebCore/ChangeLog 2014-02-05 18:11:33 UTC (rev 163456)
+++ trunk/Source/WebCore/ChangeLog 2014-02-05 18:25:26 UTC (rev 163457)
@@ -1,3 +1,56 @@
+2014-02-05 Andreas Kling <[email protected]>
+
+ CTTE: ImageLoader is always owned by an Element.
+ <https://webkit.org/b/128254>
+
+ - Codify this by making the constructor take Element& or better.
+ - Make element() return Element&.
+ - Marked HTMLImageLoader and SVGImageLoader final.
+ - Made the ImageLoader constructor protected.
+
+ Reviewed by Sam Weinig.
+
+ * html/HTMLEmbedElement.cpp:
+ (WebCore::HTMLEmbedElement::parseAttribute):
+ * html/HTMLImageElement.cpp:
+ (WebCore::HTMLImageElement::HTMLImageElement):
+ * html/HTMLImageLoader.cpp:
+ (WebCore::HTMLImageLoader::HTMLImageLoader):
+ (WebCore::HTMLImageLoader::dispatchLoadEvent):
+ (WebCore::HTMLImageLoader::sourceURI):
+ (WebCore::HTMLImageLoader::notifyFinished):
+ * html/HTMLImageLoader.h:
+ * html/HTMLInputElement.cpp:
+ (WebCore::HTMLInputElement::imageLoader):
+ * html/HTMLObjectElement.cpp:
+ (WebCore::HTMLObjectElement::parseAttribute):
+ * html/HTMLPlugInImageElement.cpp:
+ (WebCore::HTMLPlugInImageElement::startLoadingImage):
+ * html/HTMLVideoElement.cpp:
+ (WebCore::HTMLVideoElement::didAttachRenderers):
+ (WebCore::HTMLVideoElement::parseAttribute):
+ * loader/ImageLoader.cpp:
+ (WebCore::ImageLoader::ImageLoader):
+ (WebCore::ImageLoader::~ImageLoader):
+ (WebCore::ImageLoader::updateFromElement):
+ (WebCore::ImageLoader::notifyFinished):
+ (WebCore::ImageLoader::renderImageResource):
+ (WebCore::ImageLoader::updatedHasPendingEvent):
+ (WebCore::ImageLoader::timerFired):
+ (WebCore::ImageLoader::dispatchPendingBeforeLoadEvent):
+ (WebCore::ImageLoader::dispatchPendingLoadEvent):
+ (WebCore::ImageLoader::dispatchPendingErrorEvent):
+ * loader/ImageLoader.h:
+ (WebCore::ImageLoader::element):
+ * svg/SVGImageElement.cpp:
+ (WebCore::SVGImageElement::SVGImageElement):
+ * svg/SVGImageLoader.cpp:
+ (WebCore::SVGImageLoader::SVGImageLoader):
+ (WebCore::SVGImageLoader::~SVGImageLoader):
+ (WebCore::SVGImageLoader::dispatchLoadEvent):
+ (WebCore::SVGImageLoader::sourceURI):
+ * svg/SVGImageLoader.h:
+
2014-02-05 Sergio Correia <[email protected]>
SVG preserveAspectRatio=none is not honored.
Modified: trunk/Source/WebCore/html/HTMLEmbedElement.cpp (163456 => 163457)
--- trunk/Source/WebCore/html/HTMLEmbedElement.cpp 2014-02-05 18:11:33 UTC (rev 163456)
+++ trunk/Source/WebCore/html/HTMLEmbedElement.cpp 2014-02-05 18:25:26 UTC (rev 163457)
@@ -108,7 +108,7 @@
document().updateStyleIfNeeded();
if (renderer() && isImageType()) {
if (!m_imageLoader)
- m_imageLoader = adoptPtr(new HTMLImageLoader(this));
+ m_imageLoader = adoptPtr(new HTMLImageLoader(*this));
m_imageLoader->updateFromElementIgnoringPreviousError();
}
} else
Modified: trunk/Source/WebCore/html/HTMLImageElement.cpp (163456 => 163457)
--- trunk/Source/WebCore/html/HTMLImageElement.cpp 2014-02-05 18:11:33 UTC (rev 163456)
+++ trunk/Source/WebCore/html/HTMLImageElement.cpp 2014-02-05 18:25:26 UTC (rev 163457)
@@ -42,7 +42,7 @@
HTMLImageElement::HTMLImageElement(const QualifiedName& tagName, Document& document, HTMLFormElement* form)
: HTMLElement(tagName, document)
- , m_imageLoader(this)
+ , m_imageLoader(*this)
, m_form(form)
, m_compositeOperator(CompositeSourceOver)
, m_imageDevicePixelRatio(1.0f)
Modified: trunk/Source/WebCore/html/HTMLImageLoader.cpp (163456 => 163457)
--- trunk/Source/WebCore/html/HTMLImageLoader.cpp 2014-02-05 18:11:33 UTC (rev 163456)
+++ trunk/Source/WebCore/html/HTMLImageLoader.cpp 2014-02-05 18:25:26 UTC (rev 163457)
@@ -37,8 +37,8 @@
namespace WebCore {
-HTMLImageLoader::HTMLImageLoader(Element* node)
- : ImageLoader(node)
+HTMLImageLoader::HTMLImageLoader(Element& element)
+ : ImageLoader(element)
{
}
@@ -55,13 +55,13 @@
bool errorOccurred = image()->errorOccurred();
if (!errorOccurred && image()->response().httpStatusCode() >= 400)
errorOccurred = isHTMLObjectElement(element()); // An <object> considers a 404 to be an error and should fire onerror.
- element()->dispatchEvent(Event::create(errorOccurred ? eventNames().errorEvent : eventNames().loadEvent, false, false));
+ element().dispatchEvent(Event::create(errorOccurred ? eventNames().errorEvent : eventNames().loadEvent, false, false));
}
String HTMLImageLoader::sourceURI(const AtomicString& attr) const
{
#if ENABLE(DASHBOARD_SUPPORT)
- Settings* settings = element()->document().settings();
+ Settings* settings = element().document().settings();
if (settings && settings->usesDashboardBackwardCompatibilityMode() && attr.length() > 7 && attr.startsWith("url(\"") && attr.endsWith("\")"))
return attr.string().substring(5, attr.length() - 7);
#endif
@@ -73,20 +73,20 @@
{
CachedImage* cachedImage = image();
- RefPtr<Element> element = this->element();
+ Ref<Element> protect(element());
ImageLoader::notifyFinished(cachedImage);
bool loadError = cachedImage->errorOccurred() || cachedImage->response().httpStatusCode() >= 400;
if (!loadError) {
- if (!element->inDocument()) {
+ if (!element().inDocument()) {
JSC::VM* vm = JSDOMWindowBase::commonVM();
JSC::JSLockHolder lock(vm);
vm->heap.reportExtraMemoryCost(cachedImage->encodedSize());
}
}
- if (loadError && isHTMLObjectElement(element.get()))
- toHTMLObjectElement(element.get())->renderFallbackContent();
+ if (loadError && isHTMLObjectElement(element()))
+ toHTMLObjectElement(element()).renderFallbackContent();
}
}
Modified: trunk/Source/WebCore/html/HTMLImageLoader.h (163456 => 163457)
--- trunk/Source/WebCore/html/HTMLImageLoader.h 2014-02-05 18:11:33 UTC (rev 163456)
+++ trunk/Source/WebCore/html/HTMLImageLoader.h 2014-02-05 18:25:26 UTC (rev 163457)
@@ -27,9 +27,9 @@
namespace WebCore {
-class HTMLImageLoader : public ImageLoader {
+class HTMLImageLoader final : public ImageLoader {
public:
- HTMLImageLoader(Element*);
+ explicit HTMLImageLoader(Element&);
virtual ~HTMLImageLoader();
virtual void dispatchLoadEvent() override;
Modified: trunk/Source/WebCore/html/HTMLInputElement.cpp (163456 => 163457)
--- trunk/Source/WebCore/html/HTMLInputElement.cpp 2014-02-05 18:11:33 UTC (rev 163456)
+++ trunk/Source/WebCore/html/HTMLInputElement.cpp 2014-02-05 18:25:26 UTC (rev 163457)
@@ -142,7 +142,7 @@
HTMLImageLoader* HTMLInputElement::imageLoader()
{
if (!m_imageLoader)
- m_imageLoader = adoptPtr(new HTMLImageLoader(this));
+ m_imageLoader = adoptPtr(new HTMLImageLoader(*this));
return m_imageLoader.get();
}
Modified: trunk/Source/WebCore/html/HTMLObjectElement.cpp (163456 => 163457)
--- trunk/Source/WebCore/html/HTMLObjectElement.cpp 2014-02-05 18:11:33 UTC (rev 163456)
+++ trunk/Source/WebCore/html/HTMLObjectElement.cpp 2014-02-05 18:25:26 UTC (rev 163457)
@@ -120,7 +120,7 @@
setNeedsWidgetUpdate(true);
if (isImageType()) {
if (!m_imageLoader)
- m_imageLoader = adoptPtr(new HTMLImageLoader(this));
+ m_imageLoader = adoptPtr(new HTMLImageLoader(*this));
m_imageLoader->updateFromElementIgnoringPreviousError();
}
}
Modified: trunk/Source/WebCore/html/HTMLPlugInImageElement.cpp (163456 => 163457)
--- trunk/Source/WebCore/html/HTMLPlugInImageElement.cpp 2014-02-05 18:11:33 UTC (rev 163456)
+++ trunk/Source/WebCore/html/HTMLPlugInImageElement.cpp 2014-02-05 18:25:26 UTC (rev 163457)
@@ -329,7 +329,7 @@
void HTMLPlugInImageElement::startLoadingImage()
{
if (!m_imageLoader)
- m_imageLoader = adoptPtr(new HTMLImageLoader(this));
+ m_imageLoader = adoptPtr(new HTMLImageLoader(*this));
m_imageLoader->updateFromElement();
}
Modified: trunk/Source/WebCore/html/HTMLVideoElement.cpp (163456 => 163457)
--- trunk/Source/WebCore/html/HTMLVideoElement.cpp 2014-02-05 18:11:33 UTC (rev 163456)
+++ trunk/Source/WebCore/html/HTMLVideoElement.cpp 2014-02-05 18:25:26 UTC (rev 163457)
@@ -86,7 +86,7 @@
updateDisplayState();
if (shouldDisplayPosterImage()) {
if (!m_imageLoader)
- m_imageLoader = adoptPtr(new HTMLImageLoader(this));
+ m_imageLoader = adoptPtr(new HTMLImageLoader(*this));
m_imageLoader->updateFromElement();
if (renderer())
toRenderImage(renderer())->imageResource().setCachedImage(m_imageLoader->image());
@@ -125,7 +125,7 @@
#endif
if (shouldDisplayPosterImage()) {
if (!m_imageLoader)
- m_imageLoader = adoptPtr(new HTMLImageLoader(this));
+ m_imageLoader = adoptPtr(new HTMLImageLoader(*this));
m_imageLoader->updateFromElementIgnoringPreviousError();
} else {
if (renderer())
Modified: trunk/Source/WebCore/loader/ImageLoader.cpp (163456 => 163457)
--- trunk/Source/WebCore/loader/ImageLoader.cpp 2014-02-05 18:11:33 UTC (rev 163456)
+++ trunk/Source/WebCore/loader/ImageLoader.cpp 2014-02-05 18:25:26 UTC (rev 163457)
@@ -53,8 +53,7 @@
{
if (!p)
return;
- ASSERT(p->element());
- ValueCheck<WebCore::Element*>::checkConsistency(p->element());
+ ValueCheck<WebCore::Element*>::checkConsistency(&p->element());
}
};
@@ -87,7 +86,7 @@
return frame && frame->loader().pageDismissalEventBeingDispatched() != FrameLoader::NoDismissal;
}
-ImageLoader::ImageLoader(Element* element)
+ImageLoader::ImageLoader(Element& element)
: m_element(element)
, m_image(0)
, m_derefElementTimer(this, &ImageLoader::timerFired)
@@ -120,7 +119,7 @@
// If the ImageLoader is being destroyed but it is still protecting its image-loading Element,
// remove that protection here.
if (m_elementIsProtected)
- m_element->deref();
+ element().deref();
}
void ImageLoader::setImage(CachedImage* newImage)
@@ -165,11 +164,11 @@
{
// If we're not making renderers for the page, then don't load images. We don't want to slow
// down the raw HTML parsing case by loading images we don't intend to display.
- Document& document = m_element->document();
+ Document& document = element().document();
if (!document.hasLivingRenderTree())
return;
- AtomicString attr = m_element->imageSourceURL();
+ AtomicString attr = element().imageSourceURL();
if (attr == m_failedLoadURL)
return;
@@ -179,9 +178,9 @@
CachedResourceHandle<CachedImage> newImage = 0;
if (!attr.isNull() && !stripLeadingAndTrailingHTMLSpaces(attr).isEmpty()) {
CachedResourceRequest request(ResourceRequest(document.completeURL(sourceURI(attr))));
- request.setInitiator(element());
+ request.setInitiator(&element());
- String crossOriginMode = m_element->fastGetAttribute(HTMLNames::crossoriginAttr);
+ String crossOriginMode = element().fastGetAttribute(HTMLNames::crossoriginAttr);
if (!crossOriginMode.isNull()) {
StoredCredentials allowCredentials = equalIgnoringCase(crossOriginMode, "use-credentials") ? AllowStoredCredentials : DoNotAllowStoredCredentials;
updateRequestForAccessControl(request.mutableResourceRequest(), document.securityOrigin(), allowCredentials);
@@ -284,9 +283,9 @@
if (!m_hasPendingLoadEvent)
return;
- if (m_element->fastHasAttribute(HTMLNames::crossoriginAttr)
- && !m_element->document().securityOrigin()->canRequest(image()->response().url())
- && !resource->passesAccessControlCheck(m_element->document().securityOrigin())) {
+ if (element().fastHasAttribute(HTMLNames::crossoriginAttr)
+ && !element().document().securityOrigin()->canRequest(image()->response().url())
+ && !resource->passesAccessControlCheck(element().document().securityOrigin())) {
setImageWithoutConsideringPendingLoadEvent(0);
@@ -294,7 +293,7 @@
errorEventSender().dispatchEventSoon(this);
DEFINE_STATIC_LOCAL(String, consoleMessage, (ASCIILiteral("Cross-origin image load denied by Cross-Origin Resource Sharing policy.")));
- m_element->document().addConsoleMessage(SecurityMessageSource, ErrorMessageLevel, consoleMessage);
+ element().document().addConsoleMessage(SecurityMessageSource, ErrorMessageLevel, consoleMessage);
ASSERT(!m_hasPendingLoadEvent);
@@ -317,7 +316,7 @@
RenderImageResource* ImageLoader::renderImageResource()
{
- auto renderer = m_element->renderer();
+ auto renderer = element().renderer();
if (!renderer)
return nullptr;
@@ -367,7 +366,7 @@
if (m_derefElementTimer.isActive())
m_derefElementTimer.stop();
else
- m_element->ref();
+ element().ref();
} else {
ASSERT(!m_derefElementTimer.isActive());
m_derefElementTimer.startOneShot(0);
@@ -376,7 +375,7 @@
void ImageLoader::timerFired(Timer<ImageLoader>&)
{
- m_element->deref();
+ element().deref();
}
void ImageLoader::dispatchPendingEvent(ImageEventSender* eventSender)
@@ -397,10 +396,10 @@
return;
if (!m_image)
return;
- if (!m_element->document().hasLivingRenderTree())
+ if (!element().document().hasLivingRenderTree())
return;
m_hasPendingBeforeLoadEvent = false;
- if (m_element->dispatchBeforeLoadEvent(m_image->url())) {
+ if (element().dispatchBeforeLoadEvent(m_image->url())) {
updateRenderer();
return;
}
@@ -412,8 +411,8 @@
loadEventSender().cancelEvent(this);
m_hasPendingLoadEvent = false;
- if (isHTMLObjectElement(m_element))
- toHTMLObjectElement(m_element)->renderFallbackContent();
+ if (isHTMLObjectElement(element()))
+ toHTMLObjectElement(element()).renderFallbackContent();
// Only consider updating the protection ref-count of the Element immediately before returning
// from this function as doing so might result in the destruction of this ImageLoader.
@@ -427,7 +426,7 @@
if (!m_image)
return;
m_hasPendingLoadEvent = false;
- if (m_element->document().hasLivingRenderTree())
+ if (element().document().hasLivingRenderTree())
dispatchLoadEvent();
// Only consider updating the protection ref-count of the Element immediately before returning
@@ -440,8 +439,8 @@
if (!m_hasPendingErrorEvent)
return;
m_hasPendingErrorEvent = false;
- if (m_element->document().hasLivingRenderTree())
- m_element->dispatchEvent(Event::create(eventNames().errorEvent, false, false));
+ if (element().document().hasLivingRenderTree())
+ element().dispatchEvent(Event::create(eventNames().errorEvent, false, false));
// Only consider updating the protection ref-count of the Element immediately before returning
// from this function as doing so might result in the destruction of this ImageLoader.
Modified: trunk/Source/WebCore/loader/ImageLoader.h (163456 => 163457)
--- trunk/Source/WebCore/loader/ImageLoader.h 2014-02-05 18:11:33 UTC (rev 163456)
+++ trunk/Source/WebCore/loader/ImageLoader.h 2014-02-05 18:25:26 UTC (rev 163457)
@@ -39,7 +39,6 @@
class ImageLoader : public CachedImageClient {
public:
- explicit ImageLoader(Element*);
virtual ~ImageLoader();
// This function should be called when the element is attached to a document; starts
@@ -52,7 +51,9 @@
void elementDidMoveToNewDocument();
- Element* element() const { return m_element; }
+ Element& element() { return m_element; }
+ const Element& element() const { return m_element; }
+
bool imageComplete() const { return m_imageComplete; }
CachedImage* image() const { return m_image.get(); }
@@ -70,6 +71,7 @@
static void dispatchPendingErrorEvents();
protected:
+ explicit ImageLoader(Element&);
virtual void notifyFinished(CachedResource*) override;
private:
@@ -90,7 +92,7 @@
void timerFired(Timer<ImageLoader>&);
- Element* m_element;
+ Element& m_element;
CachedResourceHandle<CachedImage> m_image;
Timer<ImageLoader> m_derefElementTimer;
AtomicString m_failedLoadURL;
Modified: trunk/Source/WebCore/svg/SVGImageElement.cpp (163456 => 163457)
--- trunk/Source/WebCore/svg/SVGImageElement.cpp 2014-02-05 18:11:33 UTC (rev 163456)
+++ trunk/Source/WebCore/svg/SVGImageElement.cpp 2014-02-05 18:25:26 UTC (rev 163457)
@@ -60,7 +60,7 @@
, m_y(LengthModeHeight)
, m_width(LengthModeWidth)
, m_height(LengthModeHeight)
- , m_imageLoader(this)
+ , m_imageLoader(*this)
{
registerAnimatedPropertiesForSVGImageElement();
}
Modified: trunk/Source/WebCore/svg/SVGImageLoader.cpp (163456 => 163457)
--- trunk/Source/WebCore/svg/SVGImageLoader.cpp 2014-02-05 18:11:33 UTC (rev 163456)
+++ trunk/Source/WebCore/svg/SVGImageLoader.cpp 2014-02-05 18:25:26 UTC (rev 163457)
@@ -25,33 +25,35 @@
#include "Event.h"
#include "EventNames.h"
#include "HTMLParserIdioms.h"
-#include "RenderImage.h"
#include "SVGImageElement.h"
namespace WebCore {
-SVGImageLoader::SVGImageLoader(SVGImageElement* node)
- : ImageLoader(node)
+SVGImageLoader::SVGImageLoader(SVGImageElement& element)
+ : ImageLoader(element)
{
}
+SVGImageLoader::~SVGImageLoader()
+{
+}
+
void SVGImageLoader::dispatchLoadEvent()
{
if (image()->errorOccurred())
- element()->dispatchEvent(Event::create(eventNames().errorEvent, false, false));
+ element().dispatchEvent(Event::create(eventNames().errorEvent, false, false));
else {
- SVGImageElement* imageElement = toSVGImageElement(element());
- if (imageElement->externalResourcesRequiredBaseValue())
- imageElement->sendSVGLoadEventIfPossible(true);
+ if (toSVGImageElement(element()).externalResourcesRequiredBaseValue())
+ toSVGImageElement(ImageLoader::element()).sendSVGLoadEventIfPossible(true);
}
}
String SVGImageLoader::sourceURI(const AtomicString& attribute) const
{
- URL base = element()->baseURI();
+ URL base = element().baseURI();
if (base.isValid())
return URL(base, stripLeadingAndTrailingHTMLSpaces(attribute)).string();
- return element()->document().completeURL(stripLeadingAndTrailingHTMLSpaces(attribute));
+ return element().document().completeURL(stripLeadingAndTrailingHTMLSpaces(attribute));
}
}
Modified: trunk/Source/WebCore/svg/SVGImageLoader.h (163456 => 163457)
--- trunk/Source/WebCore/svg/SVGImageLoader.h 2014-02-05 18:11:33 UTC (rev 163456)
+++ trunk/Source/WebCore/svg/SVGImageLoader.h 2014-02-05 18:25:26 UTC (rev 163457)
@@ -26,9 +26,10 @@
class SVGImageElement;
-class SVGImageLoader : public ImageLoader {
+class SVGImageLoader final : public ImageLoader {
public:
- SVGImageLoader(SVGImageElement*);
+ explicit SVGImageLoader(SVGImageElement&);
+ virtual ~SVGImageLoader();
private:
virtual void dispatchLoadEvent() override;