WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
67764
Crash in WebCore::CompositeEditCommand::insertNodeAt
https://bugs.webkit.org/show_bug.cgi?id=67764
Summary
Crash in WebCore::CompositeEditCommand::insertNodeAt
Shinya Kawanaka
Reported
2011-09-08 00:00:37 PDT
ASSERT(destination.deepEquivalent().anchorNode()->inDocument()); fails. <div contenteditable="true" id="div"><hkern><span contenteditable="false"><dl>000A0<script> var sel = window.getSelection(); sel.setPosition(div, 2000000000); document.execCommand("Delete"); </script>
Attachments
Patch
(4.01 KB, patch)
2011-09-12 14:09 PDT
,
Annie Sullivan
rniwa
: review-
Details
Formatted Diff
Diff
Proposed patch
(4.92 KB, patch)
2011-11-25 07:01 PST
,
Parag Radke
rniwa
: review-
Details
Formatted Diff
Diff
Updated Patch
(5.06 KB, patch)
2012-02-27 06:10 PST
,
Parag Radke
no flags
Details
Formatted Diff
Diff
Updated Patch
(4.64 KB, patch)
2012-02-28 07:05 PST
,
Parag Radke
no flags
Details
Formatted Diff
Diff
Updated Patch
(4.60 KB, patch)
2012-02-29 01:43 PST
,
Parag Radke
no flags
Details
Formatted Diff
Diff
Updated Patch
(4.56 KB, patch)
2012-02-29 02:37 PST
,
Parag Radke
no flags
Details
Formatted Diff
Diff
Show Obsolete
(5)
View All
Add attachment
proposed patch, testcase, etc.
Annie Sullivan
Comment 1
2011-09-09 08:31:17 PDT
I'm going to look into this today. A quick glance in the debugger shows that mergeParagraphs() gets called with the following selections (S for startParagraph, E for endParagraph, and D for destination): BODY 0x131d05cb0 SE DIV 0x131d05ff0 D HKERN 0x131d064b0 SPAN 0x131d066a0 DL 0x131d06980 #text 0x131d07230 "000A0" SCRIPT 0x131d07310 #text 0x131d07550 "\nvar sel = window.getSelection();\nsel.setPosition(div, 2000000000);\ndocument.execCommand("Delete");\n" afterChildren, offset:0 It seems weird to merge paragraphs that aren't adjacent. What ends up happening is that cleanupAfterDeletion removes the DIV from the document entirely and then the ASSERT fires. The comments indicate that cleanupAfterDeletion is meant to help with list/table problems, so it seems like the codepath is getting called for something it wasn't intended to handle. I am also going to try and reduce this test case; I think it was generated by a fuzzer, and hopefully we don't need an svg element, a contenteditable=false span, a block tag within a span, and an invalid position to reproduce the problem.
Ryosuke Niwa
Comment 2
2011-09-09 10:22:54 PDT
Sigh... mergeParagraphs again. I personally won't spend too much time on crashes caused by mergeParagraphs because they're insanely hard to fix correctly. I'd focus on other high priority bugs if I were you.
Annie Sullivan
Comment 3
2011-09-12 14:09:57 PDT
Created
attachment 107082
[details]
Patch It looks like changing the mergeParagraphs algorithm for an edge case like this introduces a lot of risk. So this patch changes the ASSERT to an early bail, which fixes the crash.
Ryosuke Niwa
Comment 4
2011-09-12 14:14:50 PDT
Comment on
attachment 107082
[details]
Patch This is wrong. We need to fix cleanupAfterDeletion not to remove the destination.
Annie Sullivan
Comment 5
2011-09-12 14:18:27 PDT
(In reply to
comment #4
)
> (From update of
attachment 107082
[details]
) > This is wrong. We need to fix cleanupAfterDeletion not to remove the destination.
I definitely agree it's not an ideal fix. It does fix a potential crash without adding a lot of code, though. Do you think it's worth spending the time to fix this correctly? I wasn't able to reduce the test case further than what's in the layout test: <div contenteditable><hkern><span contenteditable="false">text
Ryosuke Niwa
Comment 6
2011-09-12 14:20:37 PDT
(In reply to
comment #5
)
> (In reply to
comment #4
) > > (From update of
attachment 107082
[details]
[details]) > > This is wrong. We need to fix cleanupAfterDeletion not to remove the destination. > > I definitely agree it's not an ideal fix. It does fix a potential crash without adding a lot of code, though. Do you think it's worth spending the time to fix this correctly? I wasn't able to reduce the test case further than what's in the layout test: <div contenteditable><hkern><span contenteditable="false">text
Yes. That assertion has caught us many bugs in the past, and I'm very reluctant to remove it. I'm okay with adding an early exit there in addition to the assertion but we shouldn't be removing the assertion.
Parag Radke
Comment 7
2011-11-25 07:01:38 PST
Created
attachment 116615
[details]
Proposed patch Added a check for the root editability of the parent node. If parent is not root editable, we should not remove its child and hence not prune it
Ryosuke Niwa
Comment 8
2011-11-25 11:56:21 PST
Comment on
attachment 116615
[details]
Proposed patch View in context:
https://bugs.webkit.org/attachment.cgi?id=116615&action=review
> Source/WebCore/ChangeLog:8 > + Added a check for root editability of node's parent.
You should explain why this fixes the crash and why your fix is correct.
> Source/WebCore/editing/CompositeEditCommand.cpp:232 > + if (parent && !parent->rootEditableElement())
I think what you're trying to check is that parent->isContentEditable().
> LayoutTests/ChangeLog:8 > + Added a test case for the crash-67764.
crash-67764 doesn't tell me anything about the kind of crash you're fixing. Please explain rather than giving the bug number. Also, the bug number is redundant because it's already given at line 4.
> LayoutTests/editing/deleting/delete-block-merge-contents-025.html:6 > +var sel = window.getSelection(); > +sel.setPosition(div, 2000000000); > +document.execCommand("Delete");
This should be converted to a dumpAsText test. Just do: if (window.layoutTestController) layoutTestController.dumpAsText();
Parag Radke
Comment 9
2012-02-27 06:10:26 PST
Created
attachment 129024
[details]
Updated Patch This patch is to make an early exit without removing the ASSERT.
Ryosuke Niwa
Comment 10
2012-02-27 08:10:07 PST
Comment on
attachment 129024
[details]
Updated Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=129024&action=review
r- due to the bad test description and comment.
> Source/WebCore/editing/CompositeEditCommand.cpp:1037 > + // for VisiblePositions V1 and V2, it's possible V1 != V2 but still editing code treat them as same. > + // Ref : FIXME @ Position.h :inline bool operator==(const Position& a, const Position& b)
I don't understand why the fact two VisiblePositions being treated same is resulting in this code since that's not true. I think what you meant is Position. But the fact multiple Positions can be treated as the same position is a well-known fact and doesn't deserve a comment. Instead, you should explain why you're calling rendersInDifferentPosition in this particular situation.
> LayoutTests/editing/deleting/delete-block-merge-contents-025-expected.txt:1 > +This is for bug-67764,to Pass this testcase it should not crash.
Please explain what the test is doing. Saying that it's for the
bug 67764
doesn't explain anything about the nature of the test.
Parag Radke
Comment 11
2012-02-28 07:05:27 PST
Created
attachment 129241
[details]
Updated Patch Updated patch with review comments implemented.
Ryosuke Niwa
Comment 12
2012-02-28 08:48:45 PST
Comment on
attachment 129241
[details]
Updated Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=129241&action=review
> Source/WebCore/ChangeLog:8 > + If caret position after deletion and destination position where to move paragraph
Nit: "where to move paragraph" is making this sentence more confusing. "destination position" should be clear enough.
> Source/WebCore/ChangeLog:10 > + Hence ASSERT.
The bug summary says crash though?
Parag Radke
Comment 13
2012-02-29 01:43:32 PST
Created
attachment 129416
[details]
Updated Patch Updated patch with all review comments implemented.
Ryosuke Niwa
Comment 14
2012-02-29 02:01:54 PST
Comment on
attachment 129416
[details]
Updated Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=129416&action=review
Please address nits below.
> Source/WebCore/ChangeLog:8 > + If caret position after deletion and destination position coinsides than
Nit: s/ than/, then/
> LayoutTests/editing/deleting/delete-block-merge-contents-025-expected.txt:1 > +This is to test a usecase in which caret position after deletion and the destination position where to move the paragraph, coinsides. To pass this testcase it should not crash.
Same comment about "where to move the paragraph, ".
> LayoutTests/editing/deleting/delete-block-merge-contents-025.html:1 > +<html>
No DOCTYPE?
Parag Radke
Comment 15
2012-02-29 02:37:09 PST
Created
attachment 129425
[details]
Updated Patch Updated patch with all review comments implemented.
Ryosuke Niwa
Comment 16
2012-02-29 02:41:25 PST
Comment on
attachment 129425
[details]
Updated Patch Great. Thanks for the patch! r=me.
WebKit Review Bot
Comment 17
2012-02-29 08:43:41 PST
Comment on
attachment 129425
[details]
Updated Patch Clearing flags on attachment: 129425 Committed
r109218
: <
http://trac.webkit.org/changeset/109218
>
WebKit Review Bot
Comment 18
2012-02-29 08:43:46 PST
All reviewed patches have been landed. Closing bug.
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug