Bug 111228 - InsertUnorderedList can lead to lost content and assertions in moveParagraphs
Summary: InsertUnorderedList can lead to lost content and assertions in moveParagraphs
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: HTML Editing (show other bugs)
Version: 528+ (Nightly build)
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Levi Weintraub
URL: https://code.google.com/p/chromium/is...
Keywords:
Depends on:
Blocks: 118847
  Show dependency treegraph
 
Reported: 2013-03-01 15:48 PST by Levi Weintraub
Modified: 2013-07-18 11:21 PDT (History)
10 users (show)

See Also:


Attachments
Test case from crbug.com (2.96 KB, text/html)
2013-03-01 15:48 PST, Levi Weintraub
no flags Details
Patch (9.05 KB, patch)
2013-03-05 18:28 PST, Levi Weintraub
no flags Details | Formatted Diff | Diff
Patch for landing (9.06 KB, patch)
2013-03-06 10:21 PST, Levi Weintraub
no flags Details | Formatted Diff | Diff
Patch (10.05 KB, patch)
2013-03-06 13:37 PST, Levi Weintraub
no flags Details | Formatted Diff | Diff
Patch (10.70 KB, patch)
2013-03-06 15:13 PST, Levi Weintraub
no flags Details | Formatted Diff | Diff
Patch for landing (10.85 KB, patch)
2013-03-06 15:25 PST, Levi Weintraub
no flags Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Levi Weintraub 2013-03-01 15:48:30 PST
Created attachment 191055 [details]
Test case from crbug.com

ASSERTION FAILED: destination.deepEquivalent().anchorNode()->inDocument()
../../third_party/WebKit/Source/WebCore/editing/CompositeEditCommand.cpp(1220) : void WebCore::CompositeEditCommand::moveParagraphs(const WebCore::VisiblePosition&, const WebCore::V
isiblePosition&, const WebCore::VisiblePosition&, bool, bool)

#0  0x00000000025d490c in WebCore::CompositeEditCommand::moveParagraphs (this=0x25bab8595b60, startOfParagraphToMove=..., endOfParagraphToMove=..., destination=..., preserveSelectio
n=true, preserveStyle=true) at ../../third_party/WebKit/Source/WebCore/editing/CompositeEditCommand.cpp:1220
#1  0x000000000219bb04 in WebCore::InsertListCommand::unlistifyParagraph (this=0x25bab8595b60, originalStart=..., listNode=0x25bab8c0c980, listChildNode=0x25bab852b840) at ../../thi
rd_party/WebKit/Source/WebCore/editing/InsertListCommand.cpp:306
#2  0x000000000219b245 in WebCore::InsertListCommand::doApplyForSingleParagraph (this=0x25bab8595b60, forceCreateList=false, listTag=..., currentSelection=0x25bab8429ec0) at ../../t
hird_party/WebKit/Source/WebCore/editing/InsertListCommand.cpp:246
#3  0x000000000219a46f in WebCore::InsertListCommand::doApply (this=0x25bab8595b60) at ../../third_party/WebKit/Source/WebCore/editing/InsertListCommand.cpp:158
#4  0x00000000025ce45f in WebCore::CompositeEditCommand::apply (this=0x25bab8595b60) at ../../third_party/WebKit/Source/WebCore/editing/CompositeEditCommand.cpp:214
#5  0x00000000025ce18a in WebCore::applyCommand (command=...) at ../../third_party/WebKit/Source/WebCore/editing/CompositeEditCommand.cpp:170
#6  0x0000000002185f2f in WebCore::executeInsertUnorderedList (frame=0x25bab8a4dc20) at ../../third_party/WebKit/Source/WebCore/editing/EditorCommand.cpp:565
#7  0x0000000002188f83 in WebCore::Editor::Command::execute (this=0x7fffde005690, parameter=..., triggeringEvent=0x0) at ../../third_party/WebKit/Source/WebCore/editing/EditorComman
d.cpp:1700
#8  0x0000000002bcc848 in WebCore::Document::execCommand (this=0x25bab8a1b020, commandName=..., userInterface=false, value=...) at ../../third_party/WebKit/Source/WebCore/dom/Docume
nt.cpp:4185
#9  0x00000000032fff04 in WebCore::DocumentV8Internal::execCommandMethod (args=...) at gen/webcore/bindings/V8Document.cpp:2357
#10 0x00000000032fff90 in WebCore::DocumentV8Internal::execCommandMethodCallback (args=...) at gen/webcore/bindings/V8Document.cpp:2362
#11 0x000024e9ceb44d15 in ?? ()
#12 0x00007fffde005a00 in ?? ()
#13 0x00007fffde005a08 in ?? ()
#14 0x0000000000000001 in ?? ()
#15 0x0000000000000000 in ?? ()


