From ad0d549d4cc13433f77c1ac8f0ab379c83d93f28 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Fri, 24 Feb 2012 16:36:50 +0100 Subject: Imported WebKit commit bb52bf3c0119e8a128cd93afe5572413a8617de9 (http://svn.webkit.org/repository/webkit/trunk@108790) --- Source/WebCore/loader/ImageLoader.cpp | 99 ++++------------------------------- 1 file changed, 11 insertions(+), 88 deletions(-) (limited to 'Source/WebCore/loader/ImageLoader.cpp') diff --git a/Source/WebCore/loader/ImageLoader.cpp b/Source/WebCore/loader/ImageLoader.cpp index 56e675145..842175b5e 100644 --- a/Source/WebCore/loader/ImageLoader.cpp +++ b/Source/WebCore/loader/ImageLoader.cpp @@ -28,6 +28,7 @@ #include "Document.h" #include "Element.h" #include "Event.h" +#include "EventSender.h" #include "HTMLNames.h" #include "HTMLObjectElement.h" #include "HTMLParserIdioms.h" @@ -62,32 +63,6 @@ template<> struct ValueCheck { namespace WebCore { -class ImageEventSender { - WTF_MAKE_NONCOPYABLE(ImageEventSender); WTF_MAKE_FAST_ALLOCATED; -public: - ImageEventSender(const AtomicString& eventType); - - void dispatchEventSoon(ImageLoader*); - void cancelEvent(ImageLoader*); - - void dispatchPendingEvents(); - -#ifndef NDEBUG - bool hasPendingEvents(ImageLoader* loader) const - { - return m_dispatchSoonList.find(loader) != notFound || m_dispatchingList.find(loader) != notFound; - } -#endif - -private: - void timerFired(Timer*); - - AtomicString m_eventType; - Timer m_timer; - Vector m_dispatchSoonList; - Vector m_dispatchingList; -}; - static ImageEventSender& beforeLoadEventSender() { DEFINE_STATIC_LOCAL(ImageEventSender, sender, (eventNames().beforeloadEvent)); @@ -302,6 +277,16 @@ void ImageLoader::updateRenderer() imageResource->setCachedImage(m_image.get()); } +void ImageLoader::dispatchPendingEvent(ImageEventSender* eventSender) +{ + ASSERT(eventSender == &beforeLoadEventSender() || eventSender == &loadEventSender()); + const AtomicString& eventType = eventSender->eventType(); + if (eventType == eventNames().beforeloadEvent) + dispatchPendingBeforeLoadEvent(); + if (eventType == eventNames().loadEvent) + dispatchPendingLoadEvent(); +} + void ImageLoader::dispatchPendingBeforeLoadEvent() { if (m_firedBeforeLoad) @@ -354,66 +339,4 @@ void ImageLoader::elementDidMoveToNewDocument() setImage(0); } -ImageEventSender::ImageEventSender(const AtomicString& eventType) - : m_eventType(eventType) - , m_timer(this, &ImageEventSender::timerFired) -{ -} - -void ImageEventSender::dispatchEventSoon(ImageLoader* loader) -{ - m_dispatchSoonList.append(loader); - if (!m_timer.isActive()) - m_timer.startOneShot(0); -} - -void ImageEventSender::cancelEvent(ImageLoader* loader) -{ - // Remove instances of this loader from both lists. - // Use loops because we allow multiple instances to get into the lists. - size_t size = m_dispatchSoonList.size(); - for (size_t i = 0; i < size; ++i) { - if (m_dispatchSoonList[i] == loader) - m_dispatchSoonList[i] = 0; - } - size = m_dispatchingList.size(); - for (size_t i = 0; i < size; ++i) { - if (m_dispatchingList[i] == loader) - m_dispatchingList[i] = 0; - } - if (m_dispatchSoonList.isEmpty()) - m_timer.stop(); -} - -void ImageEventSender::dispatchPendingEvents() -{ - // Need to avoid re-entering this function; if new dispatches are - // scheduled before the parent finishes processing the list, they - // will set a timer and eventually be processed. - if (!m_dispatchingList.isEmpty()) - return; - - m_timer.stop(); - - m_dispatchSoonList.checkConsistency(); - - m_dispatchingList.swap(m_dispatchSoonList); - size_t size = m_dispatchingList.size(); - for (size_t i = 0; i < size; ++i) { - if (ImageLoader* loader = m_dispatchingList[i]) { - m_dispatchingList[i] = 0; - if (m_eventType == eventNames().beforeloadEvent) - loader->dispatchPendingBeforeLoadEvent(); - else - loader->dispatchPendingLoadEvent(); - } - } - m_dispatchingList.clear(); -} - -void ImageEventSender::timerFired(Timer*) -{ - dispatchPendingEvents(); -} - } -- cgit v1.2.1