QUnit.module( "support", { teardown: moduleTeardown } ); var computedSupport = getComputedSupport( jQuery.support ); function getComputedSupport( support ) { var prop, result = {}; for ( prop in support ) { if ( typeof support[ prop ] === "function" ) { result[ prop ] = support[ prop ](); } else { result[ prop ] = support[ prop ]; } } return result; } if ( jQuery.css ) { testIframeWithCallback( "body background is not lost if set prior to loading jQuery (#9239)", "support/bodyBackground.html", function( color, support, assert ) { assert.expect( 2 ); var okValue = { "#000000": true, "rgb(0, 0, 0)": true }; assert.ok( okValue[ color ], "color was not reset (" + color + ")" ); assert.deepEqual( jQuery.extend( {}, support ), computedSupport, "Same support properties" ); } ); } // This test checks CSP only for browsers with "Content-Security-Policy" header support // i.e. no old WebKit or old Firefox testIframeWithCallback( "Check CSP (https://developer.mozilla.org/en-US/docs/Security/CSP) restrictions", "support/csp.php", function( support, assert ) { var done = assert.async(); assert.expect( 2 ); assert.deepEqual( jQuery.extend( {}, support ), computedSupport, "No violations of CSP polices" ); supportjQuery.get( "data/support/csp.log" ).done( function( data ) { assert.equal( data, "", "No log request should be sent" ); supportjQuery.get( "data/support/csp-clean.php" ).done( done ); } ); } ); ( function() { var expected, userAgent = window.navigator.userAgent; if ( /edge\//i.test( userAgent ) ) { expected = { "ajax": true, "boxSizingReliable": true, "checkClone": true, "checkOn": true, "clearCloneStyle": false, "cors": true, "createHTMLDocument": true, "focusin": false, "noCloneChecked": true, "optSelected": true, "pixelMarginRight": true, "pixelPosition": true, "radioValue": true, "reliableMarginLeft": true }; } else if ( /(msie 10\.0|trident\/7\.0)/i.test( userAgent ) ) { expected = { "ajax": true, "boxSizingReliable": false, "checkClone": true, "checkOn": true, "clearCloneStyle": false, "cors": true, "createHTMLDocument": true, "focusin": true, "noCloneChecked": false, "optSelected": false, "pixelMarginRight": true, "pixelPosition": true, "radioValue": false, "reliableMarginLeft": true }; } else if ( /msie 9\.0/i.test( userAgent ) ) { expected = { "ajax": true, "boxSizingReliable": false, "checkClone": true, "checkOn": true, "clearCloneStyle": false, "cors": false, "createHTMLDocument": true, "focusin": true, "noCloneChecked": false, "optSelected": false, "pixelMarginRight": true, "pixelPosition": true, "radioValue": false, "reliableMarginLeft": true }; } else if ( /chrome/i.test( userAgent ) ) { // Catches Chrome on Android as well (i.e. the default // Android browser on Android >= 4.4). expected = { "ajax": true, "boxSizingReliable": true, "checkClone": true, "checkOn": true, "clearCloneStyle": true, "cors": true, "createHTMLDocument": true, "focusin": false, "noCloneChecked": true, "optSelected": true, "pixelMarginRight": true, "pixelPosition": true, "radioValue": true, "reliableMarginLeft": true }; } else if ( /9\.0(\.\d+|) safari/i.test( userAgent ) ) { expected = { "ajax": true, "boxSizingReliable": true, "checkClone": true, "checkOn": true, "clearCloneStyle": true, "cors": true, "createHTMLDocument": true, "focusin": false, "noCloneChecked": true, "optSelected": true, "pixelMarginRight": true, "pixelPosition": false, "radioValue": true, "reliableMarginLeft": true }; } else if ( /8\.0(\.\d+|) safari/i.test( userAgent ) ) { expected = { "ajax": true, "boxSizingReliable": true, "checkClone": true, "checkOn": true, "clearCloneStyle": true, "cors": true, "createHTMLDocument": false, "focusin": false, "noCloneChecked": true, "optSelected": true, "pixelMarginRight": true, "pixelPosition": false, "radioValue": true, "reliableMarginLeft": true }; } else if ( /firefox/i.test( userAgent ) ) { expected = { "ajax": true, "boxSizingReliable": true, "checkClone": true, "checkOn": true, "clearCloneStyle": true, "cors": true, "createHTMLDocument": true, "focusin": false, "noCloneChecked": true, "optSelected": true, "pixelMarginRight": true, "pixelPosition": true, "radioValue": true, "reliableMarginLeft": false }; } else if ( /iphone os 9_/i.test( userAgent ) ) { expected = { "ajax": true, "boxSizingReliable": true, "checkClone": true, "checkOn": true, "clearCloneStyle": true, "cors": true, "createHTMLDocument": true, "focusin": false, "noCloneChecked": true, "optSelected": true, "pixelMarginRight": true, "pixelPosition": false, "radioValue": true, "reliableMarginLeft": true }; } else if ( /iphone os 8_/i.test( userAgent ) ) { expected = { "ajax": true, "boxSizingReliable": true, "checkClone": true, "checkOn": true, "clearCloneStyle": true, "cors": true, "createHTMLDocument": false, "focusin": false, "noCloneChecked": true, "optSelected": true, "pixelMarginRight": true, "pixelPosition": false, "radioValue": true, "reliableMarginLeft": true }; } else if ( /iphone os 7_/i.test( userAgent ) ) { expected = { "ajax": true, "boxSizingReliable": true, "checkClone": true, "checkOn": true, "clearCloneStyle": true, "cors": true, "createHTMLDocument": true, "focusin": false, "noCloneChecked": true, "optSelected": true, "pixelMarginRight": true, "pixelPosition": false, "radioValue": true, "reliableMarginLeft": true }; } else if ( /android 4\.[0-3]/i.test( userAgent ) ) { expected = { "ajax": true, "boxSizingReliable": true, "checkClone": false, "checkOn": false, "clearCloneStyle": true, "cors": true, "createHTMLDocument": true, "focusin": false, "noCloneChecked": true, "optSelected": true, "pixelMarginRight": false, "pixelPosition": false, "radioValue": true, "reliableMarginLeft": false }; } QUnit.test( "Verify that support tests resolve as expected per browser", function( assert ) { if ( !expected ) { assert.expect( 1 ); assert.ok( false, "Known client: " + userAgent ); } var i, prop, j = 0; for ( prop in computedSupport ) { j++; } assert.expect( j ); for ( i in expected ) { if ( jQuery.ajax || i !== "ajax" && i !== "cors" ) { assert.equal( computedSupport[ i ], expected[ i ], "jQuery.support['" + i + "']: " + computedSupport[ i ] + ", expected['" + i + "']: " + expected[ i ] ); } else { assert.ok( true, "no ajax; skipping jQuery.support['" + i + "']" ); } } }); } )(); 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
QUnit.module( "support", { afterEach: moduleTeardown } );

