mirror of
https://github.com/jquery/jquery.git
synced 2025-01-10 18:24:24 +00:00
Core: Report browser errors in parseXML
Fixes gh-4784
Closes gh-4816
(cherry picked from commit 8969732518
)
This commit is contained in:
parent
2fadbc0a98
commit
54d98835b6
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
};
|
||||
|
@ -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( "" );
|
||||
@ -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",
|
||||
|
Loading…
Reference in New Issue
Block a user