From d4cd816b6ff2dc9b7c5e82b3e40e367fedc3949f Mon Sep 17 00:00:00 2001 From: Ed Sanders Date: Mon, 21 Jul 2014 14:32:17 +0100 Subject: [PATCH] MWReferenceSearchWidget buildIndex optimisations * Each item builds an MWReferenceModel which creates a document slice clone. This is very expensive and we only use the model for getting basic attributes, so defer the evaluation of the document. * $.show is expensive and, in this case, unnecessary. Change-Id: I99abc4c1b17f05559a9cae68b15121a8be6d23fb --- .../ve-mw/dm/models/ve.dm.MWReferenceModel.js | 24 ++++++++++++------- .../widgets/ve.ui.MWReferenceSearchWidget.js | 2 +- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/modules/ve-mw/dm/models/ve.dm.MWReferenceModel.js b/modules/ve-mw/dm/models/ve.dm.MWReferenceModel.js index 8171b28da4..7e02fb9ef1 100644 --- a/modules/ve-mw/dm/models/ve.dm.MWReferenceModel.js +++ b/modules/ve-mw/dm/models/ve.dm.MWReferenceModel.js @@ -23,6 +23,7 @@ ve.dm.MWReferenceModel = function VeDmMWReferenceModel() { this.listIndex = null; this.group = ''; this.doc = null; + this.deferDoc = null; }; /* Inheritance */ @@ -47,7 +48,10 @@ ve.dm.MWReferenceModel.static.newFromReferenceNode = function ( node ) { ref.setListGroup( attr.listGroup ); ref.setListIndex( attr.listIndex ); ref.setGroup( attr.refGroup ); - ref.setDocument( doc.cloneFromRange( internalList.getItemNode( attr.listIndex ).getRange() ) ); + ref.deferDoc = function () { + // cloneFromRange is very expensive, so lazy evaluate it + return doc.cloneFromRange( internalList.getItemNode( attr.listIndex ).getRange() ); + }; return ref; }; @@ -149,7 +153,7 @@ ve.dm.MWReferenceModel.prototype.updateInternalItem = function ( surfaceModel ) itemNodeRange = internalList.getItemNode( this.listIndex ).getRange(); surfaceModel.change( ve.dm.Transaction.newFromRemoval( doc, itemNodeRange, true ) ); surfaceModel.change( - ve.dm.Transaction.newFromDocumentInsertion( doc, itemNodeRange.start, this.doc ) + ve.dm.Transaction.newFromDocumentInsertion( doc, itemNodeRange.start, this.getDocument() ) ); }; @@ -219,12 +223,16 @@ ve.dm.MWReferenceModel.prototype.getGroup = function () { */ ve.dm.MWReferenceModel.prototype.getDocument = function () { if ( !this.doc ) { - this.doc = new ve.dm.Document( [ - { 'type': 'paragraph', 'internal': { 'generated': 'wrapper' } }, - { 'type': '/paragraph' }, - { 'type': 'internalList' }, - { 'type': '/internalList' } - ] ); + if ( this.deferDoc ) { + this.doc = this.deferDoc(); + } else { + this.doc = new ve.dm.Document( [ + { 'type': 'paragraph', 'internal': { 'generated': 'wrapper' } }, + { 'type': '/paragraph' }, + { 'type': 'internalList' }, + { 'type': '/internalList' } + ] ); + } } return this.doc; }; diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWReferenceSearchWidget.js b/modules/ve-mw/ui/widgets/ve.ui.MWReferenceSearchWidget.js index 815e7696b8..83a47819a9 100644 --- a/modules/ve-mw/ui/widgets/ve.ui.MWReferenceSearchWidget.js +++ b/modules/ve-mw/ui/widgets/ve.ui.MWReferenceSearchWidget.js @@ -131,7 +131,7 @@ ve.ui.MWReferenceSearchWidget.prototype.buildIndex = function ( internalList ) { view.$element.find( 'a[href]' ).each( extractAttrs ); this.index.push( { - '$element': view.$element.clone().show(), + '$element': view.$element.clone(), 'text': text, 'reference': ref, 'citation': citation,