Catrope has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/89213


Change subject: Stop using ve.isMixedIn() to check if a node is focusable
......................................................................

Stop using ve.isMixedIn() to check if a node is focusable

* Moved isNodeFocusable to ve.ce.NodeFactory
* Added isFocusable static property to ve.ce.Node
* Set isFocusable to true on ve.ce.FocusableNode

Change-Id: I3cf666280abdfce55bf9b0710827bb25c40bfd51
---
M modules/ve/ce/ve.ce.Document.js
M modules/ve/ce/ve.ce.FocusableNode.js
M modules/ve/ce/ve.ce.Node.js
M modules/ve/ce/ve.ce.NodeFactory.js
M modules/ve/ce/ve.ce.Surface.js
M modules/ve/dm/ve.dm.NodeFactory.js
6 files changed, 40 insertions(+), 21 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor 
refs/changes/13/89213/1

diff --git a/modules/ve/ce/ve.ce.Document.js b/modules/ve/ce/ve.ce.Document.js
index 4dc671f..e4da9e6 100644
--- a/modules/ve/ce/ve.ce.Document.js
+++ b/modules/ve/ce/ve.ce.Document.js
@@ -208,14 +208,14 @@
                        }
                        if (
                                this.isOpenElementData( index ) &&
-                               ve.dm.nodeFactory.isNodeFocusable( 
this.getType( index ) )
+                               ve.ce.nodeFactory.isNodeFocusable( 
this.getType( index ) )
                        ) {
                                coveredOffset = index + 1;
                                return true;
                        }
                        if (
                                this.isCloseElementData( index ) &&
-                               ve.dm.nodeFactory.isNodeFocusable( 
this.getType( index ) )
+                               ve.ce.nodeFactory.isNodeFocusable( 
this.getType( index ) )
                        ) {
                                coveredOffset = index;
                                return true;
@@ -252,7 +252,7 @@
        }
 
        node = this.documentNode.getNodeFromOffset( range.start + 1 );
