| Differences between
and this patch
- Source/WebCore/ChangeLog +39 lines
Lines 1-3 Source/WebCore/ChangeLog_sec1
1
2014-02-17  Ryosuke Niwa  <rniwa@webkit.org>
2
3
        setSelectionRange should set selection without validation
4
        https://bugs.webkit.org/show_bug.cgi?id=128949
5
6
        Reviewed by NOBODY (OOPS!).
7
8
        Since positionForIndex in HTMLTextFormControlElement always returns a candidate Position, we don't have to
9
        validate selection in setSelectionRange.
10
11
        Also fixed various bugs uncovered by this change.
12
13
        This patch also fixes fast/forms/input-select-webkit-user-select-none.html, which used to assert wrong outcome.
14
15
        Test: fast/forms/input-select-webkit-user-select-none.html
16
17
        * dom/Position.h:
18
        (WebCore::positionInParentBeforeNode): This function had a bug that when node is a child of the shadow root
19
        it would return a null Position. Allow a position anchored inside a shadow root.
20
        (WebCore::positionInParentAfterNode): Ditto.
21
22
        * editing/FrameSelection.cpp:
23
        (WebCore::FrameSelection::moveWithoutValidationTo): Renamed from moveTo and avoided selection validation.
24
        * editing/FrameSelection.h:
25
26
        * editing/htmlediting.cpp:
27
        (WebCore::updatePositionForNodeRemoval): Fixed the bug that this function doesn't update positions before
28
        or after children even if the shadow host of the anchor node is getting removed. Move the position before
29
        the shadow host to be removed in both situations.
30
31
        * html/HTMLTextFormControlElement.cpp:
32
        (WebCore::HTMLTextFormControlElement::setSelectionRange): moveTo is renamed to moveWithoutValidationTo.
33
        (WebCore::HTMLTextFormControlElement::selectionChanged): Check if the cached selection offsets are different
34
        in lieu of FrameSelection::isRange() since they're equivalent here.
35
        (WebCore::positionForIndex): Return the position inside or after the last br when there is one to match
36
        the canonicalization algorithm we have. It's probably harmless to return the last position in the inner text
37
        element anyways since most of our codebase supports that but this would avoid having to rebaseline dozens
38
        of tests and reduces the risk of this patch.
39
1
2014-02-17  Dean Jackson  <dino@apple.com>
40
2014-02-17  Dean Jackson  <dino@apple.com>
2
41
3
        Constrain replaced element layout to from-intrinsic aspect ratio if specified
42
        Constrain replaced element layout to from-intrinsic aspect ratio if specified
- Source/WebCore/dom/Position.h -3 / +3 lines
Lines 276-288 inline Position positionInParentBeforeNo Source/WebCore/dom/Position.h_sec1
276
    // At least one caller currently hits this ASSERT though, which indicates
276
    // At least one caller currently hits this ASSERT though, which indicates
277
    // that the caller is trying to make a position relative to a disconnected node (which is likely an error)
277
    // that the caller is trying to make a position relative to a disconnected node (which is likely an error)
278
    // Specifically, editing/deleting/delete-ligature-001.html crashes with ASSERT(node->parentNode())
278
    // Specifically, editing/deleting/delete-ligature-001.html crashes with ASSERT(node->parentNode())
279
    return Position(Position::findParent(node), node->nodeIndex(), Position::PositionIsOffsetInAnchor);
279
    return Position(node->parentNode(), node->nodeIndex(), Position::PositionIsOffsetInAnchor);
