Title: [121388] trunk
Revision
121388
Author
dch...@chromium.org
Date
2012-06-27 17:09:03 -0700 (Wed, 27 Jun 2012)

Log Message

Fix crash in Frame::nodeImage.
https://bugs.webkit.org/show_bug.cgi?id=89911

Reviewed by Abhishek Arya.

Source/WebCore:

We were caching a pointer to a RenderObject and then calling updateLayout(). Instead, we
need to get a pointer to the RenderObject again after updateLayout().

Test: fast/events/drag-display-none-element.html

* page/Frame.cpp:
(WebCore::Frame::nodeImage):
* page/mac/FrameMac.mm:
(WebCore::Frame::snapshotDragImage):
(WebCore::Frame::nodeImage):

LayoutTests:

* fast/events/drag-display-none-element-expected.txt: Added.
* fast/events/drag-display-none-element.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (121387 => 121388)


--- trunk/LayoutTests/ChangeLog	2012-06-28 00:04:32 UTC (rev 121387)
+++ trunk/LayoutTests/ChangeLog	2012-06-28 00:09:03 UTC (rev 121388)
@@ -1,3 +1,13 @@
+2012-06-27  Daniel Cheng  <dch...@chromium.org>
+
+        Fix crash in Frame::nodeImage.
+        https://bugs.webkit.org/show_bug.cgi?id=89911
+
+        Reviewed by Abhishek Arya.
+
+        * fast/events/drag-display-none-element-expected.txt: Added.
+        * fast/events/drag-display-none-element.html: Added.
+
 2012-06-27  Tony Chang  <t...@chromium.org>
 
         Unreviewed, rolling out r121380.

Added: trunk/LayoutTests/fast/events/drag-display-none-element-expected.txt (0 => 121388)


--- trunk/LayoutTests/fast/events/drag-display-none-element-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/events/drag-display-none-element-expected.txt	2012-06-28 00:09:03 UTC (rev 121388)
@@ -0,0 +1,2 @@
+To test, try dragging this div around. It shouldn't crash, and PASS should appear below when you end the drag.
+PASS
Property changes on: trunk/LayoutTests/fast/events/drag-display-none-element-expected.txt
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/fast/events/drag-display-none-element.html (0 => 121388)


--- trunk/LayoutTests/fast/events/drag-display-none-element.html	                        (rev 0)
+++ trunk/LayoutTests/fast/events/drag-display-none-element.html	2012-06-28 00:09:03 UTC (rev 121388)
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+#dragme:-webkit-drag
+{
+    display: none;
+}
+</style>
+<script>
+function runTest()
+{
+    var dragme = document.getElementById('dragme');
+    dragme.addEventListener('dragend', function () {
+        if (window.testRunner)
+            testRunner.notifyDone();
+        document.getElementById('console').appendChild(document.createTextNode('PASS'));
+    });
+
+    if (!window.testRunner)
+        return;
+
+    testRunner.waitUntilDone();
+    testRunner.dumpAsText();
+
+    eventSender.mouseMoveTo(dragme.offsetLeft + dragme.offsetWidth / 2, dragme.offsetTop + dragme.offsetHeight / 2);
+    eventSender.mouseDown();
+    eventSender.leapForward(100);
+    eventSender.mouseMoveTo(0, 0);
+    eventSender.mouseUp();
+}
+window.addEventListener('load', runTest);
+</script>
+</head>
+<body>
+<div id="dragme" draggable="true">To test, try dragging this div around. It shouldn't crash, and PASS should appear below when you end the drag.</div>
+<div id="console"></div>
+</body>
+</html>
Property changes on: trunk/LayoutTests/fast/events/drag-display-none-element.html
___________________________________________________________________

Added: svn:eol-style

Modified: trunk/Source/WebCore/ChangeLog (121387 => 121388)


--- trunk/Source/WebCore/ChangeLog	2012-06-28 00:04:32 UTC (rev 121387)
+++ trunk/Source/WebCore/ChangeLog	2012-06-28 00:09:03 UTC (rev 121388)
@@ -1,3 +1,21 @@
+2012-06-27  Daniel Cheng  <dch...@chromium.org>
+
+        Fix crash in Frame::nodeImage.
+        https://bugs.webkit.org/show_bug.cgi?id=89911
+
+        Reviewed by Abhishek Arya.
+
+        We were caching a pointer to a RenderObject and then calling updateLayout(). Instead, we
+        need to get a pointer to the RenderObject again after updateLayout().
+
+        Test: fast/events/drag-display-none-element.html
+
+        * page/Frame.cpp:
+        (WebCore::Frame::nodeImage):
+        * page/mac/FrameMac.mm:
+        (WebCore::Frame::snapshotDragImage):
+        (WebCore::Frame::nodeImage):
+
 2012-06-27  Tony Chang  <t...@chromium.org>
 
         Unreviewed, rolling out r121380.

