jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/334368 )

Change subject: Handle home/end/pageup/pagedown keys when on focusable nodes
......................................................................


Handle home/end/pageup/pagedown keys when on focusable nodes

Bug: T156376
Change-Id: Ib34f32a7aa64c4a682725e94c5114b48b23a4ec0
---
M src/ce/keydownhandlers/ve.ce.LinearArrowKeyDownHandler.js
M src/ce/keydownhandlers/ve.ce.TableArrowKeyDownHandler.js
M tests/ce/ve.ce.Surface.test.js
3 files changed, 46 insertions(+), 13 deletions(-)

Approvals:
  jenkins-bot: Verified
  Jforrester: Looks good to me, approved



diff --git a/src/ce/keydownhandlers/ve.ce.LinearArrowKeyDownHandler.js 
b/src/ce/keydownhandlers/ve.ce.LinearArrowKeyDownHandler.js
index caf9626..df3e3c0 100644
--- a/src/ce/keydownhandlers/ve.ce.LinearArrowKeyDownHandler.js
+++ b/src/ce/keydownhandlers/ve.ce.LinearArrowKeyDownHandler.js
@@ -25,7 +25,10 @@
 
 ve.ce.LinearArrowKeyDownHandler.static.name = 'linearArrow';
 
-ve.ce.LinearArrowKeyDownHandler.static.keys = [ OO.ui.Keys.UP, 
OO.ui.Keys.DOWN, OO.ui.Keys.LEFT, OO.ui.Keys.RIGHT ];
+ve.ce.LinearArrowKeyDownHandler.static.keys = [
+       OO.ui.Keys.UP, OO.ui.Keys.DOWN, OO.ui.Keys.LEFT, OO.ui.Keys.RIGHT,
+       OO.ui.Keys.HOME, OO.ui.Keys.END, OO.ui.Keys.PAGEUP, OO.ui.Keys.PAGEDOWN
+];
 
 ve.ce.LinearArrowKeyDownHandler.static.supportedSelections = [ 'linear' ];
 
