Commit cf9c03f9 authored by rniwa@webkit.org's avatar rniwa@webkit.org

REGRESSION(r94274): setting input.value erroneously triggers focus event

https://bugs.webkit.org/show_bug.cgi?id=69315

Reviewed by Kent Tamura.

Fixed the bug by adding a new flag to setSelection to avoid calling setFocusedNodeIfNeeded
when called by nodeWillBeRemoved and textWillBeReplaced.

Added a manual test. Unfortunately, the test always passes in DRT.

* editing/FrameSelection.cpp:
(WebCore::FrameSelection::setSelection):
(WebCore::FrameSelection::respondToNodeModification):
(WebCore::FrameSelection::textWillBeReplaced):
* editing/FrameSelection.h:
* manual-tests/mutate-unfocused-text-with-selection.html: Added.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@96628 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent ff057a67
2011-10-04 Ryosuke Niwa <rniwa@webkit.org>
REGRESSION(r94274): setting input.value erroneously triggers focus event
https://bugs.webkit.org/show_bug.cgi?id=69315
Reviewed by Kent Tamura.
Fixed the bug by adding a new flag to setSelection to avoid calling setFocusedNodeIfNeeded
when called by nodeWillBeRemoved and textWillBeReplaced.
Added a manual test. Unfortunately, the test always passes in DRT.
* editing/FrameSelection.cpp:
(WebCore::FrameSelection::setSelection):
(WebCore::FrameSelection::respondToNodeModification):
(WebCore::FrameSelection::textWillBeReplaced):
* editing/FrameSelection.h:
* manual-tests/mutate-unfocused-text-with-selection.html: Added.
2011-10-04 Young Han Lee <joybro201@gmail.com>
HTML canvas strokes with dash and dashOffset
......@@ -274,7 +274,7 @@ void FrameSelection::setSelection(const VisibleSelection& newSelection, SetSelec
m_selection = s;
setCaretRectNeedsUpdate();
if (!s.isNone())
if (!s.isNone() && !(options & DoNotSetFocus))
setFocusedNodeIfNeeded();
updateAppearance();
......@@ -393,7 +393,7 @@ void FrameSelection::respondToNodeModification(Node* node, bool baseRemoved, boo
clearRenderViewSelection(m_selection.start());
if (clearDOMTreeSelection)
setSelection(VisibleSelection(), 0);
setSelection(VisibleSelection(), DoNotSetFocus);
}
static void updatePositionAfterAdoptingTextReplacement(Position& position, CharacterData* node, unsigned offset, unsigned oldLength, unsigned newLength)
......@@ -433,7 +433,7 @@ void FrameSelection::textWillBeReplaced(CharacterData* node, unsigned offset, un
VisibleSelection newSelection;
newSelection.setWithoutValidation(base, extent);
m_frame->document()->updateLayout();
setSelection(newSelection, 0);
setSelection(newSelection, DoNotSetFocus);
}
}
......
......@@ -115,6 +115,7 @@ public:
CloseTyping = 1 << 1,
ClearTypingStyle = 1 << 2,
SpellCorrectionTriggered = 1 << 3,
DoNotSetFocus = 1 << 4,
};
typedef unsigned SetSelectionOptions; // Union of values in SetSelectionOption and EUserTriggered
static inline EUserTriggered selectionOptionsToUserTriggered(SetSelectionOptions options)
......
<!DOCTYPE html>
<html>
<body>
<p>This tests modifying a text node with selection but without a focus.
WebKit used to automatically set the focus to the root editable element of this node but it should not.
You should see 'PASS' below:</p>
<div id="target" onfocus="target.innerText='FAIL'" contenteditable>hello</div>
<div id="focused" contenteditable>world</div>
<script>
var target = document.getElementById('target');
var focused = document.getElementById('focused');
focused.focus();
getSelection().setBaseAndExtent(target.firstChild, 1, target.firstChild, 3);
// The bug doesn't reproduce if this function was ran here or inside load event handler
setTimeout(function() {
target.firstChild.data = 'PASS';
alert('activeElement:' + document.activeElement.id); // necessary to reproduce the bug
}, 50);
</script>
</body>
</html>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment