Tests: Add support for running unit tests via grunt with karma

- Update QUnit to 1.23.1
- Remove unused dl#dl from test/index.html
- Remove unused map#imgmap from test/index.html
- Ensure all urls to data use baseURI
- Add the 'grunt karma:main' task
  - customContextFile & customDebugFile
- Add 'npm run jenkins' script

Close gh-3744
Fixes gh-1999
This commit is contained in:
Timo Tijhof 2017-08-01 09:52:45 -07:00 committed by Timmy Willison
parent e84d3bc02e
commit ecd8ddea33
No known key found for this signature in database
GPG Key ID: 5F0C8B73EF56CE6F
60 changed files with 2568 additions and 1861 deletions

View File

@ -5,3 +5,5 @@ node_js:
- "6" - "6"
- "8" - "8"
- "9" - "9"
addons:
chrome: stable

View File

@ -147,6 +147,88 @@ module.exports = function( grunt ) {
"tween" "tween"
] ]
}, },
karma: {
options: {
customContextFile: "test/karma.context.html",
customDebugFile: "test/karma.debug.html",
frameworks: [ "qunit" ],
middleware: [ "mockserver" ],
plugins: [
"karma-*",
{
"middleware:mockserver": [
"factory",
require( "./test/middleware-mockserver.js" )
]
}
],
files: [
"test/data/jquery-1.9.1.js",
"external/qunit-assert-step/qunit-assert-step.js",
"external/sinon/sinon.js",
"external/npo/npo.js",
"external/requirejs/require.js",
"test/data/testinit.js",
"dist/jquery.min.js",
// Replacement for testinit.js#loadTests()
"test/data/testrunner.js",
"test/unit/basic.js",
"test/unit/core.js",
"test/unit/callbacks.js",
"test/unit/deferred.js",
"test/unit/deprecated.js",
"test/unit/support.js",
"test/unit/data.js",
"test/unit/queue.js",
"test/unit/attributes.js",
"test/unit/event.js",
"test/unit/selector.js",
"test/unit/traversing.js",
"test/unit/manipulation.js",
"test/unit/wrap.js",
"test/unit/css.js",
"test/unit/serialize.js",
"test/unit/ajax.js",
"test/unit/effects.js",
"test/unit/offset.js",
"test/unit/dimensions.js",
"test/unit/animation.js",
"test/unit/tween.js",
"test/unit/ready.js",
{ pattern: "dist/jquery.js", included: false, served: true },
{ pattern: "dist/*.map", included: false, served: true },
{ pattern: "external/qunit/qunit.css", included: false, served: true },
{
pattern: "test/**/*.@(js|css|jpg|html|xml)",
included: false,
served: true
}
],
reporters: [ "dots" ],
autoWatch: false,
concurrency: 3,
captureTimeout: 20 * 1000,
// To debug tests with Karma:
// - Run 'grunt karma:chrome' or 'grunt karma:firefox'
// (any karma subtask that has singleRun=false)
// - Press "Debug" in the opened browser window.
singleRun: false
},
main: {
browsers: [ "ChromeHeadless" ],
singleRun: true
},
chrome: {
browsers: [ "Chrome" ]
},
firefox: {
browsers: [ "Firefox" ]
}
},
watch: { watch: {
files: [ "<%= eslint.dev.src %>" ], files: [ "<%= eslint.dev.src %>" ],
tasks: [ "dev" ] tasks: [ "dev" ]
@ -222,6 +304,7 @@ module.exports = function( grunt ) {
"newer:uglify", "newer:uglify",
"remove_map_comment", "remove_map_comment",
"dist:*", "dist:*",
"qunit_fixture",
"compare_size" "compare_size"
] ); ] );
@ -231,6 +314,7 @@ module.exports = function( grunt ) {
"uglify", "uglify",
"remove_map_comment", "remove_map_comment",
"dist:*", "dist:*",
"qunit_fixture",
"eslint:dist", "eslint:dist",
"test:fast", "test:fast",
"compare_size" "compare_size"

View File

@ -323,20 +323,20 @@ fireNative( jQuery("#elem")[0], "click" );
### Add random number to url to stop caching ### ### Add random number to url to stop caching ###
```js ```js
url( "some/url.php" ); url( "some/url" );
``` ```
Example: Example:
```js ```js
url("data/test.html"); url("index.html");
=> "data/test.html?10538358428943" => "data/index.html?10538358428943"
url("data/test.php?foo=bar"); url("mock.php?foo=bar");
=> "data/test.php?foo=bar&10538358345554" => "data/mock.php?foo=bar&10538358345554"
``` ```

View File

@ -0,0 +1,22 @@
var fs = require( "fs" );
module.exports = function( grunt ) {
grunt.registerTask( "qunit_fixture", function() {
var dest = "./test/data/qunit-fixture.js";
fs.writeFileSync(
dest,
"// Generated by build/tasks/qunit_fixture.js\n" +
"QUnit.config.fixture = " +
JSON.stringify(
fs.readFileSync(
"./test/data/qunit-fixture.html",
"utf8"
).toString()
) +
";\n" +
"// Compat with QUnit 1.x:\n" +
"document.getElementById( \"qunit-fixture\" ).innerHTML = QUnit.config.fixture;\n"
);
grunt.log.ok( "Updated " + dest + "." );
} );
};

View File

@ -1,12 +1,12 @@
/*! /*!
* QUnit 1.20.0 * QUnit 1.23.1
* http://qunitjs.com/ * https://qunitjs.com/
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
* Released under the MIT license * Released under the MIT license
* http://jquery.org/license * https://jquery.org/license
* *
* Date: 2015-10-27T17:53Z * Date: 2016-04-12T17:29Z
*/ */
/** Font Family and Sizes */ /** Font Family and Sizes */
@ -120,6 +120,10 @@
display: list-item; display: list-item;
} }
#qunit-tests.hidepass {
position: relative;
}
#qunit-tests.hidepass li.running, #qunit-tests.hidepass li.running,
#qunit-tests.hidepass li.pass { #qunit-tests.hidepass li.pass {
visibility: hidden; visibility: hidden;

2378
external/qunit/qunit.js vendored

File diff suppressed because it is too large Load Diff

View File

@ -39,18 +39,25 @@
"grunt-eslint": "20.0.0", "grunt-eslint": "20.0.0",
"grunt-git-authors": "3.2.0", "grunt-git-authors": "3.2.0",
"grunt-jsonlint": "1.1.0", "grunt-jsonlint": "1.1.0",
"grunt-karma": "2.0.0",
"grunt-newer": "1.3.0", "grunt-newer": "1.3.0",
"grunt-npmcopy": "0.1.0", "grunt-npmcopy": "0.1.0",
"gzip-js": "0.3.2", "gzip-js": "0.3.2",
"husky": "0.14.3", "husky": "0.14.3",
"insight": "0.8.4", "insight": "0.8.4",
"jsdom": "5.6.1", "jsdom": "5.6.1",
"karma": "1.7.0",
"karma-browserstack-launcher": "1.3.0",
"karma-chrome-launcher": "2.2.0",
"karma-firefox-launcher": "1.0.1",
"karma-qunit": "1.2.1",
"load-grunt-tasks": "3.5.2", "load-grunt-tasks": "3.5.2",
"native-promise-only": "0.8.1", "native-promise-only": "0.8.1",
"promises-aplus-tests": "2.1.2", "promises-aplus-tests": "2.1.2",
"q": "1.5.0", "q": "1.5.0",
"qunit-assert-step": "1.1.1", "qunit-assert-step": "1.0.3",
"qunitjs": "2.4.0", "qunitjs": "1.23.1",
"raw-body": "2.2.0",
"requirejs": "2.3.3", "requirejs": "2.3.3",
"sinon": "2.3.7", "sinon": "2.3.7",
"sizzle": "2.3.3", "sizzle": "2.3.3",
@ -61,8 +68,9 @@
"scripts": { "scripts": {
"build": "npm install && grunt", "build": "npm install && grunt",
"start": "grunt watch", "start": "grunt watch",
"test": "grunt && grunt test:slow", "test": "grunt && grunt test:slow karma:main",
"precommit": "grunt lint:newer", "jenkins": "grunt && grunt test:slow",
"precommit": "grunt lint:newer qunit_fixture",
"commitmsg": "node node_modules/commitplease" "commitmsg": "node node_modules/commitplease"
}, },
"commitplease": { "commitplease": {

View File

@ -1,5 +0,0 @@
<?php
$type = $_REQUEST['content-type'];
header("Content-type: $type");
echo $_REQUEST['response']
?>

View File

@ -1 +0,0 @@
ok( "<?php echo $_SERVER['REQUEST_METHOD'] ?>" === "GET", "request method is <?php echo $_SERVER['REQUEST_METHOD'] ?>" );

View File

@ -1 +0,0 @@
<?php echo $_SERVER['REQUEST_METHOD'] ?>

View File

@ -15,7 +15,7 @@ jQuery(function() {
}, 200 ); }, 200 );
var number = 50; var number = 50;
while( number-- ) { while( number-- ) {
jQuery.ajax("../name.php?wait=10"); jQuery.ajax("../mock.php?action=wait&wait=10");
} }
}); });
</script> </script>

View File

@ -1,4 +0,0 @@
<?php header("Content-type: atom+xml") ?>
<root>
<element />
</root>

View File

@ -1,3 +0,0 @@
<?php
sleep(30);
?>

View File

@ -7,7 +7,7 @@
<script src="../iframeTest.js"></script> <script src="../iframeTest.js"></script>
</head> </head>
<body> <body>
<iframe id="dont_return" src="dont_return.php"></iframe> <iframe id="dont_return" src="../mock.php?action=wait&wait=30"></iframe>
<script> <script>
var timeoutId, $, var timeoutId, $,
timeoutFired = false; timeoutFired = false;

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CSP Test Page</title>
<script src="../jquery.js"></script>
<script src="iframeTest.js"></script>
<script src="support/csp.js"></script>
<script src="support/getComputedSupport.js"></script>
</head>
<body>
<p>CSP Test Page</p>
</body>
</html>

View File

@ -1 +0,0 @@
<?php echo file_get_contents('php://input'); ?>

