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 ( includesModule( "css" ) ) {
	testIframe(
		"body background is not lost if set prior to loading jQuery (trac-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 old WebKit or old Firefox
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 browserKey, expected,
		userAgent = window.navigator.userAgent,
		expectedMap = {
			edge: {
				"ajax": true,
				"boxSizingReliable": true,
				"checkClone": true,
				"checkOn": true,
				"clearCloneStyle": true,
				"cors": true,
				"createHTMLDocument": true,
				"focusin": false,
				"noCloneChecked": true,
				"option": true,
				"optSelected": true,
				"pixelBoxStyles": true,
				"pixelPosition": true,
				"radioValue": true,
				"reliableMarginLeft": true,
				"reliableTrDimensions": false,
				"scrollboxSize": true
			},
			ie_10_11: {
				"ajax": true,
				"boxSizingReliable": false,
				"checkClone": true,
				"checkOn": true,
				"clearCloneStyle": false,
				"cors": true,
				"createHTMLDocument": true,
				"focusin": true,
				"noCloneChecked": false,
				"option": true,
				"optSelected": false,
				"pixelBoxStyles": true,
				"pixelPosition": true,
				"radioValue": false,
				"reliableMarginLeft": true,
				"reliableTrDimensions": false,
				"scrollboxSize": true
			},
			ie_9: {
				"ajax": true,
				"boxSizingReliable": false,
				"checkClone": true,
				"checkOn": true,
				"clearCloneStyle": false,
				"cors": false,
				"createHTMLDocument": true,
				"focusin": true,
				"noCloneChecked": false,
				"option": false,
				"optSelected": false,
				"pixelBoxStyles": true,
				"pixelPosition": true,
				"radioValue": false,
				"reliableMarginLeft": true,
				"reliableTrDimensions": false,
				"scrollboxSize": false
			},
			chrome: {
				"ajax": true,
				"boxSizingReliable": true,
				"checkClone": true,
				"checkOn": true,
				"clearCloneStyle": true,
				"cors": true,
				"createHTMLDocument": true,
				"focusin": false,
				"noCloneChecked": true,
				"option": true,
				"optSelected": true,
				"pixelBoxStyles": true,
				"pixelPosition": true,
				"radioValue": true,
				"reliableMarginLeft": true,
				"reliableTrDimensions": true,
				"scrollboxSize": true
			},
			safari: {
				"ajax": true,
				"boxSizingReliable": true,
				"checkClone": true,
				"checkOn": true,
				"clearCloneStyle": true,
				"cors": true,
				"createHTMLDocument": true,
				"focusin": false,
				"noCloneChecked": true,
				"option": true,
				"optSelected": true,
				"pixelBoxStyles": true,
				"pixelPosition": true,
				"radioValue": true,
				"reliableMarginLeft": true,
				"reliableTrDimensions": true,
				"scrollboxSize": true
			},
			safari_9_10: {
				"ajax": true,
				"boxSizingReliable": true,
				"checkClone": true,
				"checkOn": true,
				"clearCloneStyle": true,
				"cors": true,
				"createHTMLDocument": true,
				"focusin": false,
				"noCloneChecked": true,
				"option": true,
				"optSelected": true,
				"pixelBoxStyles": false,
				"pixelPosition": false,
				"radioValue": true,
				"reliableMarginLeft": true,
				"reliableTrDimensions": true,
				"scrollboxSize": true
			},
			firefox: {
				"ajax": true,
				"boxSizingReliable": true,
				"checkClone": true,
				"checkOn": true,
				"clearCloneStyle": true,
				"cors": true,
				"createHTMLDocument": true,
				"focusin": false,
				"noCloneChecked": true,
				"option": true,
				"optSelected": true,
				"pixelBoxStyles": true,
				"pixelPosition": true,
				"radioValue": true,
				"reliableMarginLeft": true,
				"reliableTrDimensions": false,
				"scrollboxSize": true
			},
			firefox_60: {
				"ajax": true,
				"boxSizingReliable": true,
				"checkClone": true,
				"checkOn": true,
				"clearCloneStyle": true,
				"cors": true,
				"createHTMLDocument": true,
				"focusin": false,
				"noCloneChecked": true,
				"option": true,
				"optSelected": true,
				"pixelBoxStyles": true,
				"pixelPosition": true,
				"radioValue": true,
				"reliableMarginLeft": false,
				"reliableTrDimensions": true,
				"scrollboxSize": true
			},
			ios: {
				"ajax": true,
				"boxSizingReliable": true,
				"checkClone": true,
				"checkOn": true,
				"clearCloneStyle": true,
				"cors": true,
				"createHTMLDocument": true,
				"focusin": false,
				"noCloneChecked": true,
				"option": true,
				"optSelected": true,
				"pixelBoxStyles": true,
				"pixelPosition": true,
				"radioValue": true,
				"reliableMarginLeft": true,
				"reliableTrDimensions": true,
				"scrollboxSize": true
			},
			ios_9_10: {
				"ajax": true,
				"boxSizingReliable": true,
				"checkClone": true,
				"checkOn": true,
				"clearCloneStyle": true,
				"cors": true,
				"createHTMLDocument": true,
				"focusin": false,
				"noCloneChecked": true,
				"option": true,
				"optSelected": true,
				"pixelBoxStyles": false,
				"pixelPosition": false,
				"radioValue": true,
				"reliableMarginLeft": true,
				"reliableTrDimensions": true,
				"scrollboxSize": true
			},
			ios_8: {
				"ajax": true,
				"boxSizingReliable": true,
				"checkClone": true,
				"checkOn": true,
				"clearCloneStyle": true,
				"cors": true,
				"createHTMLDocument": false,
				"focusin": false,
				"noCloneChecked": true,
				"option": true,
				"optSelected": true,
				"pixelBoxStyles": false,
				"pixelPosition": false,
				"radioValue": true,
				"reliableMarginLeft": true,
				"reliableTrDimensions": true,
				"scrollboxSize": true
			},
			ios_7: {
				"ajax": true,
				"boxSizingReliable": true,
				"checkClone": true,
				"checkOn": true,
				"clearCloneStyle": true,
				"cors": true,
				"createHTMLDocument": true,
				"focusin": false,
				"noCloneChecked": true,
				"option": true,
				"optSelected": true,
				"pixelBoxStyles": false,
				"pixelPosition": false,
				"radioValue": true,
				"reliableMarginLeft": true,
				"reliableTrDimensions": true,
				"scrollboxSize": true
			},
			android: {
				"ajax": true,
				"boxSizingReliable": true,
				"checkClone": false,
				"checkOn": false,
				"clearCloneStyle": true,
				"cors": true,
				"createHTMLDocument": true,
				"focusin": false,
				"noCloneChecked": true,
				"option": true,
				"optSelected": true,
				"pixelBoxStyles": false,
				"pixelPosition": false,
				"radioValue": true,
				"reliableMarginLeft": false,
				"reliableTrDimensions": true,
				"scrollboxSize": true
			}
		};

	// Make the slim build pass tests.
	for ( browserKey in expectedMap ) {
		if ( !jQuery.ajax ) {
			delete expectedMap[ browserKey ].ajax;
			delete expectedMap[ browserKey ].cors;
		}
	}

	if ( /edge\//i.test( userAgent ) ) {
		expected = expectedMap.edge;
	} else if ( /(msie 10\.0|trident\/7\.0)/i.test( userAgent ) ) {
		expected = expectedMap.ie_10_11;
	} else if ( /msie 9\.0/i.test( userAgent ) ) {
		expected = expectedMap.ie_9;
	} else if ( /chrome/i.test( userAgent ) ) {

		// Catches Chrome on Android as well (i.e. the default
		// Android browser on Android >= 4.4).
		expected = expectedMap.chrome;
	} else if ( /\b(?:9|10)\.\d+(\.\d+)* safari/i.test( userAgent ) ) {
		expected = expectedMap.safari_9_10;
	} else if ( /firefox\/(?:4\d|5\d|60)/i.test( userAgent ) ) {
		expected = expectedMap.firefox_60;
	} else if ( /firefox/i.test( userAgent ) ) {
		expected = expectedMap.firefox;
	} else if ( /android 4\.[0-3]/i.test( userAgent ) ) {
		expected = expectedMap.android;
	} else if ( /iphone os (?:9|10)_/i.test( userAgent ) ) {
		expected = expectedMap.ios_9_10;
	} else if ( /iphone os 8_/i.test( userAgent ) ) {
		expected = expectedMap.ios_8;
	} else if ( /iphone os 7_/i.test( userAgent ) ) {
		expected = expectedMap.ios_7;
	} else if ( /(?:iphone|ipad);.*(?:iphone)? os \d+_/i.test( userAgent ) ) {
		expected = expectedMap.ios;
	} else if ( /\b\d+(\.\d+)+ safari/i.test( userAgent ) ) {
		expected = expectedMap.safari;
	}

	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 ( includesModule( "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 + "']" );
			}
		}
	} );

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

		var prop, browserKey, supportTestName,
			i = 0,
			supportProps = {},
			failingSupportProps = {},
			whitelist = {
				ajax: true
			};

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

		assert.expect( i );

		// Record all support props and the failing ones and ensure everyone
		// except a few on a whitelist are failing at least once.
		for ( browserKey in expectedMap ) {
			for ( supportTestName in expectedMap[ browserKey ] ) {
				supportProps[ supportTestName ] = true;
				if ( expectedMap[ browserKey ][ supportTestName ] !== true ) {
					failingSupportProps[ supportTestName ] = true;
				}
			}
		}

		for ( supportTestName in supportProps ) {
			assert.ok( whitelist[ supportTestName ] || failingSupportProps[ supportTestName ],
				"jQuery.support['" + supportTestName + "'] always succeeds; remove it?" );
		}
	} );

} )();
