2010-12-23  Ryosuke Niwa  <rniwa@webkit.org>

        Reviewed by Darin Adler.

        Selection becomes stale when CharacterData is manipulated directly
        https://bugs.webkit.org/show_bug.cgi?id=51389

        The bug was caused by SelectionController's not adjusting selection when CharacterData's
        m_data is modified by its API.

        Fixed the bug by adding textWillBeReplaced to SelectionController and calling it in
        CharacterData::textWillBeReplaced. Added newLength to setDataAndUpdate, which is passed to
        textWillBeReplaced because inserting, replacing, or removing data may require moving
        the offset of the selection end points (done by shouldRemovePositionAfterAdoptingTextReplacement).

        Also fixed the condition for determining whether or not a node intersects the selection
        in respondToNodeModification, which is extracted from nodeWillBeRemoved. The old condition
        failed to recognize certain cases when selection started and ended with non-zero offsets.

        Tests: editing/selection/character-data-mutation-crash.html
               editing/selection/character-data-mutation.html

        * dom/CharacterData.cpp:
        (WebCore::CharacterData::setData): Passes newLegnth to setDataAndUpdate.
        (WebCore::CharacterData::appendData): Ditto.
        (WebCore::CharacterData::insertData): Ditto.
        (WebCore::CharacterData::deleteData): Ditto.
        (WebCore::CharacterData::replaceData): Ditto.
        (WebCore::CharacterData::setDataAndUpdate): Added newLegnth to the argument list,
        and renamed lengthOfReplacedData to oldLength; calls textWillBeReplaced.
        * dom/CharacterData.h:
        * editing/SelectionController.cpp:
        (WebCore::removingNodeRemovesPosition): Removed indentations from blank lines.
        (WebCore::SelectionController::nodeWillBeRemoved): Calls nodeWillBeRemoved.
        (WebCore::SelectionController::respondToNodeModification): Extracted from nodeWillBeRemoved;
        fixed the logic to figure out whether a node is inside the range or not.
        (WebCore::shouldRemovePositionAfterAdoptingTextReplacement): Added.
        (WebCore::SelectionController::textWillBeReplaced): Added.
        * editing/SelectionController.h:
