Title: [137615] trunk/Source/WebCore
Revision
137615
Author
[email protected]
Date
2012-12-13 10:48:43 -0800 (Thu, 13 Dec 2012)

Log Message

Document will never be released when an Image is created inside unload event listener
https://bugs.webkit.org/show_bug.cgi?id=104830

Patch by Yongjun Zhang <[email protected]> on 2012-12-13
Reviewed by Darin Adler.

When setting src attribute to an Image object inside unload event listener, ImageLoader will
mark it as load failure (by setting m_hasPendingErrorEvent to true) and the following call
to updatedHasPendingEvent will ref the element but won't be deref-ed since the Document is
being dismissed.  This was introduced in r131670.  To match pre r131670 behavior, we shouldn't
trigger error event for image loading when the page is being dismissed.

No new tests, there is no visual change.  Manually tested to verify documents are released by
using heap in Mac OS X.

* loader/ImageLoader.cpp:
(WebCore::pageIsBeingDismissed): add a helper function to test whether the page is being dismissed.
(WebCore::ImageLoader::updateFromElement): don't trigger error event if the page is being dismissed.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (137614 => 137615)


--- trunk/Source/WebCore/ChangeLog	2012-12-13 18:47:13 UTC (rev 137614)
+++ trunk/Source/WebCore/ChangeLog	2012-12-13 18:48:43 UTC (rev 137615)
@@ -1,3 +1,23 @@
+2012-12-13  Yongjun Zhang  <[email protected]>
+
+        Document will never be released when an Image is created inside unload event listener
+        https://bugs.webkit.org/show_bug.cgi?id=104830
+
+        Reviewed by Darin Adler.
+
+        When setting src attribute to an Image object inside unload event listener, ImageLoader will
+        mark it as load failure (by setting m_hasPendingErrorEvent to true) and the following call
+        to updatedHasPendingEvent will ref the element but won't be deref-ed since the Document is
+        being dismissed.  This was introduced in r131670.  To match pre r131670 behavior, we shouldn't
+        trigger error event for image loading when the page is being dismissed.
+
+        No new tests, there is no visual change.  Manually tested to verify documents are released by
+        using heap in Mac OS X.
+
+        * loader/ImageLoader.cpp:
+        (WebCore::pageIsBeingDismissed): add a helper function to test whether the page is being dismissed.
+        (WebCore::ImageLoader::updateFromElement): don't trigger error event if the page is being dismissed.
+
 2012-12-13  Claudio Saavedra  <[email protected]>
 
         [GTK] Add missing breaks in switch-case statements

Modified: trunk/Source/WebCore/loader/ImageLoader.cpp (137614 => 137615)


--- trunk/Source/WebCore/loader/ImageLoader.cpp	2012-12-13 18:47:13 UTC (rev 137614)
+++ trunk/Source/WebCore/loader/ImageLoader.cpp	2012-12-13 18:48:43 UTC (rev 137615)
@@ -31,6 +31,7 @@
 #include "ElementShadow.h"
 #include "Event.h"
 #include "EventSender.h"
+#include "Frame.h"
 #include "HTMLNames.h"
 #include "HTMLObjectElement.h"
 #include "HTMLParserIdioms.h"
@@ -84,6 +85,12 @@
     return sender;
 }
 
+static inline bool pageIsBeingDismissed(Document* document)
+{
+    Frame* frame = document->frame();
+    return frame && frame->loader()->pageDismissalEventBeingDispatched() != FrameLoader::NoDismissal;
+}
+
 ImageLoader::ImageLoader(ImageLoaderClient* client)
     : m_client(client)
     , m_image(0)
@@ -200,8 +207,9 @@
 
         // If we do not have an image here, it means that a cross-site
         // violation occurred, or that the image was blocked via Content
-        // Security Policy. Either way, trigger an error event.
-        if (!newImage) {
+        // Security Policy, or the page is being dismissed. Trigger an
+        // error event if the page is not being dismissed.
+        if (!newImage && !pageIsBeingDismissed(document())) {
             m_failedLoadURL = attr;
             m_hasPendingErrorEvent = true;
             errorEventSender().dispatchEventSoon(this);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to