Esanders has uploaded a new change for review.

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

Change subject: Create CE view initialization event for when $element is created
......................................................................

Create CE view initialization event for when $element is created

This event is fired after $element is created or re-created, so
after construction in the node factory and after $element is changed
in GCN or updateTagName.

Follows up I2690751.

Bug: T91831
Change-Id: Iffc2e81f9e8eee13f6ce26087403df9326aea10a
---
M src/ce/nodes/ve.ce.GeneratedContentNode.js
M src/ce/nodes/ve.ce.TableCellNode.js
M src/ce/ve.ce.BranchNode.js
M src/ce/ve.ce.FocusableNode.js
M src/ce/ve.ce.LeafNode.js
M src/ce/ve.ce.NodeFactory.js
M src/ce/ve.ce.View.js
7 files changed, 73 insertions(+), 43 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor 
refs/changes/28/195228/1

diff --git a/src/ce/nodes/ve.ce.GeneratedContentNode.js 
b/src/ce/nodes/ve.ce.GeneratedContentNode.js
index a03ea44..bad3b21 100644
--- a/src/ce/nodes/ve.ce.GeneratedContentNode.js
+++ b/src/ce/nodes/ve.ce.GeneratedContentNode.js
@@ -174,6 +174,8 @@
        }
 
        if ( this.live ) {
+               // $element has changed, so re-initialize
+               this.emit( 'initialize' );
                this.emit( 'setup' );
                this.afterRender();
        }
diff --git a/src/ce/nodes/ve.ce.TableCellNode.js 
b/src/ce/nodes/ve.ce.TableCellNode.js
index f2980ce..2f28d4b 100644
--- a/src/ce/nodes/ve.ce.TableCellNode.js
+++ b/src/ce/nodes/ve.ce.TableCellNode.js
@@ -17,22 +17,6 @@
        // Parent constructor
        ve.ce.TableCellNode.super.apply( this, arguments );
 
