Skip to content

Commit

Permalink
Core: Report browser errors in parseXML
Browse files Browse the repository at this point in the history
Fixes gh-4784
Closes gh-4816

(cherry picked from commit 8969732)
  • Loading branch information
mgol committed Dec 8, 2020
1 parent 2fadbc0 commit 54d9883
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 8 deletions.
17 changes: 11 additions & 6 deletions src/core/parseXML.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ define( [

// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
var xml;
var xml, parserErrorElem;
if ( !data || typeof data !== "string" ) {
return null;
}
Expand All @@ -15,12 +15,17 @@ jQuery.parseXML = function( data ) {
// IE throws on parseFromString with invalid input.
try {
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
} catch ( e ) {
xml = undefined;
}
} catch ( e ) {}

if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
jQuery.error( "Invalid XML: " + data );
parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
if ( !xml || parserErrorElem ) {
jQuery.error( "Invalid XML: " + (
parserErrorElem ?
jQuery.map( parserErrorElem.childNodes, function( el ) {
return el.textContent;
} ).join( "\n" ) :
data
) );
}
return xml;
};
Expand Down
27 changes: 25 additions & 2 deletions test/unit/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -1411,9 +1411,9 @@ QUnit.test( "jQuery.parseXML", function( assert ) {
}
try {
xml = jQuery.parseXML( "<p>Not a <<b>well-formed</b> xml string</p>" );
assert.ok( false, "invalid xml not detected" );
assert.ok( false, "invalid XML not detected" );
} catch ( e ) {
assert.strictEqual( e.message, "Invalid XML: <p>Not a <<b>well-formed</b> xml string</p>", "invalid xml detected" );
assert.ok( e.message.indexOf( "Invalid XML:" ) === 0, "invalid XML detected" );
}
try {
xml = jQuery.parseXML( "" );
Expand All @@ -1429,6 +1429,29 @@ QUnit.test( "jQuery.parseXML", function( assert ) {
}
} );

// Support: IE 11+
// IE throws an error when parsing invalid XML instead of reporting the error
// in a `parsererror` element, skip the test there.
QUnit.testUnlessIE( "jQuery.parseXML - error reporting", function( assert ) {
assert.expect( 2 );

var errorArg, lineMatch, line, columnMatch, column;

sinon.stub( jQuery, "error" );

jQuery.parseXML( "<p>Not a <<b>well-formed</b> xml string</p>" );
errorArg = jQuery.error.firstCall.lastArg.toLowerCase();
console.log( "errorArg", errorArg );

lineMatch = errorArg.match( /line\s*(?:number)?\s*(\d+)/ );
line = lineMatch && lineMatch[ 1 ];
columnMatch = errorArg.match( /column\s*(\d+)/ );
column = columnMatch && columnMatch[ 1 ];

assert.strictEqual( line, "1", "reports error line" );
assert.strictEqual( column, "11", "reports error column" );
} );

testIframe(
"Conditional compilation compatibility (#13274)",
"core/cc_on.html",
Expand Down

0 comments on commit 54d9883

Please sign in to comment.