var computedSupport = getComputedSupport( jQuery.support );

function getComputedSupport( support ) {
	var prop,
		result = {};

	for ( prop in support ) {
		if ( typeof support[ prop ] === "function" ) {
			result[ prop ] = support[ prop ]();
		} else {
			result[ prop ] = support[ prop ];
		}
	}

	return result;
}

if ( jQuery.css ) {
	testIframe(
		"body background is not lost if set prior to loading jQuery (#9239)",
		"support/bodyBackground.html",
		function( assert, jQuery, window, document, color, support ) {
			assert.expect( 2 );
			var okValue = {
				"#000000": true,
				"rgb(0, 0, 0)": true
			};
			assert.ok( okValue[ color ], "color was not reset (" + color + ")" );

			assert.deepEqual( jQuery.extend( {}, support ), computedSupport,
				"Same support properties" );
		}
	);
}

// This test checks CSP only for browsers with "Content-Security-Policy" header support
// i.e. no IE
testIframe(
	"Check CSP (https://developer.mozilla.org/en-US/docs/Security/CSP) restrictions",
	"mock.php?action=cspFrame",
	function( assert, jQuery, window, document, support ) {
		var done = assert.async();

		assert.expect( 2 );
		assert.deepEqual( jQuery.extend( {}, support ), computedSupport,
			"No violations of CSP polices" );

		supportjQuery.get( baseURL + "support/csp.log" ).done( function( data ) {
			assert.equal( data, "", "No log request should be sent" );
			supportjQuery.get( baseURL + "mock.php?action=cspClean" ).done( done );
		} );
	}
);

