REGRESSION(r94274): setting input.value erroneously triggers focus event
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Oct 2011 19:02:44 +0000 (19:02 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Oct 2011 19:02:44 +0000 (19:02 +0000)
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: https://svn.webkit.org/repository/webkit/trunk@96628 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/editing/FrameSelection.cpp
Source/WebCore/editing/FrameSelection.h
Source/WebCore/manual-tests/mutate-unfocused-text-with-selection.html [new file with mode: 0644]

index 3d5a49d..5da6cf2 100644 (file)
@@ -1,3 +1,22 @@
+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
index 6ee91d8..9a17ce4 100644 (file)
@@ -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);
     }
 }
 
index b26c474..0f89d6b 100644 (file)
@@ -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)
diff --git a/Source/WebCore/manual-tests/mutate-unfocused-text-with-selection.html b/Source/WebCore/manual-tests/mutate-unfocused-text-with-selection.html
new file mode 100644 (file)
index 0000000..c193d12
--- /dev/null
@@ -0,0 +1,24 @@
+<!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>