mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-11-16 10:59:56 +00:00
362df66b47
Parsoid does not use relative links anywhere anymore (T72743). There is no reason for us to support this. And previous code allowed "hrefPrefix" to be empty '' sometimes, which is scary, as it could lead to XSS vulnerabilities if titles starting with 'JavaScript:' are not handled correctly elsewhere. Bug: T206357 Depends-On: I8728f63084902c76d1c61193be4367939b069f1a Change-Id: I99be18877aae2b505cf261bd7cdef6cf0d7a8670
133 lines
3.5 KiB
JavaScript
133 lines
3.5 KiB
JavaScript
/*!
|
|
* VisualEditor DataModel MWInternalLinkAnnotation tests.
|
|
*
|
|
* @copyright 2011-2019 VisualEditor Team and others; see http://ve.mit-license.org
|
|
*/
|
|
|
|
QUnit.module( 've.dm.MWInternalLinkAnnotation' );
|
|
|
|
QUnit.test( 'toDataElement', function ( assert ) {
|
|
var i, l,
|
|
doc = ve.dm.example.createExampleDocument(),
|
|
internalLink = function ( pageTitle ) {
|
|
var link = document.createElement( 'a' );
|
|
link.setAttribute( 'href', location.origin + mw.Title.newFromText( pageTitle ).getUrl() );
|
|
return link;
|
|
},
|
|
cases = [
|
|
{
|
|
msg: 'Simple',
|
|
element: internalLink( 'Foo' ),
|
|
expected: {
|
|
type: 'link/mwInternal',
|
|
attributes: {
|
|
lookupTitle: 'Foo',
|
|
normalizedTitle: 'Foo',
|
|
origTitle: 'Foo',
|
|
title: 'Foo'
|
|
}
|
|
}
|
|
},
|
|
{
|
|
// Because percent-encoded URLs aren't valid titles, but what they decode to might be
|
|
msg: 'Percent encoded characters',
|
|
element: internalLink( 'Foo?' ),
|
|
expected: {
|
|
type: 'link/mwInternal',
|
|
attributes: {
|
|
lookupTitle: 'Foo?',
|
|
normalizedTitle: 'Foo?',
|
|
origTitle: 'Foo%3F',
|
|
title: 'Foo?'
|
|
}
|
|
}
|
|
},
|
|
{
|
|
// The fragment should make it into some parts of this, and not others
|
|
msg: 'Fragments',
|
|
element: internalLink( 'Foo#bar' ),
|
|
expected: {
|
|
type: 'link/mwInternal',
|
|
attributes: {
|
|
lookupTitle: 'Foo',
|
|
normalizedTitle: 'Foo#bar',
|
|
origTitle: 'Foo#bar',
|
|
title: 'Foo#bar'
|
|
}
|
|
}
|
|
},
|
|
{
|
|
// Question marks in the fragment shouldn't confuse this
|
|
msg: 'Question marks in fragments',
|
|
element: internalLink( 'Foo#bar?' ),
|
|
expected: {
|
|
type: 'link/mwInternal',
|
|
attributes: {
|
|
lookupTitle: 'Foo',
|
|
normalizedTitle: 'Foo#bar.3F',
|
|
origTitle: 'Foo#bar.3F',
|
|
title: 'Foo#bar.3F'
|
|
}
|
|
}
|
|
}
|
|
],
|
|
converter = new ve.dm.Converter( ve.dm.modelRegistry, ve.dm.nodeFactory, ve.dm.annotationFactory, ve.dm.metaItemFactory );
|
|
|
|
// toDataElement is called during a converter run, so we need to fake up a bit of state to test it.
|
|
// This would normally be done by ve.dm.converter.getModelFromDom.
|
|
converter.doc = doc.getHtmlDocument();
|
|
converter.targetDoc = doc.getHtmlDocument();
|
|
converter.store = doc.getStore();
|
|
converter.internalList = doc.getInternalList();
|
|
converter.contextStack = [];
|
|
|
|
for ( i = 0, l = cases.length; i < l; i++ ) {
|
|
assert.deepEqual( ve.dm.MWInternalLinkAnnotation.static.toDataElement( [ cases[ i ].element ], converter ), cases[ i ].expected, cases[ i ].msg );
|
|
}
|
|
} );
|
|
|
|
QUnit.test( 'getFragment', function ( assert ) {
|
|
var i, l,
|
|
cases = [
|
|
{
|
|
msg: 'No fragment returns null',
|
|
original: 'Foo',
|
|
expected: null
|
|
},
|
|
{
|
|
msg: 'Invalid title returns null',
|
|
original: 'A%20B',
|
|
expected: null
|
|
},
|
|
{
|
|
msg: 'Blank fragment returns empty string',
|
|
original: 'Foo#',
|
|
expected: ''
|
|
},
|
|
{
|
|
msg: 'Extant fragment returns same string',
|
|
original: 'Foo#bar',
|
|
expected: 'bar'
|
|
},
|
|
{
|
|
msg: 'Hash-bang works returns full string',
|
|
original: 'Foo#!bar',
|
|
expected: '!bar'
|
|
},
|
|
{
|
|
msg: 'Double-hash returns everything after the first hash',
|
|
original: 'Foo##bar',
|
|
expected: '#bar'
|
|
},
|
|
{
|
|
msg: 'Multi-fragment returns everything after the first hash',
|
|
original: 'Foo#bar#baz#bat',
|
|
expected: 'bar#baz#bat'
|
|
}
|
|
];
|
|
|
|
for ( i = 0, l = cases.length; i < l; i++ ) {
|
|
assert.strictEqual( ve.dm.MWInternalLinkAnnotation.static.getFragment( cases[ i ].original ), cases[ i ].expected, cases[ i ].msg );
|
|
}
|
|
} );
|