280
}
280
}
281
281
282
inline Position positionInParentAfterNode(const Node* node)
282
inline Position positionInParentAfterNode(const Node* node)
283
{
283
{
284
    ASSERT(Position::findParent(node));
284
    ASSERT(node->parentNode());
285
    return Position(Position::findParent(node), node->nodeIndex() + 1, Position::PositionIsOffsetInAnchor);
285
    return Position(node->parentNode(), node->nodeIndex() + 1, Position::PositionIsOffsetInAnchor);
286
}
286
}
287
287
288
// positionBeforeNode and positionAfterNode return neighbor-anchored positions, construction is O(1)
288
// positionBeforeNode and positionAfterNode return neighbor-anchored positions, construction is O(1)
- Source/WebCore/editing/FrameSelection.cpp -3 / +5 lines
Lines 164-173 void FrameSelection::moveTo(const Positi Source/WebCore/editing/FrameSelection.cpp_sec1
164
    setSelection(VisibleSelection(base, extent, affinity, selectionHasDirection), defaultSetSelectionOptions(userTriggered));
164
    setSelection(VisibleSelection(base, extent, affinity, selectionHasDirection), defaultSetSelectionOptions(userTriggered));
165
}
165
}
166
166
167
void FrameSelection::moveTo(const Position& base, const Position& extent, bool selectionHasDirection, bool shouldSetFocus)
167
void FrameSelection::moveWithoutValidationTo(const Position& base, const Position& extent, bool selectionHasDirection, bool shouldSetFocus)
168
{
168
{
169
    setSelection(VisibleSelection(base, extent, DOWNSTREAM, selectionHasDirection),
169
    VisibleSelection newSelection;
170
        defaultSetSelectionOptions() | (shouldSetFocus ? 0 : DoNotSetFocus));
170
    newSelection.setWithoutValidation(base, extent);
171
    newSelection.setIsDirectional(selectionHasDirection);
172
    setSelection(newSelection, defaultSetSelectionOptions() | (shouldSetFocus ? 0 : DoNotSetFocus));
171
}
173
}
172
174
173
void DragCaretController::setCaretPosition(const VisiblePosition& position)
175
void DragCaretController::setCaretPosition(const VisiblePosition& position)
- Source/WebCore/editing/FrameSelection.h -1 / +1 lines
Lines 140-146 public: Source/WebCore/editing/FrameSelection.h_sec1
140
    void moveTo(const VisiblePosition&, const VisiblePosition&, EUserTriggered = NotUserTriggered);
140
    void moveTo(const VisiblePosition&, const VisiblePosition&, EUserTriggered = NotUserTriggered);
141
    void moveTo(const Position&, EAffinity, EUserTriggered = NotUserTriggered);
141
    void moveTo(const Position&, EAffinity, EUserTriggered = NotUserTriggered);
142
    void moveTo(const Position&, const Position&, EAffinity, EUserTriggered = NotUserTriggered);
142
    void moveTo(const Position&, const Position&, EAffinity, EUserTriggered = NotUserTriggered);
143
    void moveTo(const Position&, const Position&, bool selectionHasDirection, bool shouldSetFocus);
143
    void moveWithoutValidationTo(const Position&, const Position&, bool selectionHasDirection, bool shouldSetFocus);
144
144
145
    const VisibleSelection& selection() const { return m_selection; }
145
    const VisibleSelection& selection() const { return m_selection; }
146
    void setSelection(const VisibleSelection&, SetSelectionOptions = defaultSetSelectionOptions(), CursorAlignOnScroll = AlignCursorOnScrollIfNeeded, TextGranularity = CharacterGranularity);
146
    void setSelection(const VisibleSelection&, SetSelectionOptions = defaultSetSelectionOptions(), CursorAlignOnScroll = AlignCursorOnScrollIfNeeded, TextGranularity = CharacterGranularity);
