diff --git a/lib/ve b/lib/ve index 89ce43b137..90cbd62c7e 160000 --- a/lib/ve +++ b/lib/ve @@ -1 +1 @@ -Subproject commit 89ce43b137d6f02c3341815e143bf3ae3d68c440 +Subproject commit 90cbd62c7e9f2dbc5df457f894ec243a39b8595e diff --git a/modules/ve-mw/init/ve.init.mw.Platform.js b/modules/ve-mw/init/ve.init.mw.Platform.js index c293dd1d3d..97c157aeac 100644 --- a/modules/ve-mw/init/ve.init.mw.Platform.js +++ b/modules/ve-mw/init/ve.init.mw.Platform.js @@ -47,6 +47,17 @@ ve.init.mw.Platform.prototype.getUnanchoredExternalLinkUrlProtocolsRegExp = func return this.unanchoredExternalLinkUrlProtocolsRegExp; }; +/** + * Regular expression matching RESTBase IDs + * + * This isn't perfect, see T147607 + * + * @inheritdoc + */ +ve.init.mw.Platform.prototype.getMetadataIdRegExp = function () { + return /^mw[a-zA-Z0-9\-_]{2,6}$/; +}; + /** @inheritdoc */ ve.init.mw.Platform.prototype.addMessages = function ( messages ) { return mw.messages.set( messages ); diff --git a/modules/ve-mw/tests/ce/ve.ce.Surface.test.js b/modules/ve-mw/tests/ce/ve.ce.Surface.test.js index de2704dd83..28ae61fc9c 100644 --- a/modules/ve-mw/tests/ce/ve.ce.Surface.test.js +++ b/modules/ve-mw/tests/ce/ve.ce.Surface.test.js @@ -62,3 +62,41 @@ QUnit.test( 'handleLinearDelete', function ( assert ) { ); } } ); + +QUnit.test( 'beforePaste/afterPaste', function ( assert ) { + var i, expected = 0, + cases = [ + { + documentHtml: '

', + rangeOrSelection: new ve.Range( 1 ), + pasteHtml: '--', + fromVe: true, + expectedRangeOrSelection: new ve.Range( 5 ), + expectedHtml: '

--

', + msg: 'RESTBase IDs stripped' + } + ]; + + for ( i = 0; i < cases.length; i++ ) { + if ( cases[ i ].expectedOps ) { + expected++; + } + if ( cases[ i ].expectedRangeOrSelection ) { + expected++; + } + if ( cases[ i ].expectedHtml ) { + expected++; + } + } + QUnit.expect( expected ); + + for ( i = 0; i < cases.length; i++ ) { + ve.test.utils.runSurfacePasteTest( + assert, cases[ i ].documentHtml, + cases[ i ].pasteHtml, cases[ i ].internalSourceRangeOrSelection, cases[ i ].fromVe, cases[ i ].useClipboardData, + cases[ i ].pasteTargetHtml, cases[ i ].rangeOrSelection, cases[ i ].pasteSpecial, + cases[ i ].expectedOps, cases[ i ].expectedRangeOrSelection, cases[ i ].expectedHtml, + cases[ i ].store, false, cases[ i ].msg + ); + } +} ); diff --git a/modules/ve-mw/tests/ve.test.utils.js b/modules/ve-mw/tests/ve.test.utils.js index 6b9c27a997..dad625bacd 100644 --- a/modules/ve-mw/tests/ve.test.utils.js +++ b/modules/ve-mw/tests/ve.test.utils.js @@ -36,7 +36,8 @@ ve.dm.modelRegistry.register( ve.dm.InlineImageNode ); ve.dm.modelRegistry.register( ve.dm.BlockImageNode ); ve.test.utils.mwEnvironment = ( function () { - var overrides = [ + var mwPlatform, corePlatform, + overrides = [ ve.dm.MWHeadingNode, ve.dm.MWPreformattedNode, ve.dm.MWTableNode, @@ -47,6 +48,13 @@ ve.test.utils.mwEnvironment = ( function () { ve.dm.BlockImageNode ]; + corePlatform = ve.init.platform; + mwPlatform = new ve.init.mw.Platform(); + // Disable some API requests from platform + mwPlatform.imageInfoCache = null; + // Unregister mwPlatform + ve.init.platform = corePlatform; + function setupOverrides() { var i; for ( i = 0; i < overrides.length; i++ ) { @@ -55,6 +63,7 @@ ve.test.utils.mwEnvironment = ( function () { for ( i = 0; i < overridden.length; i++ ) { ve.dm.modelRegistry.unregister( overridden[ i ] ); } + ve.init.platform = mwPlatform; } function teardownOverrides() { @@ -65,6 +74,7 @@ ve.test.utils.mwEnvironment = ( function () { for ( i = 0; i < overridden.length; i++ ) { ve.dm.modelRegistry.register( overridden[ i ] ); } + ve.init.platform = corePlatform; } // On load, teardown overrides so the first core tests run correctly