2011-04-29 Geoffrey Garen <ggaren@apple.com>
[WebKit-https.git] / Source / WebCore / bindings / js / JSNodeCustom.cpp
index be0a7a1..43f4f66 100644 (file)
@@ -27,6 +27,8 @@
 #include "JSNode.h"
 
 #include "Attr.h"
+#include "CachedImage.h"
+#include "CachedScript.h"
 #include "CDATASection.h"
 #include "Comment.h"
 #include "Document.h"
@@ -103,18 +105,20 @@ static inline bool isObservable(JSNode* jsNode, Node* node)
 static inline bool isReachableFromDOM(JSNode* jsNode, Node* node, SlotVisitor& visitor)
 {
     if (!node->inDocument()) {
-        // If a wrapper is the last reference to an image or script element
+        // If a wrapper is the last reference to an image element
         // that is loading but not in the document, the wrapper is observable
         // because it is the only thing keeping the image element alive, and if
-        // the image element is destroyed, its load event will not fire.
+        // the element is destroyed, its load event will not fire.
         // FIXME: The DOM should manage this issue without the help of JavaScript wrappers.
-        if (node->hasTagName(imgTag) && !static_cast<HTMLImageElement*>(node)->haveFiredLoadEvent())
-            return true;
-        if (node->hasTagName(scriptTag) && !static_cast<HTMLScriptElement*>(node)->haveFiredLoadEvent())
-            return true;
+        if (node->hasTagName(imgTag)) {
+            if (static_cast<HTMLImageElement*>(node)->hasPendingActivity())
+                return true;
+        }
     #if ENABLE(VIDEO)
-        if (node->hasTagName(audioTag) && !static_cast<HTMLAudioElement*>(node)->paused())
-            return true;
+        else if (node->hasTagName(audioTag)) {
+            if (!static_cast<HTMLAudioElement*>(node)->paused())
+                return true;
+        }
     #endif
 
         // If a node is firing event listeners, its wrapper is observable because