Changeset 56639 in webkit


Ignore:
Timestamp:
Mar 26, 2010 1:19:15 PM (14 years ago)
Author:
ojan@chromium.org
Message:

2010-03-25 Ojan Vafai <ojan@chromium.org>

Reviewed by Darin Adler.

shift+home/end and cmd+shift+left/right don't extend the selection correctly
https://bugs.webkit.org/show_bug.cgi?id=36539

  • editing/selection/extend-after-mouse-selection.html:
  • editing/selection/extend-selection-expected.txt: Extending forward by lineboundary selects the whole line. Now extending backwards by lineboundary after the whole line is selected is a noop instead of collapsed the selection to the start.
  • editing/selection/move-begin-end.html: Just cleaned up this test.
  • platform/mac/editing/selection/extend-after-mouse-selection-expected.txt:

2010-03-25 Ojan Vafai <ojan@chromium.org>

Reviewed by Darin Adler.

shift+home/end and cmd+shift+left/right don't extend the selection correctly
https://bugs.webkit.org/show_bug.cgi?id=36539

  • WebCore.base.exp:
  • editing/SelectionController.cpp: (WebCore::SelectionController::modify):
  • editing/SelectionController.h:
Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r56634 r56639  
     12010-03-25  Ojan Vafai  <ojan@chromium.org>
     2
     3        Reviewed by Darin Adler.
     4
     5        shift+home/end and cmd+shift+left/right don't extend the selection correctly
     6        https://bugs.webkit.org/show_bug.cgi?id=36539
     7
     8        * editing/selection/extend-after-mouse-selection.html:
     9        * editing/selection/extend-selection-expected.txt:
     10        Extending forward by lineboundary selects the whole line. Now extending backwards
     11        by lineboundary after the whole line is selected is a noop instead of collapsed
     12        the selection to the start.
     13        * editing/selection/move-begin-end.html:
     14        Just cleaned up this test.
     15        * platform/mac/editing/selection/extend-after-mouse-selection-expected.txt:
     16
    1172010-03-26  Brian Weinstein  <bweinstein@apple.com>
    218
  • trunk/LayoutTests/editing/selection/extend-after-mouse-selection.html

    r56567 r56639  
    5050    extendSelectionForwardByLineBoundaryCommand();
    5151
    52     if (onMacPlatform) {
    53         // FIXME: This encodes what TextEdit does. Currently WebKit does the wrong thing.
    54         // The selection should go from the beginning of startTarget to the end of the line that endTarget is on.
     52    if (onMacPlatform)
    5553        assertSelectionAt(endTarget.nextSibling, 1, startTarget.firstChild, 0);
    56     } else
     54    else
    5755        assertSelectionAt(startTarget.firstChild, 0, endTarget.nextSibling, 1);
    5856
    5957    extendSelectionBackwardByLineBoundaryCommand();
    6058
    61     if (onMacPlatform) {
    62         // FIXME: This encodes what TextEdit does. Currently WebKit does the wrong thing.
    63         // The selection should contain the both entire lines that endTarget and startTarget are on.
     59    if (onMacPlatform)
    6460        assertSelectionAt(endTarget.nextSibling, 1, startTarget.previousSibling, 0);
    65     } else
     61    else
    6662        assertSelectionAt(startTarget.firstChild, 0, document.getElementById('test'), 4);
    6763}
  • trunk/LayoutTests/editing/selection/extend-selection-expected.txt

    r55990 r56639  
    396396Test 1, LTR:
    397397  Extending forward: "\nabc ABC xyz DEF def\n"[(1,1), (1,20)]
    398   Extending backward:  "\nabc ABC xyz DEF def\n"[(1,20), (1,1)]
     398  Extending backward:  "\nabc ABC xyz DEF def\n"[(1,20)]
    399399Test 1, RTL:
    400400  Extending forward: "\nabc ABC xyz DEF def\n"[(1,1), (1,20)]
    401   Extending backward:  "\nabc ABC xyz DEF def\n"[(1,20), (1,1)]
     401  Extending backward:  "\nabc ABC xyz DEF def\n"[(1,20)]
    402402Test 2, LTR:
    403403  Extending forward: "\nABC xyz DEF def GHI\n"[(1,1), (1,20)]
    404   Extending backward:  "\nABC xyz DEF def GHI\n"[(1,20), (1,1)]
     404  Extending backward:  "\nABC xyz DEF def GHI\n"[(1,20)]
    405405Test 2, RTL:
    406406  Extending forward: "\nABC xyz DEF def GHI\n"[(1,1), (1,20)]
    407   Extending backward:  "\nABC xyz DEF def GHI\n"[(1,20), (1,1)]
     407  Extending backward:  "\nABC xyz DEF def GHI\n"[(1,20)]
    408408Test 3, LTR:
    409409  Extending forward: "\nABC DEF ABC\n"[(1,1), (1,12)]
    410   Extending backward:  "\nABC DEF ABC\n"[(1,12), (1,1)]
     410  Extending backward:  "\nABC DEF ABC\n"[(1,12)]
    411411Test 3, RTL:
    412412  Extending forward: "\nABC DEF ABC\n"[(1,1), (1,12)]
    413   Extending backward:  "\nABC DEF ABC\n"[(1,12), (1,1)]
     413  Extending backward:  "\nABC DEF ABC\n"[(1,12)]
    414414Test 4, LTR:
    415415  Extending forward: "\nabc efd dabeb\n"[(1,1), (1,14)]
    416   Extending backward:  "\nabc efd dabeb\n"[(1,14), (1,1)]
     416  Extending backward:  "\nabc efd dabeb\n"[(1,14)]
    417417Test 4, RTL:
    418418  Extending forward: "\nabc efd dabeb\n"[(1,1), (1,14)]
    419   Extending backward:  "\nabc efd dabeb\n"[(1,14), (1,1)]
     419  Extending backward:  "\nabc efd dabeb\n"[(1,14)]
    420420Test 5, LTR:
    421421  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
    422   Extending backward:  " amet"[(0,5)], "Lorem "[(0,0)]
     422  Extending backward:  " amet"[(0,5)]
    423423Test 5, RTL:
    424424  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
    425   Extending backward:  " amet"[(0,5)], "Lorem "[(0,0)]
     425  Extending backward:  " amet"[(0,5)]
    426426Test 6, LTR:
    427427  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
    428   Extending backward:  " amet"[(0,5)], "Lorem "[(0,0)]
     428  Extending backward:  " amet"[(0,5)]
    429429Test 6, RTL:
    430430  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
    431   Extending backward:  " amet"[(0,5)], "Lorem "[(0,0)]
     431  Extending backward:  " amet"[(0,5)]
    432432Test 7, LTR:
    433433  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
    434   Extending backward:  " amet"[(0,5)], "Lorem "[(0,0)]
     434  Extending backward:  " amet"[(0,5)]
    435435Test 7, RTL:
    436436  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
    437   Extending backward:  " amet"[(0,5)], "Lorem "[(0,0)]
     437  Extending backward:  " amet"[(0,5)]
    438438Test 8, LTR:
    439439  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
    440   Extending backward:  " amet"[(0,5)], "Lorem "[(0,0)]
     440  Extending backward:  " amet"[(0,5)]
    441441Test 8, RTL:
    442442  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
    443   Extending backward:  " amet"[(0,5)], "Lorem "[(0,0)]
     443  Extending backward:  " amet"[(0,5)]
    444444Test 9, LTR:
    445445  Extending forward: "Lorem "[(0,0), (0,5)]
    446   Extending backward:  "Lorem "[(0,5), (0,0)]
     446  Extending backward:  "Lorem "[(0,5)]
    447447Test 9, RTL:
    448448  Extending forward: "Lorem "[(0,0), (0,5)]
    449   Extending backward:  "Lorem "[(0,5), (0,0)]
     449  Extending backward:  "Lorem "[(0,5)]
    450450Test 10, LTR:
    451451  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
    452   Extending backward:  " amet"[(0,5)], "Lorem "[(0,0)]
     452  Extending backward:  " amet"[(0,5)]
    453453Test 10, RTL:
    454454  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
    455   Extending backward:  " amet"[(0,5)], "Lorem "[(0,0)]
     455  Extending backward:  " amet"[(0,5)]
    456456Test 11, LTR:
    457457  Extending forward: "Lorem "[(0,0)], "ipsum dolor"[(0,11)]
    458   Extending backward:  "ipsum dolor"[(0,11)], "Lorem "[(0,0)]
     458  Extending backward:  "ipsum dolor"[(0,11)]
    459459Test 11, RTL:
    460460  Extending forward: "Lorem "[(0,0)], "ipsum dolor"[(0,11)]
    461   Extending backward:  "ipsum dolor"[(0,11)], "Lorem "[(0,0)]
     461  Extending backward:  "ipsum dolor"[(0,11)]
    462462Test 12, LTR:
    463463  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
    464   Extending backward:  " amet"[(0,5)], "Lorem "[(0,0)]
     464  Extending backward:  " amet"[(0,5)]
    465465Test 12, RTL:
    466466  Extending forward: "Lorem "[(0,0)], " amet"[(0,5)]
    467   Extending backward:  " amet"[(0,5)], "Lorem "[(0,0)]
     467  Extending backward:  " amet"[(0,5)]
    468468Test 13, LTR:
    469469  Extending forward: "Lorem "[(0,0), (0,5)]
    470   Extending backward:  "Lorem "[(0,5), (0,0)]
     470  Extending backward:  "Lorem "[(0,5)]
    471471Test 13, RTL:
    472472  Extending forward: "Lorem "[(0,0), (0,5)]
    473   Extending backward:  "Lorem "[(0,5), (0,0)]
     473  Extending backward:  "Lorem "[(0,5)]
    474474Test 14, LTR:
    475475  Extending forward: "\n Just\n "[(2,2)], "\n BFDX\n"[(2,6)]
    476   Extending backward:  "\n BFDX\n"[(2,6)], "\n Just\n "[(2,2)]
     476  Extending backward:  "\n BFDX\n"[(2,6)]
    477477Test 14, RTL:
    478478  Extending forward: "\n Just\n "[(2,2)], "\n BFDX\n"[(2,6)]
    479   Extending backward:  "\n BFDX\n"[(2,6)], "\n Just\n "[(2,2)]
     479  Extending backward:  "\n BFDX\n"[(2,6)]
    480480Test 15, LTR:
    481481  Extending forward: "\n Just\n "[(2,2)], "\n ever\n"[(2,6)]
    482   Extending backward:  "\n ever\n"[(2,6)], "\n Just\n "[(2,2)]
     482  Extending backward:  "\n ever\n"[(2,6)]
    483483Test 15, RTL:
    484484  Extending forward: "\n Just\n "[(2,2)], "\n ever\n"[(2,6)]
    485   Extending backward:  "\n ever\n"[(2,6)], "\n Just\n "[(2,2)]
     485  Extending backward:  "\n ever\n"[(2,6)]
    486486Test 16, LTR:
    487487  Extending forward: "car means ABC."[(0,0), (0,14)]
    488   Extending backward:  "car means ABC."[(0,14), (0,0)]
     488  Extending backward:  "car means ABC."[(0,14)]
    489489Test 16, RTL:
    490490  Extending forward: "car means ABC."[(0,0), (0,14)]
    491   Extending backward:  "car means ABC."[(0,14), (0,0)]
     491  Extending backward:  "car means ABC."[(0,14)]
    492492Test 17, LTR:
    493493  Extending forward: "᪜car DEF ABC.᪝"[(1,1), (1,13)]
    494   Extending backward:  "᪜car DEF ABC.᪝"[(1,13), (1,1)]
     494  Extending backward:  "᪜car DEF ABC.᪝"[(1,13)]
    495495Test 17, RTL:
    496496  Extending forward: "᪜car DEF ABC.᪝"[(1,1), (1,13)]
    497   Extending backward:  "᪜car DEF ABC.᪝"[(1,13), (1,1)]
     497  Extending backward:  "᪜car DEF ABC.᪝"[(1,13)]
    498498Test 18, LTR:
    499499  Extending forward: "he said "᪜car DEF ABC᪝.""[(0,0), (0,24)]
    500   Extending backward:  "he said "᪜car DEF ABC᪝.""[(0,24), (0,0)]
     500  Extending backward:  "he said "᪜car DEF ABC᪝.""[(0,24)]
    501501Test 18, RTL:
    502502  Extending forward: "he said "᪜car DEF ABC᪝.""[(0,0), (0,24)]
    503   Extending backward:  "he said "᪜car DEF ABC᪝.""[(0,24), (0,0)]
     503  Extending backward:  "he said "᪜car DEF ABC᪝.""[(0,24)]
    504504Test 19, LTR:
    505505  Extending forward: "GHI JKL MNO '᪛he said "᪜car DEF ABC᪝"᪝'?"[(0,0), (0,40)]
    506   Extending backward:  "GHI JKL MNO '᪛he said "᪜car DEF ABC᪝"᪝'?"[(0,40), (0,0)]
     506  Extending backward:  "GHI JKL MNO '᪛he said "᪜car DEF ABC᪝"᪝'?"[(0,40)]
    507507Test 19, RTL:
    508508  Extending forward: "GHI JKL MNO '᪛he said "᪜car DEF ABC᪝"᪝'?"[(0,0), (0,40)]
    509   Extending backward:  "GHI JKL MNO '᪛he said "᪜car DEF ABC᪝"᪝'?"[(0,40), (0,0)]
     509  Extending backward:  "GHI JKL MNO '᪛he said "᪜car DEF ABC᪝"᪝'?"[(0,40)]
    510510Test 20, LTR:
    511511  Extending forward: "ABC abc DEF"[(0,0), (0,11)]
    512   Extending backward:  "ABC abc DEF"[(0,11), (0,0)]
     512  Extending backward:  "ABC abc DEF"[(0,11)]
    513513Test 20, RTL:
    514514  Extending forward: "ABC abc DEF"[(0,0), (0,11)]
    515   Extending backward:  "ABC abc DEF"[(0,11), (0,0)]
     515  Extending backward:  "ABC abc DEF"[(0,11)]
    516516Test 21, LTR:
    517517  Extending forward: "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,0), (0,8)]
    518   Extending backward:  "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,8), (0,0)]
     518  Extending backward:  "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,8)]
    519519Test 21, RTL:
    520520  Extending forward: "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,0), (0,7)]
    521   Extending backward:  "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,7), (0,0)]
     521  Extending backward:  "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,7)]
    522522Test 22, LTR:
    523523  Extending forward: "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,0), (0,8)]
    524   Extending backward:  "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,8), (0,0)]
     524  Extending backward:  "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,8)]
    525525Test 22, RTL:
    526526  Extending forward: "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,0), (0,7)]
    527   Extending backward:  "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,7), (0,0)]
    528 
     527  Extending backward:  "abcdefg abcdefg abcdefg a abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg "[(0,7)]
     528
  • trunk/LayoutTests/editing/selection/move-begin-end.html

    r54980 r56639  
    1 <html>
    2     <head>
    31<script>
    4 if (window.layoutTestController)
     2if (window.layoutTestController) {
    53     layoutTestController.dumpEditingCallbacks();
     4     layoutTestController.dumpAsText();
     5}
     6
     7var sel = window.getSelection();
     8
     9function logResult(str) {
     10    if (str != 'SUCCESS')
     11        str += ' baseOffset: ' + sel.baseOffset + ' extentOffset: ' + sel.extentOffset;
     12    document.getElementById('result').innerHTML = str;
     13}
     14
     15function runTest() {
     16    if (!window.layoutTestController) {
     17        log('This test must be run by DumpRenderTree!')
     18        return;
     19    }
     20
     21    var onMacPlatform =  navigator.userAgent.search(/\bMac OS X\b/) != -1;
     22   
     23    var area = document.getElementById('area');
     24    area.focus();
     25   
     26    // Position the caret at the beginning of the string.
     27    eventSender.keyDown("leftArrow");
     28
     29    // Now move to the end
     30    if (onMacPlatform)
     31        eventSender.keyDown("rightArrow", ["metaKey"]);
     32    else
     33        eventSender.keyDown("end");
     34
     35    if (sel.baseOffset != 9 || sel.extentOffset != 9) {
     36        logResult("Selection should be at the end.");
     37        return;
     38    }
     39   
     40    // Now move back to the beginning
     41    if (onMacPlatform)
     42        eventSender.keyDown("leftArrow", ["metaKey"]);
     43    else
     44        eventSender.keyDown("home");
     45
     46    if (sel.baseOffset != 0 || sel.extentOffset != 0) {
     47        logResult("Selection should be at the beginning.");
     48        return;
     49    }
     50
     51    // Now move to the end, selecting
     52    if (onMacPlatform)
     53        eventSender.keyDown("rightArrow", ["metaKey", "shiftKey"]);
     54    else
     55        eventSender.keyDown("end",["shiftKey"]);
     56
     57    if (sel.baseOffset != 0 || sel.extentOffset != 9) {
     58        logResult("Selection should contain the whole line and have forward directionality.");
     59        return;
     60    }
     61
     62    // Deselect but position the caret at the end
     63    eventSender.keyDown("rightArrow");
     64   
     65    if (sel.baseOffset != 9 || sel.extentOffset != 9) {
     66        logResult("Selection should be at the end.");
     67        return;
     68    }
     69
     70    // Now move to the beginning, selecting
     71    if (onMacPlatform)
     72        eventSender.keyDown("leftArrow", ["metaKey", "shiftKey"]);
     73    else
     74        eventSender.keyDown("home",["shiftKey"]);
     75   
     76    if (sel.baseOffset != 9 || sel.extentOffset != 0) {
     77        logResult("Selection should contain the whole line and have backward directionality.");
     78        return;
     79    }
     80   
     81    logResult('SUCCESS');
     82}
    683</script>
    7 
    8         <script>
    9             function runTest() {
    10                 if (window.layoutTestController)
    11                     layoutTestController.dumpAsText();
    12                 else {
    13                     log('This test must be run by DumpRenderTree!')
    14                     return;
    15                 }
    16 
    17                 var onMacPlatform = false;
    18                 if (navigator.userAgent.search(/\bMac OS X\b/) != -1)
    19                     onMacPlatform = true;
    20                
    21                 var area = document.getElementById('area');
    22                 area.focus();
    23                
    24                 var sel = window.getSelection();
    25                 // Position the caret at the beginning of the string.
    26                 eventSender.keyDown("leftArrow");
    27 
    28                 // Now move to the end
    29                 if (onMacPlatform)
    30                     eventSender.keyDown("rightArrow", ["metaKey"]);
    31                 else
    32                     eventSender.keyDown("end");
    33 
    34                 if (sel.baseOffset != 9 || sel.extentOffset != 9)
    35                     return;
    36                
    37                 // Now move back to the beginning
    38                 if (onMacPlatform)
    39                     eventSender.keyDown("leftArrow", ["metaKey"]);
    40                 else
    41                     eventSender.keyDown("home");
    42 
    43                 if (sel.baseOffset != 0 || sel.extentOffset != 0)
    44                     return;
    45 
    46                 // Now move to the end, selecting
    47                 if (onMacPlatform)
    48                     eventSender.keyDown("rightArrow", ["metaKey", "shiftKey"]);
    49                 else
    50                     eventSender.keyDown("end",["shiftKey"]);
    51 
    52                 if (sel.baseOffset != 0 || sel.extentOffset != 9)
    53                     return;
    54 
    55                 // Deselect but position the caret at the end
    56                 eventSender.keyDown("rightArrow");
    57                
    58                 if (sel.baseOffset != 9 || sel.extentOffset != 9)
    59                     return;
    60                
    61                 // Now move to the beginning, selecting
    62                 if (onMacPlatform)
    63                     eventSender.keyDown("leftArrow", ["metaKey", "shiftKey"]);
    64                 else
    65                     eventSender.keyDown("home",["shiftKey"]);
    66                
    67                 if (sel.baseOffset != 9 || sel.extentOffset != 0)
    68                     return;
    69                
    70                 document.getElementById('result').innerHTML = 'SUCCESS'
    71             }
    72         </script>
    73     </head>
    74     <body onload="runTest();">
    75         <div contenteditable id="area">Some text</div>
    76         <div>This tests that moving the caret and selecting using Command+Left/Right arrows work correctly. If this text is successful, the text "SUCCESS" will be shown below.</div>
    77         <div id="result">FAILURE</div>
    78     </body>
    79 </html>
     84<body onload="runTest();">
     85    <div contenteditable id="area">Some text</div>
     86    <div>This tests that moving the caret and selecting using Command+Left/Right arrows work correctly. If this text is successful, the text "SUCCESS" will be shown below.</div>
     87    <div id="result">FAILURE</div>
     88</body>
  • trunk/LayoutTests/platform/mac/editing/selection/extend-after-mouse-selection-expected.txt

    r54980 r56639  
    55PASS Selection is [anchorNode: [object Text](ef) anchorOffset: 2 focusNode: [object Text](a ) focusOffset: 1 isCollapsed: false]
    66PASS Selection is [anchorNode: [object Text](ef) anchorOffset: 2 focusNode: [object Text](bc) focusOffset: 0 isCollapsed: false]
    7 FAIL Selection is [anchorNode: [object Text]( ) anchorOffset: 0 focusNode: [object Text]( ) focusOffset: 1 isCollapsed: false] should be at anchorNode: [object Text] anchorOffset: 1 focusNode: [object Text] focusOffset: 0
    8 FAIL Selection is [anchorNode: [object Text](ef) anchorOffset: 2 focusNode: [object Text](d ) focusOffset: 0 isCollapsed: false] should be at anchorNode: [object Text] anchorOffset: 1 focusNode: [object Text] focusOffset: 0
     7PASS Selection is [anchorNode: [object Text]( ) anchorOffset: 1 focusNode: [object Text](bc) focusOffset: 0 isCollapsed: false]
     8PASS Selection is [anchorNode: [object Text]( ) anchorOffset: 1 focusNode: [object Text](a ) focusOffset: 0 isCollapsed: false]
    99PASS successfullyParsed is true
    1010
  • trunk/WebCore/ChangeLog

    r56631 r56639  
     12010-03-25  Ojan Vafai  <ojan@chromium.org>
     2
     3        Reviewed by Darin Adler.
     4
     5        shift+home/end and cmd+shift+left/right don't extend the selection correctly
     6        https://bugs.webkit.org/show_bug.cgi?id=36539
     7
     8        * WebCore.base.exp:
     9        * editing/SelectionController.cpp:
     10        (WebCore::SelectionController::modify):
     11        * editing/SelectionController.h:
     12
    1132010-03-26  Janne Koskinen  <janne.p.koskinen@digia.com>
    214
  • trunk/WebCore/editing/SelectionController.cpp

    r56598 r56639  
    613613bool SelectionController::modify(EAlteration alter, EDirection dir, TextGranularity granularity, bool userTriggered)
    614614{
     615    Settings* settings = m_frame ? m_frame->settings() : 0;
     616    return modify(alter, dir, granularity, userTriggered, settings);
     617}
     618   
     619static bool isBoundary(TextGranularity granularity)
     620{
     621    return granularity == LineBoundary || granularity == ParagraphBoundary || granularity == DocumentBoundary;
     622}   
     623   
     624bool SelectionController::modify(EAlteration alter, EDirection direction, TextGranularity granularity, bool userTriggered, Settings* settings)
     625{
    615626    if (userTriggered) {
    616627        SelectionController trialSelectionController;
    617628        trialSelectionController.setSelection(m_selection);
    618629        trialSelectionController.setIsDirectional(m_isDirectional);
    619         trialSelectionController.modify(alter, dir, granularity, false);
     630        trialSelectionController.modify(alter, direction, granularity, false, settings);
    620631
    621632        bool change = m_frame->shouldChangeSelection(trialSelectionController.selection());
     
    624635    }
    625636
    626     willBeModified(alter, dir);
    627 
    628     VisiblePosition pos;
    629     switch (dir) {
     637    willBeModified(alter, direction);
     638
     639    VisiblePosition position;
     640    switch (direction) {
    630641        case RIGHT:
    631642            if (alter == MOVE)
    632                 pos = modifyMovingRight(granularity);
     643                position = modifyMovingRight(granularity);
    633644            else
    634                 pos = modifyExtendingRight(granularity);
     645                position = modifyExtendingRight(granularity);
    635646            break;
    636647        case FORWARD:
    637648            if (alter == EXTEND)
    638                 pos = modifyExtendingForward(granularity);
     649                position = modifyExtendingForward(granularity);
    639650            else
    640                 pos = modifyMovingForward(granularity);
     651                position = modifyMovingForward(granularity);
    641652            break;
    642653        case LEFT:
    643654            if (alter == MOVE)
    644                 pos = modifyMovingLeft(granularity);
     655                position = modifyMovingLeft(granularity);
    645656            else
    646                 pos = modifyExtendingLeft(granularity);
     657                position = modifyExtendingLeft(granularity);
    647658            break;
    648659        case BACKWARD:
    649660            if (alter == EXTEND)
    650                 pos = modifyExtendingBackward(granularity);
     661                position = modifyExtendingBackward(granularity);
    651662            else
    652                 pos = modifyMovingBackward(granularity);
    653             break;
    654     }
    655 
    656     if (pos.isNull())
     663                position = modifyMovingBackward(granularity);
     664            break;
     665    }
     666
     667    if (position.isNull())
    657668        return false;
    658669
     
    665676    switch (alter) {
    666677        case MOVE:
    667             moveTo(pos, userTriggered);
     678            moveTo(position, userTriggered);
    668679            break;
    669680        case EXTEND:
    670             setExtent(pos, userTriggered);
    671             break;
     681            if (!settings || settings->editingBehavior() != EditingMacBehavior || m_selection.isCaret() || !isBoundary(granularity))
     682                setExtent(position, userTriggered);
     683            else {
     684                // Standard Mac behavior when extending to a boundary is grow the selection rather
     685                // than leaving the base in place and moving the extent. Matches NSTextView.
     686                if (direction == FORWARD || direction == RIGHT)
     687                    setEnd(position, userTriggered);
     688                else
     689                    setStart(position, userTriggered);
     690            }
    672691    }
    673692   
     
    823842    m_granularity = CharacterGranularity;
    824843    setSelection(VisibleSelection());
     844}
     845
     846void SelectionController::setStart(const VisiblePosition &pos, bool userTriggered)
     847{
     848    if (m_selection.isBaseFirst())
     849        setBase(pos, userTriggered);
     850    else
     851        setExtent(pos, userTriggered);
     852}
     853
     854void SelectionController::setEnd(const VisiblePosition &pos, bool userTriggered)
     855{
     856    if (m_selection.isBaseFirst())
     857        setExtent(pos, userTriggered);
     858    else
     859        setBase(pos, userTriggered);
    825860}
    826861
  • trunk/WebCore/editing/SelectionController.h

    r56567 r56639  
    3939class RenderObject;
    4040class RenderView;
     41class Settings;
    4142class VisiblePosition;
    4243
     
    7980    TextGranularity granularity() const { return m_granularity; }
    8081
     82    void setStart(const VisiblePosition &, bool userTriggered = false);
     83    void setEnd(const VisiblePosition &, bool userTriggered = false);
     84   
    8185    void setBase(const VisiblePosition&, bool userTriggered = false);
    8286    void setBase(const Position&, EAffinity, bool userTriggered = false);
     
    148152    VisiblePosition startForPlatform() const;
    149153    VisiblePosition endForPlatform() const;
     154
     155    bool modify(EAlteration, EDirection, TextGranularity, bool userTriggered, Settings*);
    150156
    151157    VisiblePosition modifyExtendingRight(TextGranularity);
Note: See TracChangeset for help on using the changeset viewer.