-       var rowspan = this.model.getRowspan(),
-               colspan = this.model.getColspan();
-
-       // DOM changes
-       this.$element
-               // The following classes can be used here:
-               // ve-ce-tableCellNode-data
-               // ve-ce-tableCellNode-header
-               .addClass( 've-ce-tableCellNode ve-ce-tableCellNode-' + 
this.model.getAttribute( 'style' ) );
-       if ( rowspan > 1 ) {
-               this.$element.attr( 'rowspan', rowspan );
-       }
-       if ( colspan > 1 ) {
-               this.$element.attr( 'colspan', colspan );
-       }
-
        // Events
        this.model.connect( this, {
                update: 'onUpdate',
@@ -80,6 +64,31 @@
 };
 
 /**
+ * @inheritdoc
+ */
+ve.ce.TableCellNode.prototype.onInitialize = function () {
+       // Parent method
+       ve.ce.TableCellNode.super.prototype.onInitialize.apply( this, arguments 
);
+
+       var rowspan = this.model.getRowspan(),
+               colspan = this.model.getColspan();
+
+       // DOM changes
+       this.$element
+               // The following classes can be used here:
+               // ve-ce-tableCellNode-data
+               // ve-ce-tableCellNode-header
+               .addClass( 've-ce-tableCellNode ve-ce-tableCellNode-' + 
this.model.getAttribute( 'style' ) );
+
+       if ( rowspan > 1 ) {
+               this.$element.attr( 'rowspan', rowspan );
+       }
+       if ( colspan > 1 ) {
+               this.$element.attr( 'colspan', colspan );
+       }
+};
+
+/**
  * Handle model update events.
  *
  * If the style changed since last update the DOM wrapper will be replaced 
with an appropriate one.
@@ -104,9 +113,6 @@
                        }
                        break;
                case 'style':
-                       this.$element
-                               .removeClass( 've-ce-tableCellNode-' + from )
-                               .addClass( 've-ce-tableCellNode-' + to );
                        this.updateTagName();
                        break;
        }
diff --git a/src/ce/ve.ce.BranchNode.js b/src/ce/ve.ce.BranchNode.js
index a4513b5..8eff640 100644
--- a/src/ce/ve.ce.BranchNode.js
+++ b/src/ce/ve.ce.BranchNode.js
@@ -17,15 +17,12 @@
  * @param {ve.dm.BranchNode} model Model to observe
  * @param {Object} [config] Configuration options
  */
-ve.ce.BranchNode = function VeCeBranchNode( model, config ) {
+ve.ce.BranchNode = function VeCeBranchNode() {
        // Mixin constructor
        ve.BranchNode.call( this );
 
        // Parent constructor
-       ve.ce.Node.call( this, model, config );
-
-       // DOM changes (keep in sync with #onSetup)
-       this.$element.addClass( 've-ce-branchNode' );
+       ve.ce.BranchNode.super.apply( this, arguments );
 
        // Properties
        this.tagName = this.$element.get( 0 ).nodeName.toLowerCase();
@@ -35,7 +32,7 @@
        this.model.connect( this, { splice: 'onSplice' } );
 
        // Initialization
-       this.onSplice.apply( this, [0, 0].concat( model.getChildren() ) );
+       this.onSplice.apply( this, [0, 0].concat( this.model.getChildren() ) );
 };
 
 /* Inheritance */
@@ -100,11 +97,11 @@
 /**
  * @inheritdoc
  */
-ve.ce.BranchNode.prototype.onSetup = function () {
+ve.ce.BranchNode.prototype.onInitialize = function () {
        // Parent method
-       ve.ce.Node.prototype.onSetup.call( this );
+       ve.ce.BranchNode.super.prototype.onInitialize.call( this );
 
-       // DOM changes (duplicated from constructor in case this.$element is 
replaced)
+       // DOM changes
        this.$element.addClass( 've-ce-branchNode' );
 };
 
@@ -141,6 +138,8 @@
                }
                // Use new element from now on
                this.$element = $( wrapper );
+               // $element has changed, so re-initialize
+               this.emit( 'initialize' );
                this.emit( 'setup' );
                // Remember which tag name we are using now
                this.tagName = tagName;
diff --git a/src/ce/ve.ce.FocusableNode.js b/src/ce/ve.ce.FocusableNode.js
index 42d857c..a716933 100644
--- a/src/ce/ve.ce.FocusableNode.js
+++ b/src/ce/ve.ce.FocusableNode.js
@@ -42,6 +42,7 @@
 
        // Events
        this.connect( this, {
+               initialize: 'onFocusableInitialize',
                setup: 'onFocusableSetup',
                teardown: 'onFocusableTeardown',
                resizeStart: 'onFocusableResizeStart',
@@ -89,6 +90,18 @@
 };
 
 /**
+ * Handle node initialization.
+ *
+ * @method
+ */
+ve.ce.FocusableNode.prototype.onFocusableInitialize = function () {
+       // DOM changes
+       this.$element
+               .addClass( 've-ce-focusableNode' )
+               .prop( 'contentEditable', 'false' );
+};
+
+/**
  * Handle node setup.
  *
  * @method
@@ -100,11 +113,6 @@
        }
 
        this.surface = this.getRoot().getSurface();
-
-       // DOM changes (duplicated from constructor in case this.$element is 
replaced)
-       this.$element
-               .addClass( 've-ce-focusableNode' )
-               .prop( 'contentEditable', 'false' );
 
        // Events
        this.$focusable.on( {
diff --git a/src/ce/ve.ce.LeafNode.js b/src/ce/ve.ce.LeafNode.js
index 992f7e3..d98b787 100644
--- a/src/ce/ve.ce.LeafNode.js
+++ b/src/ce/ve.ce.LeafNode.js
@@ -17,17 +17,12 @@
  * @param {ve.dm.LeafNode} model
  * @param {Object} [config]
  */
-ve.ce.LeafNode = function VeCeLeafNode( model ) {
+ve.ce.LeafNode = function VeCeLeafNode() {
        // Mixin constructor
        ve.LeafNode.call( this );
 
        // Parent constructor
-       ve.ce.Node.apply( this, arguments );
-
-       // DOM changes (keep in sync with #onSetup)
-       if ( model.isWrapped() ) {
-               this.$element.addClass( 've-ce-leafNode' );
-       }
+       ve.ce.LeafNode.super.apply( this, arguments );
 };
 
 /* Inheritance */
@@ -45,11 +40,11 @@
 /**
  * @inheritdoc
  */
-ve.ce.LeafNode.prototype.onSetup = function () {
+ve.ce.LeafNode.prototype.onInitialize = function () {
        // Parent method
-       ve.ce.Node.prototype.onSetup.call( this );
+       ve.ce.LeafNode.super.prototype.onInitialize.call( this );
 
-       // DOM changes (duplicated from constructor in case this.$element is 
replaced)
+       // DOM changes
        if ( this.model.isWrapped() ) {
                this.$element.addClass( 've-ce-leafNode' );
        }
diff --git a/src/ce/ve.ce.NodeFactory.js b/src/ce/ve.ce.NodeFactory.js
index d913cff..f9566cb 100644
--- a/src/ce/ve.ce.NodeFactory.js
+++ b/src/ce/ve.ce.NodeFactory.js
@@ -23,6 +23,18 @@
 /* Methods */
 
 /**
+ * @inheritdoc
+ */
+ve.ce.NodeFactory.prototype.create = function () {
+       // Parent method
+       var obj = ve.ce.NodeFactory.super.prototype.create.apply( this, 
arguments );
+
+       obj.emit( 'initialize' );
+
+       return obj;
+};
+
+/**
  * Get a plain text description of a node model.
  *
  * @param {ve.dm.Node} node Node to describe
diff --git a/src/ce/ve.ce.View.js b/src/ce/ve.ce.View.js
index 168f51c..39277c4 100644
--- a/src/ce/ve.ce.View.js
+++ b/src/ce/ve.ce.View.js
@@ -32,6 +32,7 @@
 
        // Events
        this.connect( this, {
+               initialize: 'onInitialize',
                setup: 'onSetup',
                teardown: 'onTeardown'
        } );
@@ -110,6 +111,13 @@
 };
 
 /**
+ * Initialize the $element.
+ *
+ * @method
+ */
+ve.ce.View.prototype.onInitialize = function () {};
+
+/**
  * Handle setup event.
  *
  * @method

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iffc2e81f9e8eee13f6ce26087403df9326aea10a
Gerrit-PatchSet: 1
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>

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

Reply via email to