2010-12-23  Ryosuke Niwa  <rniwa@webkit.org>

        Reviewed by Darin Adler.

        Selection becomes stale when CharacterData is manipulated directly
        https://bugs.webkit.org/show_bug.cgi?id=51389

        Added tests to ensure WebKit adjusts or clears selection when the start container
        or the end container of the selection's first range is modified by CharacterData's API.

        Many editing tests had to be rebaselined due to different editing delegate dumps
        caused by WebKit's properly adjusting selection's offsets as editing commands modify the DOM.

        * editing/deleting/delete-by-word-001-expected.txt:
        * editing/deleting/delete-by-word-002-expected.txt:
        * editing/deleting/delete-ligature-001-expected.txt:
        * editing/deleting/delete-ligature-002-expected.txt:
        * editing/deleting/delete-ligature-003-expected.txt:
        * editing/deleting/skip-virama-001-expected.txt:
        * editing/execCommand/createLink-expected.txt:
        * editing/execCommand/hilitecolor-expected.txt:
        * editing/execCommand/unlink-expected.txt:
        * editing/inserting/insert-thai-characters-001-expected.txt:
        * editing/pasteboard/copy-in-password-field-expected.txt:
        * editing/pasteboard/paste-into-anchor-text-expected.txt:
        * editing/selection/character-data-mutation-crash-expected.txt: Added.
        * editing/selection/character-data-mutation-crash.html: Added.
        * editing/selection/character-data-mutation-expected.txt: Added.
        * editing/selection/character-data-mutation.html: Added.
        * editing/style/remove-underline-from-stylesheet-expected.txt:
        * editing/style/typing-style-003-expected.txt:
        * editing/undo/redo-style-expected.txt:
        * platform/mac/editing/deleting/collapse-whitespace-3587601-fix-expected.txt:
        * platform/mac/editing/deleting/delete-3608430-fix-expected.txt:
        * platform/mac/editing/deleting/delete-3608445-fix-expected.txt:
        * platform/mac/editing/deleting/delete-3608462-fix-expected.txt:
        * platform/mac/editing/deleting/delete-after-span-ws-001-expected.txt:
        * platform/mac/editing/deleting/delete-after-span-ws-002-expected.txt:
        * platform/mac/editing/deleting/delete-after-span-ws-003-expected.txt:
        * platform/mac/editing/deleting/delete-and-undo-expected.txt:
        * platform/mac/editing/deleting/delete-block-merge-contents-010-expected.txt:
        * platform/mac/editing/deleting/delete-block-table-expected.txt:
        * platform/mac/editing/deleting/delete-br-007-expected.txt:
        * platform/mac/editing/deleting/delete-character-001-expected.txt:
        * platform/mac/editing/deleting/delete-contiguous-ws-001-expected.txt:
        * platform/mac/editing/deleting/delete-hr-expected.txt:
        * platform/mac/editing/deleting/delete-leading-ws-001-expected.txt:
        * platform/mac/editing/deleting/delete-line-end-ws-001-expected.txt:
        * platform/mac/editing/deleting/delete-line-end-ws-002-expected.txt:
        * platform/mac/editing/deleting/delete-listitem-001-expected.txt:
        * platform/mac/editing/deleting/delete-selection-001-expected.txt:
        * platform/mac/editing/deleting/delete-tab-001-expected.txt:
        * platform/mac/editing/deleting/delete-tab-002-expected.txt:
        * platform/mac/editing/deleting/delete-tab-003-expected.txt:
        * platform/mac/editing/deleting/delete-tab-004-expected.txt:
        * platform/mac/editing/deleting/delete-trailing-ws-001-expected.txt:
        * platform/mac/editing/deleting/delete-trailing-ws-002-expected.txt:
        * platform/mac/editing/deleting/delete-ws-fixup-001-expected.txt:
        * platform/mac/editing/deleting/delete-ws-fixup-002-expected.txt:
        * platform/mac/editing/deleting/forward-delete-expected.txt:
        * platform/mac/editing/deleting/non-smart-delete-expected.txt:
        * platform/mac/editing/deleting/smart-delete-001-expected.txt:
        * platform/mac/editing/deleting/smart-delete-002-expected.txt:
        * platform/mac/editing/deleting/smart-delete-003-expected.txt:
        * platform/mac/editing/deleting/smart-delete-004-expected.txt:
        * platform/mac/editing/execCommand/insertHorizontalRule-expected.txt:
        * platform/mac/editing/input/firstrectforcharacterrange-styled-expected.txt:
        * platform/mac/editing/input/text-input-controller-expected.txt:
        * platform/mac/editing/inserting/4278698-expected.txt:
        * platform/mac/editing/inserting/editing-empty-divs-expected.txt:
        * platform/mac/editing/inserting/insert-3654864-fix-expected.txt:
        * platform/mac/editing/inserting/insert-after-delete-001-expected.txt:
        * platform/mac/editing/inserting/insert-br-003-expected.txt:
        * platform/mac/editing/inserting/insert-br-006-expected.txt:
        * platform/mac/editing/inserting/insert-br-007-expected.txt:
        * platform/mac/editing/inserting/insert-br-008-expected.txt:
        * platform/mac/editing/inserting/insert-br-009-expected.txt:
        * platform/mac/editing/inserting/insert-br-at-tabspan-002-expected.txt:
        * platform/mac/editing/inserting/insert-br-at-tabspan-003-expected.txt:
        * platform/mac/editing/inserting/insert-div-003-expected.txt:
        * platform/mac/editing/inserting/insert-div-006-expected.txt:
        * platform/mac/editing/inserting/insert-div-008-expected.txt:
        * platform/mac/editing/inserting/insert-div-024-expected.txt:
        * platform/mac/editing/inserting/insert-space-in-empty-doc-expected.txt:
        * platform/mac/editing/inserting/insert-tab-003-expected.txt:
        * platform/mac/editing/inserting/insert-text-at-tabspan-001-expected.txt:
        * platform/mac/editing/inserting/insert-text-at-tabspan-002-expected.txt:
        * platform/mac/editing/inserting/insert-text-with-newlines-expected.txt:
        * platform/mac/editing/inserting/typing-001-expected.txt:
        * platform/mac/editing/inserting/typing-002-expected.txt:
        * platform/mac/editing/inserting/typing-003-expected.txt:
        * platform/mac/editing/inserting/typing-around-br-001-expected.txt:
        * platform/mac/editing/inserting/typing-around-image-001-expected.txt:
        * platform/mac/editing/pasteboard/4076267-2-expected.txt:
        * platform/mac/editing/pasteboard/4076267-3-expected.txt:
        * platform/mac/editing/pasteboard/bad-placeholder-expected.txt:
        * platform/mac/editing/pasteboard/cut-text-001-expected.txt:
        * platform/mac/editing/pasteboard/emacs-ctrl-a-k-y-expected.txt:
        * platform/mac/editing/pasteboard/emacs-ctrl-k-y-001-expected.txt:
        * platform/mac/editing/pasteboard/interchange-newline-1-expected.txt:
        * platform/mac/editing/pasteboard/merge-end-1-expected.txt:
        * platform/mac/editing/pasteboard/merge-end-2-expected.txt:
        * platform/mac/editing/pasteboard/merge-end-4-expected.txt:
        * platform/mac/editing/pasteboard/merge-end-list-expected.txt:
        * platform/mac/editing/pasteboard/merge-end-table-expected.txt:
        * platform/mac/editing/pasteboard/paste-match-style-001-expected.txt:
        * platform/mac/editing/pasteboard/paste-text-001-expected.txt:
        * platform/mac/editing/pasteboard/paste-text-019-expected.txt:
        * platform/mac/editing/pasteboard/paste-text-at-tabspan-001-expected.txt:
        * platform/mac/editing/pasteboard/paste-text-at-tabspan-002-expected.txt:
        * platform/mac/editing/pasteboard/paste-text-at-tabspan-003-expected.txt:
        * platform/mac/editing/pasteboard/paste-xml-expected.txt:
        * platform/mac/editing/pasteboard/pasting-object-expected.txt:
        * platform/mac/editing/pasteboard/smart-paste-002-expected.txt:
        * platform/mac/editing/pasteboard/smart-paste-006-expected.txt:
        * platform/mac/editing/pasteboard/smart-paste-007-expected.txt:
        * platform/mac/editing/pasteboard/subframe-dragndrop-1-expected.txt:
        * platform/mac/editing/spelling/spelling-expected.txt:
        * platform/mac/editing/style/style-3681552-fix-001-expected.txt:
        * platform/mac/editing/style/style-3681552-fix-002-expected.txt:
        * platform/mac/editing/style/style-boundary-002-expected.txt:
        * platform/mac/editing/style/style-boundary-005-expected.txt:
        * platform/mac/editing/style/typing-style-001-expected.txt:
        * platform/mac/editing/style/typing-style-002-expected.txt:
        * platform/mac/editing/style/unbold-in-bold-expected.txt:
        * platform/mac/editing/undo/4063751-expected.txt:
        * platform/mac/editing/undo/redo-typing-001-expected.txt:
        * platform/mac/editing/undo/undo-combined-delete-boundary-expected.txt:
        * platform/mac/editing/undo/undo-combined-delete-expected.txt:
        * platform/mac/editing/undo/undo-delete-boundary-expected.txt:
        * platform/mac/editing/undo/undo-delete-expected.txt:
        * platform/mac/editing/undo/undo-forward-delete-boundary-expected.txt:
        * platform/mac/editing/undo/undo-forward-delete-expected.txt:
        * platform/mac/editing/undo/undo-misspellings-expected.txt:
        * platform/mac/editing/undo/undo-typing-001-expected.txt:
        * platform/mac/editing/unsupported-content/list-type-after-expected.txt:
        * platform/mac/editing/unsupported-content/list-type-before-expected.txt:
        * platform/mac/editing/unsupported-content/table-type-after-expected.txt:
        * platform/mac/editing/unsupported-content/table-type-before-expected.txt:


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@74593 268f45cc-cd09-0410-ab3c-d52691b4dbfc
132 files changed