- Source/WebCore/editing/htmlediting.cpp -3 / +3 lines
Lines 988-999 void updatePositionForNodeRemoval(Positi Source/WebCore/editing/htmlediting.cpp_sec1
988
        return;
988
        return;
989
    switch (position.anchorType()) {
989
    switch (position.anchorType()) {
990
    case Position::PositionIsBeforeChildren:
990
    case Position::PositionIsBeforeChildren:
991
        if (position.containerNode() == node)
991
        if (node->containsIncludingShadowDOM(position.containerNode()))
992
            position = positionInParentBeforeNode(node);
992
            position = positionInParentBeforeNode(node);
993
        break;
993
        break;
994
    case Position::PositionIsAfterChildren:
994
    case Position::PositionIsAfterChildren:
995
        if (position.containerNode() == node)
995
        if (node->containsIncludingShadowDOM(position.containerNode()))
996
            position = positionInParentAfterNode(node);
996
            position = positionInParentBeforeNode(node);
997
        break;
997
        break;
998
    case Position::PositionIsOffsetInAnchor:
998
    case Position::PositionIsOffsetInAnchor:
999
        if (position.containerNode() == node->parentNode() && static_cast<unsigned>(position.offsetInContainerNode()) > node->nodeIndex())
999
        if (position.containerNode() == node->parentNode() && static_cast<unsigned>(position.offsetInContainerNode()) > node->nodeIndex())
- Source/WebCore/html/HTMLTextFormControlElement.cpp -9 / +7 lines
Lines 315-321 void HTMLTextFormControlElement::setSele Source/WebCore/html/HTMLTextFormControlElement.cpp_sec1
315
    }
315
    }
316
316
317
    if (Frame* frame = document().frame())
317
    if (Frame* frame = document().frame())
318
        frame->selection().moveTo(startPosition, endPosition, direction != SelectionHasNoDirection, !hasFocus);
318
        frame->selection().moveWithoutValidationTo(startPosition, endPosition, direction != SelectionHasNoDirection, !hasFocus);
319
}
319
}
320
320
321
int HTMLTextFormControlElement::indexForVisiblePosition(const VisiblePosition& position) const
321
int HTMLTextFormControlElement::indexForVisiblePosition(const VisiblePosition& position) const
Lines 480-492 void HTMLTextFormControlElement::selecti Source/WebCore/html/HTMLTextFormControlElement.cpp_sec2
480
    // selectionStart() or selectionEnd() will return cached selection when this node doesn't have focus
480
    // selectionStart() or selectionEnd() will return cached selection when this node doesn't have focus
481
    cacheSelection(computeSelectionStart(), computeSelectionEnd(), computeSelectionDirection());
481
    cacheSelection(computeSelectionStart(), computeSelectionEnd(), computeSelectionDirection());
482
    
482
    
483
    if (!shouldFireSelectEvent)
483
    if (shouldFireSelectEvent && m_cachedSelectionStart != m_cachedSelectionEnd)
484
        return;
484
        dispatchEvent(Event::create(eventNames().selectEvent, true, false));
485
486
    if (Frame* frame = document().frame()) {
487
        if (frame->selection().isRange())
488
            dispatchEvent(Event::create(eventNames().selectEvent, true, false));
489
    }
