Bug 572649 - Attempting to scroll a textarea with a horizontal scrollbar using the mouse jumps to its bottom right (focusing a textarea with the mouse scrolls the selection into view); r=roc a=blocking-betaN+
authorEhsan Akhgari <ehsan@mozilla.com>
Mon, 20 Sep 2010 19:30:07 -0400
changeset 54465 3ea256acb017288d9ce5359892c42e26bff4c912
parent 54464 27df5529f2cf3e259ccf20e8d45820c2f19c2f8d
child 54466 d95e7b7cb3362f5372bead43539bb647f74aafcd
push idunknown
push userunknown
push dateunknown
reviewersroc, blocking-betaN
bugs572649
milestone2.0b7pre
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 572649 - Attempting to scroll a textarea with a horizontal scrollbar using the mouse jumps to its bottom right (focusing a textarea with the mouse scrolls the selection into view); r=roc a=blocking-betaN+
layout/forms/nsTextControlFrame.cpp
layout/forms/test/Makefile.in
layout/forms/test/test_bug572649.html
--- a/layout/forms/nsTextControlFrame.cpp
+++ b/layout/forms/nsTextControlFrame.cpp
@@ -698,20 +698,31 @@ void nsTextControlFrame::SetFocus(PRBool
   nsIPresShell* presShell = PresContext()->GetPresShell();
   nsRefPtr<nsCaret> caret = presShell->GetCaret();
   if (!caret) return;
 
   // Scroll the current selection into view
   nsISelection *caretSelection = caret->GetCaretDOMSelection();
   const PRBool isFocusedRightNow = ourSel == caretSelection;
   if (!isFocusedRightNow) {
-    nsRefPtr<ScrollOnFocusEvent> event = new ScrollOnFocusEvent(this);
-    nsresult rv = NS_DispatchToCurrentThread(event);
-    if (NS_SUCCEEDED(rv)) {
-      mScrollEvent = event;
+    // Don't scroll the current selection if we've been focused using the mouse.
+    PRUint32 lastFocusMethod = 0;
+    nsIDocument* doc = GetContent()->GetCurrentDoc();
+    if (doc) {
+      nsIFocusManager* fm = nsFocusManager::GetFocusManager();
+      if (fm) {
+        fm->GetLastFocusMethod(doc->GetWindow(), &lastFocusMethod);
+      }
+    }
+    if (!(lastFocusMethod & nsIFocusManager::FLAG_BYMOUSE)) {
+      nsRefPtr<ScrollOnFocusEvent> event = new ScrollOnFocusEvent(this);
+      nsresult rv = NS_DispatchToCurrentThread(event);
+      if (NS_SUCCEEDED(rv)) {
+        mScrollEvent = event;
+      }
     }
   }
 
   // tell the caret to use our selection
   caret->SetCaretDOMSelection(ourSel);
 
   // mutual-exclusion: the selection is either controlled by the
   // document or by the text input/area. Clear any selection in the
--- a/layout/forms/test/Makefile.in
+++ b/layout/forms/test/Makefile.in
@@ -68,13 +68,14 @@ include $(topsrcdir)/config/rules.mk
 		test_bug549170.html \
 		test_bug562447.html \
 		test_bug563642.html \
 		test_bug564115.html \
 		bug564115_window.html \
 		test_bug377624.html \
 		test_bug571352.html \
 		test_bug572406.html \
+		test_bug572649.html \
 		test_bug36619.html \
 		$(NULL)
 
 libs:: $(_TEST_FILES)
 	$(INSTALL) $^ $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)
copy from layout/forms/test/test_bug353539.html
copy to layout/forms/test/test_bug572649.html
--- a/layout/forms/test/test_bug353539.html
+++ b/layout/forms/test/test_bug572649.html
@@ -1,21 +1,22 @@
 <!DOCTYPE HTML>
 <html>
 <!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=353539
+https://bugzilla.mozilla.org/show_bug.cgi?id=572649
 -->
 <head>
-  <title>Test for Bug 353539</title>
+  <title>Test for Bug 572649</title>
   <script type="application/javascript" src="/MochiKit/packed.js"></script>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=353539">Mozilla Bug 353539</a>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=572649">Mozilla Bug 572649</a>
 <p id="display">
   <textarea id="area" rows="5">
   Here
   is
   some
   very
   long
   text
@@ -28,26 +29,32 @@ https://bugzilla.mozilla.org/show_bug.cg
   </textarea>
 </p>
 <div id="content" style="display: none">
   
 </div>
 <pre id="test">
 <script type="application/javascript">
 
-/** Test for Bug 353539 **/
+/** Test for Bug 572649 **/
 SimpleTest.waitForExplicitFinish();
 addLoadEvent(function() {
   var area = document.getElementById("area");
 
   is(area.scrollTop, 0, "The textarea should not be scrolled initially");
-  area.focus();
+  area.addEventListener("focus", function() {
+    area.removeEventListener("focus", arguments.callee, false);
+    setTimeout(function() {
+      is(area.scrollTop, 0, "The textarea's insertion point should not be scrolled into view");
+
+      SimpleTest.finish();
+    }, 0);
+  }, false);
   setTimeout(function() {
-    isnot(area.scrollTop, 0, "The textarea's insertion point should be scrolled into view");
-
-    SimpleTest.finish();
+    var rect = area.getBoundingClientRect();
+    synthesizeMouse(area, rect.width - 5, 5, {});
   }, 0);
 });
 
 </script>
 </pre>
 </body>
 </html>