| 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?" ); | |
| } | |
| } ); | |
| } )(); |