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