jenkins-bot has submitted this change and it was merged.

Change subject: Link pasting: Match RDFa-less links as external
......................................................................


Link pasting: Match RDFa-less links as external

Now that some targets support link pasting (Flow) we need to
make sure that pasted links match to an allowed type ('link/mwExternal')
instead of plain 'link' annotations which should never exist
in an MW document.

In a later commit we should auto-detect internal links.

Change-Id: I7faae834aa6e730c3cf93a691331a05fd0fe3d5c
---
M modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
M modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js
M modules/ve-mw/tests/dm/ve.dm.mwExample.js
M modules/ve-mw/tests/ve.test.utils.js
4 files changed, 72 insertions(+), 10 deletions(-)

Approvals:
  Jforrester: Looks good to me, approved
  Esanders: Looks good to me, but someone else must approve
  jenkins-bot: Verified



diff --git a/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js 
b/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
index 055594c..5ab1301 100644
--- a/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
+++ b/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
@@ -33,18 +33,26 @@
 
 ve.dm.MWExternalLinkAnnotation.static.name = 'link/mwExternal';
 
-ve.dm.MWExternalLinkAnnotation.static.matchRdfaTypes = [ 'mw:ExtLink' ];
+ve.dm.MWExternalLinkAnnotation.static.matchFunction = function ( domElement ) {
+       var rel = domElement.getAttribute( 'rel' );
+       // Match explicity mw:ExtLink, or plain RDFa-less links (e.g. from 
external paste)
+       return !rel || rel === 'mw:ExtLink';
+};
 
 ve.dm.MWExternalLinkAnnotation.static.toDataElement = function ( domElements ) 
{
-       var parentResult = ve.dm.LinkAnnotation.static.toDataElement.apply( 
this, arguments );
-       parentResult.attributes.rel = domElements[ 0 ].getAttribute( 'rel' );
-       return parentResult;
+       // Parent method
+       var dataElement = 
ve.dm.MWExternalLinkAnnotation.super.static.toDataElement.apply( this, 
arguments );
+
+       dataElement.attributes.rel = domElements[ 0 ].getAttribute( 'rel' );
+       return dataElement;
 };
 
 ve.dm.MWExternalLinkAnnotation.static.toDomElements = function ( dataElement ) 
{
-       var parentResult = ve.dm.LinkAnnotation.static.toDomElements.apply( 
this, arguments );
-       parentResult[ 0 ].setAttribute( 'rel', dataElement.attributes.rel || 
'mw:ExtLink' );
-       return parentResult;
+       // Parent method
+       var domElements = 
ve.dm.MWExternalLinkAnnotation.super.static.toDomElements.apply( this, 
arguments );
+
+       domElements[ 0 ].setAttribute( 'rel', dataElement.attributes.rel || 
'mw:ExtLink' );
+       return domElements;
 };
 
 /* Methods */
diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js 
b/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js
index 7f37dc1..9011b9a 100644
--- a/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js
+++ b/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js
@@ -41,9 +41,9 @@
 
 ve.dm.MWNumberedExternalLinkNode.static.blacklistedAnnotationTypes = [ 'link' 
];
 
-ve.dm.MWNumberedExternalLinkNode.static.matchFunction = function ( element ) {
+ve.dm.MWNumberedExternalLinkNode.static.matchFunction = function ( domElement 
) {
        // Must be empty
-       return element.childNodes.length === 0;
+       return domElement.childNodes.length === 0;
 };
 
 ve.dm.MWNumberedExternalLinkNode.static.toDataElement = function ( domElements 
) {
diff --git a/modules/ve-mw/tests/dm/ve.dm.mwExample.js 
b/modules/ve-mw/tests/dm/ve.dm.mwExample.js
index 7857f63..66f67ae 100644
--- a/modules/ve-mw/tests/dm/ve.dm.mwExample.js
+++ b/modules/ve-mw/tests/dm/ve.dm.mwExample.js
@@ -1515,5 +1515,57 @@
                        doc.metadata.data[ 1 ].splice( 0, 1 );
                },
                normalizedBody: '<h1></h1>'
+       },
+       'Plain links (e.g. on paste) are converted to link/mwExternal': {
+               body: 'Foo<a href="Bar">bar</a>',
+               data: [
+                       {
+                               type: 'paragraph',
+                               internal: {
+                                       generated: 'wrapper'
+                               }
+                       },
+                       'F', 'o', 'o',
+                       [
+                               'b',
+                               [ {
+                                       type: 'link/mwExternal',
+                                       attributes: {
+                                               href: 'Bar',
+                                               rel: null
+                                       }
+                               } ]
+                       ],
+                       [
+                               'a',
+                               [ {
+                                       type: 'link/mwExternal',
+                                       attributes: {
+                                               href: 'Bar',
+                                               rel: null
+                                       }
+                               } ]
+                       ],
+                       [
+                               'r',
+                               [ {
+                                       type: 'link/mwExternal',
+                                       attributes: {
+                                               href: 'Bar',
+                                               rel: null
+                                       }
+                               } ]
+                       ],
+                       {
+                               type: '/paragraph'
+                       },
+                       {
+                               type: 'internalList'
+                       },
+                       {
+                               type: '/internalList'
+                       }
+               ],
+               normalizedBody: 'Foo<a href="Bar" rel="mw:ExtLink">bar</a>'
        }
 };
diff --git a/modules/ve-mw/tests/ve.test.utils.js 
b/modules/ve-mw/tests/ve.test.utils.js
index ec19af3..ce6859b 100644
--- a/modules/ve-mw/tests/ve.test.utils.js
+++ b/modules/ve-mw/tests/ve.test.utils.js
@@ -30,6 +30,7 @@
 ve.dm.modelRegistry.unregister( ve.dm.MWHeadingNode );
 ve.dm.modelRegistry.unregister( ve.dm.MWPreformattedNode );
 ve.dm.modelRegistry.unregister( ve.dm.MWTableNode );
+ve.dm.modelRegistry.unregister( ve.dm.MWExternalLinkAnnotation );
 // Re-register unregistered nodes.
 ve.dm.modelRegistry.register( ve.dm.InlineImageNode );
 ve.dm.modelRegistry.register( ve.dm.BlockImageNode );
@@ -38,7 +39,8 @@
        var overrides = [
                        ve.dm.MWHeadingNode,
                        ve.dm.MWPreformattedNode,
-                       ve.dm.MWTableNode
+                       ve.dm.MWTableNode,
+                       ve.dm.MWExternalLinkAnnotation
                ],
                overridden = [
                        ve.dm.InlineImageNode,

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I7faae834aa6e730c3cf93a691331a05fd0fe3d5c
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>
Gerrit-Reviewer: Esanders <[email protected]>
Gerrit-Reviewer: Jforrester <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to