490
}
485
}
491
486
492
void HTMLTextFormControlElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
487
void HTMLTextFormControlElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
Lines 556-574 String HTMLTextFormControlElement::inner Source/WebCore/html/HTMLTextFormControlElement.cpp_sec3
556
static Position positionForIndex(TextControlInnerTextElement* innerText, unsigned index)
551
static Position positionForIndex(TextControlInnerTextElement* innerText, unsigned index)
557
{
552
{
558
    unsigned remainingCharactersToMoveForward = index;
553
    unsigned remainingCharactersToMoveForward = index;
554
    Node* lastBrOrText = innerText;
559
    for (Node* node = innerText; node; node = NodeTraversal::next(node, innerText)) {
555
    for (Node* node = innerText; node; node = NodeTraversal::next(node, innerText)) {
560
        if (node->hasTagName(brTag)) {
556
        if (node->hasTagName(brTag)) {
561
            if (!remainingCharactersToMoveForward)
557
            if (!remainingCharactersToMoveForward)
562
                return positionBeforeNode(node);
558
                return positionBeforeNode(node);
563
            remainingCharactersToMoveForward--;
559
            remainingCharactersToMoveForward--;
560
            lastBrOrText = node;
564
        } else if (node->isTextNode()) {
561
        } else if (node->isTextNode()) {
565
            Text& text = toText(*node);
562
            Text& text = toText(*node);
566
            if (remainingCharactersToMoveForward < text.length())
563
            if (remainingCharactersToMoveForward < text.length())
567
                return Position(&text, remainingCharactersToMoveForward);
564
                return Position(&text, remainingCharactersToMoveForward);
568
            remainingCharactersToMoveForward -= text.length();
565
            remainingCharactersToMoveForward -= text.length();
566
            lastBrOrText = node;
569
        }
567
        }
570
    }
568
    }
571
    return lastPositionInNode(innerText);
569
    return lastPositionInOrAfterNode(lastBrOrText);
572
}
570
}
573
571
574
unsigned HTMLTextFormControlElement::indexForPosition(const Position& passedPosition) const
572
unsigned HTMLTextFormControlElement::indexForPosition(const Position& passedPosition) const
- LayoutTests/ChangeLog +29 lines
Lines 1-3 LayoutTests/ChangeLog_sec1
1
2014-02-17  Ryosuke Niwa  <rniwa@webkit.org>
2
3
        setSelectionRange should set selection without validation
4
        https://bugs.webkit.org/show_bug.cgi?id=128949
5
6
        Reviewed by NOBODY (OOPS!).
7
8
        Fixed input-select-webkit-user-select-none.html which was asserting wrong conditions. Even when
9
        -webkit-user-select: none is specified, selectionStart and selectionEnd of text fields should
10
        reflect the programatically set selection offsets since such style should not bleed into the
11
        shadow DOM of the text field in the first place.
12
13
        New behavior matches the latest Firefox and Chrome although we still have the bug that user
14
        cannot select text inside such a text field.
15
16
        Also modernized LayoutTests/editing/selection/5497643.html to make the expected results more
17
        readable and made the test more robust against changes in the node index of textarea element.
18
19
        * editing/selection/5497643-expected.txt: See above.
20
        * editing/selection/5497643.html:
21
        * fast/forms/input-select-webkit-user-select-none-expected.txt: See above.
22
        * fast/forms/input-select-webkit-user-select-none.html:
23
        * editing/deleting/delete-ligature-001-expected.txt: Progression in the editing delegate callbacks
24
        dumps. Now we set selection directly into the text node inside the inner text element.
25
        * platform/mac/platform/mac/editing/spelling/autocorrection-at-beginning-of-word-1-expected.txt:
26
        Ditto.
27
        * platform/mac/platform/mac/editing/spelling/autocorrection-at-beginning-of-word-2-expected.txt:
28
        Ditto.
29
1
2014-02-17  Dean Jackson  <dino@apple.com>
30
2014-02-17  Dean Jackson  <dino@apple.com>
2
31
3
        Constrain replaced element layout to from-intrinsic aspect ratio if specified
32
        Constrain replaced element layout to from-intrinsic aspect ratio if specified