This also shows off a separate bug where the second InsertUnorderdList command that should unlistify breaks each list item into its own list and sets the blocks to inlines.
Comment 1 Levi Weintraub 2013-03-05 15:14:35 PST
I've got a fix for this.
Comment 2 Ryosuke Niwa 2013-03-05 15:14:52 PST
(In reply to comment #1)
> I've got a fix for this.

Nice!
Comment 3 Levi Weintraub 2013-03-05 18:28:41 PST
Created attachment 191630 [details]
Patch
Comment 4 WebKit Review Bot 2013-03-05 19:25:31 PST
Comment on attachment 191630 [details]
Patch

Attachment 191630 [details] did not pass chromium-ews (chromium-xvfb):
Output: http://webkit-commit-queue.appspot.com/results/17044102

New failing tests:
fast/parser/nested-fragment-parser-crash.html
Comment 5 Levi Weintraub 2013-03-05 22:04:36 PST
Comment on attachment 191630 [details]
Patch

I don't believe that's a related crash.
Comment 6 Ryosuke Niwa 2013-03-05 22:14:15 PST
Comment on attachment 191630 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=191630&action=review

Please fix the test before you land it.

> LayoutTests/editing/execCommand/insert-remove-block-list-inside-presentational-inline.html:10
> +function styleList() {

styleList is a vague name.

> LayoutTests/editing/execCommand/insert-remove-block-list-inside-presentational-inline.html:11
> +    var newElem = document.createElement('div');

Please don't abbreviate element as elem.

> LayoutTests/editing/execCommand/insert-remove-block-list-inside-presentational-inline.html:14
> +    var textNode = document.createTextNode('x');
> +    newElem.appendChild(textNode);

We could do this in one line.

> LayoutTests/editing/execCommand/insert-remove-block-list-inside-presentational-inline.html:15
> +    root.insertBefore(newElem, root.firstChild);

Where is root coming from?

> LayoutTests/editing/execCommand/insert-remove-block-list-inside-presentational-inline.html:22
> +		testRunner.dumpAsText();

Nit: tab. cq-.

> LayoutTests/editing/execCommand/insert-remove-block-list-inside-presentational-inline.html:26
> +	root.offsetHeight;

Why do we need to force layout here? SelectAll is going to do that anyways

> LayoutTests/editing/execCommand/insert-remove-block-list-inside-presentational-inline.html:34
> +	finalMarkup = root.innerHTML;
> +	listIsRemoved = finalMarkup.indexOf("ul") == -1;

Why don't you just check document.getElementsByTagName('ul').length == 0 instead?

> LayoutTests/editing/execCommand/insert-remove-block-list-inside-presentational-inline.html:38
> +		root.parentNode.removeChild(root);

Nit: tab.
Comment 7 Levi Weintraub 2013-03-05 22:15:36 PST
Thanks for the review!
Comment 8 Build Bot 2013-03-06 00:09:03 PST
Comment on attachment 191630 [details]
Patch

Attachment 191630 [details] did not pass mac-wk2-ews (mac-wk2):
Output: http://webkit-commit-queue.appspot.com/results/17011018

New failing tests:
fast/parser/nested-fragment-parser-crash.html
plugins/plugin-clip-subframe.html
Comment 9 Levi Weintraub 2013-03-06 10:21:04 PST
Created attachment 191784 [details]
Patch for landing
Comment 10 WebKit Review Bot 2013-03-06 10:29:56 PST
Comment on attachment 191784 [details]
Patch for landing

Rejecting attachment 191784 [details] from commit-queue.

Failed to run "['/mnt/git/webkit-commit-queue/Tools/Scripts/webkit-patch', '--status-host=webkit-commit-queue.appspot.com', '--bot-id=gce-cq-04', 'apply-attachment', '--no-update', '--non-interactive', 191784, '--port=chromium-xvfb']" exit_code: 1 cwd: /mnt/git/webkit-commit-queue

Last 500 characters of output:
  return self.open(self.click(*args, **kwds))
  File "/mnt/git/webkit-commit-queue/Tools/Scripts/webkitpy/thirdparty/autoinstalled/mechanize/_mechanize.py", line 203, in open
    return self._mech_open(url, data, timeout=timeout)
  File "/mnt/git/webkit-commit-queue/Tools/Scripts/webkitpy/thirdparty/autoinstalled/mechanize/_mechanize.py", line 255, in _mech_open
    raise response
webkitpy.thirdparty.autoinstalled.mechanize._response.httperror_seek_wrapper: HTTP Error 500: Internal Server Error

Full output: http://webkit-commit-queue.appspot.com/results/17086088
Comment 11 WebKit Review Bot 2013-03-06 11:14:43 PST
Comment on attachment 191784 [details]
Patch for landing

Attachment 191784 [details] did not pass chromium-ews (chromium-xvfb):
Output: http://webkit-commit-queue.appspot.com/results/17009341

New failing tests:
fast/parser/nested-fragment-parser-crash.html
Comment 12 Build Bot 2013-03-06 12:50:27 PST
Comment on attachment 191784 [details]
Patch for landing

Attachment 191784 [details] did not pass mac-wk2-ews (mac-wk2):
Output: http://webkit-commit-queue.appspot.com/results/17050246

New failing tests:
fast/parser/nested-fragment-parser-crash.html
Comment 13 Levi Weintraub 2013-03-06 13:37:04 PST
Created attachment 191822 [details]
Patch
Comment 14 Levi Weintraub 2013-03-06 13:37:41 PST
That failure was actually legitimate and needed another 1-line change. Ryosuke, can you take another look?
Comment 15 Ryosuke Niwa 2013-03-06 14:34:17 PST
Comment on attachment 191822 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=191822&action=review

> Source/WebCore/editing/EditingStyle.cpp:196
> -    return style->getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect) || style->getPropertyCSSValue(CSSPropertyTextDecoration);
> +    return style && (style->getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect) || style->getPropertyCSSValue(CSSPropertyTextDecoration));

