Bug 904810 - Restore old default behavior on Windows that UP/DOWN go to next/prev line also when there's a selection. r=ehsan a=bbajaj
authorMats Palmgren <matspal@gmail.com>
Tue, 20 Aug 2013 10:43:35 +0000
changeset 149089 fa839e49fce6ea7c60defa78a82137c04326d54d
parent 149088 62ec86acf4c68ece0941cfa6314f5512262ccae8
child 149090 bab2e697a32f0f88cc3d21753f0b2112973a8965
push id4147
push usermpalmgren@mozilla.com
push dateTue, 20 Aug 2013 10:43:37 +0000
treeherdermozilla-aurora@fa839e49fce6 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersehsan, bbajaj
bugs904810
milestone25.0a2
Bug 904810 - Restore old default behavior on Windows that UP/DOWN go to next/prev line also when there's a selection. r=ehsan a=bbajaj
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>