jenkins-bot has submitted this change and it was merged.

Change subject: Factor out undeletability from internal-ness
......................................................................


Factor out undeletability from internal-ness

This will allow us to have undeletable node types
that aren't internal nodes.

Change-Id: I44cf221311a6b2a5c5cd5bb4845a5ef39d2752ff
---
M src/dm/nodes/ve.dm.InternalItemNode.js
M src/dm/nodes/ve.dm.InternalListNode.js
M src/dm/ve.dm.Node.js
M src/dm/ve.dm.NodeFactory.js
M src/dm/ve.dm.Transaction.js
5 files changed, 36 insertions(+), 8 deletions(-)

Approvals:
  Jforrester: Looks good to me, but someone else must approve
  Esanders: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/src/dm/nodes/ve.dm.InternalItemNode.js 
b/src/dm/nodes/ve.dm.InternalItemNode.js
index e69b7a7..b4cab4c 100644
--- a/src/dm/nodes/ve.dm.InternalItemNode.js
+++ b/src/dm/nodes/ve.dm.InternalItemNode.js
@@ -33,6 +33,8 @@
 
 ve.dm.InternalItemNode.static.isInternal = true;
 
+ve.dm.InternalItemNode.static.isDeletable = false;
+
 /* Registration */
 
 ve.dm.modelRegistry.register( ve.dm.InternalItemNode );
diff --git a/src/dm/nodes/ve.dm.InternalListNode.js 
b/src/dm/nodes/ve.dm.InternalListNode.js
index 8b80598..91eb2d8 100644
--- a/src/dm/nodes/ve.dm.InternalListNode.js
+++ b/src/dm/nodes/ve.dm.InternalListNode.js
@@ -33,6 +33,8 @@
 
 ve.dm.InternalListNode.static.isInternal = true;
 
+ve.dm.InternalListNode.static.isDeletable = false;
+
 /* Registration */
 
 ve.dm.modelRegistry.register( ve.dm.InternalListNode );
diff --git a/src/dm/ve.dm.Node.js b/src/dm/ve.dm.Node.js
index d27a975..4c59bf5 100644
--- a/src/dm/ve.dm.Node.js
+++ b/src/dm/ve.dm.Node.js
@@ -80,6 +80,16 @@
 ve.dm.Node.static.ignoreChildren = false;
 
 /**
+ * Whether this node can be deleted. If false, 
ve.dm.Transaction#newFromRemoval will silently
+ * ignore any attepts to delete this node.
+ *
+ * @static
+ * @property {boolean}
+ * @inheritable
+ */
+ve.dm.Node.static.isDeletable = true;
+
+/**
  * Whether this node type is internal. Internal node types are ignored by the 
converter.
  *
  * @static
diff --git a/src/dm/ve.dm.NodeFactory.js b/src/dm/ve.dm.NodeFactory.js
index 7ba6507..5a408ed 100644
--- a/src/dm/ve.dm.NodeFactory.js
+++ b/src/dm/ve.dm.NodeFactory.js
@@ -270,6 +270,20 @@
        throw new Error( 'Unknown node type: ' + type );
 };
 
+/**
+ * Check if node is deletable.
+ *
+ * @param {string} type Node type
+ * @return {boolean} Whether the node is internal
+ * @throws {Error} Unknown node type
+ */
+ve.dm.NodeFactory.prototype.isNodeDeletable = function ( type ) {
+       if ( Object.prototype.hasOwnProperty.call( this.registry, type ) ) {
+               return this.registry[ type ].static.isDeletable;
+       }
+       throw new Error( 'Unknown node type: ' + type );
+};
+
 /* Initialization */
 
 ve.dm.nodeFactory = new ve.dm.NodeFactory();
diff --git a/src/dm/ve.dm.Transaction.js b/src/dm/ve.dm.Transaction.js
index 2d4ea94..1b510fc 100644
--- a/src/dm/ve.dm.Transaction.js
+++ b/src/dm/ve.dm.Transaction.js
@@ -1115,7 +1115,7 @@
 
 /**
  * Adds a replace op to remove the desired range and, where required, splices 
in retain ops
- * to prevent the deletion of internal data.
+ * to prevent the deletion of undeletable nodes.
  *
  * An extra `replaceMetadata` operation might be pushed at the end if the
  * affected region contains metadata; see
@@ -1130,23 +1130,23 @@
 ve.dm.Transaction.prototype.addSafeRemoveOps = function ( doc, removeStart, 
removeEnd, removeMetadata ) {
        var i, queuedRetain,
                retainStart = removeStart,
-               internalStackDepth = 0;
+               undeletableStackDepth = 0;
        // Iterate over removal range and use a stack counter to determine if
-       // we are inside an internal node
+       // we are inside an undeletable node
        for ( i = removeStart; i < removeEnd; i++ ) {
-               if ( doc.data.isElementData( i ) && 
ve.dm.nodeFactory.isNodeInternal( doc.data.getType( i ) ) ) {
+               if ( doc.data.isElementData( i ) && 
!ve.dm.nodeFactory.isNodeDeletable( doc.data.getType( i ) ) ) {
                        if ( !doc.data.isCloseElementData( i ) ) {
-                               if ( internalStackDepth === 0 ) {
+                               if ( undeletableStackDepth === 0 ) {
                                        if ( queuedRetain ) {
                                                this.pushRetain( queuedRetain );
                                        }
                                        this.pushReplace( doc, removeStart, i - 
removeStart, [], removeMetadata ? [] : undefined );
                                        retainStart = i;
                                }
-                               internalStackDepth++;
+                               undeletableStackDepth++;
                        } else {
-                               internalStackDepth--;
-                               if ( internalStackDepth === 0 ) {
+                               undeletableStackDepth--;
+                               if ( undeletableStackDepth === 0 ) {
                                        queuedRetain = i + 1 - retainStart;
                                        removeStart = i + 1;
                                }

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I44cf221311a6b2a5c5cd5bb4845a5ef39d2752ff
Gerrit-PatchSet: 3
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Catrope <[email protected]>
Gerrit-Reviewer: Catrope <[email protected]>
Gerrit-Reviewer: Esanders <[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