Modified: trunk/Source/WebCore/page/Frame.cpp (121387 => 121388)


--- trunk/Source/WebCore/page/Frame.cpp	2012-06-28 00:04:32 UTC (rev 121387)
+++ trunk/Source/WebCore/page/Frame.cpp	2012-06-28 00:09:03 UTC (rev 121388)
@@ -1047,38 +1047,39 @@
 
 #if !PLATFORM(MAC) && !PLATFORM(WIN)
 struct ScopedFramePaintingState {
-    ScopedFramePaintingState(Frame* theFrame, RenderObject* theRenderer)
-        : frame(theFrame)
-        , renderer(theRenderer)
+    ScopedFramePaintingState(Frame* frame, Node* node)
+        : frame(frame)
+        , node(node)
         , paintBehavior(frame->view()->paintBehavior())
         , backgroundColor(frame->view()->baseBackgroundColor())
     {
+        ASSERT(!node || node->renderer());
+        if (node)
+            node->renderer()->updateDragState(true);
     }
 
     ~ScopedFramePaintingState()
     {
-        if (renderer)
-            renderer->updateDragState(false);
+        if (node && node->renderer())
+            node->renderer()->updateDragState(false);
         frame->view()->setPaintBehavior(paintBehavior);
         frame->view()->setBaseBackgroundColor(backgroundColor);
         frame->view()->setNodeToDraw(0);
     }
 
     Frame* frame;
-    RenderObject* renderer;
+    Node* node;
     PaintBehavior paintBehavior;
     Color backgroundColor;
 };
 
 DragImageRef Frame::nodeImage(Node* node)
 {
-    RenderObject* renderer = node->renderer();
-    if (!renderer)
+    if (!node->renderer())
         return 0;
 
-    const ScopedFramePaintingState state(this, renderer);
+    const ScopedFramePaintingState state(this, node);
 
-    renderer->updateDragState(true);
     m_view->setPaintBehavior(state.paintBehavior | PaintBehaviorFlattenCompositingLayers);
 
     // When generating the drag image for an element, ignore the document background.
@@ -1086,6 +1087,11 @@
     m_doc->updateLayout();
     m_view->setNodeToDraw(node); // Enable special sub-tree drawing mode.
 
+    // Document::updateLayout may have blown away the original RenderObject.
+    RenderObject* renderer = node->renderer();
+    if (!renderer)
+      return 0;
+
     LayoutRect topLevelRect;
     IntRect paintingRect = pixelSnappedIntRect(renderer->paintingRootRect(topLevelRect));
 

Modified: trunk/Source/WebCore/page/mac/FrameMac.mm (121387 => 121388)


--- trunk/Source/WebCore/page/mac/FrameMac.mm	2012-06-28 00:04:32 UTC (rev 121387)
+++ trunk/Source/WebCore/page/mac/FrameMac.mm	2012-06-28 00:09:03 UTC (rev 121388)
@@ -157,6 +157,13 @@
     renderer->updateDragState(true);    // mark dragged nodes (so they pick up the right CSS)
     m_doc->updateLayout();        // forces style recalc - needed since changing the drag state might
                                         // imply new styles, plus JS could have changed other things
+
+
+    // Document::updateLayout may have blown away the original RenderObject.
+    renderer = node->renderer();
+    if (!renderer)
+        return nil;
+
     LayoutRect topLevelRect;
     NSRect paintingRect = pixelSnappedIntRect(renderer->paintingRootRect(topLevelRect));
 
@@ -175,12 +182,11 @@
 
 DragImageRef Frame::nodeImage(Node* node)
 {
+    m_doc->updateLayout(); // forces style recalc
+
     RenderObject* renderer = node->renderer();
     if (!renderer)
         return nil;
-
-    m_doc->updateLayout(); // forces style recalc
-
     LayoutRect topLevelRect;
     NSRect paintingRect = pixelSnappedIntRect(renderer->paintingRootRect(topLevelRect));
 

Modified: trunk/Source/WebCore/page/win/FrameCGWin.cpp (121387 => 121388)


--- trunk/Source/WebCore/page/win/FrameCGWin.cpp	2012-06-28 00:04:32 UTC (rev 121387)
+++ trunk/Source/WebCore/page/win/FrameCGWin.cpp	2012-06-28 00:09:03 UTC (rev 121388)
@@ -93,6 +93,8 @@
 
 DragImageRef Frame::nodeImage(Node* node)
 {
+    document()->updateLayout();
+
     RenderObject* renderer = node->renderer();
     if (!renderer)
         return 0;
@@ -100,8 +102,6 @@
     LayoutRect topLevelRect;
     IntRect paintingRect = pixelSnappedIntRect(renderer->paintingRootRect(topLevelRect));
 
-    document()->updateLayout();
-
     m_view->setNodeToDraw(node); // invoke special sub-tree drawing mode
     HBITMAP result = imageFromRect(this, paintingRect);
     m_view->setNodeToDraw(0);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to