This doesn't look right. We need to check the nullity in its caller instead.
Comment 16 Levi Weintraub 2013-03-06 14:37:10 PST
Comment on attachment 191822 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=191822&action=review

>> Source/WebCore/editing/EditingStyle.cpp:196
>> +    return style && (style->getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect) || style->getPropertyCSSValue(CSSPropertyTextDecoration));
> 
> This doesn't look right. We need to check the nullity in its caller instead.

It matches the other version. See: HTMLElementEquivalent::propertyExistsInStyle. There are only 5 callers, all in EditingStyle. If you want I can fix all of them to do this null check.
Comment 17 Ryosuke Niwa 2013-03-06 14:41:25 PST
Comment on attachment 191822 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=191822&action=review

>>> Source/WebCore/editing/EditingStyle.cpp:196
>>> +    return style && (style->getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect) || style->getPropertyCSSValue(CSSPropertyTextDecoration));
>> 
>> This doesn't look right. We need to check the nullity in its caller instead.
> 
> It matches the other version. See: HTMLElementEquivalent::propertyExistsInStyle. There are only 5 callers, all in EditingStyle. If you want I can fix all of them to do this null check.

That's wrong :( We need to remove that null check and move it elsewhere.
conflictsWithImplicitStyleOfAttributes and extractConflictingImplicitStyleOfAttributes already ensures style is not null.
So we just need to update elementMatchesAndPropertyIsNotInInlineStyleDecl.
Comment 18 Levi Weintraub 2013-03-06 15:13:14 PST
Created attachment 191843 [details]
Patch
Comment 19 Ryosuke Niwa 2013-03-06 15:14:49 PST
Comment on attachment 191843 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=191843&action=review

> Source/WebCore/editing/EditingStyle.cpp:131
> -    virtual bool propertyExistsInStyle(const StylePropertySet* style) const { return style && style->getPropertyCSSValue(m_propertyID); }
> +    virtual bool propertyExistsInStyle(const StylePropertySet* style) const { return style->getPropertyCSSValue(m_propertyID); }

You're missing a change log entry for this function.
Comment 20 Levi Weintraub 2013-03-06 15:19:31 PST
Comment on attachment 191843 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=191843&action=review

>> Source/WebCore/editing/EditingStyle.cpp:131
>> +    virtual bool propertyExistsInStyle(const StylePropertySet* style) const { return style->getPropertyCSSValue(m_propertyID); }
> 
> You're missing a change log entry for this function.

Will do.
Comment 21 Levi Weintraub 2013-03-06 15:25:34 PST
Created attachment 191850 [details]
Patch for landing
Comment 22 WebKit Review Bot 2013-03-06 16:09:08 PST
Comment on attachment 191850 [details]
Patch for landing

Clearing flags on attachment: 191850

Committed r144995: <http://trac.webkit.org/changeset/144995>
Comment 23 WebKit Review Bot 2013-03-06 16:09:13 PST
All reviewed patches have been landed.  Closing bug.
Comment 24 Antoine Quint 2013-07-18 06:10:14 PDT
This caused https://bugs.webkit.org/show_bug.cgi?id=118847.