Bug 904810 - Restore old default behavior on Windows that UP/DOWN go to next/prev line also when there's a selection. r=ehsan
authorMats Palmgren <matspal@gmail.com>
Fri, 16 Aug 2013 16:20:04 +0000
changeset 142908 abed25d32cdd59298c22690e5fed153b7c49a0cb
parent 142907 780365615c6d66e1f0042a97994dec8919995dbc
child 142909 67f3cc2de725bf132552734f30cef3e929406f10
push id25116
push userphilringnalda@gmail.com
push dateSat, 17 Aug 2013 15:35:37 +0000
treeherdermozilla-central@74fe1012de43 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersehsan
bugs904810
milestone26.0a1
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 904810 - Restore old default behavior on Windows that UP/DOWN go to next/prev line also when there's a selection. r=ehsan
layout/generic/nsSelection.cpp
layout/generic/test/Makefile.in
layout/generic/test/test_bug904810.html
--- a/layout/generic/nsSelection.cpp
+++ b/layout/generic/nsSelection.cpp
@@ -782,17 +782,22 @@ nsFrameSelection::MoveCaret(uint32_t    
   {
     result = FetchDesiredX(desiredX);
     if (NS_FAILED(result))
       return result;
     SetDesiredX(desiredX);
   }
 
   int32_t caretStyle = Preferences::GetInt("layout.selection.caret_style", 0);
-  if (caretStyle == 0) {
+  if (caretStyle == 0
+#ifdef XP_WIN
+      && aKeycode != nsIDOMKeyEvent::DOM_VK_UP
+      && aKeycode != nsIDOMKeyEvent::DOM_VK_DOWN
+#endif
+     ) {
     // Put caret at the selection edge in the |aKeycode| direction.
     caretStyle = 2;
   }
 
   if (!isCollapsed && !aContinueSelection && caretStyle == 2) {
     switch (aKeycode){
       case nsIDOMKeyEvent::DOM_VK_LEFT  :
       case nsIDOMKeyEvent::DOM_VK_UP    :
--- a/layout/generic/test/Makefile.in
+++ b/layout/generic/test/Makefile.in
@@ -56,16 +56,17 @@ MOCHITEST_FILES = \
   test_bug496275.html \
   test_bug503813.html \
   $(filter disabled-temporarily--bug-510001, test_bug507902.html) \
   test_bug514732.html \
   test_bug527306.html \
   test_bug579767.html \
   test_bug597333.html \
   test_bug666225.html \
+  test_bug904810.html \
   test_image_selection.html \
   test_image_selection_2.html \
   test_invalidate_during_plugin_paint.html \
   test_movement_by_characters.html \
   test_movement_by_words.html \
   test_page_scroll_with_fixed_pos.html \
     page_scroll_with_fixed_pos_window.html \
   test_plugin_clipping.xhtml \
new file mode 100644
--- /dev/null
+++ b/layout/generic/test/test_bug904810.html
@@ -0,0 +1,110 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=904810
+-->
+<head>
+  <title>Test for Bug 904810</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/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=904810">Mozilla Bug 904810</a>
+<p id="display">
+<textarea dir="ltr" id="textarea904810">
+first line
+second line
+third line
+</textarea></p>
+<div id="content" style="display: none">
+  
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 904810 **/
+
+SimpleTest.waitForExplicitFinish();
+SimpleTest.waitForFocus(function test() {
+  function shiftLeft(i) {
+    for ( ; i > 0; --i)
+      synthesizeKey("VK_LEFT", {shiftKey:true});
+  }
+
+  function shiftRight(i) {
+    for ( ; i > 0; --i)
+      synthesizeKey("VK_RIGHT", {shiftKey:true});
+  }
+
+  const isWindows = /WINNT/.test(SpecialPowers.OS);
+  
+  var textarea = document.getElementById('textarea904810');
+  textarea.focus();
+
+  // Testing VK_DOWN with forward selection
+  textarea.selectionStart = 1;
+  textarea.selectionEnd = 1;
+  shiftRight(7);
+  synthesizeKey("VK_DOWN", {});
+  if (isWindows) {
+    is(textarea.selectionStart, 19, "caret moved to next line below selection end");
+    is(textarea.selectionEnd, 19, "caret moved to next line below selection end");
+  } else {
+    is(textarea.selectionStart, 8, "caret moved to visual end of selection");
+    is(textarea.selectionEnd, 8, "caret moved to visual end of selection");
+  }
+
+  // Testing VK_DOWN with backward selection
+  textarea.selectionStart = 8;
+  textarea.selectionEnd = 8;
+  shiftLeft(7);
+  synthesizeKey("VK_DOWN", {});
+  if (isWindows) {
+    is(textarea.selectionStart, 12, "caret moved to next line below selection start");
+    is(textarea.selectionEnd, 12, "caret moved to next line below selection start");
+  } else {
+    is(textarea.selectionStart, 8, "caret moved to visual end of selection");
+    is(textarea.selectionEnd, 8, "caret moved to visual end of selection");
+  }
+
+  // Testing VK_UP with forward selection
+  textarea.selectionStart = 12;
+  textarea.selectionEnd = 12;
+  shiftRight(7);
+  synthesizeKey("VK_UP", {});
+  var result = textarea.selectionEnd
+  if (isWindows) {
+    is(textarea.selectionStart, 8, "caret moved to previous line above selection end");
+    is(textarea.selectionEnd, 8, "caret moved to previous line above selection end");
+  } else {
+    is(textarea.selectionStart, 12, "caret moved to visual start of selection");
+    is(textarea.selectionEnd, 12, "caret moved to visual start of selection");
+  }
+
+  // Testing VK_UP with backward selection
+  textarea.selectionStart = 19;
+  textarea.selectionEnd = 19;
+  shiftLeft(7);
+  synthesizeKey("VK_UP", {});
+  var result = textarea.selectionEnd
+  if (isWindows) {
+    is(textarea.selectionStart, 1, "caret moved to previous line above selection start");
+    is(textarea.selectionEnd, 1, "caret moved to previous line above selection start");
+  } else {
+    is(textarea.selectionStart, 12, "caret moved to visual start of selection");
+    is(textarea.selectionEnd, 12, "caret moved to visual start of selection");
+  }
+
+ 
+
+  SimpleTest.finish();
+});
+
+
+
+
+</script>
+</pre>
+</body>
+</html>