View File

@ -1 +0,0 @@
<?php echo $_SERVER['QUERY_STRING']; ?>

View File

@ -1,6 +0,0 @@
<?php
header("HTTP/1.0 400 Bad Request");
header("Content-Type: application/json");
echo '{ "code": 40, "message": "Bad Request" }';

View File

@ -1,5 +0,0 @@
<?php
header("HTTP/1.0 400 Bad Request");
echo "plain text message";

View File

@ -1,24 +0,0 @@
<?php
error_reporting(0);
$ts = $_REQUEST['ts'];
$etag = md5($ts);
$ifNoneMatch = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : "";
preg_match('/"([^"]+)"/', $ifNoneMatch, $matches);
$ifNoneMatch = isset($matches[1]) ? $matches[1] : false;
if ($ifNoneMatch == $etag) {
header('HTTP/1.0 304 Not Modified');
die; // stop processing
}
header("Etag: W/\"" . $etag . "\"");
if ( $ifNoneMatch ) {
echo "OK: " . $etag;
} else {
echo "FAIL";
}
?>

View File

@ -18,7 +18,7 @@ jQuery( function () {
oldIE into thinking the dom is ready, but it's not... oldIE into thinking the dom is ready, but it's not...
leaving this check here for future trailblazers to attempt leaving this check here for future trailblazers to attempt
fixing this...--> fixing this...-->
<script type="text/javascript" src="../longLoadScript.php?sleep=1"></script> <script type="text/javascript" src="../mock.php?action=wait&wait=1"></script>
<div id="container" style="height: 300px"></div> <div id="container" style="height: 300px"></div>
</body> </body>
</html> </html>

View File

@ -18,7 +18,7 @@ jQuery( document ).ready(function () {
oldIE into thinking the dom is ready, but it's not... oldIE into thinking the dom is ready, but it's not...
leaving this check here for future trailblazers to attempt leaving this check here for future trailblazers to attempt
fixing this...--> fixing this...-->
<script type="text/javascript" src="../longLoadScript.php?sleep=1"></script> <script type="text/javascript" src="../mock.php?action=wait&wait=1"></script>
<div id="container" style="height: 300px"></div> <div id="container" style="height: 300px"></div>
</body> </body>
</html> </html>

View File

@ -1,23 +0,0 @@
<?php
header( "Sample-Header: Hello World" );
header( "Empty-Header: " );
header( "Sample-Header2: Hello World 2" );
$headers = array();
foreach( $_SERVER as $key => $value ) {
$key = str_replace( "_" , "-" , substr( $key , 0 , 5 ) == "HTTP_" ? substr( $key , 5 ) : $key );
$headers[ $key ] = $value;
}
foreach( explode( "_" , $_GET[ "keys" ] ) as $key ) {
// Only echo if key exists in the header
if ( isset( $headers[ strtoupper( $key ) ] ) ) {
echo "$key: " . @$headers[ strtoupper( $key ) ] . "\n";
}
}

View File

@ -1,20 +0,0 @@
<?php
error_reporting(0);
$ts = $_REQUEST['ts'];
$ifModifiedSince = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) : false;
if ($ifModifiedSince == $ts) {
header('HTTP/1.0 304 Not Modified');
die; // stop processing
}
header("Last-Modified: " . $ts);
if ( $ifModifiedSince ) {
echo "OK: " . $ts;
} else {
echo "FAIL";
}
?>

View File

@ -1,13 +0,0 @@
<?php
error_reporting(0);
if ( $_REQUEST['header'] ) {
header("Content-type: application/json");
}
$json = $_REQUEST['json'];
if($json) {
echo '[ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ]';
} else {
echo '{ "data": {"lang": "en", "length": 25} }';
}
?>

View File

@ -1,14 +0,0 @@
<?php
error_reporting(0);
$callback = $_REQUEST['callback'];
if ( ! $callback ) {
$callback = explode("?",end(explode("/",$_SERVER['REQUEST_URI'])));
$callback = $callback[0];
}
$json = $_REQUEST['json'];
if($json) {
echo $callback . '([ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ])';
} else {
echo $callback . '({ "data": {"lang": "en", "length": 25} })';
}
?>

View File

@ -1,4 +0,0 @@
<?php
sleep((int)$_GET['sleep']);
header('Content-type: text/javascript');
?>

244
test/data/mock.php Normal file
View File

@ -0,0 +1,244 @@
<?php
/**
* Keep in sync with /test/middleware-mockserver.js
*/
class MockServer {
protected function contentType( $req ) {
$type = $req->query['contentType'];
header("Content-type: $type");
echo $req->query['response'];
}
protected function wait( $req ) {
$wait = (int) $req->query['wait'];
sleep( $wait );
if ( isset( $req->query['script'] ) ) {
header( 'Content-type: text/javascript' );
} else {
header( 'Content-type: text/html' );
echo 'ERROR <script>ok( true, "mock executed" );</script>';
}
}
protected function name( $req ) {
if ( $req->query['name'] === 'foo' ) {
echo 'bar';
} elseif ( $_POST['name'] === 'peter' ) {
echo 'pan';
} else {
echo 'ERROR';
}
}
protected function xml( $req ) {
header( 'Content-type: text/xml' );
if ( $req->query['cal'] !== '5-2' && $_POST['cal'] !== '5-2' ) {
echo '<error>ERROR</error>';
return;
}
echo "<math><calculation>5-2</calculation><result>3</result></math>\n";
}
protected function atom( $req ) {
header( 'Content-type: atom+xml' );
echo '<root><element /></root>';
}
protected function script( $req ) {
if ( isset( $req->query['header'] ) ) {
if ( $req->query['header'] === 'ecma' ) {
header( 'Content-type: application/ecmascript' );
} else {
header( 'Content-type: text/javascript' );
}
} else {
header( 'Content-type: text/html' );
}
echo 'ok( true, "mock executed" );';
}
// Used to be in test.js, but was renamed to testbar.php
// https://github.com/jquery/jquery/commit/d89c278a33#commitcomment-23423165
protected function testbar( $req ) {
echo 'this.testBar = "bar";
jQuery("#ap").html("bar");
ok( true, "mock executed");';
}
protected function json( $req ) {
if ( isset( $req->query['header'] ) ) {
header( 'Content-type: application/json' );
}
if ( isset( $req->query['array'] ) ) {
echo '[ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ]';
} else {
echo '{ "data": {"lang": "en", "length": 25} }';
}
}
protected function jsonp( $req ) {
if ( isset( $req->query['callback'] ) ) {
$callback = $req->query['callback'];
} elseif ( $req->method === 'GET' ) {
// Try REST-like path
preg_match( '/\/([^\/?]+)\?.+$/', $req->url, $m );
$callback = $m[1];
} else {
$callback = $_POST['callback'];
}
if ( isset( $req->query['array'] ) ) {
echo $callback . '([ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ])';
} else {
echo $callback . '({ "data": {"lang": "en", "length": 25} })';
}
}
protected function xmlOverJsonp( $req ) {
$callback = $_REQUEST['callback'];
$text = json_encode( file_get_contents( __DIR__ . '/with_fries.xml' ) );
echo "$callback($text)\n";
}
protected function error( $req ) {
header( 'HTTP/1.0 400 Bad Request' );
if ( isset( $req->query['json'] ) ) {
header( 'Content-Type: application/json' );
echo '{ "code": 40, "message": "Bad Request" }';
} else {
echo 'plain text message';
}
}
protected function headers( $req ) {
header( 'Sample-Header: Hello World' );
header( 'Empty-Header: ' );
header( 'Sample-Header2: Hello World 2' );
foreach ( explode( '|' , $req->query[ 'keys' ] ) as $key ) {
// Only echo if key exists in the header
if ( isset( $req->headers[ strtoupper( $key ) ] ) ) {
echo "$key: " . $req->headers[ strtoupper( $key ) ] . "\n";
}
}
}
protected function echoData( $req ) {
echo file_get_contents('php://input');
}
protected function echoQuery( $req ) {
echo $_SERVER['QUERY_STRING'];
}
protected function echoMethod( $req ) {
echo $req->method;
}
protected function echoHtml( $req ) {
header( 'Content-type: text/html' );
echo '<div id="method">' . $req->method . '</div>';
echo '<div id="query">' . $_SERVER['QUERY_STRING'] . '</div>';
echo '<div id="data">' . file_get_contents('php://input') . '</div>';
}
protected function etag( $req ) {
$hash = md5( $req->query['ts'] );
$etag = 'W/"' . $hash . '"';
$ifNoneMatch = isset( $req->headers['IF-NONE-MATCH'] ) ? $req->headers['IF-NONE-MATCH'] : '';
if ($ifNoneMatch === $etag) {
header('HTTP/1.0 304 Not Modified');
return;
}
header("Etag: $etag");
echo "ETag: $etag\n";
if ( $ifNoneMatch ) {
echo "If-None-Match: $ifNoneMatch\n";
}
}
protected function ims( $req ) {
$ts = $req->query['ts'];
$ims = isset( $req->headers['IF-MODIFIED-SINCE'] ) ? $req->headers['IF-MODIFIED-SINCE'] : '';
if ($ims === $ts) {
header('HTTP/1.0 304 Not Modified');
return;
}
header("Last-Modified: $ts");
echo "Last-Modified: $ts\n";
if ( $ims ) {
echo "If-Modified-Since: $ims\n";
}
}
protected function status( $req ) {
header( "HTTP/1.0 {$req->query['code']} {$req->query['text']}" );
}
protected function testHTML( $req ) {
header( 'Content-type: text/html' );
$html = file_get_contents( __DIR__ . '/test.include.html' );
$html = str_replace( '{{baseURL}}', $req->query['baseURL'], $html );
echo $html;
}
protected function cspFrame( $req ) {
// This is CSP only for browsers with "Content-Security-Policy" header support
// i.e. no old WebKit or old Firefox
header( "Content-Security-Policy: default-src 'self'; report-uri ./mock.php?action=cspLog" );
header( 'Content-type: text/html' );
echo file_get_contents( __DIR__ . '/csp.include.html' );
}
protected function cspLog( $req ) {
file_put_contents( $this->cspFile, 'error' );
}
protected function cspClean( $req ) {
file_put_contents( $this->cspFile, '' );
unlink( $this->cspFile );
}
public function __construct() {
$this->cspFile = __DIR__ . '/support/csp.log';
}
public function respond( stdClass $req ) {
if ( !isset( $req->query['action'] ) || !method_exists( $this, $req->query['action'] ) ) {
header( "HTTP/1.0 400 Bad Request" );
echo "Invalid action query.\n";
return;
}
$this->{$req->query['action']}( $req );
}
}
// Don't include PHP errors in http response
error_reporting( 0 );
// Collect headers
$headers = array();
foreach ( $_SERVER as $name => $value ) {
if ( substr( $name, 0, 5 ) === 'HTTP_' ) {
$name = str_replace( '_', '-', substr( $name, 5 ) );
$headers[$name] = $value;
} elseif ( $name === 'CONTENT_LENGTH' ) {
$headers['CONTENT-LENGTH'] = $value;
} elseif ( $name === 'CONTENT_TYPE' ) {
$headers['CONTENT-TYPE'] = $value;
}
}
$mock = new MockServer();
$req = (object) array(
'query' => $_GET,
'headers' => $headers,
'method' => $_SERVER['REQUEST_METHOD'],
'url' => $_SERVER['REQUEST_URI'],
);
$mock->respond( $req );

View File

@ -1,24 +0,0 @@
<?php
error_reporting(0);
$wait = $_REQUEST['wait'];
if($wait) {
sleep($wait);
}
$xml = $_REQUEST['xml'];
if($xml) {
header("Content-type: text/xml");
$result = ($xml == "5-2") ? "3" : "?";
echo "<math><calculation>$xml</calculation><result>$result</result></math>";
die();
}
$name = $_REQUEST['name'];
if($name == 'foo') {
echo "bar";
die();
} else if($name == 'peter') {
echo "pan";
die();
}
echo 'ERROR <script type="text/javascript">ok( true, "name.php executed" );</script>';
?>

View File

@ -1,5 +0,0 @@
<?php
header('HTTP/1.0 204 No Content');
?>

View File

@ -1,12 +0,0 @@
<div id="post">
<?php
foreach( $_POST as $key=>$value )
echo "<b id='$key'>$value</b>";
?>
</div>
<div id="get">
<?php
foreach( $_GET as $key=>$value )
echo "<b id='$key'>$value</b>";
?>
</div>

View File

@ -0,0 +1,237 @@
<p id="firstp">See <a id="simon1" href="http://simon.incutio.com/archive/2003/03/25/#getElementsBySelector" rel="bookmark">this blog entry</a> for more information.</p>
<p id="ap">
Here are some links in a normal paragraph: <a id="google" href="http://www.google.com/" title="Google!">Google</a>,
<a id="groups" href="http://groups.google.com/" class="GROUPS">Google Groups (Link)</a>.
This link has <code><a href="http://smin" id="anchor1">class="blog"</a></code>:
<a href="http://diveintomark.org/" class="blog" hreflang="en" id="mark">diveintomark</a>
</p>
<div id="foo">
<p id="sndp">Everything inside the red border is inside a div with <code>id="foo"</code>.</p>
<p lang="en" id="en">This is a normal link: <a id="yahoo" href="http://www.yahoo.com/" class="blogTest">Yahoo</a></p>
<p id="sap">This link has <code><a href="#2" id="anchor2">class="blog"</a></code>: <a href="http://simon.incutio.com/" class="blog link" id="simon">Simon Willison's Weblog</a></p>
</div>
<div id="nothiddendiv" style="height:1px;background:white;" class="nothiddendiv">
<div id="nothiddendivchild"></div>
</div>
<span id="name+value"></span>
<p id="first">Try them out:</p>
<ul id="firstUL"></ul>
<ol id="empty"></ol>
<form id="form" action="formaction">
<label for="action" id="label-for">Action:</label>
<input type="text" name="action" value="Test" id="text1" maxlength="30"/>
<input type="text" name="text2" value="Test" id="text2" disabled="disabled"/>
<input type="radio" name="radio1" id="radio1" value="on"/>
<input type="radio" name="radio2" id="radio2" checked="checked"/>
<input type="checkbox" name="check" id="check1" checked="checked"/>
<input type="checkbox" id="check2" value="on"/>
<input type="hidden" name="hidden" id="hidden1"/>
<input type="text" style="display:none;" name="foo[bar]" id="hidden2"/>
<input type="text" id="name" name="name" value="name" />
<input type="search" id="search" name="search" value="search" />
<button id="button" name="button" type="button">Button</button>
<textarea id="area1" maxlength="30">foobar</textarea>
<select name="select1" id="select1">
<option id="option1a" class="emptyopt" value="">Nothing</option>
<option id="option1b" value="1">1</option>
<option id="option1c" value="2">2</option>
<option id="option1d" value="3">3</option>
</select>
<select name="select2" id="select2">
<option id="option2a" class="emptyopt" value="">Nothing</option>
<option id="option2b" value="1">1</option>
<option id="option2c" value="2">2</option>
<option id="option2d" selected="selected" value="3">3</option>
</select>
<select name="select3" id="select3" multiple="multiple">
<option id="option3a" class="emptyopt" value="">Nothing</option>
<option id="option3b" selected="selected" value="1">1</option>
<option id="option3c" selected="selected" value="2">2</option>
<option id="option3d" value="3">3</option>
<option id="option3e">no value</option>
</select>
<select name="select4" id="select4" multiple="multiple">
<optgroup disabled="disabled">
<option id="option4a" class="emptyopt" value="">Nothing</option>
<option id="option4b" disabled="disabled" selected="selected" value="1">1</option>
<option id="option4c" selected="selected" value="2">2</option>
</optgroup>
<option selected="selected" disabled="disabled" id="option4d" value="3">3</option>
<option id="option4e">no value</option>
</select>
<select name="select5" id="select5">
<option id="option5a" value="3">1</option>
<option id="option5b" value="2">2</option>
<option id="option5c" value="1" data-attr="">3</option>
</select>
<object id="object1" codebase="stupid">
<param name="p1" value="x1" />
<param name="p2" value="x2" />
</object>
<span id="台北Táiběi"></span>
<span id="台北" lang="中文"></span>
<span id="utf8class1" class="台北Táiběi 台北"></span>
<span id="utf8class2" class="台北"></span>
<span id="foo:bar" class="foo:bar"></span>
<span id="test.foo[5]bar" class="test.foo[5]bar"></span>
<foo_bar id="foobar">test element</foo_bar>
</form>
<b id="floatTest">Float test.</b>
<iframe id="iframe" name="iframe"></iframe>
<form id="lengthtest">
<input type="text" id="length" name="test"/>
<input type="text" id="idTest" name="id"/>
</form>
<table id="table"></table>
<form id="name-tests">
<!-- Inputs with a grouped name attribute. -->
<input name="types[]" id="types_all" type="checkbox" value="all" />
<input name="types[]" id="types_anime" type="checkbox" value="anime" />
<input name="types[]" id="types_movie" type="checkbox" value="movie" />
</form>
<form id="testForm" action="#" method="get">
<textarea name="T3" rows="2" cols="15">?
Z</textarea>
<input type="hidden" name="H1" value="x" />
<input type="hidden" name="H2" />
<input name="PWD" type="password" value="" />
<input name="T1" type="text" />
<input name="T2" type="text" value="YES" readonly="readonly" />
<input type="checkbox" name="C1" value="1" />
<input type="checkbox" name="C2" />
<input type="radio" name="R1" value="1" />
<input type="radio" name="R1" value="2" />
<input type="text" name="My Name" value="me" />
<input type="reset" name="reset" value="NO" />
<select name="S1">
<option value="abc">ABC</option>
<option value="abc">ABC</option>
<option value="abc">ABC</option>
</select>
<select name="S2" multiple="multiple" size="3">
<option value="abc">ABC</option>
<option value="abc">ABC</option>
<option value="abc">ABC</option>
</select>
<select name="S3">
<option selected="selected">YES</option>
</select>
<select name="S4">
<option value="" selected="selected">NO</option>
</select>
<input type="submit" name="sub1" value="NO" />
<input type="submit" name="sub2" value="NO" />
<input type="image" name="sub3" value="NO" />
<button name="sub4" type="submit" value="NO">NO</button>
<input name="D1" type="text" value="NO" disabled="disabled" />
<input type="checkbox" checked="checked" disabled="disabled" name="D2" value="NO" />
<input type="radio" name="D3" value="NO" checked="checked" disabled="disabled" />
<select name="D4" disabled="disabled">
<option selected="selected" value="NO">NO</option>
</select>
<input id="list-test" type="text" />
<datalist id="datalist">
<option value="option"></option>
</datalist>
</form>
<div id="moretests">
<form>
<div id="checkedtest" style="display:none;">
<input type="radio" name="checkedtestradios" checked="checked"/>
<input type="radio" name="checkedtestradios" value="on"/>
<input type="checkbox" name="checkedtestcheckboxes" checked="checked"/>
<input type="checkbox" name="checkedtestcheckboxes" />
</div>
</form>
<div id="nonnodes"><span id="nonnodesElement">hi</span> there <!-- mon ami --></div>
<div id="t2037">
<div><div class="hidden">hidden</div></div>
</div>
<div id="t6652">
<div></div>
</div>
<div id="no-clone-exception"><object><embed></embed></object></div>
</div>
<div id="tabindex-tests">
<ol id="listWithTabIndex" tabindex="5">
<li id="foodWithNegativeTabIndex" tabindex="-1">Rice</li>
<li id="foodNoTabIndex">Beans</li>
<li>Blinis</li>
<li>Tofu</li>
</ol>
<div id="divWithNoTabIndex">I'm hungry. I should...</div>
<span>...</span><a href="#" id="linkWithNoTabIndex">Eat lots of food</a><span>...</span> |
<span>...</span><a href="#" id="linkWithTabIndex" tabindex="2">Eat a little food</a><span>...</span> |
<span>...</span><a href="#" id="linkWithNegativeTabIndex" tabindex="-1">Eat no food</a><span>...</span>
<span>...</span><a id="linkWithNoHrefWithNoTabIndex">Eat a burger</a><span>...</span>
<span>...</span><a id="linkWithNoHrefWithTabIndex" tabindex="1">Eat some funyuns</a><span>...</span>
<span>...</span><a id="linkWithNoHrefWithNegativeTabIndex" tabindex="-1">Eat some funyuns</a><span>...</span>
<input id="inputWithoutTabIndex"/>
<button id="buttonWithoutTabIndex"></button>
<textarea id="textareaWithoutTabIndex"></textarea>
<menu type="popup">
<menuitem id="menuitemWithoutTabIndex" command="submitbutton" default/>
</menu>
</div>
<div id="liveHandlerOrder">
<span id="liveSpan1"><a href="#" id="liveLink1"></a></span>
<span id="liveSpan2"><a href="#" id="liveLink2"></a></span>
</div>
<div id="siblingTest">
<em id="siblingfirst">1</em>
<em id="siblingnext">2</em>
<em id="siblingthird">
<em id="siblingchild">
<em id="siblinggrandchild">
<em id="siblinggreatgrandchild"></em>
</em>
</em>
</em>
<span id="siblingspan"></span>
</div>
<div id="fx-test-group" style="position: absolute; width: 1px; height: 1px; overflow: hidden;">
<div id="fx-queue" name="test">
<div id="fadein" class='chain-test' name='div'>fadeIn<div>fadeIn</div></div>
<div id="fadeout" class='chain-test chain-test-out'>fadeOut<div>fadeOut</div></div>
<div id="show" class='chain-test'>show<div>show</div></div>
<div id="hide" class='chain-test chain-test-out'>hide<div>hide</div></div>
<div id="easehide" class='chain-test chain-test-out'>hide<div>hide</div></div>
<div id="togglein" class='chain-test'>togglein<div>togglein</div></div>
<div id="toggleout" class='chain-test chain-test-out'>toggleout<div>toggleout</div></div>
<div id="easetoggleout" class='chain-test chain-test-out'>toggleout<div>toggleout</div></div>
<div id="slideup" class='chain-test'>slideUp<div>slideUp</div></div>
<div id="slidedown" class='chain-test chain-test-out'>slideDown<div>slideDown</div></div>
<div id="easeslideup" class='chain-test'>slideUp<div>slideUp</div></div>
<div id="slidetogglein" class='chain-test'>slideToggleIn<div>slideToggleIn</div></div>
<div id="slidetoggleout" class='chain-test chain-test-out'>slideToggleOut<div>slideToggleOut</div></div>
<div id="fadetogglein" class='chain-test'>fadeToggleIn<div>fadeToggleIn</div></div>
<div id="fadetoggleout" class='chain-test chain-test-out'>fadeToggleOut<div>fadeToggleOut</div></div>
<div id="fadeto" class='chain-test'>fadeTo<div>fadeTo</div></div>
</div>
<div id="fx-tests"></div>
<span id="display"></span>
</div>

File diff suppressed because one or more lines are too long

View File

@ -1,11 +0,0 @@
<?php
error_reporting(0);
if ( $_REQUEST['header'] ) {
if ( $_REQUEST['header'] == "ecma" ) {
header("Content-type: application/ecmascript");
} else {
header("Content-type: text/javascript");
}
}
?>
ok( true, "Script executed correctly." );

View File

@ -1,5 +0,0 @@
<?php
header( "HTTP/1.0 $_GET[status] $_GET[text]" );
?>

View File

@ -1,3 +0,0 @@
<?php
file_put_contents("csp.log", "", LOCK_EX);
?>

View File

@ -1,3 +0,0 @@
<?php
file_put_contents("csp.log", "error", LOCK_EX);
?>

View File

@ -1,19 +0,0 @@
<?php
# This test page checks CSP only for browsers with "Content-Security-Policy" header support
# i.e. no old WebKit or old Firefox
header("Content-Security-Policy: default-src 'self'; report-uri csp-log.php");
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CSP Test Page</title>
<script src="../../jquery.js"></script>
<script src="../iframeTest.js"></script>
<script src="csp.js"></script>
<script src="getComputedSupport.js"></script>
</head>
<body>
<p>CSP Test Page</p>
</body>
</html>

View File

@ -1,7 +1,7 @@
html text<br/> html text<br/>
<script type="text/javascript">/* <![CDATA[ */ <script type="text/javascript">/* <![CDATA[ */
testFoo = "foo"; jQuery('#foo').html('foo'); testFoo = "foo"; jQuery('#foo').html('foo');
ok( true, "test.html executed" ); ok( true, "test.include.html executed" );
/* ]]> */</script> /* ]]> */</script>
<script src="data/testbar.php"></script> <script src="{{baseURL}}mock.php?action=testbar"></script>
blabla blabla

View File

@ -1,7 +0,0 @@
html text<br/>
<script type="text/javascript">/* <![CDATA[ */
testFoo = "foo"; jQuery('#foo').html('foo');
ok( true, "test.php executed" );
/* ]]> */</script>
<script src="data/testbar.php?<?php srand(); echo time() . '' . rand(); ?>"></script>
blabla

View File

@ -1,3 +0,0 @@
this.testBar = "bar";
jQuery("#ap").html("bar");
ok( true, "testbar.php executed");

View File

@ -1,6 +1,11 @@
/* eslint no-multi-str: "off" */ /* eslint no-multi-str: "off" */
var baseURL = "", // baseURL is intentionally set to "data/" instead of "".
// This is not just for convenience (since most files are in data/)
// but also to ensure that urls without prefix fail.
// Otherwise it's easy to write tests that pass on test/index.html
// but fail in Karma runner (where the baseURL is different).
var baseURL = "data/",
supportjQuery = this.jQuery, supportjQuery = this.jQuery,
// see RFC 2606 // see RFC 2606
@ -148,11 +153,13 @@ window.fireNative = document.createEvent ?
/** /**
* Add random number to url to stop caching * Add random number to url to stop caching
* *
* @example url("data/test.html") * Also prefixes with baseURL automatically.
* @result "data/test.html?10538358428943"
* *
* @example url("data/test.php?foo=bar") * @example url("index.html")
* @result "data/test.php?foo=bar&10538358345554" * @result "data/index.html?10538358428943"
*
* @example url("mock.php?foo=bar")
* @result "data/mock.php?foo=bar&10538358345554"
*/ */
function url( value ) { function url( value ) {
return baseURL + value + ( /\?/.test( value ) ? "&" : "?" ) + return baseURL + value + ( /\?/.test( value ) ? "&" : "?" ) +
@ -239,7 +246,7 @@ this.testIframe = function( title, fileName, func, wrapper ) {
var done = assert.async(), var done = assert.async(),
$iframe = supportjQuery( "<iframe/>" ) $iframe = supportjQuery( "<iframe/>" )
.css( { position: "absolute", top: "0", left: "-600px", width: "500px" } ) .css( { position: "absolute", top: "0", left: "-600px", width: "500px" } )
.attr( { id: "qunit-fixture-iframe", src: url( "./data/" + fileName ) } ); .attr( { id: "qunit-fixture-iframe", src: url( fileName ) } );
// Test iframes are expected to invoke this via startIframeTest (cf. iframeTest.js) // Test iframes are expected to invoke this via startIframeTest (cf. iframeTest.js)
window.iframeCallback = function() { window.iframeCallback = function() {
@ -264,14 +271,20 @@ this.testIframe = function( title, fileName, func, wrapper ) {
}; };
this.iframeCallback = undefined; this.iframeCallback = undefined;
if ( window.__karma__ ) {
// In Karma, files are served from /base
baseURL = "base/test/data/";
} else {
// Tests are always loaded async // Tests are always loaded async
// except when running tests in Karma (See Gruntfile)
QUnit.config.autostart = false; QUnit.config.autostart = false;
this.loadTests = function() { }
// Leverage QUnit URL parsing to detect testSwarm environment and "basic" testing mode // Leverage QUnit URL parsing to detect testSwarm environment and "basic" testing mode
QUnit.isSwarm = ( QUnit.urlParams.swarmURL + "" ).indexOf( "http" ) === 0; QUnit.isSwarm = ( QUnit.urlParams.swarmURL + "" ).indexOf( "http" ) === 0;
QUnit.basicTests = ( QUnit.urlParams.module + "" ) === "basic"; QUnit.basicTests = ( QUnit.urlParams.module + "" ) === "basic";
this.loadTests = function() {
// Get testSubproject from testrunner first // Get testSubproject from testrunner first
require( [ "data/testrunner.js" ], function() { require( [ "data/testrunner.js" ], function() {
var i = 0, var i = 0,

View File

@ -1,7 +0,0 @@
<?php
error_reporting(0);
$callback = $_REQUEST['callback'];
$json = $_REQUEST['json'];
$text = json_encode(file_get_contents(dirname(__FILE__)."/with_fries.xml"));
echo "$callback($text)";
?>

View File

@ -42,250 +42,7 @@
<!-- Test HTML --> <!-- Test HTML -->
<!-- this iframe is outside the #qunit-fixture so it won't waste time by constantly reloading; the tests are "safe" and clean up after themselves --> <!-- this iframe is outside the #qunit-fixture so it won't waste time by constantly reloading; the tests are "safe" and clean up after themselves -->
<iframe id="loadediframe" name="loadediframe" style="display:none;" src="data/iframe.html"></iframe> <iframe id="loadediframe" name="loadediframe" style="display:none;" src="data/iframe.html"></iframe>
<dl id="dl" style="position:absolute;top:-32767px;left:-32767px;width:1px;"> <div id="qunit-fixture"></div>
<div id="qunit-fixture"> <script src="data/qunit-fixture.js"></script>
<p id="firstp">See <a id="simon1" href="http://simon.incutio.com/archive/2003/03/25/#getElementsBySelector" rel="bookmark">this blog entry</a> for more information.</p>
<p id="ap">
Here are some links in a normal paragraph: <a id="google" href="http://www.google.com/" title="Google!">Google</a>,
<a id="groups" href="http://groups.google.com/" class="GROUPS">Google Groups (Link)</a>.
This link has <code><a href="http://smin" id="anchor1">class="blog"</a></code>:
<a href="http://diveintomark.org/" class="blog" hreflang="en" id="mark">diveintomark</a>
</p>
<div id="foo">
<p id="sndp">Everything inside the red border is inside a div with <code>id="foo"</code>.</p>
<p lang="en" id="en">This is a normal link: <a id="yahoo" href="http://www.yahoo.com/" class="blogTest">Yahoo</a></p>
<p id="sap">This link has <code><a href="#2" id="anchor2">class="blog"</a></code>: <a href="http://simon.incutio.com/" class="blog link" id="simon">Simon Willison's Weblog</a></p>
</div>
<div id="nothiddendiv" style="height:1px;background:white;" class="nothiddendiv">
<div id="nothiddendivchild"></div>
</div>
<span id="name+value"></span>
<p id="first">Try them out:</p>
<ul id="firstUL"></ul>
<ol id="empty"></ol>
<form id="form" action="formaction">
<label for="action" id="label-for">Action:</label>
<input type="text" name="action" value="Test" id="text1" maxlength="30"/>
<input type="text" name="text2" value="Test" id="text2" disabled="disabled"/>
<input type="radio" name="radio1" id="radio1" value="on"/>
<input type="radio" name="radio2" id="radio2" checked="checked"/>
<input type="checkbox" name="check" id="check1" checked="checked"/>
<input type="checkbox" id="check2" value="on"/>
<input type="hidden" name="hidden" id="hidden1"/>
<input type="text" style="display:none;" name="foo[bar]" id="hidden2"/>
<input type="text" id="name" name="name" value="name" />
<input type="search" id="search" name="search" value="search" />
<button id="button" name="button" type="button">Button</button>
<textarea id="area1" maxlength="30">foobar</textarea>
<select name="select1" id="select1">
<option id="option1a" class="emptyopt" value="">Nothing</option>
<option id="option1b" value="1">1</option>
<option id="option1c" value="2">2</option>
<option id="option1d" value="3">3</option>
</select>
<select name="select2" id="select2">
<option id="option2a" class="emptyopt" value="">Nothing</option>
<option id="option2b" value="1">1</option>
<option id="option2c" value="2">2</option>
<option id="option2d" selected="selected" value="3">3</option>
</select>
<select name="select3" id="select3" multiple="multiple">
<option id="option3a" class="emptyopt" value="">Nothing</option>
<option id="option3b" selected="selected" value="1">1</option>
<option id="option3c" selected="selected" value="2">2</option>
<option id="option3d" value="3">3</option>
<option id="option3e">no value</option>
</select>
<select name="select4" id="select4" multiple="multiple">
<optgroup disabled="disabled">
<option id="option4a" class="emptyopt" value="">Nothing</option>
<option id="option4b" disabled="disabled" selected="selected" value="1">1</option>
<option id="option4c" selected="selected" value="2">2</option>
</optgroup>
<option selected="selected" disabled="disabled" id="option4d" value="3">3</option>
<option id="option4e">no value</option>
</select>
<select name="select5" id="select5">
<option id="option5a" value="3">1</option>
<option id="option5b" value="2">2</option>
<option id="option5c" value="1" data-attr="">3</option>
</select>
<object id="object1" codebase="stupid">
<param name="p1" value="x1" />
<param name="p2" value="x2" />
</object>
<span id="台北Táiběi"></span>
<span id="台北" lang="中文"></span>
<span id="utf8class1" class="台北Táiběi 台北"></span>
<span id="utf8class2" class="台北"></span>
<span id="foo:bar" class="foo:bar"></span>
<span id="test.foo[5]bar" class="test.foo[5]bar"></span>
<foo_bar id="foobar">test element</foo_bar>
</form>
<b id="floatTest">Float test.</b>
<iframe id="iframe" name="iframe"></iframe>
<form id="lengthtest">
<input type="text" id="length" name="test"/>
<input type="text" id="idTest" name="id"/>
</form>
<table id="table"></table>
<form id="name-tests">
<!-- Inputs with a grouped name attribute. -->
<input name="types[]" id="types_all" type="checkbox" value="all" />
<input name="types[]" id="types_anime" type="checkbox" value="anime" />
<input name="types[]" id="types_movie" type="checkbox" value="movie" />
</form>
<form id="testForm" action="#" method="get">
<textarea name="T3" rows="2" cols="15">?
Z</textarea>
<input type="hidden" name="H1" value="x" />
<input type="hidden" name="H2" />
<input name="PWD" type="password" value="" />
<input name="T1" type="text" />
<input name="T2" type="text" value="YES" readonly="readonly" />
<input type="checkbox" name="C1" value="1" />
<input type="checkbox" name="C2" />
<input type="radio" name="R1" value="1" />
<input type="radio" name="R1" value="2" />
<input type="text" name="My Name" value="me" />
<input type="reset" name="reset" value="NO" />
<select name="S1">
<option value="abc">ABC</option>
<option value="abc">ABC</option>
<option value="abc">ABC</option>
</select>
<select name="S2" multiple="multiple" size="3">
<option value="abc">ABC</option>
<option value="abc">ABC</option>
<option value="abc">ABC</option>
</select>
<select name="S3">
<option selected="selected">YES</option>
</select>
<select name="S4">
<option value="" selected="selected">NO</option>
</select>
<input type="submit" name="sub1" value="NO" />
<input type="submit" name="sub2" value="NO" />
<input type="image" name="sub3" value="NO" />
<button name="sub4" type="submit" value="NO">NO</button>
<input name="D1" type="text" value="NO" disabled="disabled" />
<input type="checkbox" checked="checked" disabled="disabled" name="D2" value="NO" />
<input type="radio" name="D3" value="NO" checked="checked" disabled="disabled" />
<select name="D4" disabled="disabled">
<option selected="selected" value="NO">NO</option>
</select>
<input id="list-test" type="text" />
<datalist id="datalist">
<option value="option"></option>
</datalist>
</form>
<div id="moretests">
<form>
<div id="checkedtest" style="display:none;">
<input type="radio" name="checkedtestradios" checked="checked"/>
<input type="radio" name="checkedtestradios" value="on"/>
<input type="checkbox" name="checkedtestcheckboxes" checked="checked"/>
<input type="checkbox" name="checkedtestcheckboxes" />
</div>
</form>
<div id="nonnodes"><span id="nonnodesElement">hi</span> there <!-- mon ami --></div>
<div id="t2037">
<div><div class="hidden">hidden</div></div>
</div>
<div id="t6652">
<div></div>
</div>
<div id="no-clone-exception"><object><embed></embed></object></div>
</div>
<div id="tabindex-tests">
<ol id="listWithTabIndex" tabindex="5">
<li id="foodWithNegativeTabIndex" tabindex="-1">Rice</li>
<li id="foodNoTabIndex">Beans</li>
<li>Blinis</li>
<li>Tofu</li>
</ol>
<div id="divWithNoTabIndex">I'm hungry. I should...</div>
<span>...</span><a href="#" id="linkWithNoTabIndex">Eat lots of food</a><span>...</span> |
<span>...</span><a href="#" id="linkWithTabIndex" tabindex="2">Eat a little food</a><span>...</span> |
<span>...</span><a href="#" id="linkWithNegativeTabIndex" tabindex="-1">Eat no food</a><span>...</span>
<span>...</span><a id="linkWithNoHrefWithNoTabIndex">Eat a burger</a><span>...</span>
<span>...</span><a id="linkWithNoHrefWithTabIndex" tabindex="1">Eat some funyuns</a><span>...</span>
<span>...</span><a id="linkWithNoHrefWithNegativeTabIndex" tabindex="-1">Eat some funyuns</a><span>...</span>
<input id="inputWithoutTabIndex"/>
<button id="buttonWithoutTabIndex"></button>
<textarea id="textareaWithoutTabIndex"></textarea>
<menu type="popup">
<menuitem id="menuitemWithoutTabIndex" command="submitbutton" default/>
</menu>
</div>
<div id="liveHandlerOrder">
<span id="liveSpan1"><a href="#" id="liveLink1"></a></span>
<span id="liveSpan2"><a href="#" id="liveLink2"></a></span>
</div>
<div id="siblingTest">
<em id="siblingfirst">1</em>
<em id="siblingnext">2</em>
<em id="siblingthird">
<em id="siblingchild">
<em id="siblinggrandchild">
<em id="siblinggreatgrandchild"></em>
</em>
</em>
</em>
<span id="siblingspan"></span>
</div>
<div id="fx-test-group" style="position: absolute; width: 1px; height: 1px; overflow: hidden;">
<div id="fx-queue" name="test">
<div id="fadein" class='chain-test' name='div'>fadeIn<div>fadeIn</div></div>
<div id="fadeout" class='chain-test chain-test-out'>fadeOut<div>fadeOut</div></div>
<div id="show" class='chain-test'>show<div>show</div></div>
<div id="hide" class='chain-test chain-test-out'>hide<div>hide</div></div>
<div id="easehide" class='chain-test chain-test-out'>hide<div>hide</div></div>
<div id="togglein" class='chain-test'>togglein<div>togglein</div></div>
<div id="toggleout" class='chain-test chain-test-out'>toggleout<div>toggleout</div></div>
<div id="easetoggleout" class='chain-test chain-test-out'>toggleout<div>toggleout</div></div>
<div id="slideup" class='chain-test'>slideUp<div>slideUp</div></div>
<div id="slidedown" class='chain-test chain-test-out'>slideDown<div>slideDown</div></div>
<div id="easeslideup" class='chain-test'>slideUp<div>slideUp</div></div>
<div id="slidetogglein" class='chain-test'>slideToggleIn<div>slideToggleIn</div></div>
<div id="slidetoggleout" class='chain-test chain-test-out'>slideToggleOut<div>slideToggleOut</div></div>
<div id="fadetogglein" class='chain-test'>fadeToggleIn<div>fadeToggleIn</div></div>
<div id="fadetoggleout" class='chain-test chain-test-out'>fadeToggleOut<div>fadeToggleOut</div></div>
<div id="fadeto" class='chain-test'>fadeTo<div>fadeTo</div></div>
</div>
<div id="fx-tests"></div>
<span id="display"></span>
</div>
</div>
</dl>
<map name="imgmap" id="imgmap">
<area shape="rect" coords="0,0,200,50">
</map>
</body> </body>
</html> </html>

45
test/karma.context.html Normal file
View File

@ -0,0 +1,45 @@
<!DOCTYPE html>
<html lang="en" id="html">
<head>
<meta charset="utf-8">
<title>CONTEXT</title>
<!-- Karma serves this page from /context.html. Other files are served from /base -->
<link rel="stylesheet" href="/base/test/data/testsuite.css" />
</head>
<body id="body">
<div id="qunit"></div>
<!-- Start: jQuery Test HTML -->
<!-- this iframe is outside the #qunit-fixture so it won't waste time by constantly reloading; the tests are "safe" and clean up after themselves -->
<iframe id="loadediframe" name="loadediframe" style="display:none;" src="/base/test/data/iframe.html"></iframe>
<div id="qunit-fixture"></div>
<!-- End: jQuery Test HTML -->
<!-- Start: Karma boilerplate -->
<script src="/context.js"></script>
<script>
%CLIENT_CONFIG%
window.__karma__.setupContext(window);
%MAPPINGS%
</script>
%SCRIPTS%
<!-- End: Karma boilerplate -->
<script src="/base/test/data/qunit-fixture.js"></script>
<script>
// Workaround: Remove call to window.__karma__.loaded()
// in favour of calling window.__karma__.start() at window.onload
// because tests such as unit/ready.js should run after document ready
window.addEventListener('load', function() {
window.__karma__.start();
// Workaround: https://github.com/karma-runner/karma-qunit/issues/92
QUnit.testStart(function () {
// Restore content
document.getElementById("qunit-fixture").innerHTML = QUnit.config.fixture;
});
});
</script>
</body>
</html>

47
test/karma.debug.html Normal file
View File

@ -0,0 +1,47 @@
<!DOCTYPE html>
<html lang="en" id="html">
<head>
%X_UA_COMPATIBLE%
<title>DEBUG</title>
<meta charset="utf-8">
<!-- Karma serves this page from /context.html. Other files are served from /base -->
<link rel="stylesheet" href="/base/external/qunit/qunit.css" />
<link rel="stylesheet" href="/base/test/data/testsuite.css" />
</head>
<body id="body">
<div id="qunit"></div>
<!-- Start: jQuery Test HTML -->
<!-- this iframe is outside the #qunit-fixture so it won't waste time by constantly reloading; the tests are "safe" and clean up after themselves -->
<iframe id="loadediframe" name="loadediframe" style="display:none;" src="/base/test/data/iframe.html"></iframe>
<div id="qunit-fixture"></div>
<!-- End: jQuery Test HTML -->
<!-- Start: Karma boilerplate -->
<script src="/context.js"></script>
<script src="/debug.js"></script>
<script>
%CLIENT_CONFIG%
%MAPPINGS%
</script>
%SCRIPTS%
<!-- End: Karma boilerplate -->
<script src="/base/test/data/qunit-fixture.js"></script>
<script>
// Workaround: Remove call to window.__karma__.loaded()
// in favour of calling window.__karma__.start() at window.onload
// because tests such as unit/ready.js should run after document ready
window.addEventListener('load', function() {
window.__karma__.start();
// Workaround: https://github.com/karma-runner/karma-qunit/issues/92
QUnit.testStart(function () {
// Restore content
document.getElementById("qunit-fixture").innerHTML = QUnit.config.fixture;
});
});
</script>
</body>
</html>

View File

@ -0,0 +1,284 @@
/* eslint-env node */
var url = require( "url" );
var fs = require( "fs" );
var getRawBody = require( "raw-body" );
var cspLog = "";
/**
* Keep in sync with /test/mock.php
*/
var mocks = {
contentType: function( req, resp ) {
resp.writeHead( 200, {
"content-type": req.query.contentType
} );
resp.end( req.query.response );
},
wait: function( req, resp ) {
var wait = Number( req.query.wait ) * 1000;
setTimeout( function() {
if ( req.query.script ) {
resp.writeHead( 200, { "content-type": "text/javascript" } );
} else {
resp.writeHead( 200, { "content-type": "text/html" } );
resp.end( "ERROR <script>ok( true, \"mock executed\" );</script>" );
}
}, wait );
},
name: function( req, resp, next ) {
resp.writeHead( 200 );
if ( req.query.name === "foo" ) {
resp.end( "bar" );
return;
}
getBody( req ).then( function( body ) {
if ( body === "name=peter" ) {
resp.end( "pan" );
} else {
resp.end( "ERROR" );
}
}, next );
},
xml: function( req, resp, next ) {
var content = "<math><calculation>5-2</calculation><result>3</result></math>";
resp.writeHead( 200, { "content-type": "text/xml" } );
if ( req.query.cal === "5-2" ) {
resp.end( content );
return;
}
getBody( req ).then( function( body ) {
if ( body === "cal=5-2" ) {
resp.end( content );
} else {
resp.end( "<error>ERROR</error>" );
}
}, next );
},
atom: function( req, resp, next ) {
resp.writeHead( 200, { "content-type": "atom+xml" } );
resp.end( "<root><element /></root>" );
},
script: function( req, resp ) {
if ( req.query.header === "ecma" ) {
resp.writeHead( 200, { "content-type": "application/ecmascript" } );
} else if ( req.query.header ) {
resp.writeHead( 200, { "content-type": "text/javascript" } );
} else {
resp.writeHead( 200, { "content-type": "text/html" } );
}
resp.end( "ok( true, \"mock executed\" );" );
},
testbar: function( req, resp ) {
resp.writeHead( 200 );
resp.end(
"this.testBar = 'bar'; " +
"jQuery('#ap').html('bar'); " +
"ok( true, 'mock executed');"
);
},
json: function( req, resp ) {
if ( req.query.header ) {
resp.writeHead( 200, { "content-type": "application/json" } );
}
if ( req.query.array ) {
resp.end( JSON.stringify(
[ { name: "John", age: 21 }, { name: "Peter", age: 25 } ]
) );
} else {
resp.end( JSON.stringify(
{ data: { lang: "en", length: 25 } }
) );
}
},
jsonp: function( req, resp, next ) {
var callback;
if ( req.query.callback ) {
callback = Promise.resolve( req.query.callback );
} else if ( req.method === "GET" ) {
callback = Promise.resolve( req.url.match( /^.+\/([^\/?.]+)\?.+$/ )[ 1 ] );
} else {
callback = getBody( req ).then( function( body ) {
return body.trim().replace( "callback=", "" );
} );
}
var json = req.query.array ?
JSON.stringify(
[ { name: "John", age: 21 }, { name: "Peter", age: 25 } ]
) :
JSON.stringify(
{ data: { lang: "en", length: 25 } }
);
callback.then( function( cb ) {
resp.end( cb + "(" + json + ")" );
}, next );
},
xmlOverJsonp: function( req, resp ) {
var callback = req.query.callback;
var body = fs.readFileSync( __dirname + "/data/with_fries.xml" ).toString();
resp.writeHead( 200 );
resp.end( callback + "(" + JSON.stringify( body ) + ")\n" );
},
error: function( req, resp ) {
if ( req.query.json ) {
resp.writeHead( 400, { "content-type": "application/json" } );
resp.end( "{ \"code\": 40, \"message\": \"Bad Request\" }" );
} else {
resp.writeHead( 400 );
resp.end( "plain text message" );
}
},
headers: function( req, resp ) {
resp.writeHead( 200, {
"Sample-Header": "Hello World",
"Empty-Header": "",
"Sample-Header2": "Hello World 2"
} );
req.query.keys.split( "|" ).forEach( function( key ) {
if ( req.headers[ key.toLowerCase() ] ) {
resp.write( key + ": " + req.headers[ key.toLowerCase() ] + "\n" );
}
} );
resp.end();
},
echoData: function( req, resp, next ) {
getBody( req ).then( function( body ) {
resp.end( body );
}, next );
},
echoQuery: function( req, resp ) {
resp.end( req.parsed.search.slice( 1 ) );
},
echoMethod: function( req, resp ) {
resp.end( req.method );
},
echoHtml: function( req, resp, next ) {
resp.writeHead( 200, { "Content-Type": "text/html" } );
resp.write( "<div id='method'>" + req.method + "</div>" );
resp.write( "<div id='query'>" + req.parsed.search.slice( 1 ) + "</div>" );
getBody( req ).then( function( body ) {
resp.write( "<div id='data'>" + body + "</div>" );
resp.end( body );
}, next );
},
etag: function( req, resp ) {
var hash = Number( req.query.ts ).toString( 36 );
var etag = "W/\"" + hash + "\"";
if ( req.headers[ "if-none-match" ] === etag ) {
resp.writeHead( 304 );
resp.end();
return;
}
resp.writeHead( 200, {
"Etag": etag
} );
resp.end();
},
ims: function( req, resp, next ) {
var ts = req.query.ts;
if ( req.headers[ "if-modified-since" ] === ts ) {
resp.writeHead( 304 );
resp.end();
return;
}
resp.writeHead( 200, {
"Last-Modified": ts
} );
resp.end();
},
status: function( req, resp, next ) {
resp.writeHead( Number( req.query.code ) );
resp.end();
},
testHTML: function( req, resp ) {
resp.writeHead( 200, { "Content-Type": "text/html" } );
var body = fs.readFileSync( __dirname + "/data/test.include.html" ).toString();
body = body.replace( /{{baseURL}}/g, req.query.baseURL );
resp.end( body );
},
cspFrame: function( req, resp ) {
resp.writeHead( 200, {
"Content-Type": "text/html",
"Content-Security-Policy": "default-src 'self'; report-uri /base/test/data/mock.php?action=cspLog"
} );
var body = fs.readFileSync( __dirname + "/data/csp.include.html" ).toString();
resp.end( body );
},
cspLog: function( req, resp ) {
cspLog = "error";
resp.writeHead( 200 );
resp.end();
},
cspClean: function( req, resp ) {
cspLog = "";
resp.writeHead( 200 );
resp.end();
}
};
var handlers = {
"test/data/mock.php": function( req, resp, next ) {
if ( !mocks[ req.query.action ] ) {
resp.writeHead( 400 );
resp.end( "Invalid action query.\n" );
console.log( "Invalid action query:", req.method, req.url );
return;
}
mocks[ req.query.action ]( req, resp, next );
},
"test/data/support/csp.log": function( req, resp ) {
resp.writeHead( 200 );
resp.end( cspLog );
},
"test/data/404.txt": function( req, resp ) {
resp.writeHead( 404 );
resp.end( "" );
}
};
/**
* Connect-compatible middleware factory for mocking server responses.
* Used by Ajax unit tests when run via Karma.
*
* Despite Karma using Express, it uses Connect to deal with custom middleware,
* which passes the raw Node Request and Response objects instead of the
* Express versions of these (e.g. no req.path, req.query, resp.set).
*/
function MockserverMiddlewareFactory() {
/**
* @param {http.IncomingMessage} req
* @param {http.ServerResponse} resp
* @param {Function} next Continue request handling
*/
return function( req, resp, next ) {
var method = req.method,
parsed = url.parse( req.url, /* parseQuery */ true ),
path = parsed.pathname.replace( /^\/base\//, "" ),
query = parsed.query,
subReq = Object.assign( Object.create( req ), {
query: query,
parsed: parsed
} );
if ( /^test\/data\/mock.php\//.test( path ) ) {
// Support REST-like Apache PathInfo
path = "test\/data\/mock.php";
}
if ( !handlers[ path ] ) {
next();
return;
}
handlers[ path ]( subReq, resp, next );
};
}
function getBody( req ) {
return req.method !== "POST" ?
Promise.resolve( "" ) :
getRawBody( req, {
encoding: true
} );
}
module.exports = MockserverMiddlewareFactory;

File diff suppressed because it is too large Load Diff

View File

@ -127,7 +127,7 @@ QUnit.test( "attr(String)", function( assert ) {
assert.equal( jQuery( option ).prop( "selected" ), true, "Make sure that a single option is selected, even when in an optgroup." ); assert.equal( jQuery( option ).prop( "selected" ), true, "Make sure that a single option is selected, even when in an optgroup." );
$img = jQuery( "<img style='display:none' width='215' height='53' src='data/1x1.jpg'/>" ).appendTo( "body" ); $img = jQuery( "<img style='display:none' width='215' height='53' src='" + baseURL + "1x1.jpg'/>" ).appendTo( "body" );
assert.equal( $img.attr( "width" ), "215", "Retrieve width attribute on an element with display:none." ); assert.equal( $img.attr( "width" ), "215", "Retrieve width attribute on an element with display:none." );
assert.equal( $img.attr( "height" ), "53", "Retrieve height attribute on an element with display:none." ); assert.equal( $img.attr( "height" ), "53", "Retrieve height attribute on an element with display:none." );
@ -780,7 +780,7 @@ QUnit.test( "prop('tabindex')", function( assert ) {
QUnit.test( "image.prop( 'tabIndex' )", function( assert ) { QUnit.test( "image.prop( 'tabIndex' )", function( assert ) {
assert.expect( 1 ); assert.expect( 1 );
var image = jQuery( "<img src='data/1x1.jpg' />" ) var image = jQuery( "<img src='" + baseURL + "1x1.jpg' />" )
.appendTo( "#qunit-fixture" ); .appendTo( "#qunit-fixture" );
assert.equal( image.prop( "tabIndex" ), -1, "tabIndex on image" ); assert.equal( image.prop( "tabIndex" ), -1, "tabIndex on image" );
} ); } );

View File

@ -8,7 +8,7 @@ QUnit.test( "ajax", function( assert ) {
jQuery.ajax( { jQuery.ajax( {
type: "GET", type: "GET",
url: url( "data/name.php?name=foo" ), url: url( "mock.php?action=name&name=foo" ),
success: function( msg ) { success: function( msg ) {
assert.strictEqual( msg, "bar", "Check for GET" ); assert.strictEqual( msg, "bar", "Check for GET" );
done.pop()(); done.pop()();
@ -17,7 +17,7 @@ QUnit.test( "ajax", function( assert ) {
jQuery.ajax( { jQuery.ajax( {
type: "POST", type: "POST",
url: url( "data/name.php" ), url: url( "mock.php?action=name" ),
data: "name=peter", data: "name=peter",
success: function( msg ) { success: function( msg ) {
assert.strictEqual( msg, "pan", "Check for POST" ); assert.strictEqual( msg, "pan", "Check for POST" );
@ -25,7 +25,7 @@ QUnit.test( "ajax", function( assert ) {
} }
} ); } );
jQuery( "#first" ).load( url( "data/name.html" ), function() { jQuery( "#first" ).load( url( "name.html" ), function() {
assert.ok( /^ERROR/.test( jQuery( "#first" ).text() ), assert.ok( /^ERROR/.test( jQuery( "#first" ).text() ),
"Check if content was injected into the DOM" ); "Check if content was injected into the DOM" );
done.pop()(); done.pop()();

View File

@ -188,7 +188,7 @@ QUnit.test( "globalEval execution after script injection (#7862)", function( ass
var now, var now,
script = document.createElement( "script" ); script = document.createElement( "script" );
script.src = "data/longLoadScript.php?sleep=2"; script.src = baseURL + "mock.php?action=wait&wait=2&script=1";
now = jQuery.now(); now = jQuery.now();
document.body.appendChild( script ); document.body.appendChild( script );
@ -1627,10 +1627,10 @@ QUnit.test( "jQuery.parseHTML", function( assert ) {
QUnit.test( "jQuery.parseHTML(<a href>) - gh-2965", function( assert ) { QUnit.test( "jQuery.parseHTML(<a href>) - gh-2965", function( assert ) {
assert.expect( 1 ); assert.expect( 1 );
var html = "<a href='test.html'></a>", var html = "<a href='example.html'></a>",
href = jQuery.parseHTML( html )[ 0 ].href; href = jQuery.parseHTML( html )[ 0 ].href;
assert.ok( /\/test\.html$/.test( href ), "href is not lost after parsing anchor" ); assert.ok( /\/example\.html$/.test( href ), "href is not lost after parsing anchor" );
} ); } );
if ( jQuery.support.createHTMLDocument ) { if ( jQuery.support.createHTMLDocument ) {

View File

@ -1066,7 +1066,7 @@ QUnit.test( "can't get css for disconnected in IE<9, see #10254 and #8388", func
assert.expect( 2 ); assert.expect( 2 );
var span, div; var span, div;
span = jQuery( "<span/>" ).css( "background-image", "url(data/1x1.jpg)" ); span = jQuery( "<span/>" ).css( "background-image", "url(" + baseURL + "1x1.jpg)" );
assert.notEqual( span.css( "background-image" ), null, "can't get background-image in IE<9, see #10254" ); assert.notEqual( span.css( "background-image" ), null, "can't get background-image in IE<9, see #10254" );
div = jQuery( "<div/>" ).css( "top", 10 ); div = jQuery( "<div/>" ).css( "top", 10 );
@ -1374,7 +1374,6 @@ QUnit.test(
"Clearing a Cloned Element's Style Shouldn't Clear the Original Element's Style (#8908)", "Clearing a Cloned Element's Style Shouldn't Clear the Original Element's Style (#8908)",
24, 24,
function( assert ) { function( assert ) {
var baseUrl = document.location.href.replace( /([^\/]*)$/, "" );
var done = assert.async(); var done = assert.async();
var styles = [ { var styles = [ {
name: "backgroundAttachment", name: "backgroundAttachment",
@ -1388,7 +1387,7 @@ QUnit.test(
// Firefox returns auto's value // Firefox returns auto's value
name: "backgroundImage", name: "backgroundImage",
value: [ "url('test.png')", "url(" + baseUrl + "test.png)", "url(\"" + baseUrl + "test.png\")" ], value: [ "url('test.png')", "url(" + baseURL + "test.png)", "url(\"" + baseURL + "test.png\")" ],
expected: [ "none", "url(\"http://static.jquery.com/files/rocker/images/logo_jquery_215x53.gif\")" ] expected: [ "none", "url(\"http://static.jquery.com/files/rocker/images/logo_jquery_215x53.gif\")" ]
}, { }, {
name: "backgroundPosition", name: "backgroundPosition",

View File

@ -777,7 +777,7 @@ QUnit.test( ".removeData should not throw exceptions. (#10080)", function( asser
} ); } );
// change the url to trigger unload // change the url to trigger unload
frame.attr( "src", "data/iframe.html?param=true" ); frame.attr( "src", baseURL + "iframe.html?param=true" );
} ); } );
QUnit.test( ".data only checks element attributes once. #8909", function( assert ) { QUnit.test( ".data only checks element attributes once. #8909", function( assert ) {

View File

@ -33,7 +33,7 @@ QUnit.module( "effects", {
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "sanity check", function( assert ) { QUnit[ jQuery.find.compile ? "test" : "skip" ]( "sanity check", function( assert ) {
assert.expect( 1 ); assert.expect( 1 );
assert.equal( jQuery( "#dl:visible, #qunit-fixture:visible, #foo:visible" ).length, 3, "QUnit state is correct for testing effects" ); assert.equal( jQuery( "#qunit-fixture:visible, #foo:visible" ).length, 2, "QUnit state is correct for testing effects" );
} ); } );
QUnit.test( "show() basic", function( assert ) { QUnit.test( "show() basic", function( assert ) {

View File

@ -1281,8 +1281,7 @@ QUnit.test( ".trigger() doesn't bubble load event (#10717)", function( assert )
assert.ok( false, "load fired on window" ); assert.ok( false, "load fired on window" );
} ); } );
// It's not an image, but as long as it fires load... jQuery( "<img src='" + baseURL + "1x1.jpg' />" )
jQuery( "<img src='index.html' />" )
.appendTo( "body" ) .appendTo( "body" )
.on( "load", function() { .on( "load", function() {
assert.ok( true, "load fired on img" ); assert.ok( true, "load fired on img" );
@ -1443,7 +1442,7 @@ QUnit.test( "Submit event can be stopped (#11049)", function( assert ) {
// handler making it impossible to feature-detect the support. // handler making it impossible to feature-detect the support.
QUnit[ /(ipad|iphone|ipod)/i.test( navigator.userAgent ) ? "skip" : "test" ]( QUnit[ /(ipad|iphone|ipod)/i.test( navigator.userAgent ) ? "skip" : "test" ](
"on(beforeunload)", 1, function( assert ) { "on(beforeunload)", 1, function( assert ) {
var iframe = jQuery( jQuery.parseHTML( "<iframe src='data/event/onbeforeunload.html'><iframe>" ) ); var iframe = jQuery( jQuery.parseHTML( "<iframe src='" + baseURL + "event/onbeforeunload.html'><iframe>" ) );
var done = assert.async(); var done = assert.async();
window.onmessage = function( event ) { window.onmessage = function( event ) {

View File

@ -2377,7 +2377,7 @@ QUnit.asyncTest( "html() - script exceptions bubble (#11743)", 2, function( asse
assert.ok( true, "Exception thrown in remote script" ); assert.ok( true, "Exception thrown in remote script" );
}; };
jQuery( "#qunit-fixture" ).html( "<script src='data/badcall.js'></script>" ); jQuery( "#qunit-fixture" ).html( "<script src='" + baseURL + "badcall.js'></script>" );
assert.ok( true, "Exception ignored" ); assert.ok( true, "Exception ignored" );
} else { } else {
assert.ok( true, "No jQuery.ajax" ); assert.ok( true, "No jQuery.ajax" );
@ -2463,7 +2463,7 @@ QUnit.test( "script evaluation (#11795)", function( assert ) {
if ( jQuery.ajax ) { if ( jQuery.ajax ) {
Globals.register( "testBar" ); Globals.register( "testBar" );
jQuery( "#qunit-fixture" ).append( "<script src='" + url( "data/testbar.php" ) + "'/>" ); jQuery( "#qunit-fixture" ).append( "<script src='" + url( "mock.php?action=testbar" ) + "'/>" );
assert.strictEqual( window.testBar, "bar", "Global script evaluation" ); assert.strictEqual( window.testBar, "bar", "Global script evaluation" );
} else { } else {
assert.ok( true, "No jQuery.ajax" ); assert.ok( true, "No jQuery.ajax" );

View File

@ -771,12 +771,12 @@ QUnit.test( "offsetParent", function( assert ) {
assert.equal( div[ 0 ], document.documentElement, "The html element is the offsetParent of the body." ); assert.equal( div[ 0 ], document.documentElement, "The html element is the offsetParent of the body." );
assert.equal( div[ 1 ], jQuery( "#nothiddendiv" )[ 0 ], "The div is the offsetParent." ); assert.equal( div[ 1 ], jQuery( "#nothiddendiv" )[ 0 ], "The div is the offsetParent." );
area = jQuery( "#imgmap area" ).offsetParent(); area = jQuery( "<map name=\"imgmap\"><area shape=\"rect\" coords=\"0,0,200,50\"></map>" ).appendTo( "body" ).find( "area" );
assert.equal( area[ 0 ], document.documentElement, "The html element is the offsetParent of the body." ); assert.equal( area.offsetParent()[ 0 ], document.documentElement, "The html element is the offsetParent of a map area." );
area.remove();
div = jQuery( "<div>" ).css( { "position": "absolute" } ).appendTo( "body" ); div = jQuery( "<div>" ).css( { "position": "absolute" } ).appendTo( "body" );
assert.equal( div.offsetParent()[ 0 ], document.documentElement, "Absolutely positioned div returns html as offset parent, see #12139" ); assert.equal( div.offsetParent()[ 0 ], document.documentElement, "Absolutely positioned div returns html as offset parent, see #12139" );
div.remove(); div.remove();
} ); } );

View File

@ -39,7 +39,7 @@ if ( jQuery.css ) {
// i.e. no old WebKit or old Firefox // i.e. no old WebKit or old Firefox
testIframe( testIframe(
"Check CSP (https://developer.mozilla.org/en-US/docs/Security/CSP) restrictions", "Check CSP (https://developer.mozilla.org/en-US/docs/Security/CSP) restrictions",
"support/csp.php", "mock.php?action=cspFrame",
function( assert, jQuery, window, document, support ) { function( assert, jQuery, window, document, support ) {
var done = assert.async(); var done = assert.async();
@ -47,9 +47,9 @@ testIframe(
assert.deepEqual( jQuery.extend( {}, support ), computedSupport, assert.deepEqual( jQuery.extend( {}, support ), computedSupport,
"No violations of CSP polices" ); "No violations of CSP polices" );
supportjQuery.get( "data/support/csp.log" ).done( function( data ) { supportjQuery.get( baseURL + "support/csp.log" ).done( function( data ) {
assert.equal( data, "", "No log request should be sent" ); assert.equal( data, "", "No log request should be sent" );
supportjQuery.get( "data/support/csp-clean.php" ).done( done ); supportjQuery.get( baseURL + "mock.php?action=cspClean" ).done( done );
} ); } );
} }
); );

View File

@ -608,7 +608,7 @@ QUnit.test( "parents([String])", function( assert ) {
assert.equal( jQuery( "#groups" ).parents( "p" )[ 0 ].id, "ap", "Filtered parents check" ); assert.equal( jQuery( "#groups" ).parents( "p" )[ 0 ].id, "ap", "Filtered parents check" );
assert.equal( jQuery( "#groups" ).parents( "div" )[ 0 ].id, "qunit-fixture", "Filtered parents check2" ); assert.equal( jQuery( "#groups" ).parents( "div" )[ 0 ].id, "qunit-fixture", "Filtered parents check2" );
assert.deepEqual( jQuery( "#groups" ).parents( "p, div" ).get(), q( "ap", "qunit-fixture" ), "Check for multiple filters" ); assert.deepEqual( jQuery( "#groups" ).parents( "p, div" ).get(), q( "ap", "qunit-fixture" ), "Check for multiple filters" );
assert.deepEqual( jQuery( "#en, #sndp" ).parents().get(), q( "foo", "qunit-fixture", "dl", "body", "html" ), "Check for unique results from parents" ); assert.deepEqual( jQuery( "#en, #sndp" ).parents().get(), q( "foo", "qunit-fixture", "body", "html" ), "Check for unique results from parents" );
} ); } );
QUnit.test( "parentsUntil([String])", function( assert ) { QUnit.test( "parentsUntil([String])", function( assert ) {
@ -621,11 +621,11 @@ QUnit.test( "parentsUntil([String])", function( assert ) {
assert.deepEqual( jQuery( "#groups" ).parentsUntil( "#html" ).get(), parents.slice( 0, -1 ).get(), "Simple parentsUntil check" ); assert.deepEqual( jQuery( "#groups" ).parentsUntil( "#html" ).get(), parents.slice( 0, -1 ).get(), "Simple parentsUntil check" );
assert.equal( jQuery( "#groups" ).parentsUntil( "#ap" ).length, 0, "Simple parentsUntil check" ); assert.equal( jQuery( "#groups" ).parentsUntil( "#ap" ).length, 0, "Simple parentsUntil check" );
assert.deepEqual( jQuery( "#nonnodes" ).contents().eq( 1 ).parentsUntil( "#html" ).eq( 0 ).get(), q( "nonnodes" ), "Text node parentsUntil check" ); assert.deepEqual( jQuery( "#nonnodes" ).contents().eq( 1 ).parentsUntil( "#html" ).eq( 0 ).get(), q( "nonnodes" ), "Text node parentsUntil check" );
assert.deepEqual( jQuery( "#groups" ).parentsUntil( "#html, #body" ).get(), parents.slice( 0, 3 ).get(), "Less simple parentsUntil check" ); assert.deepEqual( jQuery( "#groups" ).parentsUntil( "#html, #body" ).get(), parents.slice( 0, 2 ).get(), "Less simple parentsUntil check" );
assert.deepEqual( jQuery( "#groups" ).parentsUntil( "#html", "div" ).get(), jQuery( "#qunit-fixture" ).get(), "Filtered parentsUntil check" ); assert.deepEqual( jQuery( "#groups" ).parentsUntil( "#html", "div" ).get(), jQuery( "#qunit-fixture" ).get(), "Filtered parentsUntil check" );
assert.deepEqual( jQuery( "#groups" ).parentsUntil( "#html", "p,div,dl" ).get(), parents.slice( 0, 3 ).get(), "Multiple-filtered parentsUntil check" ); assert.deepEqual( jQuery( "#groups" ).parentsUntil( "#html", "p,div" ).get(), parents.slice( 0, 2 ).get(), "Multiple-filtered parentsUntil check" );
assert.equal( jQuery( "#groups" ).parentsUntil( "#html", "span" ).length, 0, "Filtered parentsUntil check, no match" ); assert.equal( jQuery( "#groups" ).parentsUntil( "#html", "span" ).length, 0, "Filtered parentsUntil check, no match" );
assert.deepEqual( jQuery( "#groups, #ap" ).parentsUntil( "#html", "p,div,dl" ).get(), parents.slice( 0, 3 ).get(), "Multi-source, multiple-filtered parentsUntil check" ); assert.deepEqual( jQuery( "#groups, #ap" ).parentsUntil( "#html", "p,div" ).get(), parents.slice( 0, 2 ).get(), "Multi-source, multiple-filtered parentsUntil check" );
} ); } );
QUnit.test( "next([String])", function( assert ) { QUnit.test( "next([String])", function( assert ) {
@ -784,7 +784,7 @@ QUnit[ "content" in document.createElement( "template" ) ? "test" : "skip" ](
jQuery( "#qunit-fixture" ).append( jQuery( "#qunit-fixture" ).append(
"<template id='template'>" + "<template id='template'>" +
" <script>testScript = 1;</script>" + " <script>testScript = 1;</script>" +
" <img src='data/1x1.jpg' onload='testImgOnload = 1' >" + " <img src='" + baseURL + "1x1.jpg' onload='testImgOnload = 1' >" +
"</template>" "</template>"
); );