Esanders has uploaded a new change for review.

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


Change subject: getDataFromDom -> getModelFromDom
......................................................................

getDataFromDom -> getModelFromDom

Following on from getDomFromModel, this returns a document model
instead of element linear data. The only instance that hasn't been
replaced is in rich paste, where we need to sanitize the converted
data before constructing the document model.

This should be cleaned up in a later commit.

Change-Id: I37a2b641632af2cb515e3409deed5cd1fa358af5
---
M modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js
M modules/ve-mw/init/ve.init.mw.Target.js
M modules/ve-mw/test/dm/ve.dm.MWConverter.test.js
M modules/ve/ce/ve.ce.Surface.js
M modules/ve/dm/ve.dm.Converter.js
M modules/ve/dm/ve.dm.Document.js
M modules/ve/test/dm/lineardata/ve.dm.ElementLinearData.test.js
M modules/ve/test/dm/ve.dm.Converter.test.js
M modules/ve/test/dm/ve.dm.Document.test.js
M modules/ve/test/ve.test.utils.js
M modules/ve/ui/ve.ui.Surface.js
11 files changed, 106 insertions(+), 113 deletions(-)


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

diff --git a/modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js 
b/modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js
index b982dca..758437e 100644
--- a/modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js
+++ b/modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js
@@ -848,55 +848,48 @@
 ve.init.mw.ViewPageTarget.prototype.setUpSurface = function ( doc, callback ) {
        var target = this;
        setTimeout( function () {
-               // Build linmod
-               var store = new ve.dm.IndexValueStore(),
-                       internalList = new ve.dm.InternalList(),
-                       innerWhitespace = new Array( 2 ),
-                       data = ve.dm.converter.getDataFromDom( doc, store, 
internalList, innerWhitespace );
+               // Build model
+               var dmDoc = ve.dm.converter.getModelFromDom( doc );
                setTimeout( function () {
-                       // Build DM tree
-                       var dmDoc = new ve.dm.Document( data, doc, undefined, 
internalList, innerWhitespace );
+                       // Create ui.Surface (also creates ce.Surface and 
dm.Surface and builds CE tree)
+                       target.surface = new ve.ui.Surface( dmDoc );
+                       target.surface.$element.addClass( 
've-init-mw-viewPageTarget-surface' );
                        setTimeout( function () {
-                               // Create ui.Surface (also creates ce.Surface 
and dm.Surface and builds CE tree)
-                               target.surface = new ve.ui.Surface( dmDoc );
-                               target.surface.$element.addClass( 
've-init-mw-viewPageTarget-surface' );
-                               setTimeout( function () {
-                                       // Initialize surface
-                                       target.surface.getContext().hide();
-                                       target.$document = 
target.surface.$element.find( '.ve-ce-documentNode' );
-                                       
target.surface.getModel().getDocument().connect( target, {
-                                               'transact': 
'recordLastTransactionTime'
-                                       } );
-                                       target.surface.getModel().connect( 
target, {
-                                               'documentUpdate': 
'checkForWikitextWarning',
-                                               'history': 
'updateToolbarSaveButtonState'
-                                       } );
-                                       target.surface.setPasteRules( 
target.constructor.static.pasteRules );
-                                       target.$element.append( 
target.surface.$element );
-                                       target.setUpToolbar();
-                                       target.transformPageTitle();
-                                       target.changeDocumentTitle();
-
-                                       // Update UI
-                                       target.hidePageContent();
-                                       target.hideSpinner();
-                                       target.active = true;
-                                       target.$document.attr( {
-                                               'lang': mw.config.get( 
'wgVisualEditor' ).pageLanguageCode,
-                                               'dir': mw.config.get( 
'wgVisualEditor' ).pageLanguageDir
-                                       } );
-
-                                       // Add appropriately mw-content-ltr or 
mw-content-rtl class
-                                       target.surface.view.$element.addClass(
-                                               'mw-content-' + mw.config.get( 
'wgVisualEditor' ).pageLanguageDir
-                                       );
-
-                                       // Now that the surface is attached to 
the document and ready,
-                                       // let it initialize itself
-                                       target.surface.initialize();
-
-                                       setTimeout( callback );
+                               // Initialize surface
+                               target.surface.getContext().hide();
+                               target.$document = 
target.surface.$element.find( '.ve-ce-documentNode' );
+                               
target.surface.getModel().getDocument().connect( target, {
+                                       'transact': 'recordLastTransactionTime'
                                } );
+                               target.surface.getModel().connect( target, {
+                                       'documentUpdate': 
'checkForWikitextWarning',
+                                       'history': 
'updateToolbarSaveButtonState'
+                               } );
+                               target.surface.setPasteRules( 
target.constructor.static.pasteRules );
+                               target.$element.append( target.surface.$element 
);
+                               target.setUpToolbar();
+                               target.transformPageTitle();
+                               target.changeDocumentTitle();
+
+                               // Update UI
+                               target.hidePageContent();
+                               target.hideSpinner();
+                               target.active = true;
+                               target.$document.attr( {
+                                       'lang': mw.config.get( 'wgVisualEditor' 
).pageLanguageCode,
+                                       'dir': mw.config.get( 'wgVisualEditor' 
).pageLanguageDir
+                               } );
+
+                               // Add appropriately mw-content-ltr or 
mw-content-rtl class
+                               target.surface.view.$element.addClass(
+                                       'mw-content-' + mw.config.get( 
'wgVisualEditor' ).pageLanguageDir
+                               );
+
+                               // Now that the surface is attached to the 
document and ready,
+                               // let it initialize itself
+                               target.surface.initialize();
+
+                               setTimeout( callback );
                        } );
                } );
        } );
diff --git a/modules/ve-mw/init/ve.init.mw.Target.js 
b/modules/ve-mw/init/ve.init.mw.Target.js
index 41c7bc5..eae0218 100644
--- a/modules/ve-mw/init/ve.init.mw.Target.js
+++ b/modules/ve-mw/init/ve.init.mw.Target.js
@@ -1066,38 +1066,31 @@
 ve.init.mw.Target.prototype.setUpSurface = function ( doc, callback ) {
        var target = this;
        setTimeout( function () {
-               // Build linmod
-               var store = new ve.dm.IndexValueStore(),
-                       internalList = new ve.dm.InternalList(),
-                       innerWhitespace = new Array( 2 ),
-                       data = ve.dm.converter.getDataFromDom( doc, store, 
internalList, innerWhitespace );
+               // Build model
+               var dmDoc = ve.dm.converter.getModelFromDom( doc );
                setTimeout( function () {
-                       // Build DM tree
-                       var dmDoc = new ve.dm.Document( data, doc, undefined, 
internalList, innerWhitespace );
+                       // Create ui.Surface (also creates ce.Surface and 
dm.Surface and builds CE tree)
+                       target.surface = new ve.ui.Surface( dmDoc, 
target.surfaceOptions );
+                       target.surface.$element.addClass( 
've-init-mw-viewPageTarget-surface' );
                        setTimeout( function () {
-                               // Create ui.Surface (also creates ce.Surface 
and dm.Surface and builds CE tree)
-                               target.surface = new ve.ui.Surface( dmDoc, 
target.surfaceOptions );
-                               target.surface.$element.addClass( 
've-init-mw-viewPageTarget-surface' );
-                               setTimeout( function () {
-                                       // Initialize surface
-                                       target.surface.getContext().hide();
-                                       target.$document = 
target.surface.$element.find( '.ve-ce-documentNode' );
-                                       target.$element.append( 
target.surface.$element );
-                                       target.setUpToolbar();
-                                       target.$document.attr( {
-                                               'lang': mw.config.get( 
'wgVisualEditor' ).pageLanguageCode,
-                                               'dir': mw.config.get( 
'wgVisualEditor' ).pageLanguageDir
-                                       } );
-                                       // Add appropriately mw-content-ltr or 
mw-content-rtl class
-                                       target.surface.view.$element.addClass(
-                                               'mw-content-' + mw.config.get( 
'wgVisualEditor' ).pageLanguageDir
-                                       );
-                                       target.active = true;
-                                       // Now that the surface is attached to 
the document and ready,
-                                       // let it initialize itself
-                                       target.surface.initialize();
-                                       setTimeout( callback );
+                               // Initialize surface
+                               target.surface.getContext().hide();
+                               target.$document = 
target.surface.$element.find( '.ve-ce-documentNode' );
+                               target.$element.append( target.surface.$element 
);
+                               target.setUpToolbar();
+                               target.$document.attr( {
+                                       'lang': mw.config.get( 'wgVisualEditor' 
).pageLanguageCode,
+                                       'dir': mw.config.get( 'wgVisualEditor' 
).pageLanguageDir
                                } );
+                               // Add appropriately mw-content-ltr or 
mw-content-rtl class
+                               target.surface.view.$element.addClass(
+                                       'mw-content-' + mw.config.get( 
'wgVisualEditor' ).pageLanguageDir
+                               );
+                               target.active = true;
+                               // Now that the surface is attached to the 
document and ready,
+                               // let it initialize itself
+                               target.surface.initialize();
+                               setTimeout( callback );
                        } );
                } );
        } );
diff --git a/modules/ve-mw/test/dm/ve.dm.MWConverter.test.js 
b/modules/ve-mw/test/dm/ve.dm.MWConverter.test.js
index 612e562..bc64cf1 100644
--- a/modules/ve-mw/test/dm/ve.dm.MWConverter.test.js
+++ b/modules/ve-mw/test/dm/ve.dm.MWConverter.test.js
@@ -9,8 +9,8 @@
 
 /* Tests */
 
-QUnit.test( 'getDataFromDom', function ( assert ) {
-       ve.test.utils.runGetDataFromDomTests( assert, ve.copy( 
ve.dm.mwExample.domToDataCases ) );
+QUnit.test( 'getModelFromDom', function ( assert ) {
+       ve.test.utils.runGetModelFromDomTests( assert, ve.copy( 
ve.dm.mwExample.domToDataCases ) );
 } );
 
 QUnit.test( 'getDomFromModel', function ( assert ) {
diff --git a/modules/ve/ce/ve.ce.Surface.js b/modules/ve/ce/ve.ce.Surface.js
index ba3f92c..c7da3d7 100644
--- a/modules/ve/ce/ve.ce.Surface.js
+++ b/modules/ve/ce/ve.ce.Surface.js
@@ -1002,7 +1002,7 @@
                if ( beforePasteData.context ) {
                        internalListRange = 
doc.getInternalList().getListNode().getOuterRange();
                        context = new ve.dm.ElementLinearData(
-                               store,
+                               doc.getStore(),
                                ve.copy( beforePasteData.context )
                        );
                        if ( this.pasteSpecial ) {
diff --git a/modules/ve/dm/ve.dm.Converter.js b/modules/ve/dm/ve.dm.Converter.js
index a694b1c..e2295fe 100644
--- a/modules/ve/dm/ve.dm.Converter.js
+++ b/modules/ve/dm/ve.dm.Converter.js
@@ -381,6 +381,20 @@
 };
 
 /**
+ * Convert an HTML document to a document model.
+ * @param {HTMLDocument} doc HTML document to convert
+ * @returns {ve.dm.Document} Document model
+ */
+ve.dm.Converter.prototype.getModelFromDom = function ( doc ) {
+       var     internalList = new ve.dm.InternalList(),
+               innerWhitespace = new Array( 2 ),
+               data = this.getDataFromDom( doc, new ve.dm.IndexValueStore(), 
internalList, innerWhitespace ),
+               model = new ve.dm.Document( data, doc, undefined, internalList, 
innerWhitespace );
+
+       return model;
+};
+
+/**
  * Convert an HTML document to a linear model.
  * @param {HTMLDocument} doc HTML document to convert
  * @param {ve.dm.IndexValueStore} store Index-value store
diff --git a/modules/ve/dm/ve.dm.Document.js b/modules/ve/dm/ve.dm.Document.js
index aec953a..5e0875e 100644
--- a/modules/ve/dm/ve.dm.Document.js
+++ b/modules/ve/dm/ve.dm.Document.js
@@ -16,8 +16,8 @@
  * @class
  * @extends ve.Document
  * @constructor
- * @param {HTMLDocument|Array|ve.dm.ElementLinearData|ve.dm.FlatLinearData} 
data HTML document,
- *  raw linear model data, ElementLinearData or FlatLinearData to be split
+ * @param {Array|ve.dm.ElementLinearData|ve.dm.FlatLinearData} data Raw linear 
model data,
+ *  ElementLinearData or FlatLinearData to be split
  * @param {HTMLDocument} [htmlDocument] HTML document the data was converted 
from, if any.
  *  If omitted, a new document will be created. If data is an HTMLDocument, 
this parameter is
  *  ignored.
@@ -51,10 +51,6 @@
        } else if ( data instanceof ve.dm.FlatLinearData ) {
                // Element + Meta linear data
                fullData = data;
-       } else if ( !ve.isArray( data ) && typeof data === 'object' ) {
-               // HTMLDocument
-               fullData = ve.dm.converter.getDataFromDom( data, new 
ve.dm.IndexValueStore(), this.getInternalList(), this.getInnerWhitespace() );
-               htmlDocument = data;
        } else {
                // Raw linear model data
                fullData = new ve.dm.FlatLinearData(
diff --git a/modules/ve/test/dm/lineardata/ve.dm.ElementLinearData.test.js 
b/modules/ve/test/dm/lineardata/ve.dm.ElementLinearData.test.js
index e34f094..37cfc1c 100644
--- a/modules/ve/test/dm/lineardata/ve.dm.ElementLinearData.test.js
+++ b/modules/ve/test/dm/lineardata/ve.dm.ElementLinearData.test.js
@@ -1367,8 +1367,7 @@
 } );
 
 QUnit.test( 'sanitize', function ( assert ) {
-       var i, fullData, result, data,
-               store, internalList, innerWhitespace,
+       var i, model, data,
                count = 0,
                bold = new ve.dm.TextStyleBoldAnnotation( { 'type': 
'textStyle/bold', 'attributes': { 'nodeName': 'b' } } ),
                cases = [
@@ -1434,13 +1433,8 @@
        QUnit.expect( count );
 
        for ( i = 0; i < cases.length; i++ ) {
-               store = new ve.dm.IndexValueStore();
-               internalList = new ve.dm.InternalList();
-               innerWhitespace = new Array( 2 );
-
-               fullData = ve.dm.converter.getDataFromDom( 
ve.createDocumentFromHtml( cases[i].html ), store, internalList, 
innerWhitespace );
-               result = ve.dm.Document.static.splitData( fullData, true );
-               data = result.elementData;
+               model = ve.dm.converter.getModelFromDom( 
ve.createDocumentFromHtml( cases[i].html ) );
+               data = model.data;
                data.sanitize( cases[i].rules || {}, cases[i].plainText );
                assert.deepEqualWithDomElements( data.data, cases[i].data, 
cases[i].msg + ': data' );
                if ( cases[i].store ) {
diff --git a/modules/ve/test/dm/ve.dm.Converter.test.js 
b/modules/ve/test/dm/ve.dm.Converter.test.js
index ecc4484..99a0784 100644
--- a/modules/ve/test/dm/ve.dm.Converter.test.js
+++ b/modules/ve/test/dm/ve.dm.Converter.test.js
@@ -39,8 +39,8 @@
        }
 } );
 
-QUnit.test( 'getDataFromDom', function ( assert ) {
-       ve.test.utils.runGetDataFromDomTests( assert, ve.copy( 
ve.dm.example.domToDataCases ) );
+QUnit.test( 'getModelFromDom', function ( assert ) {
+       ve.test.utils.runGetModelFromDomTests( assert, ve.copy( 
ve.dm.example.domToDataCases ) );
 } );
 
 QUnit.test( 'getDomFromModel', function ( assert ) {
diff --git a/modules/ve/test/dm/ve.dm.Document.test.js 
b/modules/ve/test/dm/ve.dm.Document.test.js
index f6fe6ff..17a2251 100644
--- a/modules/ve/test/dm/ve.dm.Document.test.js
+++ b/modules/ve/test/dm/ve.dm.Document.test.js
@@ -9,7 +9,7 @@
 
 /* Tests */
 
-QUnit.test( 'constructor', 12, function ( assert ) {
+QUnit.test( 'constructor', 11, function ( assert ) {
        var data, htmlDoc,
                doc = ve.dm.example.createExampleDocument();
        assert.equalNodeTree( doc.getDocumentNode(), ve.dm.example.tree, 'node 
tree matches example data' );
@@ -38,8 +38,6 @@
        htmlDoc = ve.createDocumentFromHtml( 'abcd' );
        doc = new ve.dm.Document( [ 'a', 'b', 'c', 'd' ], htmlDoc );
        assert.equal( doc.getHtmlDocument(), htmlDoc, 'Provided HTML document 
is used' );
-       doc = new ve.dm.Document( htmlDoc, ve.createDocumentFromHtml( 'efgh' ) 
);
-       assert.equal( doc.getHtmlDocument(), htmlDoc, 'Second parameter ignored 
if first parameter is a document' );
 
        data = new ve.dm.ElementLinearData(
                new ve.dm.IndexValueStore(),
diff --git a/modules/ve/test/ve.test.utils.js b/modules/ve/test/ve.test.utils.js
index 993aedb..9a73aa2 100644
--- a/modules/ve/test/ve.test.utils.js
+++ b/modules/ve/test/ve.test.utils.js
@@ -52,8 +52,8 @@
        surface.destroy();
 };
 
-ve.test.utils.runGetDataFromDomTests = function( assert, cases ) {
-       var msg, doc, store, i, length, hash, data, html, n = 0;
+ve.test.utils.runGetModelFromDomTests = function( assert, cases ) {
+       var msg, model, i, length, hash, html, n = 0;
 
        for ( msg in cases ) {
                if ( cases[msg].head !== undefined || cases[msg].body !== 
undefined ) {
@@ -67,22 +67,17 @@
 
        for ( msg in cases ) {
                if ( cases[msg].head !== undefined || cases[msg].body !== 
undefined ) {
-                       doc = new ve.dm.Document( [] );
-                       store = doc.getStore();
-
                        html = '<head>' + ( cases[msg].head || '' ) + 
'</head><body>' + cases[msg].body + '</body>';
-                       data = ve.dm.converter.getDataFromDom(
-                               ve.createDocumentFromHtml( html ), store, 
doc.getInternalList(), doc.getInnerWhitespace()
-                       );
-                       ve.dm.example.preprocessAnnotations( cases[msg].data, 
store );
-                       assert.deepEqualWithDomElements( data.getData(), 
cases[msg].data, msg + ': data' );
-                       assert.deepEqual( doc.getInnerWhitespace(), 
cases[msg].innerWhitespace || new Array( 2 ), msg + ': inner whitespace' );
+                       model = ve.dm.converter.getModelFromDom( 
ve.createDocumentFromHtml( html ) );
+                       ve.dm.example.preprocessAnnotations( cases[msg].data, 
model.getStore() );
+                       assert.deepEqualWithDomElements( model.getFullData(), 
cases[msg].data, msg + ': data' );
+                       assert.deepEqual( model.getInnerWhitespace(), 
cases[msg].innerWhitespace || new Array( 2 ), msg + ': inner whitespace' );
                        // check storeItems have been added to store
                        if ( cases[msg].storeItems ) {
                                for ( i = 0, length = 
cases[msg].storeItems.length; i < length; i++ ) {
                                        hash = cases[msg].storeItems[i].hash || 
OO.getHash( cases[msg].storeItems[i].value );
                                        assert.deepEqualWithDomElements(
-                                               store.value( store.indexOfHash( 
hash ) ) || {},
+                                               model.getStore().value( 
model.getStore().indexOfHash( hash ) ) || {},
                                                cases[msg].storeItems[i].value,
                                                msg + ': store item ' + i + ' 
found'
                                        );
diff --git a/modules/ve/ui/ve.ui.Surface.js b/modules/ve/ui/ve.ui.Surface.js
index 400cf5c..8e160de 100644
--- a/modules/ve/ui/ve.ui.Surface.js
+++ b/modules/ve/ui/ve.ui.Surface.js
@@ -16,6 +16,8 @@
  * @param {Object} [config] Configuration options
  */
 ve.ui.Surface = function VeUiSurface( dataOrDoc, config ) {
+       var documentModel;
+
        // Parent constructor
        OO.ui.Element.call( this, config );
 
@@ -28,9 +30,17 @@
        this.$localOverlayBlockers = this.$( '<div>' );
        this.$localOverlayControls = this.$( '<div>' );
        this.$localOverlayMenus = this.$( '<div>' );
-       this.model = new ve.dm.Surface(
-               dataOrDoc instanceof ve.dm.Document ? dataOrDoc : new 
ve.dm.Document( dataOrDoc )
-       );
+       if ( dataOrDoc instanceof ve.dm.Document ) {
+               // ve.dm.Document
+               documentModel = dataOrDoc;
+       } else if ( dataOrDoc instanceof ve.dm.LinearData || ve.isArray( 
dataOrDoc ) ) {
+               // LinearData or raw linear data
+               documentModel = new ve.dm.Document( dataOrDoc );
+       } else {
+               // HTMLDocument
+               documentModel = ve.dm.converter.getModelFromDom( dataOrDoc );
+       }
+       this.model = new ve.dm.Surface( documentModel );
        this.view = new ve.ce.Surface( this.model, this, { '$': this.$ } );
        this.context = new ve.ui.Context( this, { '$': this.$ } );
        this.dialogs = new ve.ui.WindowSet( this, ve.ui.dialogFactory, { '$': 
this.$ } );

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I37a2b641632af2cb515e3409deed5cd1fa358af5
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/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