WebCore:
authorbdakin <bdakin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 7 Nov 2006 07:15:00 +0000 (07:15 +0000)
committerbdakin <bdakin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 7 Nov 2006 07:15:00 +0000 (07:15 +0000)
        Reviewed by Hyatt.

        Fix for <rdar://problem/4820814> A crash occurs at
        WebCore::HitTestResult::spellingToolTip() when mousing down on
        iframe at www.macsurfer.com

        The bug here is that the source of the iframe is only a comment,
        and we were not properly constructing the frame because it was
        sort-of empty but not.

        * html/HTMLDocument.cpp:
        (WebCore::HTMLDocument::childAllowed): newChild is NOT allowed if
        it is a comment node.
        * html/HTMLParser.cpp:
        (WebCore::HTMLParser::handleError): if n is a comment node and
        there is no head, we create a head, insert in the document, and add
        the comment node as a child. This is what Firefox does too.
        * page/FrameView.cpp:
        (WebCore::FrameView::handleMousePressEvent): Safe-guard for the
        fix. It is possible to get a mouse event without a target node, so
        we null check it. (Of course, in the case of this bug, it should
        not have been null, but it is a good thing to check for anyway.
        * rendering/HitTestResult.cpp:
        (WebCore::HitTestResult::spellingToolTip): Null-check
        m_innerNonSharedNode.

Layout Tests:
        Reviewed by Hyatt.

        Test for <rdar://problem/4820814> A crash occurs at
        WebCore::HitTestResult::spellingToolTip() when mousing down on
        iframe at www.macsurfer.com

        * fast/frames/onlyCommentInIFrame-expected.checksum: Added.
        * fast/frames/onlyCommentInIFrame-expected.png: Added.
        * fast/frames/onlyCommentInIFrame-expected.txt: Added.
        * fast/frames/onlyCommentInIFrame.html: Added.
        * fast/frames/resources/comment.html: Added.
        * fast/frames/resources/commentX.xhtml: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@17640 268f45cc-cd09-0410-ab3c-d52691b4dbfc

12 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/frames/onlyCommentInIFrame-expected.checksum [new file with mode: 0644]
LayoutTests/fast/frames/onlyCommentInIFrame-expected.png [new file with mode: 0644]
LayoutTests/fast/frames/onlyCommentInIFrame-expected.txt [new file with mode: 0644]
LayoutTests/fast/frames/onlyCommentInIFrame.html [new file with mode: 0644]
LayoutTests/fast/frames/resources/comment.html [new file with mode: 0644]
LayoutTests/fast/frames/resources/commentX.xhtml [new file with mode: 0644]
WebCore/ChangeLog
WebCore/html/HTMLDocument.cpp
WebCore/html/HTMLParser.cpp
WebCore/page/FrameView.cpp
WebCore/rendering/HitTestResult.cpp

index 914c8da9c3d6ab042b293a8fa63137345d336bae..1a13f83d246116c047cb9a553d378e2387369965 100644 (file)
@@ -1,3 +1,18 @@
+2006-11-06  Beth Dakin  <bdakin@apple.com>
+
+        Reviewed by Hyatt.
+
+        Test for <rdar://problem/4820814> A crash occurs at 
+        WebCore::HitTestResult::spellingToolTip() when mousing down on 
+        iframe at www.macsurfer.com
+
+        * fast/frames/onlyCommentInIFrame-expected.checksum: Added.
+        * fast/frames/onlyCommentInIFrame-expected.png: Added.
+        * fast/frames/onlyCommentInIFrame-expected.txt: Added.
+        * fast/frames/onlyCommentInIFrame.html: Added.
+        * fast/frames/resources/comment.html: Added.
+        * fast/frames/resources/commentX.xhtml: Added.
+
 2006-11-06  Geoffrey Garen  <ggaren@apple.com>
 
         New results. The originals were incorrect.
diff --git a/LayoutTests/fast/frames/onlyCommentInIFrame-expected.checksum b/LayoutTests/fast/frames/onlyCommentInIFrame-expected.checksum
new file mode 100644 (file)
index 0000000..c5d7216
--- /dev/null
@@ -0,0 +1 @@
+655becf51f13d8a2827fbc4070800270
\ No newline at end of file
diff --git a/LayoutTests/fast/frames/onlyCommentInIFrame-expected.png b/LayoutTests/fast/frames/onlyCommentInIFrame-expected.png
new file mode 100644 (file)
index 0000000..9fd8d7a
Binary files /dev/null and b/LayoutTests/fast/frames/onlyCommentInIFrame-expected.png differ
diff --git a/LayoutTests/fast/frames/onlyCommentInIFrame-expected.txt b/LayoutTests/fast/frames/onlyCommentInIFrame-expected.txt
new file mode 100644 (file)
index 0000000..668b725
--- /dev/null
@@ -0,0 +1,41 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderText {#text} at (0,0) size 780x54
+        text run at (0,0) width 780: "The documents in the src attributes of the iframes below only contain comments. This test is for a bug where we would only"
+        text run at (0,18) width 773: "construct RenderViews for such iframes. We need to propery construct an empty frame instead, so the RenderView should"
+        text run at (0,36) width 502: "have a RenderBlock and RenderBody below it in the dump of the RenderTree. "
+      RenderBR {BR} at (502,50) size 0x0
+      RenderPartObject {IFRAME} at (0,54) size 784x10
+        layer at (0,0) size 767x8
+          RenderView at (0,0) size 767x6
+        layer at (0,0) size 767x8
+          RenderBlock {HTML} at (0,0) size 767x8
+            RenderBody {BODY} at (8,8) size 751x0
+      RenderText {#text} at (0,0) size 0x0
+      RenderBR {BR} at (0,0) size 0x0
+      RenderBR {BR} at (0,64) size 0x18
+      RenderPartObject {IFRAME} at (0,82) size 784x10
+        layer at (0,0) size 767x130
+          RenderView at (0,0) size 767x6
+        layer at (0,0) size 767x130
+          RenderBlock {html} at (0,0) size 767x130
+            RenderBody {body} at (8,18) size 751x94
+              RenderBlock (anonymous) at (0,0) size 751x0
+                RenderInline {parsererror} at (0,0) size 0x0 [bgcolor=#FFDDDD] [border: (2px solid #CC7777)]
+              RenderBlock (anonymous) at (0,0) size 751x94
+                RenderBlock {h3} at (0,0) size 751x22
+                  RenderText {#text} at (0,0) size 324x22
+                    text run at (0,0) width 324: "This page contains the following errors:"
+                RenderBlock {div} at (0,40) size 751x14
+                  RenderText {#text} at (0,0) size 490x14
+                    text run at (0,0) width 490: "error on line 1 at column 30: Extra content at the end of the document"
+                    text run at (490,0) width 0: " "
+                RenderBlock {h3} at (0,72) size 751x22
+                  RenderText {#text} at (0,0) size 429x22
+                    text run at (0,0) width 429: "Below is a rendering of the page up to the first error."
+              RenderBlock (anonymous) at (0,112) size 751x0
+                RenderInline {parsererror} at (0,0) size 0x0 [bgcolor=#FFDDDD] [border: (2px solid #CC7777)]
+      RenderText {#text} at (0,0) size 0x0
diff --git a/LayoutTests/fast/frames/onlyCommentInIFrame.html b/LayoutTests/fast/frames/onlyCommentInIFrame.html
new file mode 100644 (file)
index 0000000..2f9c13a
--- /dev/null
@@ -0,0 +1,11 @@
+<HTML>
+
+<BODY>
+The documents in the src attributes of the iframes below only contain comments. This test is for a bug where we would only construct RenderViews for such iframes. We need to propery construct an empty frame instead, so the RenderView should have a RenderBlock and RenderBody below it in the dump of the RenderTree.
+<br>
+<IFRAME src="resources/comment.html" width="100%" height="10"  frameborder=1 ></IFRAME>
+<br>
+<br>
+<IFRAME src="resources/commentX.xhtml" width="100%" height="10"  frameborder=1 ></IFRAME>
+
+</HTML>
\ No newline at end of file
diff --git a/LayoutTests/fast/frames/resources/comment.html b/LayoutTests/fast/frames/resources/comment.html
new file mode 100644 (file)
index 0000000..252a833
--- /dev/null
@@ -0,0 +1 @@
+<!--BBM Banner Placeholder-->
\ No newline at end of file
diff --git a/LayoutTests/fast/frames/resources/commentX.xhtml b/LayoutTests/fast/frames/resources/commentX.xhtml
new file mode 100644 (file)
index 0000000..252a833
--- /dev/null
@@ -0,0 +1 @@
+<!--BBM Banner Placeholder-->
\ No newline at end of file
index b7e3e5556456f8175a756f60f325bd015a1cbab0..19f1ce8920f93822bbdb3ce22c40b685fb87cb95 100644 (file)
@@ -1,3 +1,31 @@
+2006-11-06  Beth Dakin  <bdakin@apple.com>
+
+        Reviewed by Hyatt.
+
+        Fix for <rdar://problem/4820814> A crash occurs at 
+        WebCore::HitTestResult::spellingToolTip() when mousing down on 
+        iframe at www.macsurfer.com
+
+        The bug here is that the source of the iframe is only a comment, 
+        and we were not properly constructing the frame because it was 
+        sort-of empty but not.
+
+        * html/HTMLDocument.cpp:
+        (WebCore::HTMLDocument::childAllowed): newChild is NOT allowed if 
+        it is a comment node.
+        * html/HTMLParser.cpp:
+        (WebCore::HTMLParser::handleError): if n is a comment node and 
+        there is no head, we create a head, insert in the document, and add 
+        the comment node as a child. This is what Firefox does too. 
+        * page/FrameView.cpp:
+        (WebCore::FrameView::handleMousePressEvent): Safe-guard for the 
+        fix. It is possible to get a mouse event without a target node, so 
+        we null check it. (Of course, in the case of this bug, it should 
+        not have been null, but it is a good thing to check for anyway.
+        * rendering/HitTestResult.cpp:
+        (WebCore::HitTestResult::spellingToolTip): Null-check 
+        m_innerNonSharedNode.
+
 2006-11-06  Justin Garcia  <justin.garcia@apple.com>
 
         Reviewed by harrison
index cef8df3e69ea247d38a3a072d7b186aded75e1ad..0c851d0ada1d6bba3785d66fa5aafd01108f7443 100644 (file)
@@ -126,7 +126,7 @@ Tokenizer *HTMLDocument::createTokenizer()
 
 bool HTMLDocument::childAllowed( Node *newChild )
 {
-    return newChild->hasTagName(htmlTag) || newChild->isCommentNode();
+    return newChild->hasTagName(htmlTag);
 }
 
 PassRefPtr<Element> HTMLDocument::createElement(const String &name, ExceptionCode& ec)
index 5023ba0a4f71e50d579f09c6b2c18b9c297f0e39..bd6129bebf98805c69b0feb5eec49960e2eb2bf3 100644 (file)
@@ -305,6 +305,16 @@ bool HTMLParser::handleError(Node* n, bool flat, const AtomicString& localName,
     if (n->isTextNode()) {
         if (current->hasTagName(selectTag))
             return false;
+    } else if (n->isCommentNode() && !head) { 
+        head = new HTMLHeadElement(document);
+        e = head;
+        insertNode(e);
+        if (head) {
+            head->addChild(n);
+            if (!n->attached() && !m_fragment)
+                n->attach();
+        }
+        return true;
     } else if (n->isHTMLElement()) {
         HTMLElement* h = static_cast<HTMLElement*>(n);
         if (h->hasLocalName(trTag) || h->hasLocalName(thTag) || h->hasLocalName(tdTag)) {
index b40a136d76a7029cf897712655794041c4eee97c..d819487787a5821bcb4adf9a1eea8d82b8fe98e6 100644 (file)
@@ -595,6 +595,11 @@ void FrameView::handleMousePressEvent(const PlatformMouseEvent& mouseEvent)
     
     MouseEventWithHitTestResults mev = prepareMouseEvent(false, true, false, mouseEvent);
 
+    if (!mev.targetNode()) {
+        invalidateClick();
+        return;
+    }
+
     Frame* subframe = subframeForTargetNode(mev.targetNode());
     if (subframe && passMousePressEventToSubframe(mev, subframe)) {
         invalidateClick();
index b8550b2124fab585586daec9d1bf37015d8865e7..9e330c101573571e8e6d6b250de1f64cde5060fe 100644 (file)
@@ -129,11 +129,14 @@ String HitTestResult::spellingToolTip() const
 {
     // Return the tool tip string associated with this point, if any. Only markers associated with bad grammar
     // currently supply strings, but maybe someday markers associated with misspelled words will also.
+    if (!m_innerNonSharedNode)
+        return String();
+    
     DocumentMarker* marker = m_innerNonSharedNode->document()->markerContainingPoint(m_point, DocumentMarker::Grammar);
-    if (marker)
-        return marker->description;
+    if (!marker)
+        return String();
     
-    return String();
+    return marker->description;
 }
 
 String HitTestResult::title() const