- LayoutTests/editing/deleting/delete-ligature-001-expected.txt -1 / +1 lines
Lines 1-6 LayoutTests/editing/deleting/delete-ligature-001-expected.txt_sec1
1
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
1
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
2
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
2
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
3
EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 0 of DIV > #document-fragment to 0 of DIV > #document-fragment toDOMRange:range from 1 of #text > DIV > #document-fragment to 1 of #text > DIV > #document-fragment affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
3
EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 1 of #text > DIV > #document-fragment to 1 of #text > DIV > #document-fragment toDOMRange:range from 1 of #text > DIV > #document-fragment to 1 of #text > DIV > #document-fragment affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
4
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
4
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
5
EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
5
EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
6
EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 1 of #text > DIV > #document-fragment to 1 of #text > DIV > #document-fragment toDOMRange:range from 2 of #text > DIV > #document-fragment to 2 of #text > DIV > #document-fragment affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
6
EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 1 of #text > DIV > #document-fragment to 1 of #text > DIV > #document-fragment toDOMRange:range from 2 of #text > DIV > #document-fragment to 2 of #text > DIV > #document-fragment affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
- LayoutTests/editing/selection/5497643-expected.txt -1 / +7 lines
Lines 1-4 LayoutTests/editing/selection/5497643-expected.txt_sec1
1
ALERT: SUCCESS: Selection is set to position 2 of BODY.
1
textareaOffset = nodeIndex(textarea); textarea.setSelectionRange(0, 0); textarea.parentNode.removeChild(textarea);
2
PASS getSelection().type is 'Caret'
3
PASS getSelection().getRangeAt(0).startContainer is document.body
4
PASS getSelection().getRangeAt(0).startOffset is textareaOffset
5
PASS successfullyParsed is true
6
7
TEST COMPLETE
2
This tests to make sure that a selection inside a textarea is updated when the textarea is removed from the document.
8
This tests to make sure that a selection inside a textarea is updated when the textarea is removed from the document.
3
9
4
10
- LayoutTests/editing/selection/5497643.html -8 / +15 lines
Lines 1-15 LayoutTests/editing/selection/5497643.html_sec1
1
<!DOCTYPE html>
2
<html>
3
<body>
1
<p>This tests to make sure that a selection inside a textarea is updated when the textarea is removed from the document.</p>
4
<p>This tests to make sure that a selection inside a textarea is updated when the textarea is removed from the document.</p>
2
<textarea id="textarea"></textarea>
5
<textarea id="textarea"></textarea>
6
<script src="../../resources/js-test-pre.js"></script>
3
<script>
7
<script>
4
if (window.testRunner)
8
if (window.testRunner)
5
    window.testRunner.dumpAsText();
9
    window.testRunner.dumpAsText();
10
function nodeIndex(node) {
11
    return Array.prototype.slice.call(node.parentNode.childNodes).indexOf(node);
12
}
6
textarea = document.getElementById("textarea");
13
textarea = document.getElementById("textarea");
7
textarea.setSelectionRange(0, 0);
14
evalAndLog("textareaOffset = nodeIndex(textarea); textarea.setSelectionRange(0, 0); textarea.parentNode.removeChild(textarea);");
8
textarea.parentNode.removeChild(textarea);
15
shouldBe("getSelection().type", "'Caret'");
9
if (window.getSelection().type == 'Caret' &&
16
shouldBe("getSelection().getRangeAt(0).startContainer", "document.body");
10
    window.getSelection().getRangeAt(0).startContainer == document.body && 
17
shouldBe("getSelection().getRangeAt(0).startOffset", "textareaOffset");
11
    window.getSelection().getRangeAt(0).startOffset == 2)
18
var successfullyParsed = true;
12
    alert("SUCCESS: Selection is set to position 2 of BODY.")
13
else
14
    alert("FAILURE: The selection is not set correctly after textarea was deleted.")
15
</script>
19
</script>
20
<script src="../../resources/js-test-post.js"></script>
21
</body>
22
</html>
- LayoutTests/fast/forms/input-select-webkit-user-select-none-expected.txt -1 / +8 lines
Lines 1-5 LayoutTests/fast/forms/input-select-webkit-user-select-none-expected.txt_sec1
1
Tests behavior of select() in case "-webkit-user-select: none" attribute is specified to the input element. The field should not be selected.
1
Tests behavior of select() in case "-webkit-user-select: none" attribute is specified to the input element. The field should not be selected.
2
2
3
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
3
4
4
5
5
PASS
6
PASS input.select(); input.selectionStart is 0
7
PASS input.selectionEnd is input.value.length
8
PASS input.value.length is not 0
9
PASS successfullyParsed is true
10
11
TEST COMPLETE
12
- LayoutTests/fast/forms/input-select-webkit-user-select-none.html -17 / +16 lines
Lines 1-26 LayoutTests/fast/forms/input-select-webkit-user-select-none.html_sec1
1
<!DOCTYPE html>
1
<html>
2
<html>
2
<head>
3
<body onload="test()">
4
<script src="../../resources/js-test-pre.js"></script>
3
<script>
5
<script>
6
description("Tests behavior of select() in case &quot;-webkit-user-select: none&quot;"
7
    + " attribute is specified to the input element. The field should not be selected.");