@@ -35,8 +38,12 @@
  * @inheritdoc
  */
 ve.ce.LinearArrowKeyDownHandler.static.execute = function ( surface, e ) {
-       var nativeRange, collapseNode, collapseOffset, direction, 
directionality, upOrDown,
+       var nativeRange, collapseNode, collapseOffset, direction, 
directionality,
                startFocusNode, startFocusOffset,
+               isBlockMove = e.keyCode === OO.ui.Keys.UP || e.keyCode === 
OO.ui.Keys.DOWN ||
+                       e.keyCode === OO.ui.Keys.PAGEUP || e.keyCode === 
OO.ui.Keys.PAGEDOWN ||
+                       e.keyCode === OO.ui.Keys.HOME || e.keyCode === 
OO.ui.Keys.END,
+               keyBlockDirection = e.keyCode === OO.ui.Keys.DOWN || e.keyCode 
=== OO.ui.Keys.PAGEDOWN || e.keyCode === OO.ui.Keys.END ? 1 : -1,
                range = surface.model.getSelection().getRange();
 
        // TODO: onDocumentKeyDown did this already
@@ -44,12 +51,10 @@
        // TODO: onDocumentKeyDown did this already
        surface.surfaceObserver.pollOnce();
 
-       upOrDown = e.keyCode === OO.ui.Keys.UP || e.keyCode === OO.ui.Keys.DOWN;
-
        if ( surface.focusedBlockSlug ) {
                // Block level selection, so directionality is just css 
directionality
-               if ( upOrDown ) {
-                       direction = e.keyCode === OO.ui.Keys.DOWN ? 1 : -1;
+               if ( isBlockMove ) {
+                       direction = keyBlockDirection;
                } else {
                        directionality = $( surface.focusedBlockSlug ).css( 
'direction' );
                        // eslint-disable-next-line no-bitwise
@@ -74,8 +79,8 @@
        }
 
        if ( surface.focusedNode ) {
-               if ( upOrDown ) {
-                       direction = e.keyCode === OO.ui.Keys.DOWN ? 1 : -1;
+               if ( isBlockMove ) {
+                       direction = keyBlockDirection;
                } else {
                        directionality = surface.getFocusedNodeDirectionality();
                        // eslint-disable-next-line no-bitwise
@@ -118,7 +123,7 @@
                        // Move to start/end of node in the model in DM (and 
DOM)
                        range = new ve.Range( direction === 1 ? range.end : 
range.start );
                        surface.model.setLinearSelection( range );
-                       if ( !upOrDown ) {
+                       if ( !isBlockMove ) {
                                // un-shifted left/right: we've already moved 
so preventDefault
                                e.preventDefault();
                                return true;
@@ -133,7 +138,7 @@
                // is backwards, then use "collapse to anchor - observe - 
expand".
                collapseNode = surface.nativeSelection.anchorNode;
                collapseOffset = surface.nativeSelection.anchorOffset;
-       } else if ( e.shiftKey && !range.isCollapsed() && upOrDown ) {
+       } else if ( e.shiftKey && !range.isCollapsed() && isBlockMove ) {
                // If selection is expanded and cursoring is up/down, use
                // "collapse to focus - observe - expand" to work round quirks.
                collapseNode = surface.nativeSelection.focusNode;
@@ -166,10 +171,10 @@
 
                if ( viewNode.isFocusable() ) {
                        // We've landed in a focusable node; fixup the range
-                       if ( upOrDown ) {
+                       if ( isBlockMove ) {
                                // The intended direction is clear, even if the 
cursor did not move
                                // or did something completely preposterous
-                               afterDirection = e.keyCode === OO.ui.Keys.DOWN 
? 1 : -1;
+                               afterDirection = keyBlockDirection;
                        } else {
                                // Observe which way the cursor moved
                                afterDirection = ve.compareDocumentOrder(
diff --git a/src/ce/keydownhandlers/ve.ce.TableArrowKeyDownHandler.js 
b/src/ce/keydownhandlers/ve.ce.TableArrowKeyDownHandler.js
index f47746a..84cbcd2 100644
--- a/src/ce/keydownhandlers/ve.ce.TableArrowKeyDownHandler.js
+++ b/src/ce/keydownhandlers/ve.ce.TableArrowKeyDownHandler.js
@@ -27,7 +27,7 @@
 
 ve.ce.TableArrowKeyDownHandler.static.keys = [
        OO.ui.Keys.UP, OO.ui.Keys.DOWN, OO.ui.Keys.LEFT, OO.ui.Keys.RIGHT,
-       OO.ui.Keys.END, OO.ui.Keys.HOME, OO.ui.Keys.PAGEUP, OO.ui.Keys.PAGEDOWN,
+       OO.ui.Keys.HOME, OO.ui.Keys.END, OO.ui.Keys.PAGEUP, OO.ui.Keys.PAGEDOWN,
        OO.ui.Keys.TAB
 ];
 
diff --git a/tests/ce/ve.ce.Surface.test.js b/tests/ce/ve.ce.Surface.test.js
index 250aacc..91eb825 100644
--- a/tests/ce/ve.ce.Surface.test.js
+++ b/tests/ce/ve.ce.Surface.test.js
@@ -756,9 +756,23 @@
                        {
                                htmlOrDoc: blockImageDoc,
                                rangeOrSelection: new ve.Range( 5, 18 ),
+                               keys: [ 'HOME' ],
+                               expectedRangeOrSelection: new ve.Range( 4 ),
+                               msg: 'Cursor home off a block node'
+                       },
+                       {
+                               htmlOrDoc: blockImageDoc,
+                               rangeOrSelection: new ve.Range( 5, 18 ),
                                keys: [ 'UP' ],
                                expectedRangeOrSelection: new ve.Range( 4 ),
                                msg: 'Cursor up off a block node'
+                       },
+                       {
+                               htmlOrDoc: blockImageDoc,
+                               rangeOrSelection: new ve.Range( 5, 18 ),
+                               keys: [ 'PAGEUP' ],
+                               expectedRangeOrSelection: new ve.Range( 4 ),
+                               msg: 'Cursor page up off a block node'
                        },
                        {
                                htmlOrDoc: blockImageDoc,
@@ -770,10 +784,24 @@
                        {
                                htmlOrDoc: blockImageDoc,
                                rangeOrSelection: new ve.Range( 5, 18 ),
+                               keys: [ 'END' ],
+                               expectedRangeOrSelection: new ve.Range( 19 ),
+                               msg: 'Cursor end off a block node'
+                       },
+                       {
+                               htmlOrDoc: blockImageDoc,
+                               rangeOrSelection: new ve.Range( 5, 18 ),
                                keys: [ 'DOWN' ],
                                expectedRangeOrSelection: new ve.Range( 19 ),
                                msg: 'Cursor down off a block node'
                        },
+                       {
+                               htmlOrDoc: blockImageDoc,
+                               rangeOrSelection: new ve.Range( 5, 18 ),
+                               keys: [ 'PAGEDOWN' ],
+                               expectedRangeOrSelection: new ve.Range( 19 ),
+                               msg: 'Cursor page down off a block node'
+                       },
                        // Cursoring onto a block node, which should focus it
                        // Again, these are forcibly moving the cursor, so it's 
not a perfect
                        // test; it's more checking how we fix up the selection 
afterwards.

-- 
To view, visit https://gerrit.wikimedia.org/r/334368
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ib34f32a7aa64c4a682725e94c5114b48b23a4ec0
Gerrit-PatchSet: 3
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>
Gerrit-Reviewer: Divec <[email protected]>
Gerrit-Reviewer: Jforrester <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to