( function() {
	var expected,
		userAgent = window.navigator.userAgent,
		expectedMap = {
			edge: {
				reliableTrDimensions: false,
				scope: undefined
			},
			ie_11: {
				reliableTrDimensions: false,
				scope: undefined
			},
			chrome: {
				reliableTrDimensions: true,
				scope: true
			},
			safari: {
				reliableTrDimensions: true,
				scope: true
			},
			firefox: {
				reliableTrDimensions: true,
				scope: true
			},
			ios: {
				reliableTrDimensions: true,
				scope: true
			}
		};

	if ( /edge\//i.test( userAgent ) ) {
		expected = expectedMap.edge;
	} else if ( document.documentMode ) {
		expected = expectedMap.ie_11;
	} else if ( /chrome/i.test( userAgent ) ) {

		// Catches Chrome on Android & Opera as well.
		expected = expectedMap.chrome;
	} else if ( /\b\d+(\.\d+)+ safari/i.test( userAgent ) ) {
		expected = expectedMap.safari;
	} else if ( /firefox/i.test( userAgent ) ) {
		expected = expectedMap.firefox;
	} else if ( /(?:iphone|ipad);.*(?:iphone)? os \d+_/i.test( userAgent ) ) {
		expected = expectedMap.ios;
	}

	QUnit.test( "Verify that support tests resolve as expected per browser", function( assert ) {
		if ( !expected ) {
			assert.expect( 1 );
			assert.ok( false, "Known client: " + userAgent );
		}

		var i, prop,
			j = 0;

		for ( prop in computedSupport ) {
			j++;
		}

		// Add an assertion per undefined support prop as it may
		// not even exist on computedSupport but we still want to run
		// the check.
		for ( prop in expected ) {
			if ( expected[ prop ] === undefined ) {
				j++;
			}
		}

		assert.expect( j );

		for ( i in expected ) {
			assert.equal( computedSupport[ i ], expected[ i ],
				"jQuery.support['" + i + "']: " + computedSupport[ i ] +
					", expected['" + i + "']: " + expected[ i ] );
		}
	} );

	QUnit.test( "Verify support tests are failing in one of tested browsers",
		function( assert ) {

		var prop, browserKey, supportTestName,
			i = 0,
			supportProps = {},
			failingSupportProps = {};

		for ( prop in computedSupport ) {
			i++;
		}

		// Add an assertion per undefined support prop as it may
		// not even exist on computedSupport but we still want to run
		// the check.
		for ( prop in expected ) {
			if ( expected[ prop ] === undefined ) {
				i++;
			}
		}

		assert.expect( i );

		// Record all support props and the failing ones and ensure every test
		// is failing at least once.
		for ( browserKey in expectedMap ) {
			for ( supportTestName in expectedMap[ browserKey ] ) {
				supportProps[ supportTestName ] = true;
				if ( !expectedMap[ browserKey ][ supportTestName ] ) {
					failingSupportProps[ supportTestName ] = true;
				}
			}
		}

		for ( supportTestName in supportProps ) {
			assert.ok( failingSupportProps[ supportTestName ],
				"jQuery.support['" + supportTestName +
					"'] is expected to fail at least in one browser" );
		}
	} );

} )();