-       if ( node && ve.dm.nodeFactory.isNodeFocusable( node.type ) ) {
+       if ( node && ve.ce.nodeFactory.isNodeFocusable( node.type ) ) {
                if ( node === this.documentNode.getNodeFromOffset( range.end - 
1 ) ) {
                        if ( this.model.data.isContentOffset( range.to ) || 
!!this.getSlugAtOffset( range.to ) ) {
                                return new ve.Range( direction === 1 ? 
range.end : range.start );
diff --git a/modules/ve/ce/ve.ce.FocusableNode.js 
b/modules/ve/ce/ve.ce.FocusableNode.js
index 96d0716..5c970ec 100644
--- a/modules/ve/ce/ve.ce.FocusableNode.js
+++ b/modules/ve/ce/ve.ce.FocusableNode.js
@@ -50,6 +50,12 @@
  * @event blur
  */
 
+/* Static Methods */
+
+ve.ce.FocusableNode.static = {};
+
+ve.ce.FocusableNode.static.isFocusable = true;
+
 /* Methods */
 
 /**
diff --git a/modules/ve/ce/ve.ce.Node.js b/modules/ve/ce/ve.ce.Node.js
index 93addd9..b9fe88f 100644
--- a/modules/ve/ce/ve.ce.Node.js
+++ b/modules/ve/ce/ve.ce.Node.js
@@ -50,6 +50,19 @@
  */
 ve.ce.Node.static.canBeSplit = false;
 
+/**
+ * Whether this node type can be focused.
+ *
+ * If this is set to true on a node, it should implement:
+ *     setFocused( boolean val )
+ *     boolean isFocused()
+ *
+ * @static
+ * @property static.isFocusable
+ * @inheritable
+ */
+ve.ce.Node.static.isFocusable = false;
+
 /* Methods */
 
 /**
diff --git a/modules/ve/ce/ve.ce.NodeFactory.js 
b/modules/ve/ce/ve.ce.NodeFactory.js
index 68971a1..ecf64c6 100644
--- a/modules/ve/ce/ve.ce.NodeFactory.js
+++ b/modules/ve/ce/ve.ce.NodeFactory.js
@@ -37,6 +37,21 @@
        throw new Error( 'Unknown node type: ' + type );
 };
 
+/**
+ * Check if the node is focusable.
+ *
+ * @method
+ * @param {string} type Node type
+ * @returns {boolean} Whether the node is focusable
+ * @throws {Error} Unknown node type
+ */
+ve.ce.NodeFactory.prototype.isNodeFocusable = function ( type ) {
+       if ( type in this.registry ) {
+               return this.registry[type].static.isFocusable;
+       }
+       throw new Error( 'Unknown node type: ' + type );
+};
+
 /* Initialization */
 
 // TODO: Move instantiation to a different file
diff --git a/modules/ve/ce/ve.ce.Surface.js b/modules/ve/ce/ve.ce.Surface.js
index be9245f..6cc86c4 100644
--- a/modules/ve/ce/ve.ce.Surface.js
+++ b/modules/ve/ce/ve.ce.Surface.js
@@ -929,7 +929,7 @@
                // Detect when only a single inline element is selected
                if ( !selection.isCollapsed() ) {
                        start = 
this.documentView.getDocumentNode().getNodeFromOffset( selection.start + 1 );
-                       if ( ve.isMixedIn( start, ve.ce.FocusableNode ) ) {
+                       if ( ve.ce.nodeFactory.isNodeFocusable( 
start.getModel().getType() ) ) {
                                end = 
this.documentView.getDocumentNode().getNodeFromOffset( selection.end - 1 );
                                if ( start === end ) {
                                        next = start;
@@ -938,7 +938,7 @@
                } else {
                        // Check we haven't been programmatically placed inside 
a focusable node with a collapsed selection
                        start = 
this.documentView.getDocumentNode().getNodeFromOffset( selection.start );
-                       if ( ve.isMixedIn( start, ve.ce.FocusableNode ) ) {
+                       if ( ve.ce.nodeFactory.isNodeFocusable( 
start.getModel().getType() ) ) {
                                next = start;
                        }
                }
@@ -1533,7 +1533,7 @@
                        // If the user tries to delete a focusable node from a 
collapsed selection,
                        // just select the node and cancel the deletion.
                        startNode = 
this.documentView.getDocumentNode().getNodeFromOffset( offset + 1 );
-                       if ( ve.isMixedIn( startNode, ve.ce.FocusableNode ) ) {
+                       if ( ve.ce.nodeFactory.isNodeFocusable( 
startNode.getModel().getType() ) ) {
                                this.model.change( null, 
startNode.getModel().getOuterRange() );
                                return;
                        }
diff --git a/modules/ve/dm/ve.dm.NodeFactory.js 
b/modules/ve/dm/ve.dm.NodeFactory.js
index b49f190..e0f6d1b 100644
--- a/modules/ve/dm/ve.dm.NodeFactory.js
+++ b/modules/ve/dm/ve.dm.NodeFactory.js
@@ -241,21 +241,6 @@
        throw new Error( 'Unknown node type: ' + type );
 };
 
-/**
- * Check if the node is focusable.
- *
- * @method
- * @param {string} type Node type
- * @returns {boolean} Whether the node is focusable
- * @throws {Error} Unknown node type
- */
-ve.dm.NodeFactory.prototype.isNodeFocusable = function ( type ) {
-       if ( ve.dm.nodeFactory.lookup( type ) ) {
-               return ve.isMixedIn( ve.ce.nodeFactory.registry[type], 
ve.ce.FocusableNode );
-       }
-       throw new Error( 'Unknown node type: ' + type );
-};
-
 /* Initialization */
 
 ve.dm.nodeFactory = new ve.dm.NodeFactory();

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I3cf666280abdfce55bf9b0710827bb25c40bfd51
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Catrope <[email protected]>
Gerrit-Reviewer: Trevor Parscal <[email protected]>

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

Reply via email to