8
4
function test() {
9
function test() {
5
    if (window.testRunner)
10
    if (window.testRunner)
6
        testRunner.dumpAsText();
11
        testRunner.dumpAsText();
7
    var tf = document.getElementById('tf');
12
    window.input = document.querySelector('input');
8
    tf.select();
13
    shouldBe("input.select(); input.selectionStart", "0");
9
    if (tf.selectionStart == 0 && tf.selectionEnd == 0) { // ;
14
    shouldBe("input.selectionEnd", "input.value.length");
10
        document.getElementById("result").innerHTML = "PASS";
15
    shouldNotBe("input.value.length", "0");
11
    } else {
16
    finishJSTest();
12
        document.getElementById("result").innerHTML = "FAIL: selection start is "
13
            + tf.selectionStart + " and end is " + tf.selectionEnd + ".";
14
    }
15
}
17
}
18
19
var successfullyParsed = true;
20
var jsTestIsAsync = true;
16
</script>
21
</script>
17
</head>
22
<script src="../../resources/js-test-post.js"></script>
18
<body onload="test()">
23
<p><input type="text" value="input text" style="-webkit-user-select: none; -moz-user-select: none;"></input></p>
19
<p>
20
Tests behavior of select() in case &quot;-webkit-user-select: none&quot;
21
attribute is specified to the input element. The field should not be selected.
22
</p>
23
<p><input type="text" id="tf" value="input text" style="-webkit-user-select: none"></input></p>
24
<p id="result">TEST NOT RUN YET</p>
25
</body>
24
</body>
26
</html>
25
</html>
- LayoutTests/platform/mac/platform/mac/editing/spelling/autocorrection-at-beginning-of-word-1-expected.txt -1 / +1 lines
Lines 1-6 LayoutTests/platform/mac/platform/mac/editing/spelling/autocorrection-at-beginning-of-word-1-expected.txt_sec1
1
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
1
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
2
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
2
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
3
EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 0 of DIV > #document-fragment to 0 of DIV > #document-fragment toDOMRange:range from 1 of #text > DIV > #document-fragment to 1 of #text > DIV > #document-fragment affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
3
EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 1 of #text > DIV > #document-fragment to 1 of #text > DIV > #document-fragment toDOMRange:range from 1 of #text > DIV > #document-fragment to 1 of #text > DIV > #document-fragment affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
4
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
4
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
5
EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
5
EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
6
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
6
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
- LayoutTests/platform/mac/platform/mac/editing/spelling/autocorrection-at-beginning-of-word-2-expected.txt -1 / +1 lines
Lines 1-6 LayoutTests/platform/mac/platform/mac/editing/spelling/autocorrection-at-beginning-of-word-2-expected.txt_sec1
1
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
1
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
2
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
2
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
3
EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 0 of DIV > #document-fragment to 0 of DIV > #document-fragment toDOMRange:range from 1 of #text > DIV > #document-fragment to 1 of #text > DIV > #document-fragment affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
3
EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 1 of #text > DIV > #document-fragment to 1 of #text > DIV > #document-fragment toDOMRange:range from 1 of #text > DIV > #document-fragment to 1 of #text > DIV > #document-fragment affinity:NSSelectionAffinityDownstream stillSelecting:FALSE
4
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
4
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
5
EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
5
EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
6
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
6
EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification

Return to Bug 128949