mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
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:
parent
e84d3bc02e
commit
ecd8ddea33
@ -5,3 +5,5 @@ node_js:
|
|||||||
- "6"
|
- "6"
|
||||||
- "8"
|
- "8"
|
||||||
- "9"
|
- "9"
|
||||||
|
addons:
|
||||||
|
chrome: stable
|
||||||
|
84
Gruntfile.js
84
Gruntfile.js
@ -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"
|
||||||
|
10
README.md
10
README.md
@ -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"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
22
build/tasks/qunit_fixture.js
Normal file
22
build/tasks/qunit_fixture.js
Normal 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 + "." );
|
||||||
|
} );
|
||||||
|
};
|
12
external/qunit/qunit.css
vendored
12
external/qunit/qunit.css
vendored
@ -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
2378
external/qunit/qunit.js
vendored
File diff suppressed because it is too large
Load Diff
16
package.json
16
package.json
@ -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": {
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
<?php
|
|
||||||
$type = $_REQUEST['content-type'];
|
|
||||||
header("Content-type: $type");
|
|
||||||
echo $_REQUEST['response']
|
|
||||||
?>
|
|
@ -1 +0,0 @@
|
|||||||
ok( "<?php echo $_SERVER['REQUEST_METHOD'] ?>" === "GET", "request method is <?php echo $_SERVER['REQUEST_METHOD'] ?>" );
|
|
@ -1 +0,0 @@
|
|||||||
<?php echo $_SERVER['REQUEST_METHOD'] ?>
|
|
@ -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>
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
<?php header("Content-type: atom+xml") ?>
|
|
||||||
<root>
|
|
||||||
<element />
|
|
||||||
</root>
|
|
@ -1,3 +0,0 @@
|
|||||||
<?php
|
|
||||||
sleep(30);
|
|
||||||
?>
|
|
@ -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;
|
||||||
|
14
test/data/csp.include.html
Normal file
14
test/data/csp.include.html
Normal 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>
|
@ -1 +0,0 @@
|
|||||||
<?php echo file_get_contents('php://input'); ?>
|
|
@ -1 +0,0 @@
|
|||||||
<?php echo $_SERVER['QUERY_STRING']; ?>
|
|
@ -1,6 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
header("HTTP/1.0 400 Bad Request");
|
|
||||||
header("Content-Type: application/json");
|
|
||||||
|
|
||||||
echo '{ "code": 40, "message": "Bad Request" }';
|
|
@ -1,5 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
header("HTTP/1.0 400 Bad Request");
|
|
||||||
|
|
||||||
echo "plain text message";
|
|
@ -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";
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -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";
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
@ -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} }';
|
|
||||||
}
|
|
||||||
?>
|
|
@ -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} })';
|
|
||||||
}
|
|
||||||
?>
|
|
@ -1,4 +0,0 @@
|
|||||||
<?php
|
|
||||||
sleep((int)$_GET['sleep']);
|
|
||||||
header('Content-type: text/javascript');
|
|
||||||
?>
|
|
244
test/data/mock.php
Normal file
244
test/data/mock.php
Normal 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 );
|
@ -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>';
|
|
||||||
?>
|
|
@ -1,5 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
header('HTTP/1.0 204 No Content');
|
|
||||||
|
|
||||||
?>
|
|
@ -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>
|
|
237
test/data/qunit-fixture.html
Normal file
237
test/data/qunit-fixture.html
Normal 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>
|
4
test/data/qunit-fixture.js
Normal file
4
test/data/qunit-fixture.js
Normal file
File diff suppressed because one or more lines are too long
@ -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." );
|
|
@ -1,5 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
header( "HTTP/1.0 $_GET[status] $_GET[text]" );
|
|
||||||
|
|
||||||
?>
|
|
@ -1,3 +0,0 @@
|
|||||||
<?php
|
|
||||||
file_put_contents("csp.log", "", LOCK_EX);
|
|
||||||
?>
|
|
@ -1,3 +0,0 @@
|
|||||||
<?php
|
|
||||||
file_put_contents("csp.log", "error", LOCK_EX);
|
|
||||||
?>
|
|
@ -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>
|
|
@ -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
|
@ -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
|
|
@ -1,3 +0,0 @@
|
|||||||
this.testBar = "bar";
|
|
||||||
jQuery("#ap").html("bar");
|
|
||||||
ok( true, "testbar.php executed");
|
|
@ -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,
|
||||||
|
@ -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)";
|
|
||||||
?>
|
|
247
test/index.html
247
test/index.html
@ -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
45
test/karma.context.html
Normal 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
47
test/karma.debug.html
Normal 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>
|
284
test/middleware-mockserver.js
Normal file
284
test/middleware-mockserver.js
Normal 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
@ -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" );
|
||||||
} );
|
} );
|
||||||
|
@ -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()();
|
||||||
|
@ -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 ) {
|
||||||
|
@ -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",
|
||||||
|
@ -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 ) {
|
||||||
|
2
test/unit/effects.js
vendored
2
test/unit/effects.js
vendored
@ -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 ) {
|
||||||
|
@ -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 ) {
|
||||||
|
@ -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" );
|
||||||
|
@ -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();
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
@ -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 );
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -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>"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user