Reviewed by Chris
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 30 Nov 2004 00:07:04 +0000 (00:07 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 30 Nov 2004 00:07:04 +0000 (00:07 +0000)
commit037fdf0f2129e362c300d8430a59e7963753e916
tree93aeb9fea06bd5e82f564e3094b289f0116937c6
parentf7bf6f0159667394ae287760fdb4c57f366e3893
    Reviewed by Chris

        Rewrite of paste code (specifically the ReplaceSelectionCommand class). Many more cases
        are handled correctly now, including selections that span multiple blocks, and cases
        where content on the pasteboard ends in newlines (or what appear to be newlines to a
        user, really block ends or BRs). I also made one small, but important change in the
        copy code to annotate the markup written to the pasteboard to support these selections
        ending in newlines.

        New header that defines a couple of constants used in copying and pasting.

        * ForwardingHeaders/editing/html_interchange.h: Added.
        * khtml/editing/html_interchange.h: Added.

        Rewrite of the ReplaceSelectionCommand. There are several new helper functions, as well
        as a new helper class, ReplacementFragment, which encapsulates information and functions
        pertaining to a document fragment that is being inserted into a document.

        * khtml/editing/htmlediting.cpp:
        (khtml::ReplacementFragment::ReplacementFragment):
        (khtml::ReplacementFragment::~ReplacementFragment):
        (khtml::ReplacementFragment::firstChild): Simple accessor.
        (khtml::ReplacementFragment::lastChild): Ditto.
        (khtml::ReplacementFragment::mergeStartNode): Looks at the nodes in a fragment and determines
        the starting node to use for merging into the block containing the start of the selection.
        (khtml::ReplacementFragment::mergeEndNode): Same as above, but for the end of the selection.
        (khtml::ReplacementFragment::pruneEmptyNodes): Simple helper.
        (khtml::ReplacementFragment::isInterchangeNewlineComment): Determines if a node is the
        special annotation comment added in by the copy code.
        (khtml::ReplacementFragment::removeNode): Simple helper.
        (khtml::isComment): Simple helper.
        (khtml::isProbablyBlock): Determines if a node is of a type that is usually rendered as a block.
        I would like to do better than this some day, but this check will hold us until I can do better.
        (khtml::ReplaceSelectionCommand::ReplaceSelectionCommand):
        (khtml::ReplaceSelectionCommand::~ReplaceSelectionCommand):
        (khtml::ReplaceSelectionCommand::doApply):
        (khtml::ReplaceSelectionCommand::completeHTMLReplacement): Figures out the right ending selection.
        * khtml/editing/htmlediting.h: Declarations for the new ReplacementFragment class.
        (khtml::ReplacementFragment::root):
        (khtml::ReplacementFragment::type):
        (khtml::ReplacementFragment::isEmpty):
        (khtml::ReplacementFragment::isSingleTextNode):
        (khtml::ReplacementFragment::isTreeFragment):
        (khtml::ReplacementFragment::hasMoreThanOneBlock):
        (khtml::ReplacementFragment::hasLogicalNewlineAtEnd):

        This smaller set of changes markup generation to add the newline annotation described in the
        comment at the start of this entry.

        * khtml/xml/dom2_rangeimpl.cpp:
        (DOM::RangeImpl::addCommentToHTMLMarkup): Simple helper.
        (DOM::RangeImpl::toHTML): Added new EAnnotateForInterchange default argument to control whether
        comment annotations are added to the markup generated.
        * khtml/xml/dom2_rangeimpl.h: Add some new declarations.
        * kwq/WebCoreBridge.mm:
        (-[WebCoreBridge markupStringFromRange:nodes:]): Request that markup resulting from call to
        DOM::RangeImpl::toHTML uses annotations when generating.

        New tests.

        * layout-tests/editing/pasteboard/paste-text-001-expected.txt: Added.
        * layout-tests/editing/pasteboard/paste-text-001.html: Added.
        * layout-tests/editing/pasteboard/paste-text-002-expected.txt: Added.
        * layout-tests/editing/pasteboard/paste-text-002.html: Added.
        * layout-tests/editing/pasteboard/paste-text-003-expected.txt: Added.
        * layout-tests/editing/pasteboard/paste-text-003.html: Added.
        * layout-tests/editing/pasteboard/paste-text-004-expected.txt: Added.
        * layout-tests/editing/pasteboard/paste-text-004.html: Added.
        * layout-tests/editing/pasteboard/paste-text-005-expected.txt: Added.
        * layout-tests/editing/pasteboard/paste-text-005.html: Added.
        * layout-tests/editing/pasteboard/paste-text-006-expected.txt: Added.
        * layout-tests/editing/pasteboard/paste-text-006.html: Added.
        * layout-tests/editing/pasteboard/paste-text-007-expected.txt: Added.
        * layout-tests/editing/pasteboard/paste-text-007.html: Added.
        * layout-tests/editing/pasteboard/paste-text-008-expected.txt: Added.
        * layout-tests/editing/pasteboard/paste-text-008.html: Added.
        * layout-tests/editing/pasteboard/paste-text-009-expected.txt: Added.
        * layout-tests/editing/pasteboard/paste-text-009.html: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@8087 268f45cc-cd09-0410-ab3c-d52691b4dbfc
26 files changed:
LayoutTests/editing/pasteboard/paste-text-001-expected.txt [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-001.html [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-002-expected.txt [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-002.html [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-003-expected.txt [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-003.html [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-004-expected.txt [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-004.html [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-005-expected.txt [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-005.html [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-006-expected.txt [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-006.html [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-007-expected.txt [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-007.html [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-008-expected.txt [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-008.html [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-009-expected.txt [new file with mode: 0644]
LayoutTests/editing/pasteboard/paste-text-009.html [new file with mode: 0644]
WebCore/ChangeLog-2005-08-23
WebCore/ForwardingHeaders/editing/html_interchange.h [new file with mode: 0644]
WebCore/khtml/editing/html_interchange.h [new file with mode: 0644]
WebCore/khtml/editing/htmlediting.cpp
WebCore/khtml/editing/htmlediting.h
WebCore/khtml/xml/dom2_rangeimpl.cpp
WebCore/khtml/xml/dom2_rangeimpl.h
WebCore/kwq/WebCoreBridge.mm