<commit_before>module( "ajax", {
	teardown: moduleTeardown
});

if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {

	var isOpera = !!window.opera;

	test( "jQuery.ajax() - success callbacks", function() {
		expect( 8 );

		jQuery.ajaxSetup({
			timeout: 0
		});

		stop();

		jQuery("#foo").ajaxStart(function() {
			ok( true, "ajaxStart" );
		}).ajaxStop(function() {
			ok( true, "ajaxStop" );
			start();
		}).ajaxSend(function() {
			ok( true, "ajaxSend" );
		}).ajaxComplete(function() {
			ok( true, "ajaxComplete" );
		}).ajaxError(function() {
			ok( false, "ajaxError" );
		}).ajaxSuccess(function() {
			ok( true, "ajaxSuccess" );
		});

		jQuery.ajax({
			url: url("data/name.html"),
			beforeSend: function() {
				ok( true, "beforeSend" );
			},
			success: function() {
				ok( true, "success" );
			},
			error: function() {
				ok( false, "error" );
			},
			complete: function() {
				ok( true, "complete");
			}
		});
	});

	test( "jQuery.ajax() - success callbacks - (url, options) syntax", function() {
		expect( 8 );

		jQuery.ajaxSetup({
			timeout: 0
		});

		stop();

		setTimeout(function() {
			jQuery("#foo").ajaxStart(function() {
				ok( true, "ajaxStart" );
			}).ajaxStop(function() {
				ok( true, "ajaxStop" );
				start();
			}).ajaxSend(function() {
				ok( true, "ajaxSend" );
			}).ajaxComplete(function() {
				ok( true, "ajaxComplete" );
			}).ajaxError(function() {
				ok( false, "ajaxError" );
			}).ajaxSuccess(function() {
				ok( true, "ajaxSuccess" );
			});

			jQuery.ajax( url("data/name.html"), {
				beforeSend: function() {
					ok( true, "beforeSend" );
				},
				success: function() {
					ok( true, "success" );
				},
				error: function() {
					ok( false, "error" );
				},
				complete: function() {
					ok( true, "complete" );
				}
			});
		}, 13 );
	});

	test( "jQuery.ajax() - success callbacks (late binding)", function() {
		expect( 8 );

		jQuery.ajaxSetup({
			timeout: 0
		});

		stop();

		setTimeout(function() {
			jQuery("#foo").ajaxStart(function() {
				ok( true, "ajaxStart" );
			}).ajaxStop(function() {
				ok( true, "ajaxStop" );
				start();
			}).ajaxSend(function() {
				ok( true, "ajaxSend" );
			}).ajaxComplete(function() {
				ok( true, "ajaxComplete" );
			}).ajaxError(function() {
				ok( false, "ajaxError" );
			}).ajaxSuccess(function() {
				ok( true, "ajaxSuccess" );
			});

			jQuery.ajax({
				url: url("data/name.html"),
				beforeSend: function() {
					ok( true, "beforeSend" );
				}
			}).complete(function() {
				ok( true, "complete" );
			}).success(function() {
				ok( true, "success" );
			}).error(function() {
				ok( false, "error" );
			});
		}, 13 );
	});

	test( "jQuery.ajax() - success callbacks (oncomplete binding)", function() {
		expect( 8 );

		jQuery.ajaxSetup({
			timeout: 0
		});

		stop();

		setTimeout(function() {
			jQuery("#foo").ajaxStart(function() {
				ok( true, "ajaxStart" );
			}).ajaxStop(function() {
				ok( true, "ajaxStop" );
			}).ajaxSend(function() {
				ok( true, "ajaxSend" );
			}).ajaxComplete(function() {
				ok( true, "ajaxComplete" );
			}).ajaxError(function() {
				ok( false, "ajaxError" );
			}).ajaxSuccess(function() {
				ok( true, "ajaxSuccess" );
			});

			jQuery.ajax({
				url: url("data/name.html"),
				beforeSend: function() {
					ok( true, "beforeSend" );
				},
				complete: function( xhr ) {
					xhr.complete(function() {
						ok( true, "complete" );
					}).success(function() {
						ok( true, "success" );
					}).error(function() {
						ok( false, "error" );
					}).complete(function() {
						start();
					});
				}
			});
		}, 13 );
	});

	test( "jQuery.ajax() - success callbacks (very late binding)", function() {
		expect( 8 );

		jQuery.ajaxSetup({
			timeout: 0
		});

		stop();

		setTimeout(function() {
			jQuery("#foo").ajaxStart(function() {
				ok( true, "ajaxStart" );
			}).ajaxStop(function() {
				ok( true, "ajaxStop" );
			}).ajaxSend(function() {
				ok( true, "ajaxSend" );
			}).ajaxComplete(function() {
				ok( true, "ajaxComplete" );
			}).ajaxError(function() {
				ok( false, "ajaxError" );
			}).ajaxSuccess(function() {
				ok( true, "ajaxSuccess" );
			});

			jQuery.ajax({
				url: url("data/name.html"),
				beforeSend: function() {
					ok(true, "beforeSend");
				},
				complete: function( xhr ) {
					setTimeout (function() {
						xhr.complete(function() {
							ok( true, "complete" );
						}).success(function() {
							ok( true, "success" );
						}).error(function() {
							ok( false, "error" );
						}).complete(function() {
							start();
						});
					}, 100 );
				}
			});
		}, 13 );
	});

	test( "jQuery.ajax() - success callbacks (order)", function() {
		expect( 1 );

		jQuery.ajaxSetup({
			timeout: 0
		});

		stop();

		var testString = "";

		setTimeout(function() {
			jQuery.ajax({
				url: url("data/name.html"),
				success: function( _1, _2, xhr ) {
					xhr.success(function() {
						xhr.success(function() {
							testString += "E";
						});
						testString += "D";
					});
					testString += "A";
				},
				complete: function() {
					strictEqual( testString, "ABCDE", "Proper order" );
					start();
				}
			}).success(function() {
				testString += "B";
			}).success(function() {
				testString += "C";
			});
		}, 13 );
	});

	test( "jQuery.ajax() - error callbacks", function() {
		expect( 8 );
		stop();

		jQuery("#foo").ajaxStart(function() {
			ok( true, "ajaxStart" );
		}).ajaxStop(function() {
			ok( true, "ajaxStop" );
			start();
		}).ajaxSend(function() {
			ok( true, "ajaxSend" );
		}).ajaxComplete(function() {
			ok( true, "ajaxComplete" );
		}).ajaxError(function() {
			ok( true, "ajaxError" );
		}).ajaxSuccess(function() {
			ok( false, "ajaxSuccess" );
		});

		jQuery.ajaxSetup({
			timeout: 500
		});

		jQuery.ajax({
			url: url("data/name.php?wait=5"),
			beforeSend: function() {
				ok( true, "beforeSend" );
			},
			success: function() {
				ok( false, "success" );
			},
			error: function() {
				ok( true, "error" );
			},
			complete: function() {
				ok( true, "complete" );
			}
		});
	});

	test( "jQuery.ajax - multiple method signatures introduced in 1.5 ( #8107)", function() {

		expect( 4 );

		stop();

		jQuery.when(
			/* jQuery.when arguments start */
			jQuery.ajax().success(function() {
				ok( true, "With no arguments" );
			}),
			jQuery.ajax("data/name.html").success(function() {
				ok( true, "With only string URL argument" );
			}),
			jQuery.ajax( "data/name.html", {}).success(function() {
				ok( true, "With string URL param and map" );
			}),
			jQuery.ajax({
				url: "data/name.html"
			}).success(function() {
				ok( true, "With only map" );
			})
			/* jQuery.when arguments end */
		).always(function() {
			start();
		});

	});

	test( "jQuery.ajax() - textStatus and errorThrown values", function() {

		var nb = 2;

		expect( 2 * nb );
		stop();

		function startN() {
			if ( !( --nb ) ) {
				start();
			}
		}

		/*
		Safari 3.x returns "OK" instead of "Not Found"
		Safari 4.x doesn't have this issue so the test should be re-instated once
		we drop support for 3.x

		jQuery.ajax({
			url: url("data/nonExistingURL"),
			error: function( _, textStatus, errorThrown ) {
				strictEqual( textStatus, "error", "textStatus is 'error' for 404" );
				strictEqual( errorThrown, "Not Found", "errorThrown is 'Not Found' for 404");
				startN();
			}
		});
		*/

		jQuery.ajax({
			url: url("data/name.php?wait=5"),
			error: function( _, textStatus, errorThrown ) {
				strictEqual( textStatus, "abort", "textStatus is 'abort' for abort" );
				strictEqual( errorThrown, "abort", "errorThrown is 'abort' for abort" );
				startN();
			}
		}).abort();

		jQuery.ajax({
			url: url("data/name.php?wait=5"),
			error: function( _, textStatus, errorThrown ) {
				strictEqual( textStatus, "mystatus", "textStatus is 'mystatus' for abort('mystatus')" );
				strictEqual( errorThrown, "mystatus", "errorThrown is 'mystatus' for abort('mystatus')" );
				startN();
			}
		}).abort("mystatus");
	});

	test( "jQuery.ajax() - responseText on error", function() {

		expect( 1 );

		stop();

		jQuery.ajax({
			url: url("data/errorWithText.php"),
			error: function( xhr ) {
				strictEqual( xhr.responseText, "plain text message", "Test jqXHR.responseText is filled for HTTP errors" );
			},
			complete: function() {
				start();
			}
		});
	});

	test( ".ajax() - retry with jQuery.ajax( this )", function() {

		expect( 2 );

		stop();

		var previousUrl,
			firstTime = true;

		jQuery.ajax({
			url: url("data/errorWithText.php"),
			error: function() {
				if ( firstTime ) {
					firstTime = false;
					jQuery.ajax( this );
				} else {
					ok ( true, "Test retrying with jQuery.ajax(this) works" );
					jQuery.ajax({
						url: url("data/errorWithText.php"),
						data: {
							"x": 1
						},
						beforeSend: function() {
							if ( !previousUrl ) {
								previousUrl = this.url;
							} else {
								strictEqual( this.url, previousUrl, "url parameters are not re-appended" );
								start();
								return false;
							}
						},
						error: function() {
							jQuery.ajax( this );
						}
					});
				}
			}
		});
	});

	test( ".ajax() - headers", function() {

		expect( 4 );

		stop();

		jQuery("#foo").ajaxSend(function( evt, xhr ) {
			xhr.setRequestHeader( "ajax-send", "test" );
		});

		var i,
			requestHeaders = {
				"siMPle": "value",
				"SometHing-elsE": "other value",
				"OthEr": "something else"
			},
			list = [];

		for ( i in requestHeaders ) {
			list.push( i );
		}
		list.push("ajax-send");

		jQuery.ajax( url("data/headers.php?keys=" + list.join("_")), {

			headers: requestHeaders,
			success: function( data, _, xhr ) {
				var i, emptyHeader,
						tmp = [];
				for ( i in requestHeaders ) {
					tmp.push( i, ": ", requestHeaders[ i ], "\n" );
				}
				tmp.push("ajax-send: test\n");
				tmp = tmp.join("");

				strictEqual( data, tmp, "Headers were sent" );
				strictEqual( xhr.getResponseHeader("Sample-Header"), "Hello World", "Sample header received" );

				emptyHeader = xhr.getResponseHeader("Empty-Header");
				if ( emptyHeader === null ) {
					ok( true, "Firefox doesn't support empty headers" );
				} else {
					strictEqual( emptyHeader, "", "Empty header received" );
				}
				strictEqual( xhr.getResponseHeader("Sample-Header2"), "Hello World 2", "Second sample header received" );
			},
			error: function() {
				ok( false, "error" );
			}
		}).always(function() {
			start();
		});
	});

	test( ".ajax() - Accept header", function() {

		expect( 1 );

		stop();

		jQuery.ajax( url("data/headers.php?keys=accept"), {
			headers: {
				Accept: "very wrong accept value"
			},
			beforeSend: function( xhr ) {
				xhr.setRequestHeader("Accept", "*/*");
			},
			success: function( data ) {
				strictEqual( data, "accept: */*\n", "Test Accept header is set to last value provided" );
				start();
			},
			error: function() {
				ok( false, "error" );
			}
		});
	});

	test( ".ajax() - contentType", function() {

		expect( 2 );

		stop();

		var count = 2;

		function restart() {
			if ( ! --count ) {
				start();
			}
		}

		jQuery.ajax( url("data/headers.php?keys=content-type"), {
			contentType: "test",
			success: function( data ) {
				strictEqual( data, "content-type: test\n", "Test content-type is sent when options.contentType is set" );
			},
			complete: function() {
				restart();
			}
		});

		jQuery.ajax( url("data/headers.php?keys=content-type" ), {
			contentType: false,
			success: function( data ) {
				strictEqual( data, "content-type: \n", "Test content-type is not sent when options.contentType===false" );
			},
			complete: function() {
				restart();
			}
		});

	});

	test( ".ajax() - protocol-less urls", function() {
		expect( 1 );

		jQuery.ajax({
			url: "//somedomain.com",
			beforeSend: function( xhr, settings ) {
				equal( settings.url, location.protocol + "//somedomain.com", "Make sure that the protocol is added." );
				return false;
			}
		});
	});

	test( ".ajax() - hash", function() {
		expect( 3 );

		jQuery.ajax({
			url: "data/name.html#foo",
			beforeSend: function( xhr, settings ) {
				equal( settings.url, "data/name.html", "Make sure that the URL is trimmed." );
				return false;
			}
		});

		jQuery.ajax({
			url: "data/name.html?abc#foo",
			beforeSend: function( xhr, settings ) {
			equal( settings.url, "data/name.html?abc", "Make sure that the URL is trimmed." );
				return false;
			}
		});

		jQuery.ajax({
			url: "data/name.html?abc#foo",
			data: {
				"test": 123
			},
			beforeSend: function( xhr, settings ) {
				equal( settings.url, "data/name.html?abc&test=123", "Make sure that the URL is trimmed." );
				return false;
			}
		});
	});

	test( "jQuery ajax - cross-domain detection", function() {

		expect( 7 );

		var loc = document.location,
			samePort = loc.port || ( loc.protocol === "http:" ? 80 : 443 ),
			otherPort = loc.port === 666 ? 667 : 666,
			otherProtocol = loc.protocol === "http:" ? "https:" : "http:";

		jQuery.ajax({
			dataType: "jsonp",
			url: loc.protocol + "//" + loc.host + ":" + samePort,
			beforeSend: function( _, s ) {
				ok( !s.crossDomain, "Test matching ports are not detected as cross-domain" );
				return false;
			}
		});

		jQuery.ajax({
			dataType: "jsonp",
			url: otherProtocol + "//" + loc.host,
			beforeSend: function( _, s ) {
				ok( s.crossDomain, "Test different protocols are detected as cross-domain" );
				return false;
			}
		});

		jQuery.ajax({
			dataType: "jsonp",
			url: "app:/path",
			beforeSend: function( _, s ) {
				ok( s.crossDomain, "Adobe AIR app:/ URL detected as cross-domain" );
				return false;
			}
		});

		jQuery.ajax({
			dataType: "jsonp",
			url: loc.protocol + "//somewebsitethatdoesnotexist-656329477541.com:" + ( loc.port || 80 ),
			beforeSend: function( _, s ) {
				ok( s.crossDomain, "Test different hostnames are detected as cross-domain" );
				return false;
			}
		});

		jQuery.ajax({
			dataType: "jsonp",
			url: loc.protocol + "//" + loc.hostname + ":" + otherPort,
			beforeSend: function( _, s ) {
				ok( s.crossDomain, "Test different ports are detected as cross-domain" );
				return false;
			}
		});

		jQuery.ajax({
			dataType: "jsonp",
			url: "about:blank",
			beforeSend: function( _, s ) {
				ok( s.crossDomain, "Test about:blank is detected as cross-domain" );
				return false;
			}
		});

		jQuery.ajax({
			dataType: "jsonp",
			url: loc.protocol + "//" + loc.host,
			crossDomain: true,
			beforeSend: function( _, s ) {
				ok( s.crossDomain, "Test forced crossDomain is detected as cross-domain" );
				return false;
			}
		});

	});

	test( ".load() - 404 error callbacks", function() {
		expect( 6 );
		stop();

		jQuery("#foo").ajaxStart(function() {
			ok( true, "ajaxStart" );
		}).ajaxStop(function() {
			ok( true, "ajaxStop" );
			start();
		}).ajaxSend(function() {
			ok( true, "ajaxSend" );
		}).ajaxComplete(function() {
			ok( true, "ajaxComplete" );
		}).ajaxError(function() {
			ok( true, "ajaxError" );
		}).ajaxSuccess(function() {
			ok( false, "ajaxSuccess" );
		});

		jQuery("<div/>").load( "data/404.html", function() {
			ok( true, "complete" );
		});
	});

	test( "jQuery.ajax() - abort", function() {
		expect( 8 );
		stop();

		jQuery("#foo").ajaxStart(function() {
			ok( true, "ajaxStart" );
		}).ajaxStop(function() {
			ok( true, "ajaxStop" );
			start();
		}).ajaxSend(function() {
			ok( true, "ajaxSend" );
		}).ajaxComplete(function() {
			ok( true, "ajaxComplete" );
		});

		var xhr = jQuery.ajax({
			url: url("data/name.php?wait=5"),
			beforeSend: function() {
				ok( true, "beforeSend" );
			},
			complete: function() {
				ok( true, "complete" );
			}
		});

		equal( xhr.readyState, 1, "XHR readyState indicates successful dispatch" );

		xhr.abort();
		equal( xhr.readyState, 0, "XHR readyState indicates successful abortion" );
	});

	test( "Ajax events with context", function() {
		expect( 14 );

		stop();
		var context = document.createElement("div");

		function event( e ) {
			equal( this, context, e.type );
		}

		function callback( msg ) {
			return function() {
				equal( this, context, "context is preserved on callback " + msg );
			};
		}

		function nocallback( msg ) {
			return function() {
				equal( typeof this.url, "string", "context is settings on callback " + msg );
			};
		}

		jQuery("#foo").add( context )
			.ajaxSend( event )
			.ajaxComplete( event )
			.ajaxError( event )
			.ajaxSuccess( event );

		jQuery.ajax({
			url: url("data/name.html"),
			beforeSend: callback("beforeSend"),
			success: callback("success"),
			error: callback("error"),
			complete: function() {
				callback("complete").call( this );

				jQuery.ajax({
					url: url("data/404.html"),
					context: context,
					beforeSend: callback("beforeSend"),
					error: callback("error"),
					complete: function() {
						callback("complete").call( this );

						jQuery("#foo").add( context ).unbind();

						jQuery.ajax({
							url: url("data/404.html"),
							beforeSend: nocallback("beforeSend"),
							error: nocallback("error"),
							complete: function() {
								nocallback("complete").call( this );
								start();
							}
						});
					}
				});
			},
			context: context
		});
	});

	test( "jQuery.ajax context modification", function() {
		expect( 1 );

		stop();

		var obj = {};

		jQuery.ajax({
			url: url("data/name.html"),
			context: obj,
			beforeSend: function() {
				this.test = "foo";
			},
			complete: function() {
				start();
			}
		});

		equal( obj.test, "foo", "Make sure the original object is maintained." );
	});

	test( "jQuery.ajax context modification through ajaxSetup", function() {
		expect( 4 );

		stop();

		var obj = {};

		jQuery.ajaxSetup({
			context: obj
		});

		strictEqual( jQuery.ajaxSettings.context, obj, "Make sure the context is properly set in ajaxSettings." );

		jQuery.ajax({
			url: url("data/name.html"),
			complete: function() {
				strictEqual( this, obj, "Make sure the original object is maintained." );
				jQuery.ajax({
					url: url("data/name.html"),
					context: {},
					complete: function() {
						ok( this !== obj, "Make sure overidding context is possible." );
						jQuery.ajaxSetup({
							context: false
						});
						jQuery.ajax({
							url: url("data/name.html"),
							beforeSend: function() {
								this.test = "foo2";
							},
							complete: function() {
								ok( this !== obj, "Make sure unsetting context is possible." );
								start();
							}
						});
					}
				});
			}
		});
	});

	test( "jQuery.ajax() - disabled globals", function() {
		expect( 3 );
		stop();

		jQuery("#foo").ajaxStart(function() {
			ok( false, "ajaxStart" );
		}).ajaxStop(function() {
			ok( false, "ajaxStop" );
		}).ajaxSend(function() {
			ok( false, "ajaxSend" );
		}).ajaxComplete(function() {
			ok( false, "ajaxComplete" );
		}).ajaxError(function() {
			ok( false, "ajaxError" );
		}).ajaxSuccess(function() {
			ok( false, "ajaxSuccess" );
		});

		jQuery.ajax({
			global: false,
			url: url("data/name.html"),
			beforeSend: function() {
				ok( true, "beforeSend" );
			},
			success: function() {
				ok( true, "success" );
			},
			error: function() {
				ok( false, "error" );
			},
			complete: function() {
				ok( true, "complete" );
				setTimeout(function() {
					start();
				}, 13 );
			}
		});
	});

	test( "jQuery.ajax - xml: non-namespace elements inside namespaced elements", function() {
		expect( 3 );

		stop();

		jQuery.ajax({
			url: url("data/with_fries.xml"),
			dataType: "xml",
			success: function( resp ) {
				equal( jQuery( "properties", resp ).length, 1, "properties in responseXML" );
				equal( jQuery( "jsconf", resp ).length, 1, "jsconf in responseXML" );
				equal( jQuery( "thing", resp ).length, 2, "things in responseXML" );
				start();
			}
		});
	});

	test( "jQuery.ajax - xml: non-namespace elements inside namespaced elements (over JSONP)", function() {
		expect( 3 );
		stop();
		jQuery.ajax({
			url: url("data/with_fries_over_jsonp.php"),
			dataType: "jsonp xml",
			success: function( resp ) {
				equal( jQuery( "properties", resp ).length, 1, "properties in responseXML" );
				equal( jQuery( "jsconf", resp ).length, 1, "jsconf in responseXML" );
				equal( jQuery( "thing", resp ).length, 2, "things in responseXML" );
				start();
			},
			error: function( _1, _2, error ) {
				ok( false, error );
				start();
			}
		});
	});

	test( "jQuery.ajax - HEAD requests", function() {
		expect( 2 );

		stop();
		jQuery.ajax({
			url: url("data/name.html"),
			type: "HEAD",
			success: function( data, status, xhr ) {
				var h = xhr.getAllResponseHeaders();
				ok( /Date/i.test( h ), "No Date in HEAD response" );

				jQuery.ajax({
					url: url("data/name.html"),
					data: {
						"whip_it": "good"
					},
					type: "HEAD",
					success: function( data, status, xhr ) {
						var h = xhr.getAllResponseHeaders();
						ok( /Date/i.test( h ), "No Date in HEAD response with data" );
						start();
					}
				});
			}
		});

	});

	test( "jQuery.ajax - beforeSend", function() {
		expect( 1 );
		stop();

		var check = false;

		jQuery.ajaxSetup({
			timeout: 0
		});

		jQuery.ajax({
			url: url("data/name.html"),
			beforeSend: function( xml ) {
				check = true;
			},
			success: function( data ) {
				ok( check, "check beforeSend was executed" );
				start();
			}
		});
	});

	test( "jQuery.ajax - beforeSend, cancel request (#2688)", function() {
		expect( 2 );

		jQuery.ajax({
			url: url("data/name.html"),
			beforeSend: function() {
				ok( true, "beforeSend got called, canceling" );
				return false;
			},
			success: function() {
				ok( false, "request didn't get canceled" );
			},
			complete: function() {
				ok( false, "request didn't get canceled" );
			},
			error: function() {
				ok( false, "request didn't get canceled" );
			}
		}).fail(function( _, reason ) {
			strictEqual( reason, "canceled", "canceled request must fail with 'canceled' status text" );
		});
	});

	test( "jQuery.ajax - beforeSend, cancel request manually", function() {
		expect( 2 );
		jQuery.ajax({
			url: url("data/name.html"),
			beforeSend: function( xhr ) {
				ok( true, "beforeSend got called, canceling" );
				xhr.abort();
			},
			success: function() {
				ok( false, "request didn't get canceled" );
			},
			complete: function() {
				ok( false, "request didn't get canceled" );
			},
			error: function() {
				ok( false, "request didn't get canceled" );
			}
		}).fail(function( _, reason ) {
			strictEqual( reason, "canceled", "manually canceled request must fail with 'canceled' status text" );
		});
	});

	window["foobar"] = null;
	window["testFoo"] = undefined;

	test( "jQuery.ajax - dataType html", function() {
		expect( 5 );
		stop();

		var verifyEvaluation = function() {
			equal( window["testFoo"], "foo", "Check if script was evaluated for datatype html" );
			equal( window["foobar"], "bar", "Check if script src was evaluated for datatype html" );

			start();
		};

		jQuery.ajax({
			dataType: "html",
			url: url("data/test.html"),
			success: function( data ) {
				jQuery("#ap").html( data );
				ok( data.match( /^html text/ ), "Check content for datatype html" );
				setTimeout( verifyEvaluation, 600 );
			}
		});
	});

	test( "synchronous request", function() {
		expect( 1 );
		var response = jQuery.ajax({
				url: url("data/json_obj.js"),
				dataType: "text",
				async: false
			}).responseText;

		ok( /^\{ "data"/.test( response ), "check returned text" );
	});

	test( "synchronous request with callbacks", function() {
		expect( 2 );
		var result;
		jQuery.ajax({
			url: url("data/json_obj.js"),
			async: false,
			dataType: "text",
			success: function(data) {
				ok( true, "sucess callback executed" );
				result = data;
			}
		});
		ok( /^\{ "data"/.test( result ), "check returned text" );
	});

	test( "pass-through request object", function() {
		expect( 8 );
		stop();

		var target = "data/name.html";
		var successCount = 0;
		var errorCount = 0;
		var errorEx = "";
		var success = function() {
			successCount++;
		};
		jQuery("#foo").ajaxError(function( e, xml, s, ex ) {
			errorCount++;
			errorEx += ": " + xml.status;
		});
		jQuery("#foo").one( "ajaxStop", function() {
			equal( successCount, 5, "Check all ajax calls successful" );
			equal( errorCount, 0, "Check no ajax errors (status" + errorEx + ")" );
			jQuery("#foo").unbind("ajaxError");

			start();
		});

		ok( jQuery.get( url(target), success ), "get" );
		ok( jQuery.post( url(target), success ), "post" );
		ok( jQuery.getScript( url("data/test.js"), success ), "script" );
		ok( jQuery.getJSON( url("data/json_obj.js"), success ), "json" );
		ok( jQuery.ajax({
			url: url( target ),
			success: success
		}), "generic" );
	});

	test( "ajax cache", function() {
		expect( 18 );

		stop();

		var count = 0;

		jQuery("#firstp").bind( "ajaxSuccess", function( e, xml, s ) {
			var re = /_=(.*?)(&|$)/g;
			var oldOne = null;
			for ( var i = 0; i < 6; i++ ) {
				var ret = re.exec( s.url );
				if ( !ret ) {
					break;
				}
				oldOne = ret[ 1 ];
			}
			equal( i, 1, "Test to make sure only one 'no-cache' parameter is there" );
			ok( oldOne != "tobereplaced555", "Test to be sure parameter (if it was there) was replaced" );
			if ( ++count === 6 ) {
				start();
			}
		});

		ok( jQuery.ajax({
			url: "data/text.php",
			cache: false
		}), "test with no parameters" );
		ok( jQuery.ajax({
			url: "data/text.php?pizza=true",
			cache: false
		}), "test with 1 parameter" );
		ok( jQuery.ajax({
			url: "data/text.php?_=tobereplaced555",
			cache: false
		}), "test with _= parameter" );
		ok( jQuery.ajax({
			url: "data/text.php?pizza=true&_=tobereplaced555",
			cache: false
		}), "test with 1 parameter plus _= one" );
		ok( jQuery.ajax({
			url: "data/text.php?_=tobereplaced555&tv=false",
			cache: false
		}), "test with 1 parameter plus _= one before it" );
		ok( jQuery.ajax({
			url: "data/text.php?name=David&_=tobereplaced555&washere=true",
			cache: false
		}), "test with 2 parameters surrounding _= one" );
	});

	/*
	 * Test disabled.
	 * The assertions expect that the passed-in object will be modified,
	 * which shouldn't be the case. Fixes #5439.
	test( "global ajaxSettings", function() {
		expect( 2 );

		var t,
			tmp = jQuery.extend({}, jQuery.ajaxSettings ),
			orig = {
				url: "data/with_fries.xml"
			};

		jQuery.ajaxSetup({
			data: {
				foo: "bar",
				bar: "BAR"
			}
		});

		t = jQuery.extend({}, orig );
		t.data = {};
		jQuery.ajax( t );
		ok( t.url.indexOf("foo") > -1 && t.url.indexOf("bar") > -1, "Check extending {}" );

		t = jQuery.extend({}, orig );
		t.data = {
			zoo: "a",
			ping: "b"
		};
		jQuery.ajax( t );
		ok( t.url.indexOf("ping") > -1 && t.url.indexOf("zoo") > -1 && t.url.indexOf("foo") > -1 && t.url.indexOf("bar") > -1, "Check extending { zoo: "a", ping: "b" }" );

		jQuery.ajaxSettings = tmp;
	});
	*/

	test( "load(String)", function() {
		expect( 2 );
		stop(); // check if load can be called with only url
		jQuery.ajaxSetup({
			beforeSend: function() {
				strictEqual( this.type, "GET", "no data means GET request" );
			}
		});
		jQuery("#first").load( "data/name.html", function() {
			start();
		});
		jQuery.ajaxSetup({
			beforeSend: null
		});
	});

	test( "load(String,null)", function() {
		expect( 2 );
		stop(); // check if load can be called with url and null data
		jQuery.ajaxSetup({
			beforeSend: function() {
				strictEqual( this.type, "GET", "no data means GET request" );
			}
		});
		jQuery("#first").load( "data/name.html", null, function() {
			start();
		});
	});

	test( "load(String,undefined)", function() {
		expect( 2 );
		stop(); // check if load can be called with url and null data
		jQuery.ajaxSetup({
			beforeSend: function() {
				strictEqual( this.type, "GET", "no data means GET request" );
			}
		});
		jQuery("#first").load( "data/name.html", undefined, function() {
			start();
		});
	});

	test( "load('url selector')", function() {
		expect( 1 );
		stop(); // check if load can be called with only url
		jQuery("#first").load( "data/test3.html div.user", function() {
			equal( jQuery( this ).children("div").length, 2, "Verify that specific elements were injected" );
			start();
		});
	});

	test( "load(String, Function) with ajaxSetup on dataType json, see #2046", function() {
		expect( 1 );
		stop();
		jQuery.ajaxSetup({
			dataType: "json"
		});
		jQuery("#first").ajaxComplete(function( e, xml, s ) {
			equal( s.dataType, "html", "Verify the load() dataType was html" );
			jQuery("#first").unbind("ajaxComplete");
			jQuery.ajaxSetup({
				dataType: ""
			});
			start();
		});
		jQuery("#first").load("data/test3.html");
	});

	test( "load(String, Function) - simple: inject text into DOM", function() {
		expect( 2 );
		stop();
		jQuery("#first").load( url("data/name.html"), function() {
			ok( /^ERROR/.test( jQuery("#first").text() ), "Check if content was injected into the DOM" );
			start();
		});
	});

	test( "load(String, Function) - check scripts", function() {
		expect( 7 );
		stop();

		var verifyEvaluation = function() {
			equal( window["foobar"], "bar", "Check if script src was evaluated after load" );
			equal( jQuery("#ap").html(), "bar", "Check if script evaluation has modified DOM");

			start();
		};
		jQuery("#first").load( url("data/test.html"), function() {
			ok( jQuery("#first").html().match( /^html text/ ), "Check content after loading html" );
			equal( jQuery("#foo").html(), "foo", "Check if script evaluation has modified DOM" );
			equal( window["testFoo"], "foo", "Check if script was evaluated after load" );
			setTimeout( verifyEvaluation, 600 );
		});
	});

	test( "load(String, Function) - check file with only a script tag", function() {
		expect( 3 );
		stop();

		jQuery("#first").load( url("data/test2.html"), function() {
			equal( jQuery("#foo").html(), "foo", "Check if script evaluation has modified DOM");
			equal( window["testFoo"], "foo", "Check if script was evaluated after load" );

			start();
		});
	});

	test( "load(String, Function) - dataFilter in ajaxSettings", function() {
		expect( 2 );
		stop();
		jQuery.ajaxSetup({
			dataFilter: function() {
				return "Hello World";
			}
		});
		var div = jQuery("<div/>").load( url("data/name.html"), function( responseText ) {
			strictEqual( div.html(), "Hello World", "Test div was filled with filtered data" );
			strictEqual( responseText, "Hello World", "Test callback receives filtered data" );
			jQuery.ajaxSetup({
				dataFilter: 0
			});
			start();
		});
	});

	test( "load(String, Object, Function)", function() {
		expect( 2 );
		stop();

		jQuery("<div />").load( url("data/params_html.php"), {
			"foo": 3,
			"bar": "ok"
		}, function() {
			var $post = jQuery( this ).find("#post");
			equal( $post.find("#foo").text(), "3", "Check if a hash of data is passed correctly" );
			equal( $post.find("#bar").text(), "ok", "Check if a hash of data is passed correctly" );
			start();
		});
	});

	test( "load(String, String, Function)", function() {
		expect( 2 );
		stop();

		jQuery("<div />").load( url("data/params_html.php"), "foo=3&bar=ok", function() {
			var $get = jQuery( this ).find("#get");
			equal( $get.find("#foo").text(), "3", "Check if a string of data is passed correctly" );
			equal( $get.find("#bar").text(), "ok", "Check if a   of data is passed correctly" );
			start();
		});
	});

	asyncTest( "load() - data specified in ajaxSettings is merged in (#10524)", 1, function() {
		jQuery.ajaxSetup({
			data: {
				"foo": "bar"
			}
		});

		var data = {
			"baz": 1
		};

		jQuery("#foo")
			.load( "data/echoQuery.php", data )
			.ajaxComplete(function( event, jqXHR, options ) {
				ok( ~options.data.indexOf("foo=bar"), "Data from ajaxSettings was used" );
				jQuery.ajaxSetup({
					data: null
				});
				start();
			});
	});

	asyncTest( "load() - callbacks get the correct parameters", 8, function() {
		var slice = [].slice,
			completeArgs = {};

		jQuery.ajaxSetup({
			success: function( _, status, jqXHR ) {
				completeArgs[ this.url ] = [ jqXHR.responseText, status, jqXHR ];
			},
			error: function( jqXHR, status ) {
				completeArgs[ this.url ] = [ jqXHR.responseText, status, jqXHR ];
			}
		});

		jQuery.when.apply(
			/* jQuery.when.apply arguments start */
			jQuery,
			jQuery.map([
				{
					type: "success",
					url: "data/echoQuery.php?arg=pop"
				},
				{
					type: "error",
					url: "data/404.php"
				}
			],
			function( options ) {
				return jQuery.Deferred(function( defer ) {
					jQuery("#foo").load( options.url, function() {
						var args = arguments;
						strictEqual( completeArgs[ options.url ].length, args.length, "same number of arguments (" + options.type + ")" );
						jQuery.each( completeArgs[ options.url ], function( i, value ) {
							strictEqual( args[ i ], value, "argument #" + i + " is the same (" + options.type + ")" );
						});
						defer.resolve();
					});
				});
			})
			/* jQuery.when.apply arguments end*/
		).always(function() {
			jQuery.ajaxSetup({
				success: null,
				error: null
			});
			start();
		});
	});

	test( "jQuery.get(String, Function) - data in ajaxSettings (#8277)", function() {
		expect( 1 );
		stop();
		jQuery.ajaxSetup({
			data: "helloworld"
		});
		jQuery.get( url("data/echoQuery.php"), function( data ) {
			ok( /helloworld$/.test( data ), "Data from ajaxSettings was used" );
			jQuery.ajaxSetup({
				data: null
			});
			start();
		});
	});

	test( "jQuery.get(String, Hash, Function) - parse xml and use text() on nodes", function() {
		expect( 2 );
		stop();
		jQuery.get( url("data/dashboard.xml"), function( xml ) {
			var content = [];
			jQuery( "tab", xml ).each(function() {
				content.push( jQuery( this ).text() );
			});
			equal( content[ 0 ], "blabla", "Check first tab" );
			equal( content[ 1 ], "blublu", "Check second tab" );
			start();
		});
	});

	test( "jQuery.getScript(String, Function) - with callback", function() {
		expect( 3 );
		stop();
		jQuery.getScript( url("data/test.js"), function( data, _, jqXHR ) {
			equal( foobar, "bar", "Check if script was evaluated" );
			strictEqual( data, jqXHR.responseText, "Same-domain script requests returns the source of the script (#8082)" );
			setTimeout(function() {
				start();
			}, 1000 );
		});
	});

	test( "jQuery.getScript(String, Function) - no callback", function() {
		expect( 1 );
		stop();
		jQuery.getScript( url("data/test.js"), function() {
			start();
		});
	});


	jQuery.each( [ "Same Domain", "Cross Domain" ], function( crossDomain, label ) {


		asyncTest( "jQuery.ajax() - JSONP, Query String (?n)" + label, function() {
			expect( 4 );

			var count = 0;
			function plus() {
				if ( ++count === 4 ) {
					start();
				}
			}

			jQuery.ajax({
				url: "data/jsonp.php?callback=?",
				dataType: "jsonp",
				crossDomain: crossDomain,
				success: function( data ) {
					ok( data.data, "JSON results returned (GET, url callback)" );
					plus();
				},
				error: function( data ) {
					ok( false, "Ajax error JSON (GET, url callback)" );
					plus();
				}
			});

			jQuery.ajax({
				url: "data/jsonp.php?callback=??",
				dataType: "jsonp",
				crossDomain: crossDomain,
				success: function( data ) {
					ok( data.data, "JSON results returned (GET, url context-free callback)" );
					plus();
				},
				error: function( data ) {
					ok( false, "Ajax error JSON (GET, url context-free callback)" );
					plus();
				}
			});

			jQuery.ajax({
				url: "data/jsonp.php/??",
				dataType: "jsonp",
				crossDomain: crossDomain,
				success: function( data ) {
					ok( data.data, "JSON results returned (GET, REST-like)" );
					plus();
				},
				error: function( data ) {
					ok( false, "Ajax error JSON (GET, REST-like)" );
					plus();
				}
			});

			jQuery.ajax({
				url: "data/jsonp.php/???json=1",
				dataType: "jsonp",
				crossDomain: crossDomain,
				success: function( data ) {
					strictEqual( jQuery.type( data ), "array", "JSON results returned (GET, REST-like with param)" );
					plus();
				},
				error: function( data ) {
					ok( false, "Ajax error JSON (GET, REST-like with param)" );
					plus();
				}
			});
		});

		asyncTest( "jQuery.ajax() - JSONP, Explicit jsonp/Callback param " + label, function() {
			expect( 9 );

			var count = 0;
			function plus() {
				if ( ++count === 4 ) {
					start();
				}
			}

			jQuery.ajax({
				url: "data/jsonp.php",
				dataType: "jsonp",
				crossDomain: crossDomain,
				jsonp: "callback",
				success: function( data ) {
					ok( data["data"], "JSON results returned (GET, data obj callback)" );
					plus();
				},
				error: function( data ) {
					ok( false, "Ajax error JSON (GET, data obj callback)" );
					plus();
				}
			});

			window["jsonpResults"] = function( data ) {
				ok( data["data"], "JSON results returned (GET, custom callback function)" );
				window["jsonpResults"] = undefined;
				plus();
			};

			jQuery.ajax({
				url: "data/jsonp.php",
				dataType: "jsonp",
				crossDomain: crossDomain,
				jsonpCallback: "jsonpResults",
				success: function( data ) {
					ok( data.data, "JSON results returned (GET, custom callback name)" );
					plus();
				},
				error: function( data ) {
					ok( false, "Ajax error JSON (GET, custom callback name)" );
					plus();
				}
			});

			jQuery.ajax({
				url: "data/jsonp.php",
				dataType: "jsonp",
				crossDomain: crossDomain,
				jsonpCallback: "functionToCleanUp",
				success: function( data ) {
					ok( data["data"], "JSON results returned (GET, custom callback name to be cleaned up)" );
					strictEqual( window["functionToCleanUp"], undefined, "Callback was removed (GET, custom callback name to be cleaned up)" );
					plus();
					var xhr;
					jQuery.ajax({
						url: "data/jsonp.php",
						dataType: "jsonp",
						crossDomain: crossDomain,
						jsonpCallback: "functionToCleanUp",
						beforeSend: function( jqXHR ) {
							xhr = jqXHR;
							return false;
						}
					});
					xhr.error(function() {
						ok( true, "Ajax error JSON (GET, custom callback name to be cleaned up)" );
						strictEqual( window["functionToCleanUp"], undefined, "Callback was removed after early abort (GET, custom callback name to be cleaned up)" );
						plus();
					});
				},
				error: function( data ) {
					ok( false, "Ajax error JSON (GET, custom callback name to be cleaned up)" );
					plus();
				}
			});

			jQuery.ajax({
				url: "data/jsonp.php?callback=XXX",
				dataType: "jsonp",
				jsonp: false,
				jsonpCallback: "XXX",
				crossDomain: crossDomain,
				beforeSend: function() {
					ok( /^data\/jsonp.php\?callback=XXX&_=\d+$/.test( this.url ), "The URL wasn't messed with (GET, custom callback name with no url manipulation)" );
					plus();
				},
				success: function( data ) {
					ok( data["data"], "JSON results returned (GET, custom callback name with no url manipulation)" );
					plus();
				},
				error: function( data ) {
					ok( false, "Ajax error JSON (GET, custom callback name with no url manipulation)" );
					plus();
				}
			});
		});


		asyncTest( "jQuery.ajax() - JSONP, Callback in data, " + label, function() {
			expect( 2 );

			var count = 0;
			function plus() {
				if ( ++count === 2 ) {
					start();
				}
			}

			jQuery.ajax({
				url: "data/jsonp.php",
				dataType: "jsonp",
				crossDomain: crossDomain,
				data: "callback=?",
				success: function( data ) {
					ok( data.data, "JSON results returned (GET, data callback)" );<commit_msg>comments out some problematic JSONP test until we figure out what the problem is<commit_after>module( "ajax", {
	teardown: moduleTeardown
});

if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {

	var isOpera = !!window.opera;

	test( "jQuery.ajax() - success callbacks", function() {
		expect( 8 );

		jQuery.ajaxSetup({
			timeout: 0
		});

		stop();

		jQuery("#foo").ajaxStart(function() {
			ok( true, "ajaxStart" );
		}).ajaxStop(function() {
			ok( true, "ajaxStop" );
			start();
		}).ajaxSend(function() {
			ok( true, "ajaxSend" );
		}).ajaxComplete(function() {
			ok( true, "ajaxComplete" );
		}).ajaxError(function() {
			ok( false, "ajaxError" );
		}).ajaxSuccess(function() {
			ok( true, "ajaxSuccess" );
		});

		jQuery.ajax({
			url: url("data/name.html"),
			beforeSend: function() {
				ok( true, "beforeSend" );
			},
			success: function() {
				ok( true, "success" );
			},
			error: function() {
				ok( false, "error" );
			},
			complete: function() {
				ok( true, "complete");
			}
		});
	});

	test( "jQuery.ajax() - success callbacks - (url, options) syntax", function() {
		expect( 8 );

		jQuery.ajaxSetup({
			timeout: 0
		});

		stop();

		setTimeout(function() {
			jQuery("#foo").ajaxStart(function() {
				ok( true, "ajaxStart" );
			}).ajaxStop(function() {
				ok( true, "ajaxStop" );
				start();
			}).ajaxSend(function() {
				ok( true, "ajaxSend" );
			}).ajaxComplete(function() {
				ok( true, "ajaxComplete" );
			}).ajaxError(function() {
				ok( false, "ajaxError" );
			}).ajaxSuccess(function() {
				ok( true, "ajaxSuccess" );
			});

			jQuery.ajax( url("data/name.html"), {
				beforeSend: function() {
					ok( true, "beforeSend" );
				},
				success: function() {
					ok( true, "success" );
				},
				error: function() {
					ok( false, "error" );
				},
				complete: function() {
					ok( true, "complete" );
				}
			});
		}, 13 );
	});

	test( "jQuery.ajax() - success callbacks (late binding)", function() {
		expect( 8 );

		jQuery.ajaxSetup({
			timeout: 0
		});

		stop();

		setTimeout(function() {
			jQuery("#foo").ajaxStart(function() {
				ok( true, "ajaxStart" );
			}).ajaxStop(function() {
				ok( true, "ajaxStop" );
				start();
			}).ajaxSend(function() {
				ok( true, "ajaxSend" );
			}).ajaxComplete(function() {
				ok( true, "ajaxComplete" );
			}).ajaxError(function() {
				ok( false, "ajaxError" );
			}).ajaxSuccess(function() {
				ok( true, "ajaxSuccess" );
			});

			jQuery.ajax({
				url: url("data/name.html"),
				beforeSend: function() {
					ok( true, "beforeSend" );
				}
			}).complete(function() {
				ok( true, "complete" );
			}).success(function() {
				ok( true, "success" );
			}).error(function() {
				ok( false, "error" );
			});
		}, 13 );
	});

	test( "jQuery.ajax() - success callbacks (oncomplete binding)", function() {
		expect( 8 );

		jQuery.ajaxSetup({
			timeout: 0
		});

		stop();

		setTimeout(function() {
			jQuery("#foo").ajaxStart(function() {
				ok( true, "ajaxStart" );
			}).ajaxStop(function() {
				ok( true, "ajaxStop" );
			}).ajaxSend(function() {
				ok( true, "ajaxSend" );
			}).ajaxComplete(function() {
				ok( true, "ajaxComplete" );
			}).ajaxError(function() {
				ok( false, "ajaxError" );
			}).ajaxSuccess(function() {
				ok( true, "ajaxSuccess" );
			});

			jQuery.ajax({
				url: url("data/name.html"),
				beforeSend: function() {
					ok( true, "beforeSend" );
				},
				complete: function( xhr ) {
					xhr.complete(function() {
						ok( true, "complete" );
					}).success(function() {
						ok( true, "success" );
					}).error(function() {
						ok( false, "error" );
					}).complete(function() {
						start();
					});
				}
			});
		}, 13 );
	});

	test( "jQuery.ajax() - success callbacks (very late binding)", function() {
		expect( 8 );

		jQuery.ajaxSetup({
			timeout: 0
		});

		stop();

		setTimeout(function() {
			jQuery("#foo").ajaxStart(function() {
				ok( true, "ajaxStart" );
			}).ajaxStop(function() {
				ok( true, "ajaxStop" );
			}).ajaxSend(function() {
				ok( true, "ajaxSend" );
			}).ajaxComplete(function() {
				ok( true, "ajaxComplete" );
			}).ajaxError(function() {
				ok( false, "ajaxError" );
			}).ajaxSuccess(function() {
				ok( true, "ajaxSuccess" );
			});

			jQuery.ajax({
				url: url("data/name.html"),
				beforeSend: function() {
					ok(true, "beforeSend");
				},
				complete: function( xhr ) {
					setTimeout (function() {
						xhr.complete(function() {
							ok( true, "complete" );
						}).success(function() {
							ok( true, "success" );
						}).error(function() {
							ok( false, "error" );
						}).complete(function() {
							start();
						});
					}, 100 );
				}
			});
		}, 13 );
	});

	test( "jQuery.ajax() - success callbacks (order)", function() {
		expect( 1 );

		jQuery.ajaxSetup({
			timeout: 0
		});

		stop();

		var testString = "";

		setTimeout(function() {
			jQuery.ajax({
				url: url("data/name.html"),
				success: function( _1, _2, xhr ) {
					xhr.success(function() {
						xhr.success(function() {
							testString += "E";
						});
						testString += "D";
					});
					testString += "A";
				},
				complete: function() {
					strictEqual( testString, "ABCDE", "Proper order" );
					start();
				}
			}).success(function() {
				testString += "B";
			}).success(function() {
				testString += "C";
			});
		}, 13 );
	});

	test( "jQuery.ajax() - error callbacks", function() {
		expect( 8 );
		stop();

		jQuery("#foo").ajaxStart(function() {
			ok( true, "ajaxStart" );
		}).ajaxStop(function() {
			ok( true, "ajaxStop" );
			start();
		}).ajaxSend(function() {
			ok( true, "ajaxSend" );
		}).ajaxComplete(function() {
			ok( true, "ajaxComplete" );
		}).ajaxError(function() {
			ok( true, "ajaxError" );
		}).ajaxSuccess(function() {
			ok( false, "ajaxSuccess" );
		});

		jQuery.ajaxSetup({
			timeout: 500
		});

		jQuery.ajax({
			url: url("data/name.php?wait=5"),
			beforeSend: function() {
				ok( true, "beforeSend" );
			},
			success: function() {
				ok( false, "success" );
			},
			error: function() {
				ok( true, "error" );
			},
			complete: function() {
				ok( true, "complete" );
			}
		});
	});

	test( "jQuery.ajax - multiple method signatures introduced in 1.5 ( #8107)", function() {

		expect( 4 );

		stop();

		jQuery.when(
			/* jQuery.when arguments start */
			jQuery.ajax().success(function() {
				ok( true, "With no arguments" );
			}),
			jQuery.ajax("data/name.html").success(function() {
				ok( true, "With only string URL argument" );
			}),
			jQuery.ajax( "data/name.html", {}).success(function() {
				ok( true, "With string URL param and map" );
			}),
			jQuery.ajax({
				url: "data/name.html"
			}).success(function() {
				ok( true, "With only map" );
			})
			/* jQuery.when arguments end */
		).always(function() {
			start();
		});

	});

	test( "jQuery.ajax() - textStatus and errorThrown values", function() {

		var nb = 2;

		expect( 2 * nb );
		stop();

		function startN() {
			if ( !( --nb ) ) {
				start();
			}
		}

		/*
		Safari 3.x returns "OK" instead of "Not Found"
		Safari 4.x doesn't have this issue so the test should be re-instated once
		we drop support for 3.x

		jQuery.ajax({
			url: url("data/nonExistingURL"),
			error: function( _, textStatus, errorThrown ) {
				strictEqual( textStatus, "error", "textStatus is 'error' for 404" );
				strictEqual( errorThrown, "Not Found", "errorThrown is 'Not Found' for 404");
				startN();
			}
		});
		*/

		jQuery.ajax({
			url: url("data/name.php?wait=5"),
			error: function( _, textStatus, errorThrown ) {
				strictEqual( textStatus, "abort", "textStatus is 'abort' for abort" );
				strictEqual( errorThrown, "abort", "errorThrown is 'abort' for abort" );
				startN();
			}
		}).abort();

		jQuery.ajax({
			url: url("data/name.php?wait=5"),
			error: function( _, textStatus, errorThrown ) {
				strictEqual( textStatus, "mystatus", "textStatus is 'mystatus' for abort('mystatus')" );
				strictEqual( errorThrown, "mystatus", "errorThrown is 'mystatus' for abort('mystatus')" );
				startN();
			}
		}).abort("mystatus");
	});

	test( "jQuery.ajax() - responseText on error", function() {

		expect( 1 );

		stop();

		jQuery.ajax({
			url: url("data/errorWithText.php"),
			error: function( xhr ) {
				strictEqual( xhr.responseText, "plain text message", "Test jqXHR.responseText is filled for HTTP errors" );
			},
			complete: function() {
				start();
			}
		});
	});

	test( ".ajax() - retry with jQuery.ajax( this )", function() {

		expect( 2 );

		stop();

		var previousUrl,
			firstTime = true;

		jQuery.ajax({
			url: url("data/errorWithText.php"),
			error: function() {
				if ( firstTime ) {
					firstTime = false;
					jQuery.ajax( this );
				} else {
					ok ( true, "Test retrying with jQuery.ajax(this) works" );
					jQuery.ajax({
						url: url("data/errorWithText.php"),
						data: {
							"x": 1
						},
						beforeSend: function() {
							if ( !previousUrl ) {
								previousUrl = this.url;
							} else {
								strictEqual( this.url, previousUrl, "url parameters are not re-appended" );
								start();
								return false;
							}
						},
						error: function() {
							jQuery.ajax( this );
						}
					});
				}
			}
		});
	});

	test( ".ajax() - headers", function() {

		expect( 4 );

		stop();

		jQuery("#foo").ajaxSend(function( evt, xhr ) {
			xhr.setRequestHeader( "ajax-send", "test" );
		});

		var i,
			requestHeaders = {
				"siMPle": "value",
				"SometHing-elsE": "other value",
				"OthEr": "something else"
			},
			list = [];

		for ( i in requestHeaders ) {
			list.push( i );
		}
		list.push("ajax-send");

		jQuery.ajax( url("data/headers.php?keys=" + list.join("_")), {

			headers: requestHeaders,
			success: function( data, _, xhr ) {
				var i, emptyHeader,
						tmp = [];
				for ( i in requestHeaders ) {
					tmp.push( i, ": ", requestHeaders[ i ], "\n" );
				}
				tmp.push("ajax-send: test\n");
				tmp = tmp.join("");

				strictEqual( data, tmp, "Headers were sent" );
				strictEqual( xhr.getResponseHeader("Sample-Header"), "Hello World", "Sample header received" );

				emptyHeader = xhr.getResponseHeader("Empty-Header");
				if ( emptyHeader === null ) {
					ok( true, "Firefox doesn't support empty headers" );
				} else {
					strictEqual( emptyHeader, "", "Empty header received" );
				}
				strictEqual( xhr.getResponseHeader("Sample-Header2"), "Hello World 2", "Second sample header received" );
			},
			error: function() {
				ok( false, "error" );
			}
		}).always(function() {
			start();
		});
	});

	test( ".ajax() - Accept header", function() {

		expect( 1 );

		stop();

		jQuery.ajax( url("data/headers.php?keys=accept"), {
			headers: {
				Accept: "very wrong accept value"
			},
			beforeSend: function( xhr ) {
				xhr.setRequestHeader("Accept", "*/*");
			},
			success: function( data ) {
				strictEqual( data, "accept: */*\n", "Test Accept header is set to last value provided" );
				start();
			},
			error: function() {
				ok( false, "error" );
			}
		});
	});

	test( ".ajax() - contentType", function() {

		expect( 2 );

		stop();

		var count = 2;

		function restart() {
			if ( ! --count ) {
				start();
			}
		}

		jQuery.ajax( url("data/headers.php?keys=content-type"), {
			contentType: "test",
			success: function( data ) {
				strictEqual( data, "content-type: test\n", "Test content-type is sent when options.contentType is set" );
			},
			complete: function() {
				restart();
			}
		});

		jQuery.ajax( url("data/headers.php?keys=content-type" ), {
			contentType: false,
			success: function( data ) {
				strictEqual( data, "content-type: \n", "Test content-type is not sent when options.contentType===false" );
			},
			complete: function() {
				restart();
			}
		});

	});

	test( ".ajax() - protocol-less urls", function() {
		expect( 1 );

		jQuery.ajax({
			url: "//somedomain.com",
			beforeSend: function( xhr, settings ) {
				equal( settings.url, location.protocol + "//somedomain.com", "Make sure that the protocol is added." );
				return false;
			}
		});
	});

	test( ".ajax() - hash", function() {
		expect( 3 );

		jQuery.ajax({
			url: "data/name.html#foo",
			beforeSend: function( xhr, settings ) {
				equal( settings.url, "data/name.html", "Make sure that the URL is trimmed." );
				return false;
			}
		});

		jQuery.ajax({
			url: "data/name.html?abc#foo",
			beforeSend: function( xhr, settings ) {
			equal( settings.url, "data/name.html?abc", "Make sure that the URL is trimmed." );
				return false;
			}
		});

		jQuery.ajax({
			url: "data/name.html?abc#foo",
			data: {
				"test": 123
			},
			beforeSend: function( xhr, settings ) {
				equal( settings.url, "data/name.html?abc&test=123", "Make sure that the URL is trimmed." );
				return false;
			}
		});
	});

	test( "jQuery ajax - cross-domain detection", function() {

		expect( 7 );

		var loc = document.location,
			samePort = loc.port || ( loc.protocol === "http:" ? 80 : 443 ),
			otherPort = loc.port === 666 ? 667 : 666,
			otherProtocol = loc.protocol === "http:" ? "https:" : "http:";

		jQuery.ajax({
			dataType: "jsonp",
			url: loc.protocol + "//" + loc.host + ":" + samePort,
			beforeSend: function( _, s ) {
				ok( !s.crossDomain, "Test matching ports are not detected as cross-domain" );
				return false;
			}
		});

		jQuery.ajax({
			dataType: "jsonp",
			url: otherProtocol + "//" + loc.host,
			beforeSend: function( _, s ) {
				ok( s.crossDomain, "Test different protocols are detected as cross-domain" );
				return false;
			}
		});

		jQuery.ajax({
			dataType: "jsonp",
			url: "app:/path",
			beforeSend: function( _, s ) {
				ok( s.crossDomain, "Adobe AIR app:/ URL detected as cross-domain" );
				return false;
			}
		});

		jQuery.ajax({
			dataType: "jsonp",
			url: loc.protocol + "//somewebsitethatdoesnotexist-656329477541.com:" + ( loc.port || 80 ),
			beforeSend: function( _, s ) {
				ok( s.crossDomain, "Test different hostnames are detected as cross-domain" );
				return false;
			}
		});

		jQuery.ajax({
			dataType: "jsonp",
			url: loc.protocol + "//" + loc.hostname + ":" + otherPort,
			beforeSend: function( _, s ) {
				ok( s.crossDomain, "Test different ports are detected as cross-domain" );
				return false;
			}
		});

		jQuery.ajax({
			dataType: "jsonp",
			url: "about:blank",
			beforeSend: function( _, s ) {
				ok( s.crossDomain, "Test about:blank is detected as cross-domain" );
				return false;
			}
		});

		jQuery.ajax({
			dataType: "jsonp",
			url: loc.protocol + "//" + loc.host,
			crossDomain: true,
			beforeSend: function( _, s ) {
				ok( s.crossDomain, "Test forced crossDomain is detected as cross-domain" );
				return false;
			}
		});

	});

	test( ".load() - 404 error callbacks", function() {
		expect( 6 );
		stop();

		jQuery("#foo").ajaxStart(function() {
			ok( true, "ajaxStart" );
		}).ajaxStop(function() {
			ok( true, "ajaxStop" );
			start();
		}).ajaxSend(function() {
			ok( true, "ajaxSend" );
		}).ajaxComplete(function() {
			ok( true, "ajaxComplete" );
		}).ajaxError(function() {
			ok( true, "ajaxError" );
		}).ajaxSuccess(function() {
			ok( false, "ajaxSuccess" );
		});

		jQuery("<div/>").load( "data/404.html", function() {
			ok( true, "complete" );
		});
	});

	test( "jQuery.ajax() - abort", function() {
		expect( 8 );
		stop();

		jQuery("#foo").ajaxStart(function() {
			ok( true, "ajaxStart" );
		}).ajaxStop(function() {
			ok( true, "ajaxStop" );
			start();
		}).ajaxSend(function() {
			ok( true, "ajaxSend" );
		}).ajaxComplete(function() {
			ok( true, "ajaxComplete" );
		});

		var xhr = jQuery.ajax({
			url: url("data/name.php?wait=5"),
			beforeSend: function() {
				ok( true, "beforeSend" );
			},
			complete: function() {
				ok( true, "complete" );
			}
		});

		equal( xhr.readyState, 1, "XHR readyState indicates successful dispatch" );

		xhr.abort();
		equal( xhr.readyState, 0, "XHR readyState indicates successful abortion" );
	});

	test( "Ajax events with context", function() {
		expect( 14 );

		stop();
		var context = document.createElement("div");

		function event( e ) {
			equal( this, context, e.type );
		}

		function callback( msg ) {
			return function() {
				equal( this, context, "context is preserved on callback " + msg );
			};
		}

		function nocallback( msg ) {
			return function() {
				equal( typeof this.url, "string", "context is settings on callback " + msg );
			};
		}

		jQuery("#foo").add( context )
			.ajaxSend( event )
			.ajaxComplete( event )
			.ajaxError( event )
			.ajaxSuccess( event );

		jQuery.ajax({
			url: url("data/name.html"),
			beforeSend: callback("beforeSend"),
			success: callback("success"),
			error: callback("error"),
			complete: function() {
				callback("complete").call( this );

				jQuery.ajax({
					url: url("data/404.html"),
					context: context,
					beforeSend: callback("beforeSend"),
					error: callback("error"),
					complete: function() {
						callback("complete").call( this );

						jQuery("#foo").add( context ).unbind();

						jQuery.ajax({
							url: url("data/404.html"),
							beforeSend: nocallback("beforeSend"),
							error: nocallback("error"),
							complete: function() {
								nocallback("complete").call( this );
								start();
							}
						});
					}
				});
			},
			context: context
		});
	});

	test( "jQuery.ajax context modification", function() {
		expect( 1 );

		stop();

		var obj = {};

		jQuery.ajax({
			url: url("data/name.html"),
			context: obj,
			beforeSend: function() {
				this.test = "foo";
			},
			complete: function() {
				start();
			}
		});

		equal( obj.test, "foo", "Make sure the original object is maintained." );
	});

	test( "jQuery.ajax context modification through ajaxSetup", function() {
		expect( 4 );

		stop();

		var obj = {};

		jQuery.ajaxSetup({
			context: obj
		});

		strictEqual( jQuery.ajaxSettings.context, obj, "Make sure the context is properly set in ajaxSettings." );

		jQuery.ajax({
			url: url("data/name.html"),
			complete: function() {
				strictEqual( this, obj, "Make sure the original object is maintained." );
				jQuery.ajax({
					url: url("data/name.html"),
					context: {},
					complete: function() {
						ok( this !== obj, "Make sure overidding context is possible." );
						jQuery.ajaxSetup({
							context: false
						});
						jQuery.ajax({
							url: url("data/name.html"),
							beforeSend: function() {
								this.test = "foo2";
							},
							complete: function() {
								ok( this !== obj, "Make sure unsetting context is possible." );
								start();
							}
						});
					}
				});
			}
		});
	});

	test( "jQuery.ajax() - disabled globals", function() {
		expect( 3 );
		stop();

		jQuery("#foo").ajaxStart(function() {
			ok( false, "ajaxStart" );
		}).ajaxStop(function() {
			ok( false, "ajaxStop" );
		}).ajaxSend(function() {
			ok( false, "ajaxSend" );
		}).ajaxComplete(function() {
			ok( false, "ajaxComplete" );
		}).ajaxError(function() {
			ok( false, "ajaxError" );
		}).ajaxSuccess(function() {
			ok( false, "ajaxSuccess" );
		});

		jQuery.ajax({
			global: false,
			url: url("data/name.html"),
			beforeSend: function() {
				ok( true, "beforeSend" );
			},
			success: function() {
				ok( true, "success" );
			},
			error: function() {
				ok( false, "error" );
			},
			complete: function() {
				ok( true, "complete" );
				setTimeout(function() {
					start();
				}, 13 );
			}
		});
	});

	test( "jQuery.ajax - xml: non-namespace elements inside namespaced elements", function() {
		expect( 3 );

		stop();

		jQuery.ajax({
			url: url("data/with_fries.xml"),
			dataType: "xml",
			success: function( resp ) {
				equal( jQuery( "properties", resp ).length, 1, "properties in responseXML" );
				equal( jQuery( "jsconf", resp ).length, 1, "jsconf in responseXML" );
				equal( jQuery( "thing", resp ).length, 2, "things in responseXML" );
				start();
			}
		});
	});

	test( "jQuery.ajax - xml: non-namespace elements inside namespaced elements (over JSONP)", function() {
		expect( 3 );
		stop();
		jQuery.ajax({
			url: url("data/with_fries_over_jsonp.php"),
			dataType: "jsonp xml",
			success: function( resp ) {
				equal( jQuery( "properties", resp ).length, 1, "properties in responseXML" );
				equal( jQuery( "jsconf", resp ).length, 1, "jsconf in responseXML" );
				equal( jQuery( "thing", resp ).length, 2, "things in responseXML" );
				start();
			},
			error: function( _1, _2, error ) {
				ok( false, error );
				start();
			}
		});
	});

	test( "jQuery.ajax - HEAD requests", function() {
		expect( 2 );

		stop();
		jQuery.ajax({
			url: url("data/name.html"),
			type: "HEAD",
			success: function( data, status, xhr ) {
				var h = xhr.getAllResponseHeaders();
				ok( /Date/i.test( h ), "No Date in HEAD response" );

				jQuery.ajax({
					url: url("data/name.html"),
					data: {
						"whip_it": "good"
					},
					type: "HEAD",
					success: function( data, status, xhr ) {
						var h = xhr.getAllResponseHeaders();
						ok( /Date/i.test( h ), "No Date in HEAD response with data" );
						start();
					}
				});
			}
		});

	});

	test( "jQuery.ajax - beforeSend", function() {
		expect( 1 );
		stop();

		var check = false;

		jQuery.ajaxSetup({
			timeout: 0
		});

		jQuery.ajax({
			url: url("data/name.html"),
			beforeSend: function( xml ) {
				check = true;
			},
			success: function( data ) {
				ok( check, "check beforeSend was executed" );
				start();
			}
		});
	});

	test( "jQuery.ajax - beforeSend, cancel request (#2688)", function() {
		expect( 2 );

		jQuery.ajax({
			url: url("data/name.html"),
			beforeSend: function() {
				ok( true, "beforeSend got called, canceling" );
				return false;
			},
			success: function() {
				ok( false, "request didn't get canceled" );
			},
			complete: function() {
				ok( false, "request didn't get canceled" );
			},
			error: function() {
				ok( false, "request didn't get canceled" );
			}
		}).fail(function( _, reason ) {
			strictEqual( reason, "canceled", "canceled request must fail with 'canceled' status text" );
		});
	});

	test( "jQuery.ajax - beforeSend, cancel request manually", function() {
		expect( 2 );
		jQuery.ajax({
			url: url("data/name.html"),
			beforeSend: function( xhr ) {
				ok( true, "beforeSend got called, canceling" );
				xhr.abort();
			},
			success: function() {
				ok( false, "request didn't get canceled" );
			},
			complete: function() {
				ok( false, "request didn't get canceled" );
			},
			error: function() {
				ok( false, "request didn't get canceled" );
			}
		}).fail(function( _, reason ) {
			strictEqual( reason, "canceled", "manually canceled request must fail with 'canceled' status text" );
		});
	});

	window["foobar"] = null;
	window["testFoo"] = undefined;

	test( "jQuery.ajax - dataType html", function() {
		expect( 5 );
		stop();

		var verifyEvaluation = function() {
			equal( window["testFoo"], "foo", "Check if script was evaluated for datatype html" );
			equal( window["foobar"], "bar", "Check if script src was evaluated for datatype html" );

			start();
		};

		jQuery.ajax({
			dataType: "html",
			url: url("data/test.html"),
			success: function( data ) {
				jQuery("#ap").html( data );
				ok( data.match( /^html text/ ), "Check content for datatype html" );
				setTimeout( verifyEvaluation, 600 );
			}
		});
	});

	test( "synchronous request", function() {
		expect( 1 );
		var response = jQuery.ajax({
				url: url("data/json_obj.js"),
				dataType: "text",
				async: false
			}).responseText;

		ok( /^\{ "data"/.test( response ), "check returned text" );
	});

	test( "synchronous request with callbacks", function() {
		expect( 2 );
		var result;
		jQuery.ajax({
			url: url("data/json_obj.js"),
			async: false,
			dataType: "text",
			success: function(data) {
				ok( true, "sucess callback executed" );
				result = data;
			}
		});
		ok( /^\{ "data"/.test( result ), "check returned text" );
	});

	test( "pass-through request object", function() {
		expect( 8 );
		stop();

		var target = "data/name.html";
		var successCount = 0;
		var errorCount = 0;
		var errorEx = "";
		var success = function() {
			successCount++;
		};
		jQuery("#foo").ajaxError(function( e, xml, s, ex ) {
			errorCount++;
			errorEx += ": " + xml.status;
		});
		jQuery("#foo").one( "ajaxStop", function() {
			equal( successCount, 5, "Check all ajax calls successful" );
			equal( errorCount, 0, "Check no ajax errors (status" + errorEx + ")" );
			jQuery("#foo").unbind("ajaxError");

			start();
		});

		ok( jQuery.get( url(target), success ), "get" );
		ok( jQuery.post( url(target), success ), "post" );
		ok( jQuery.getScript( url("data/test.js"), success ), "script" );
		ok( jQuery.getJSON( url("data/json_obj.js"), success ), "json" );
		ok( jQuery.ajax({
			url: url( target ),
			success: success
		}), "generic" );
	});

	test( "ajax cache", function() {
		expect( 18 );

		stop();

		var count = 0;

		jQuery("#firstp").bind( "ajaxSuccess", function( e, xml, s ) {
			var re = /_=(.*?)(&|$)/g;
			var oldOne = null;
			for ( var i = 0; i < 6; i++ ) {
				var ret = re.exec( s.url );
				if ( !ret ) {
					break;
				}
				oldOne = ret[ 1 ];
			}
			equal( i, 1, "Test to make sure only one 'no-cache' parameter is there" );
			ok( oldOne != "tobereplaced555", "Test to be sure parameter (if it was there) was replaced" );
			if ( ++count === 6 ) {
				start();
			}
		});

		ok( jQuery.ajax({
			url: "data/text.php",
			cache: false
		}), "test with no parameters" );
		ok( jQuery.ajax({
			url: "data/text.php?pizza=true",
			cache: false
		}), "test with 1 parameter" );
		ok( jQuery.ajax({
			url: "data/text.php?_=tobereplaced555",
			cache: false
		}), "test with _= parameter" );
		ok( jQuery.ajax({
			url: "data/text.php?pizza=true&_=tobereplaced555",
			cache: false
		}), "test with 1 parameter plus _= one" );
		ok( jQuery.ajax({
			url: "data/text.php?_=tobereplaced555&tv=false",
			cache: false
		}), "test with 1 parameter plus _= one before it" );
		ok( jQuery.ajax({
			url: "data/text.php?name=David&_=tobereplaced555&washere=true",
			cache: false
		}), "test with 2 parameters surrounding _= one" );
	});

	/*
	 * Test disabled.
	 * The assertions expect that the passed-in object will be modified,
	 * which shouldn't be the case. Fixes #5439.
	test( "global ajaxSettings", function() {
		expect( 2 );

		var t,
			tmp = jQuery.extend({}, jQuery.ajaxSettings ),
			orig = {
				url: "data/with_fries.xml"
			};

		jQuery.ajaxSetup({
			data: {
				foo: "bar",
				bar: "BAR"
			}
		});

		t = jQuery.extend({}, orig );
		t.data = {};
		jQuery.ajax( t );
		ok( t.url.indexOf("foo") > -1 && t.url.indexOf("bar") > -1, "Check extending {}" );

		t = jQuery.extend({}, orig );
		t.data = {
			zoo: "a",
			ping: "b"
		};
		jQuery.ajax( t );
		ok( t.url.indexOf("ping") > -1 && t.url.indexOf("zoo") > -1 && t.url.indexOf("foo") > -1 && t.url.indexOf("bar") > -1, "Check extending { zoo: "a", ping: "b" }" );

		jQuery.ajaxSettings = tmp;
	});
	*/

	test( "load(String)", function() {
		expect( 2 );
		stop(); // check if load can be called with only url
		jQuery.ajaxSetup({
			beforeSend: function() {
				strictEqual( this.type, "GET", "no data means GET request" );
			}
		});
		jQuery("#first").load( "data/name.html", function() {
			start();
		});
		jQuery.ajaxSetup({
			beforeSend: null
		});
	});

	test( "load(String,null)", function() {
		expect( 2 );
		stop(); // check if load can be called with url and null data
		jQuery.ajaxSetup({
			beforeSend: function() {
				strictEqual( this.type, "GET", "no data means GET request" );
			}
		});
		jQuery("#first").load( "data/name.html", null, function() {
			start();
		});
	});

	test( "load(String,undefined)", function() {
		expect( 2 );
		stop(); // check if load can be called with url and null data
		jQuery.ajaxSetup({
			beforeSend: function() {
				strictEqual( this.type, "GET", "no data means GET request" );
			}
		});
		jQuery("#first").load( "data/name.html", undefined, function() {
			start();
		});
	});

	test( "load('url selector')", function() {
		expect( 1 );
		stop(); // check if load can be called with only url
		jQuery("#first").load( "data/test3.html div.user", function() {
			equal( jQuery( this ).children("div").length, 2, "Verify that specific elements were injected" );
			start();
		});
	});

	test( "load(String, Function) with ajaxSetup on dataType json, see #2046", function() {
		expect( 1 );
		stop();
		jQuery.ajaxSetup({
			dataType: "json"
		});
		jQuery("#first").ajaxComplete(function( e, xml, s ) {
			equal( s.dataType, "html", "Verify the load() dataType was html" );
			jQuery("#first").unbind("ajaxComplete");
			jQuery.ajaxSetup({
				dataType: ""
			});
			start();
		});
		jQuery("#first").load("data/test3.html");
	});

	test( "load(String, Function) - simple: inject text into DOM", function() {
		expect( 2 );
		stop();
		jQuery("#first").load( url("data/name.html"), function() {
			ok( /^ERROR/.test( jQuery("#first").text() ), "Check if content was injected into the DOM" );
			start();
		});
	});

	test( "load(String, Function) - check scripts", function() {
		expect( 7 );
		stop();

		var verifyEvaluation = function() {
			equal( window["foobar"], "bar", "Check if script src was evaluated after load" );
			equal( jQuery("#ap").html(), "bar", "Check if script evaluation has modified DOM");

			start();
		};
		jQuery("#first").load( url("data/test.html"), function() {
			ok( jQuery("#first").html().match( /^html text/ ), "Check content after loading html" );
			equal( jQuery("#foo").html(), "foo", "Check if script evaluation has modified DOM" );
			equal( window["testFoo"], "foo", "Check if script was evaluated after load" );
			setTimeout( verifyEvaluation, 600 );
		});
	});

	test( "load(String, Function) - check file with only a script tag", function() {
		expect( 3 );
		stop();

		jQuery("#first").load( url("data/test2.html"), function() {
			equal( jQuery("#foo").html(), "foo", "Check if script evaluation has modified DOM");
			equal( window["testFoo"], "foo", "Check if script was evaluated after load" );

			start();
		});
	});

	test( "load(String, Function) - dataFilter in ajaxSettings", function() {
		expect( 2 );
		stop();
		jQuery.ajaxSetup({
			dataFilter: function() {
				return "Hello World";
			}
		});
		var div = jQuery("<div/>").load( url("data/name.html"), function( responseText ) {
			strictEqual( div.html(), "Hello World", "Test div was filled with filtered data" );
			strictEqual( responseText, "Hello World", "Test callback receives filtered data" );
			jQuery.ajaxSetup({
				dataFilter: 0
			});
			start();
		});
	});

	test( "load(String, Object, Function)", function() {
		expect( 2 );
		stop();

		jQuery("<div />").load( url("data/params_html.php"), {
			"foo": 3,
			"bar": "ok"
		}, function() {
			var $post = jQuery( this ).find("#post");
			equal( $post.find("#foo").text(), "3", "Check if a hash of data is passed correctly" );
			equal( $post.find("#bar").text(), "ok", "Check if a hash of data is passed correctly" );
			start();
		});
	});

	test( "load(String, String, Function)", function() {
		expect( 2 );
		stop();

		jQuery("<div />").load( url("data/params_html.php"), "foo=3&bar=ok", function() {
			var $get = jQuery( this ).find("#get");
			equal( $get.find("#foo").text(), "3", "Check if a string of data is passed correctly" );
			equal( $get.find("#bar").text(), "ok", "Check if a   of data is passed correctly" );
			start();
		});
	});

	asyncTest( "load() - data specified in ajaxSettings is merged in (#10524)", 1, function() {
		jQuery.ajaxSetup({
			data: {
				"foo": "bar"
			}
		});

		var data = {
			"baz": 1
		};

		jQuery("#foo")
			.load( "data/echoQuery.php", data )
			.ajaxComplete(function( event, jqXHR, options ) {
				ok( ~options.data.indexOf("foo=bar"), "Data from ajaxSettings was used" );
				jQuery.ajaxSetup({
					data: null
				});
				start();
			});
	});

	asyncTest( "load() - callbacks get the correct parameters", 8, function() {
		var slice = [].slice,
			completeArgs = {};

		jQuery.ajaxSetup({
			success: function( _, status, jqXHR ) {
				completeArgs[ this.url ] = [ jqXHR.responseText, status, jqXHR ];
			},
			error: function( jqXHR, status ) {
				completeArgs[ this.url ] = [ jqXHR.responseText, status, jqXHR ];
			}
		});

		jQuery.when.apply(
			/* jQuery.when.apply arguments start */
			jQuery,
			jQuery.map([
				{
					type: "success",
					url: "data/echoQuery.php?arg=pop"
				},
				{
					type: "error",
					url: "data/404.php"
				}
			],
			function( options ) {
				return jQuery.Deferred(function( defer ) {
					jQuery("#foo").load( options.url, function() {
						var args = arguments;
						strictEqual( completeArgs[ options.url ].length, args.length, "same number of arguments (" + options.type + ")" );
						jQuery.each( completeArgs[ options.url ], function( i, value ) {
							strictEqual( args[ i ], value, "argument #" + i + " is the same (" + options.type + ")" );
						});
						defer.resolve();
					});
				});
			})
			/* jQuery.when.apply arguments end*/
		).always(function() {
			jQuery.ajaxSetup({
				success: null,
				error: null
			});
			start();
		});
	});

	test( "jQuery.get(String, Function) - data in ajaxSettings (#8277)", function() {
		expect( 1 );
		stop();
		jQuery.ajaxSetup({
			data: "helloworld"
		});
		jQuery.get( url("data/echoQuery.php"), function( data ) {
			ok( /helloworld$/.test( data ), "Data from ajaxSettings was used" );
			jQuery.ajaxSetup({
				data: null
			});
			start();
		});
	});

	test( "jQuery.get(String, Hash, Function) - parse xml and use text() on nodes", function() {
		expect( 2 );
		stop();
		jQuery.get( url("data/dashboard.xml"), function( xml ) {
			var content = [];
			jQuery( "tab", xml ).each(function() {
				content.push( jQuery( this ).text() );
			});
			equal( content[ 0 ], "blabla", "Check first tab" );
			equal( content[ 1 ], "blublu", "Check second tab" );
			start();
		});
	});

	test( "jQuery.getScript(String, Function) - with callback", function() {
		expect( 3 );
		stop();
		jQuery.getScript( url("data/test.js"), function( data, _, jqXHR ) {
			equal( foobar, "bar", "Check if script was evaluated" );
			strictEqual( data, jqXHR.responseText, "Same-domain script requests returns the source of the script (#8082)" );
			setTimeout(function() {
				start();
			}, 1000 );
		});
	});

	test( "jQuery.getScript(String, Function) - no callback", function() {
		expect( 1 );
		stop();
		jQuery.getScript( url("data/test.js"), function() {
			start();
		});
	});


	jQuery.each( [ "Same Domain", "Cross Domain" ], function( crossDomain, label ) {
	
		asyncTest( "jQuery.ajax() - JSONP, Query String (?n)" + label, function() {
			expect( 4 );

			var count = 0;
			function plus() {
				if ( ++count === 4 ) {
					start();
				}
			}

			jQuery.ajax({
				url: "data/jsonp.php?callback=?",
				dataType: "jsonp",
				crossDomain: crossDomain,
				success: function( data ) {
					ok( data.data, "JSON results returned (GET, url callback)" );
					plus();
				},
				error: function( data ) {
					ok( false, "Ajax error JSON (GET, url callback)" );
					plus();
				}
			});

			jQuery.ajax({
				url: "data/jsonp.php?callback=??",
				dataType: "jsonp",
				crossDomain: crossDomain,
				success: function( data ) {
					ok( data.data, "JSON results returned (GET, url context-free callback)" );
					plus();
				},
				error: function( data ) {
					ok( false, "Ajax error JSON (GET, url context-free callback)" );
					plus();
				}
			});

			jQuery.ajax({
				url: "data/jsonp.php/??",
				dataType: "jsonp",
				crossDomain: crossDomain,
				success: function( data ) {
					ok( data.data, "JSON results returned (GET, REST-like)" );
					plus();
				},
				error: function( data ) {
					ok( false, "Ajax error JSON (GET, REST-like)" );
					plus();
				}
			});

			jQuery.ajax({
				url: "data/jsonp.php/???json=1",
				dataType: "jsonp",
				crossDomain: crossDomain,
				success: function( data ) {
					strictEqual( jQuery.type( data ), "array", "JSON results returned (GET, REST-like with param)" );
					plus();
				},
				error: function( data ) {
					ok( false, "Ajax error JSON (GET, REST-like with param)" );
					plus();
				}
			});
		});

/*		asyncTest( "jQuery.ajax() - JSONP, Explicit jsonp/Callback param " + label, function() {
			expect( 9 );

			var count = 0;
			function plus() {
				if ( ++count === 4 ) {
					start();
				}
			}

			jQuery.ajax({
				url: "data/jsonp.php",
				dataType: "jsonp",
				crossDomain: crossDomain,
				jsonp: "callback",
				success: function( data ) {
					ok( data["data"], "JSON results returned (GET, data obj callback)" );
					plus();
				},
				error: function( data ) {
					ok( false, "Ajax error JSON (GET, data obj callback)" );
					plus();
				}
			});

			window["jsonpResults"] = function( data ) {
				ok( data["data"], "JSON results returned (GET, custom callback function)" );
				window["jsonpResults"] = undefined;
				plus();
			};

			jQuery.ajax({
				url: "data/jsonp.php",
				dataType: "jsonp",
				crossDomain: crossDomain,
				jsonpCallback: "jsonpResults",
				success: function( data ) {
					ok( data.data, "JSON results returned (GET, custom callback name)" );
					plus();
				},
				error: function( data ) {
					ok( false, "Ajax error JSON (GET, custom callback name)" );
					plus();
				}
			});

			jQuery.ajax({
				url: "data/jsonp.php",
				dataType: "jsonp",
				crossDomain: crossDomain,
				jsonpCallback: "functionToCleanUp",
				success: function( data ) {
					ok( data["data"], "JSON results returned (GET, custom callback name to be cleaned up)" );
					strictEqual( window["functionToCleanUp"], undefined, "Callback was removed (GET, custom callback name to be cleaned up)" );
					plus();
					var xhr;
					jQuery.ajax({
						url: "data/jsonp.php",
						dataType: "jsonp",
						crossDomain: crossDomain,
						jsonpCallback: "functionToCleanUp",
						beforeSend: function( jqXHR ) {
							xhr = jqXHR;
							return false;
						}
					});
					xhr.error(function() {
						ok( true, "Ajax error JSON (GET, custom callback name to be cleaned up)" );
						strictEqual( window["functionToCleanUp"], undefined, "Callback was removed after early abort (GET, custom callback name to be cleaned up)" );
						plus();
					});
				},
				error: function( data ) {
					ok( false, "Ajax error JSON (GET, custom callback name to be cleaned up)" );
					plus();
				}
			});

			jQuery.ajax({
				url: "data/jsonp.php?callback=XXX",
				dataType: "jsonp",
				jsonp: false,
				jsonpCallback: "XXX",
				crossDomain: crossDomain,
				beforeSend: function() {
					ok( /^data\/jsonp.php\?callback=XXX&_=\d+$/.test( this.url ), "The URL wasn't messed with (GET, custom callback name with no url manipulation)" );
					plus();
				},
				success: function( data ) {
					ok( data["data"], "JSON results returned (GET, custom callback name with no url manipulation)" );
					plus();
				},
				error: function( data ) {
					ok( false, "Ajax error JSON (GET, custom callback name with no url manipulation)" );
					plus();
				}
			});
		});
*/

		asyncTest( "jQuery.ajax() - JSONP, Callback in data, " + label, function() {
			expect( 2 );

			var count = 0;
			function plus() {
				if ( ++count === 2 ) {
					start();
				}
			}

			jQuery.ajax({
				url: "data/jsonp.php",
				dataType: "jsonp",
				crossDomain: crossDomain,
				data: "callback=?",
				success: function( data ) {
					ok( data.data, "JSON results returned (GET, data callback)" );
{'fraction_non_alphanumeric': 0.18702198399555012, 'fraction_numerical': 0.006497857224125507, 'mean_word_length': 2.8803100166781124, 'pattern_counts': {'":': 28, '<': 13, '<?xml version=': 0, '>': 23, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 30}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3663352', 'n_tokens_mistral': 32976, 'n_tokens_neox': 25970, 'n_words': 6855}