implement CSP
bower updates debug heroku debug heroku heroku debug cookies
This commit is contained in:
Родитель
fe011ec608
Коммит
6fed1d3154
|
@ -4,7 +4,10 @@
|
|||
"define": true,
|
||||
"requirejs": true,
|
||||
"require": true,
|
||||
"$": true
|
||||
"$": true,
|
||||
"document": true,
|
||||
"navigator": true,
|
||||
"window": true
|
||||
},
|
||||
"bitwise": true,
|
||||
"curly": true,
|
||||
|
|
|
@ -11,6 +11,7 @@ module.exports = function (grunt) {
|
|||
browserJSHint.browser = true;
|
||||
|
||||
var clientSideJS = [
|
||||
'public/js/main.js',
|
||||
'public/js/**/*.js',
|
||||
'!public/js/lib/**',
|
||||
'!public/js/vendor/**'
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
"dependencies": {
|
||||
"jquery.validation": "~1.12.0",
|
||||
"bootstrap-datepicker": "~1.3.0",
|
||||
"jquery-cookie": "~1.4.0"
|
||||
"jquery-cookie": "~1.4.0",
|
||||
"jquery": "~2.1.0"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
"commit": "130f395eb8906e16db8506571f125a6beb28327a"
|
||||
},
|
||||
"_source": "git://github.com/jquery/jquery.git",
|
||||
"_target": ">= 1.6.4",
|
||||
"_originalSource": "jquery"
|
||||
"_target": "2.1.1-beta1",
|
||||
"_originalSource": "jquery",
|
||||
"_direct": true
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"name": "sizzle",
|
||||
"version": "1.10.16",
|
||||
"main": "./dist/sizzle.js",
|
||||
"devDependencies": {
|
||||
"qunit": "~1.12.0",
|
||||
"benchmark": "~1.0.0",
|
||||
"requirejs": "~2.1.8",
|
||||
"requirejs-domready": "~2.0.1",
|
||||
"requirejs-text": "~2.0.10"
|
||||
},
|
||||
"ignore": [
|
||||
"**/.*",
|
||||
"package.json",
|
||||
"bower.json",
|
||||
"speed",
|
||||
"Makefile",
|
||||
"*.md",
|
||||
"*.txt",
|
||||
"src",
|
||||
"Gruntfile.js"
|
||||
],
|
||||
"homepage": "https://github.com/jquery/sizzle",
|
||||
"_release": "1.10.16",
|
||||
"_resolution": {
|
||||
"type": "version",
|
||||
"tag": "1.10.16",
|
||||
"commit": "0fd151739d05648118002914c7a638411bbd0dbe"
|
||||
},
|
||||
"_source": "git://github.com/jquery/sizzle.git",
|
||||
"_target": "1.10.16",
|
||||
"_originalSource": "sizzle"
|
||||
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -0,0 +1,10 @@
|
|||
"use strict";
|
||||
|
||||
var exec = require( "child_process" ).exec;
|
||||
|
||||
module.exports = function( grunt ) {
|
||||
grunt.registerTask( "commit", "Add and commit changes", function( message ) {
|
||||
// Always add dist directory
|
||||
exec( "git add dist && git commit -m " + message, this.async() );
|
||||
});
|
||||
};
|
|
@ -0,0 +1,34 @@
|
|||
"use strict";
|
||||
|
||||
module.exports = function( grunt ) {
|
||||
grunt.registerMultiTask(
|
||||
"compile",
|
||||
"Compile sizzle.js to the dist directory. Embed date/version.",
|
||||
function() {
|
||||
var data = this.data,
|
||||
dest = data.dest,
|
||||
src = data.src,
|
||||
version = grunt.config( "pkg.version" ),
|
||||
compiled = grunt.file.read( src );
|
||||
|
||||
// Embed version and date
|
||||
compiled = compiled
|
||||
.replace( /@VERSION/g, version )
|
||||
.replace( "@DATE", function() {
|
||||
var date = new Date();
|
||||
|
||||
// YYYY-MM-DD
|
||||
return [
|
||||
date.getFullYear(),
|
||||
( "0" + ( date.getMonth() + 1 ) ).slice( -2 ),
|
||||
( "0" + date.getDate() ).slice( -2 )
|
||||
].join( "-" );
|
||||
});
|
||||
|
||||
// Write source to file
|
||||
grunt.file.write( dest, compiled );
|
||||
|
||||
grunt.log.ok( "File written to " + dest );
|
||||
}
|
||||
);
|
||||
};
|
|
@ -0,0 +1,35 @@
|
|||
"use strict";
|
||||
|
||||
var fs = require( "fs" );
|
||||
|
||||
module.exports = function( grunt ) {
|
||||
grunt.registerTask( "dist", "Process files for distribution", function() {
|
||||
var files = grunt.file.expand( { filter: "isFile" }, "dist/*" );
|
||||
|
||||
files.forEach(function( filename ) {
|
||||
var map,
|
||||
text = fs.readFileSync( filename, "utf8" );
|
||||
|
||||
// Modify map/min so that it points to files in the same folder;
|
||||
// see https://github.com/mishoo/UglifyJS2/issues/47
|
||||
if ( /\.map$/.test( filename ) ) {
|
||||
text = text.replace( /"dist\//g, "\"" );
|
||||
fs.writeFileSync( filename, text, "utf-8" );
|
||||
} else if ( /\.min\.js$/.test( filename ) ) {
|
||||
// Wrap sourceMap directive in multiline comments (#13274)
|
||||
text = text.replace( /\n?(\/\/@\s*sourceMappingURL=)(.*)/,
|
||||
function( _, directive, path ) {
|
||||
map = "\n" + directive + path.replace( /^dist\//, "" );
|
||||
return "";
|
||||
});
|
||||
if ( map ) {
|
||||
text = text.replace( /(^\/\*[\w\W]*?)\s*\*\/|$/,
|
||||
function( _, comment ) {
|
||||
return ( comment || "\n/*" ) + map + "\n*/";
|
||||
});
|
||||
}
|
||||
fs.writeFileSync( filename, text, "utf-8" );
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
|
@ -0,0 +1,43 @@
|
|||
"use strict";
|
||||
|
||||
var exec = require( "child_process" ).exec;
|
||||
|
||||
module.exports = function( grunt ) {
|
||||
var rpreversion = /(\d\.\d+\.\d+)-pre/;
|
||||
|
||||
grunt.registerTask( "release",
|
||||
"Release a version of sizzle, updates a pre version to released, " +
|
||||
"inserts `next` as the new pre version", function( next ) {
|
||||
|
||||
if ( !rpreversion.test( next ) ) {
|
||||
grunt.fatal( "Next version should be a -pre version (x.x.x-pre): " + next );
|
||||
return;
|
||||
}
|
||||
|
||||
var done,
|
||||
version = grunt.config( "pkg.version" );
|
||||
if ( !rpreversion.test( version ) ) {
|
||||
grunt.fatal( "Existing version is not a pre version: " + version );
|
||||
return;
|
||||
}
|
||||
version = version.replace( rpreversion, "$1" );
|
||||
|
||||
done = this.async();
|
||||
exec( "git diff --quiet HEAD", function( err ) {
|
||||
if ( err ) {
|
||||
grunt.fatal( "The working directory should be clean when releasing. Commit or stash changes." );
|
||||
return;
|
||||
}
|
||||
// Build to dist directories along with a map and tag the release
|
||||
grunt.task.run([
|
||||
// Commit new version
|
||||
"version:" + version,
|
||||
// Tag new version
|
||||
"tag:" + version,
|
||||
// Commit next version
|
||||
"version:" + next
|
||||
]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
};
|
|
@ -0,0 +1,9 @@
|
|||
"use strict";
|
||||
|
||||
var exec = require( "child_process" ).exec;
|
||||
|
||||
module.exports = function( grunt ) {
|
||||
grunt.registerTask( "tag", "Tag the specified version", function( version ) {
|
||||
exec( "git tag " + version, this.async() );
|
||||
});
|
||||
};
|
|
@ -0,0 +1,35 @@
|
|||
"use strict";
|
||||
|
||||
var exec = require( "child_process" ).exec;
|
||||
|
||||
module.exports = function( grunt ) {
|
||||
grunt.registerTask( "version", "Commit a new version", function( version ) {
|
||||
if ( !/\d\.\d+\.\d+(?:-pre)?/.test( version ) ) {
|
||||
grunt.fatal( "Version must follow semver release format: " + version );
|
||||
return;
|
||||
}
|
||||
|
||||
var done = this.async(),
|
||||
files = grunt.config( "version.files" ),
|
||||
rversion = /("version":\s*")[^"]+/;
|
||||
|
||||
// Update version in specified files
|
||||
files.forEach(function( filename ) {
|
||||
var text = grunt.file.read( filename );
|
||||
text = text.replace( rversion, "$1" + version );
|
||||
grunt.file.write( filename, text );
|
||||
});
|
||||
|
||||
// Add files to git index
|
||||
exec( "git add -A", function( err ) {
|
||||
if ( err ) {
|
||||
grunt.fatal( err );
|
||||
return;
|
||||
}
|
||||
// Commit next pre version
|
||||
grunt.config( "pkg.version", version );
|
||||
grunt.task.run([ "build", "uglify", "dist", "commit:'Update version to " + version + "'" ]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
};
|
|
@ -0,0 +1,22 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<script>var QUnit = parent.QUnit</script>
|
||||
<script src="testinit.js"></script>
|
||||
<script src="../../dist/sizzle.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
var doc = parent.document,
|
||||
unframed = [ doc.getElementById( "qunit-fixture" ), doc.body, doc.documentElement ],
|
||||
framed = Sizzle( "*" );
|
||||
|
||||
window.parent.iframeCallback(
|
||||
Sizzle.uniqueSort( unframed.concat( framed ) ),
|
||||
framed.concat( unframed.reverse() ),
|
||||
"Mixed array was sorted correctly"
|
||||
);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,136 @@
|
|||
var fireNative,
|
||||
jQuery = this.jQuery || "jQuery", // For testing .noConflict()
|
||||
$ = this.$ || "$",
|
||||
originaljQuery = jQuery,
|
||||
original$ = $;
|
||||
|
||||
(function() {
|
||||
// Config parameter to force basic code paths
|
||||
QUnit.config.urlConfig.push({
|
||||
id: "basic",
|
||||
label: "Bypass optimizations",
|
||||
tooltip: "Force use of the most basic code by disabling native querySelectorAll; contains; compareDocumentPosition"
|
||||
});
|
||||
if ( QUnit.urlParams.basic ) {
|
||||
document.querySelectorAll = null;
|
||||
document.documentElement.contains = null;
|
||||
document.documentElement.compareDocumentPosition = null;
|
||||
// Return array of length two to pass assertion
|
||||
// But support should be false as its not native
|
||||
document.getElementsByClassName = function() { return [ 0, 1 ]; };
|
||||
}
|
||||
})();
|
||||
|
||||
/**
|
||||
* Returns an array of elements with the given IDs
|
||||
* @example q("main", "foo", "bar")
|
||||
* @result [<div id="main">, <span id="foo">, <input id="bar">]
|
||||
*/
|
||||
function q() {
|
||||
var r = [],
|
||||
i = 0;
|
||||
|
||||
for ( ; i < arguments.length; i++ ) {
|
||||
r.push( document.getElementById( arguments[i] ) );
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts that a select matches the given IDs
|
||||
* @param {String} a - Assertion name
|
||||
* @param {String} b - Sizzle selector
|
||||
* @param {String} c - Array of ids to construct what is expected
|
||||
* @example t("Check for something", "//[a]", ["foo", "baar"]);
|
||||
* @result returns true if "//[a]" return two elements with the IDs 'foo' and 'baar'
|
||||
*/
|
||||
function t( a, b, c ) {
|
||||
var f = Sizzle(b),
|
||||
s = "",
|
||||
i = 0;
|
||||
|
||||
for ( ; i < f.length; i++ ) {
|
||||
s += ( s && "," ) + '"' + f[ i ].id + '"';
|
||||
}
|
||||
|
||||
deepEqual(f, q.apply( q, c ), a + " (" + b + ")");
|
||||
}
|
||||
|
||||
/**
|
||||
* Add random number to url to stop caching
|
||||
*
|
||||
* @example url("data/test.html")
|
||||
* @result "data/test.html?10538358428943"
|
||||
*
|
||||
* @example url("data/test.php?foo=bar")
|
||||
* @result "data/test.php?foo=bar&10538358345554"
|
||||
*/
|
||||
function url( value ) {
|
||||
return value + (/\?/.test(value) ? "&" : "?") + new Date().getTime() + "" + parseInt(Math.random()*100000);
|
||||
}
|
||||
|
||||
var createWithFriesXML = function() {
|
||||
var string = '<?xml version="1.0" encoding="UTF-8"?> \
|
||||
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" \
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema" \
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> \
|
||||
<soap:Body> \
|
||||
<jsconf xmlns="http://www.example.com/ns1"> \
|
||||
<response xmlns:ab="http://www.example.com/ns2"> \
|
||||
<meta> \
|
||||
<component id="seite1" class="component"> \
|
||||
<properties xmlns:cd="http://www.example.com/ns3"> \
|
||||
<property name="prop1"> \
|
||||
<thing /> \
|
||||
<value>1</value> \
|
||||
</property> \
|
||||
<property name="prop2"> \
|
||||
<thing att="something" /> \
|
||||
</property> \
|
||||
<foo_bar>foo</foo_bar> \
|
||||
</properties> \
|
||||
</component> \
|
||||
</meta> \
|
||||
</response> \
|
||||
</jsconf> \
|
||||
</soap:Body> \
|
||||
</soap:Envelope>';
|
||||
|
||||
return jQuery.parseXML( string );
|
||||
};
|
||||
|
||||
fireNative = document.createEvent ?
|
||||
function( node, type ) {
|
||||
var event = document.createEvent("HTMLEvents");
|
||||
event.initEvent( type, true, true );
|
||||
node.dispatchEvent( event );
|
||||
} :
|
||||
function( node, type ) {
|
||||
var event = document.createEventObject();
|
||||
node.fireEvent( "on" + type, event );
|
||||
};
|
||||
|
||||
function testIframeWithCallback( title, fileName, func ) {
|
||||
test( title, function() {
|
||||
var iframe;
|
||||
|
||||
stop();
|
||||
window.iframeCallback = function() {
|
||||
var self = this,
|
||||
args = arguments;
|
||||
setTimeout(function() {
|
||||
window.iframeCallback = undefined;
|
||||
iframe.remove();
|
||||
func.apply( self, args );
|
||||
func = function() {};
|
||||
start();
|
||||
}, 0 );
|
||||
};
|
||||
iframe = jQuery( "<div/>" ).css({ position: "absolute", width: "500px", left: "-600px" })
|
||||
.append( jQuery( "<iframe/>" ).attr( "src", url( "./data/" + fileName ) ) )
|
||||
.appendTo( "#qunit-fixture" );
|
||||
});
|
||||
};
|
||||
window.iframeCallback = undefined;
|
||||
|
||||
function moduleTeardown() {}
|
|
@ -0,0 +1,242 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr" id="html">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>Sizzle Test Suite</title>
|
||||
<link rel="Stylesheet" media="screen" href="libs/qunit/qunit.css" />
|
||||
<script type="text/javascript" src="libs/qunit/qunit.js"></script>
|
||||
<script type="text/javascript" src="data/testinit.js"></script>
|
||||
<script type="text/javascript" src="jquery.js"></script>
|
||||
<script type="text/javascript" src="../dist/sizzle.js"></script>
|
||||
<script type="text/javascript" src="unit/selector.js"></script>
|
||||
<script type="text/javascript" src="unit/utilities.js"></script>
|
||||
<script type="text/javascript" src="unit/extending.js"></script>
|
||||
</head>
|
||||
|
||||
<body id="body">
|
||||
<div id="qunit"></div>
|
||||
|
||||
<!-- Test HTML -->
|
||||
<dl id="dl" style="position:absolute;top:-32767px;left:-32767px;width:1px">
|
||||
<div id="qunit-fixture">
|
||||
<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 id="code1"><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"><!-- comment --></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">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 id="foo_descendent"></span></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>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="t12087">
|
||||
<input type="hidden" id="el12087" data-comma="0,1"/>
|
||||
</div>
|
||||
<div id="no-clone-exception"><object><embed></embed></object></div>
|
||||
<div id="names-group">
|
||||
<span id="name-is-example" name="example"></span>
|
||||
<span id="name-is-div" name="div"></span>
|
||||
</div>
|
||||
<script id="script-no-src"></script>
|
||||
<script id="script-src" src="data/empty.js"></script>
|
||||
<div id="id-name-tests">
|
||||
<a id="tName1ID" name="tName1"><span></span></a>
|
||||
<a id="tName2ID" name="tName2"><span></span></a>
|
||||
<div id="tName1"><span id="tName1-span">C</span></div>
|
||||
</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>
|
||||
</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>
|
||||
</dl>
|
||||
<br id="last"/>
|
||||
</body>
|
||||
</html>
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,244 @@
|
|||
/**
|
||||
* QUnit v1.12.0 - A JavaScript Unit Testing Framework
|
||||
*
|
||||
* http://qunitjs.com
|
||||
*
|
||||
* Copyright 2012 jQuery Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* http://jquery.org/license
|
||||
*/
|
||||
|
||||
/** Font Family and Sizes */
|
||||
|
||||
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
|
||||
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
|
||||
#qunit-tests { font-size: smaller; }
|
||||
|
||||
|
||||
/** Resets */
|
||||
|
||||
#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
|
||||
/** Header */
|
||||
|
||||
#qunit-header {
|
||||
padding: 0.5em 0 0.5em 1em;
|
||||
|
||||
color: #8699a4;
|
||||
background-color: #0d3349;
|
||||
|
||||
font-size: 1.5em;
|
||||
line-height: 1em;
|
||||
font-weight: normal;
|
||||
|
||||
border-radius: 5px 5px 0 0;
|
||||
-moz-border-radius: 5px 5px 0 0;
|
||||
-webkit-border-top-right-radius: 5px;
|
||||
-webkit-border-top-left-radius: 5px;
|
||||
}
|
||||
|
||||
#qunit-header a {
|
||||
text-decoration: none;
|
||||
color: #c2ccd1;
|
||||
}
|
||||
|
||||
#qunit-header a:hover,
|
||||
#qunit-header a:focus {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#qunit-testrunner-toolbar label {
|
||||
display: inline-block;
|
||||
padding: 0 .5em 0 .1em;
|
||||
}
|
||||
|
||||
#qunit-banner {
|
||||
height: 5px;
|
||||
}
|
||||
|
||||
#qunit-testrunner-toolbar {
|
||||
padding: 0.5em 0 0.5em 2em;
|
||||
color: #5E740B;
|
||||
background-color: #eee;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#qunit-userAgent {
|
||||
padding: 0.5em 0 0.5em 2.5em;
|
||||
background-color: #2b81af;
|
||||
color: #fff;
|
||||
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
|
||||
}
|
||||
|
||||
#qunit-modulefilter-container {
|
||||
float: right;
|
||||
}
|
||||
|
||||
/** Tests: Pass/Fail */
|
||||
|
||||
#qunit-tests {
|
||||
list-style-position: inside;
|
||||
}
|
||||
|
||||
#qunit-tests li {
|
||||
padding: 0.4em 0.5em 0.4em 2.5em;
|
||||
border-bottom: 1px solid #fff;
|
||||
list-style-position: inside;
|
||||
}
|
||||
|
||||
#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#qunit-tests li strong {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#qunit-tests li a {
|
||||
padding: 0.5em;
|
||||
color: #c2ccd1;
|
||||
text-decoration: none;
|
||||
}
|
||||
#qunit-tests li a:hover,
|
||||
#qunit-tests li a:focus {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
#qunit-tests li .runtime {
|
||||
float: right;
|
||||
font-size: smaller;
|
||||
}
|
||||
|
||||
.qunit-assert-list {
|
||||
margin-top: 0.5em;
|
||||
padding: 0.5em;
|
||||
|
||||
background-color: #fff;
|
||||
|
||||
border-radius: 5px;
|
||||
-moz-border-radius: 5px;
|
||||
-webkit-border-radius: 5px;
|
||||
}
|
||||
|
||||
.qunit-collapsed {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#qunit-tests table {
|
||||
border-collapse: collapse;
|
||||
margin-top: .2em;
|
||||
}
|
||||
|
||||
#qunit-tests th {
|
||||
text-align: right;
|
||||
vertical-align: top;
|
||||
padding: 0 .5em 0 0;
|
||||
}
|
||||
|
||||
#qunit-tests td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
#qunit-tests pre {
|
||||
margin: 0;
|
||||
white-space: pre-wrap;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
#qunit-tests del {
|
||||
background-color: #e0f2be;
|
||||
color: #374e0c;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#qunit-tests ins {
|
||||
background-color: #ffcaca;
|
||||
color: #500;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/*** Test Counts */
|
||||
|
||||
#qunit-tests b.counts { color: black; }
|
||||
#qunit-tests b.passed { color: #5E740B; }
|
||||
#qunit-tests b.failed { color: #710909; }
|
||||
|
||||
#qunit-tests li li {
|
||||
padding: 5px;
|
||||
background-color: #fff;
|
||||
border-bottom: none;
|
||||
list-style-position: inside;
|
||||
}
|
||||
|
||||
/*** Passing Styles */
|
||||
|
||||
#qunit-tests li li.pass {
|
||||
color: #3c510c;
|
||||
background-color: #fff;
|
||||
border-left: 10px solid #C6E746;
|
||||
}
|
||||
|
||||
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
|
||||
#qunit-tests .pass .test-name { color: #366097; }
|
||||
|
||||
#qunit-tests .pass .test-actual,
|
||||
#qunit-tests .pass .test-expected { color: #999999; }
|
||||
|
||||
#qunit-banner.qunit-pass { background-color: #C6E746; }
|
||||
|
||||
/*** Failing Styles */
|
||||
|
||||
#qunit-tests li li.fail {
|
||||
color: #710909;
|
||||
background-color: #fff;
|
||||
border-left: 10px solid #EE5757;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
#qunit-tests > li:last-child {
|
||||
border-radius: 0 0 5px 5px;
|
||||
-moz-border-radius: 0 0 5px 5px;
|
||||
-webkit-border-bottom-right-radius: 5px;
|
||||
-webkit-border-bottom-left-radius: 5px;
|
||||
}
|
||||
|
||||
#qunit-tests .fail { color: #000000; background-color: #EE5757; }
|
||||
#qunit-tests .fail .test-name,
|
||||
#qunit-tests .fail .module-name { color: #000000; }
|
||||
|
||||
#qunit-tests .fail .test-actual { color: #EE5757; }
|
||||
#qunit-tests .fail .test-expected { color: green; }
|
||||
|
||||
#qunit-banner.qunit-fail { background-color: #EE5757; }
|
||||
|
||||
|
||||
/** Result */
|
||||
|
||||
#qunit-testresult {
|
||||
padding: 0.5em 0.5em 0.5em 2.5em;
|
||||
|
||||
color: #2b81af;
|
||||
background-color: #D2E0E6;
|
||||
|
||||
border-bottom: 1px solid white;
|
||||
}
|
||||
#qunit-testresult .module-name {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/** Fixture */
|
||||
|
||||
#qunit-fixture {
|
||||
position: absolute;
|
||||
top: -10000px;
|
||||
left: -10000px;
|
||||
width: 1000px;
|
||||
height: 1000px;
|
||||
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,95 @@
|
|||
module("extending", { teardown: moduleTeardown });
|
||||
|
||||
test("custom pseudos", function() {
|
||||
expect( 6 );
|
||||
|
||||
Sizzle.selectors.filters.foundation = Sizzle.selectors.filters.root;
|
||||
deepEqual( Sizzle(":foundation"), [ document.documentElement ], "Copy element filter with new name" );
|
||||
delete Sizzle.selectors.filters.foundation;
|
||||
|
||||
Sizzle.selectors.setFilters.primary = Sizzle.selectors.setFilters.first;
|
||||
t( "Copy set filter with new name", "div:primary", ["qunit"] );
|
||||
delete Sizzle.selectors.setFilters.primary;
|
||||
|
||||
Sizzle.selectors.filters.aristotlean = Sizzle.selectors.createPseudo(function() {
|
||||
return function( elem ) {
|
||||
return !!elem.id;
|
||||
};
|
||||
});
|
||||
t( "Custom element filter", "#foo :aristotlean", [ "sndp", "en", "yahoo", "sap", "anchor2", "simon" ] );
|
||||
delete Sizzle.selectors.filters.aristotlean;
|
||||
|
||||
Sizzle.selectors.filters.endswith = Sizzle.selectors.createPseudo(function( text ) {
|
||||
return function( elem ) {
|
||||
return Sizzle.getText( elem ).slice( -text.length ) === text;
|
||||
};
|
||||
});
|
||||
t( "Custom element filter with argument", "a:endswith(ogle)", ["google"] );
|
||||
delete Sizzle.selectors.filters.endswith;
|
||||
|
||||
Sizzle.selectors.setFilters.second = Sizzle.selectors.createPseudo(function() {
|
||||
return Sizzle.selectors.createPseudo(function( seed, matches ) {
|
||||
if ( seed[1] ) {
|
||||
matches[1] = seed[1];
|
||||
seed[1] = false;
|
||||
}
|
||||
});
|
||||
});
|
||||
t( "Custom set filter", "#qunit-fixture p:second", ["ap"] );
|
||||
delete Sizzle.selectors.filters.second;
|
||||
|
||||
Sizzle.selectors.setFilters.slice = Sizzle.selectors.createPseudo(function( argument ) {
|
||||
var bounds = argument.split(":");
|
||||
return Sizzle.selectors.createPseudo(function( seed, matches ) {
|
||||
var i = bounds[1];
|
||||
|
||||
// Match elements found at the specified indexes
|
||||
while ( --i >= bounds[0] ) {
|
||||
if ( seed[i] ) {
|
||||
matches[i] = seed[i];
|
||||
seed[i] = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
t( "Custom set filter with argument", "#qunit-fixture p:slice(1:3)", [ "ap", "sndp" ] );
|
||||
delete Sizzle.selectors.filters.slice;
|
||||
});
|
||||
|
||||
test("backwards-compatible custom pseudos", function() {
|
||||
expect( 3 );
|
||||
|
||||
Sizzle.selectors.filters.icontains = function( elem, i, match ) {
|
||||
return Sizzle.getText( elem ).toLowerCase().indexOf( (match[3] || "").toLowerCase() ) > -1;
|
||||
};
|
||||
t( "Custom element filter with argument", "a:icontains(THIS BLOG ENTRY)", ["simon1"] );
|
||||
delete Sizzle.selectors.filters.icontains;
|
||||
|
||||
Sizzle.selectors.setFilters.podium = function( elements, argument ) {
|
||||
var count = argument == null || argument === "" ? 3 : +argument;
|
||||
return elements.slice( 0, count );
|
||||
};
|
||||
// Using TAG as the first token here forces this setMatcher into a fail state
|
||||
// Where the descendent combinator was lost
|
||||
t( "Custom setFilter", "form#form :PODIUM", ["label-for", "text1", "text2"] );
|
||||
t( "Custom setFilter with argument", "#form input:Podium(1)", ["text1"] );
|
||||
delete Sizzle.selectors.setFilters.podium;
|
||||
});
|
||||
|
||||
test("custom attribute getters", function() {
|
||||
expect( 2 );
|
||||
|
||||
var original = Sizzle.selectors.attrHandle.hreflang,
|
||||
selector = "a:contains('mark')[hreflang='http://diveintomark.org/en']";
|
||||
|
||||
Sizzle.selectors.attrHandle.hreflang = function( elem, name ) {
|
||||
var href = elem.getAttribute("href"),
|
||||
lang = elem.getAttribute( name );
|
||||
return lang && ( href + lang );
|
||||
};
|
||||
|
||||
deepEqual( Sizzle(selector, createWithFriesXML()), [], "Custom attrHandle (preferred document)" );
|
||||
t( "Custom attrHandle (preferred document)", selector, ["mark"] );
|
||||
|
||||
Sizzle.selectors.attrHandle.hreflang = original;
|
||||
});
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,169 @@
|
|||
module("utilities", { teardown: moduleTeardown });
|
||||
|
||||
function testAttr( doc ) {
|
||||
expect( 9 );
|
||||
|
||||
var el;
|
||||
if ( doc ) {
|
||||
// XML
|
||||
el = doc.createElement( "input" );
|
||||
el.setAttribute( "type", "checkbox" );
|
||||
} else {
|
||||
// Set checked on creation by creating with a fragment
|
||||
// See http://jsfiddle.net/8sVgA/1/show/light in oldIE
|
||||
el = jQuery( "<input type='checkbox' checked='checked' />" )[0];
|
||||
}
|
||||
|
||||
// Set it again for good measure
|
||||
el.setAttribute( "checked", "checked" );
|
||||
el.setAttribute( "id", "id" );
|
||||
el.setAttribute( "value", "on" );
|
||||
|
||||
strictEqual( Sizzle.attr( el, "nonexistent" ), null, "nonexistent" );
|
||||
strictEqual( Sizzle.attr( el, "id" ), "id", "existent" );
|
||||
strictEqual( Sizzle.attr( el, "value" ), "on", "value" );
|
||||
strictEqual( Sizzle.attr( el, "checked" ), "checked", "boolean" );
|
||||
strictEqual( Sizzle.attr( el, "href" ), null, "interpolation risk" );
|
||||
strictEqual( Sizzle.attr( el, "constructor" ), null,
|
||||
"Object.prototype property \"constructor\" (negative)" );
|
||||
strictEqual( Sizzle.attr( el, "watch" ), null,
|
||||
"Gecko Object.prototype property \"watch\" (negative)" );
|
||||
el.setAttribute( "constructor", "foo" );
|
||||
el.setAttribute( "watch", "bar" );
|
||||
strictEqual( Sizzle.attr( el, "constructor" ), "foo",
|
||||
"Object.prototype property \"constructor\"" );
|
||||
strictEqual( Sizzle.attr( el, "watch" ), "bar",
|
||||
"Gecko Object.prototype property \"watch\"" );
|
||||
}
|
||||
|
||||
test("Sizzle.attr (HTML)", function() {
|
||||
testAttr();
|
||||
});
|
||||
|
||||
test("Sizzle.attr (XML)", function() {
|
||||
testAttr( jQuery.parseXML("<root/>") );
|
||||
});
|
||||
|
||||
test("Sizzle.contains", function() {
|
||||
expect( 16 );
|
||||
|
||||
var container = document.getElementById("nonnodes"),
|
||||
element = container.firstChild,
|
||||
text = element.nextSibling,
|
||||
nonContained = container.nextSibling,
|
||||
detached = document.createElement("a");
|
||||
ok( element && element.nodeType === 1, "preliminary: found element" );
|
||||
ok( text && text.nodeType === 3, "preliminary: found text" );
|
||||
ok( nonContained, "preliminary: found non-descendant" );
|
||||
ok( Sizzle.contains(container, element), "child" );
|
||||
ok( Sizzle.contains(container.parentNode, element), "grandchild" );
|
||||
ok( Sizzle.contains(container, text), "text child" );
|
||||
ok( Sizzle.contains(container.parentNode, text), "text grandchild" );
|
||||
ok( !Sizzle.contains(container, container), "self" );
|
||||
ok( !Sizzle.contains(element, container), "parent" );
|
||||
ok( !Sizzle.contains(container, nonContained), "non-descendant" );
|
||||
ok( !Sizzle.contains(container, document), "document" );
|
||||
ok( !Sizzle.contains(container, document.documentElement), "documentElement (negative)" );
|
||||
ok( !Sizzle.contains(container, null), "Passing null does not throw an error" );
|
||||
ok( Sizzle.contains(document, document.documentElement), "documentElement (positive)" );
|
||||
ok( Sizzle.contains(document, element), "document container (positive)" );
|
||||
ok( !Sizzle.contains(document, detached), "document container (negative)" );
|
||||
});
|
||||
|
||||
if ( jQuery("<svg xmlns='http://www.w3.org/2000/svg' version='1.1' height='1' width='1'><g/></svg>")[0].firstChild ) {
|
||||
test("Sizzle.contains in SVG (jQuery #10832)", function() {
|
||||
expect( 4 );
|
||||
|
||||
var svg = jQuery(
|
||||
"<svg xmlns='http://www.w3.org/2000/svg' version='1.1' height='1' width='1'>" +
|
||||
"<g><circle cx='1' cy='1' r='1' /></g>" +
|
||||
"</svg>"
|
||||
).appendTo("#qunit-fixture")[0];
|
||||
|
||||
ok( Sizzle.contains( svg, svg.firstChild ), "root child" );
|
||||
ok( Sizzle.contains( svg.firstChild, svg.firstChild.firstChild ), "element child" );
|
||||
ok( Sizzle.contains( svg, svg.firstChild.firstChild ), "root granchild" );
|
||||
ok( !Sizzle.contains( svg.firstChild.firstChild, svg.firstChild ), "parent (negative)" );
|
||||
});
|
||||
}
|
||||
|
||||
test("Sizzle.uniqueSort", function() {
|
||||
expect( 14 );
|
||||
|
||||
function Arrayish( arr ) {
|
||||
var i = this.length = arr.length;
|
||||
while ( i-- ) {
|
||||
this[ i ] = arr[ i ];
|
||||
}
|
||||
}
|
||||
Arrayish.prototype = {
|
||||
slice: [].slice,
|
||||
sort: [].sort,
|
||||
splice: [].splice
|
||||
};
|
||||
|
||||
var i, tests,
|
||||
detached = [],
|
||||
body = document.body,
|
||||
fixture = document.getElementById("qunit-fixture"),
|
||||
detached1 = document.createElement("p"),
|
||||
detached2 = document.createElement("ul"),
|
||||
detachedChild = detached1.appendChild( document.createElement("a") ),
|
||||
detachedGrandchild = detachedChild.appendChild( document.createElement("b") );
|
||||
|
||||
for ( i = 0; i < 12; i++ ) {
|
||||
detached.push( document.createElement("li") );
|
||||
detached[i].id = "detached" + i;
|
||||
detached2.appendChild( document.createElement("li") ).id = "detachedChild" + i;
|
||||
}
|
||||
|
||||
tests = {
|
||||
"Empty": {
|
||||
input: [],
|
||||
expected: []
|
||||
},
|
||||
"Single-element": {
|
||||
input: [ fixture ],
|
||||
expected: [ fixture ]
|
||||
},
|
||||
"No duplicates": {
|
||||
input: [ fixture, body ],
|
||||
expected: [ body, fixture ]
|
||||
},
|
||||
"Duplicates": {
|
||||
input: [ body, fixture, fixture, body ],
|
||||
expected: [ body, fixture ]
|
||||
},
|
||||
"Detached": {
|
||||
input: detached.slice( 0 ),
|
||||
expected: detached.slice( 0 )
|
||||
},
|
||||
"Detached children": {
|
||||
input: [
|
||||
detached2.childNodes[0],
|
||||
detached2.childNodes[1],
|
||||
detached2.childNodes[2],
|
||||
detached2.childNodes[3]
|
||||
],
|
||||
expected: [
|
||||
detached2.childNodes[0],
|
||||
detached2.childNodes[1],
|
||||
detached2.childNodes[2],
|
||||
detached2.childNodes[3]
|
||||
]
|
||||
},
|
||||
"Attached/detached mixture": {
|
||||
input: [ detached1, fixture, detached2, document, detachedChild, body, detachedGrandchild ],
|
||||
expected: [ document, body, fixture ],
|
||||
length: 3
|
||||
}
|
||||
};
|
||||
|
||||
jQuery.each( tests, function( label, test ) {
|
||||
var length = test.length || test.input.length;
|
||||
deepEqual( Sizzle.uniqueSort( test.input ).slice( 0, length ), test.expected, label + " (array)" );
|
||||
deepEqual( Sizzle.uniqueSort( new Arrayish(test.input) ).slice( 0, length ), test.expected, label + " (quasi-array)" );
|
||||
});
|
||||
});
|
||||
|
||||
testIframeWithCallback( "Sizzle.uniqueSort works cross-window (jQuery #14381)", "mixed_sort.html", deepEqual );
|
|
@ -6,6 +6,11 @@
|
|||
color: #428BCA;
|
||||
}
|
||||
|
||||
body {
|
||||
padding-top: 70px;
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,3 +1,96 @@
|
|||
var login = document.querySelector("#login");
|
||||
if (login) {
|
||||
login.addEventListener("click", function () {
|
||||
navigator.id.request({
|
||||
siteName: "Ad hoc contribution logger"
|
||||
});
|
||||
}, false);
|
||||
}
|
||||
|
||||
var logout = document.querySelector("#logout");
|
||||
if (logout) {
|
||||
logout.addEventListener("click", function () {
|
||||
navigator.id.logout();
|
||||
}, false);
|
||||
}
|
||||
|
||||
var token = $("meta[name='csrf-token']").attr("content");
|
||||
var currentUser = $("meta[name='persona-email']").attr("content");
|
||||
if (!currentUser) {
|
||||
currentUser = null; // specifically set to null to avoid persona looping on logout
|
||||
}
|
||||
|
||||
navigator.id.watch({
|
||||
loggedInUser: currentUser,
|
||||
onlogin: function (assertion) {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: '/persona/verify',
|
||||
data: {
|
||||
assertion: assertion,
|
||||
_csrf: token
|
||||
},
|
||||
success: function (res, status, xhr) {
|
||||
window.location.reload();
|
||||
},
|
||||
error: function (xhr, status, err) {
|
||||
navigator.id.logout();
|
||||
window.alert("Login failure: " + err);
|
||||
}
|
||||
});
|
||||
},
|
||||
onlogout: function () {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: '/persona/logout',
|
||||
data: {
|
||||
_csrf: token
|
||||
},
|
||||
success: function (res, status, xhr) {
|
||||
window.location.reload();
|
||||
},
|
||||
error: function (xhr, status, err) {
|
||||
window.alert("Logout failure: " + err);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// pre-fill quick link
|
||||
|
||||
var type = $("#hiddenType").val();
|
||||
var team = $("#hiddenTeam").val();
|
||||
|
||||
if (type) {
|
||||
var textToFindType = type;
|
||||
textToFindType = decodeURI(textToFindType);
|
||||
var elType = document.getElementById('databucket');
|
||||
for (var i = 0; i < elType.options.length; i++) {
|
||||
if (elType.options[i].text === textToFindType) {
|
||||
elType.selectedIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (team) {
|
||||
var textToFindTeam = team;
|
||||
textToFindTeam = decodeURI(textToFindTeam);
|
||||
var elTeam = document.getElementById('teamname');
|
||||
for (var i = 0; i < elTeam.options.length; i++) {
|
||||
if (elTeam.options[i].text === textToFindTeam) {
|
||||
elTeam.selectedIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$(".deleteLink").click(function (event) {
|
||||
if (!confirm("Are you sure?")) {
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
|
||||
// Validation
|
||||
$.validator.addMethod("valueNotEquals", function (value, element, arg) {
|
||||
return arg !== value;
|
||||
|
|
|
@ -6,14 +6,9 @@
|
|||
<title>Ad hoc Contribution Logger</title>
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<meta name="csrf-token" content="{{{token}}}">
|
||||
<meta name="persona-email" content="{{{currentUser}}}">
|
||||
<link rel="stylesheet" href="css/bootstrap.min.css">
|
||||
<style>
|
||||
body {
|
||||
padding-top: 70px;
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
</style>
|
||||
<link rel="stylesheet" href="css/bootstrap-theme.min.css">
|
||||
<link rel="stylesheet" href="/bower/bootstrap-datepicker/css/datepicker.css">
|
||||
<link rel="stylesheet" href="css/main.css">
|
||||
|
@ -84,61 +79,12 @@
|
|||
</div>
|
||||
|
||||
|
||||
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
|
||||
<script>window.jQuery || document.write('<script src="/js/vendor/jquery-1.11.0.min.js"><\/script>')</script>
|
||||
<script src="/bower/jquery/dist/jquery.js"></script>
|
||||
<script src="/bower/jquery.validation/dist/jquery.validate.min.js"></script>
|
||||
|
||||
<!-- <script src="/js/vendor/bootstrap.min.js"></script> -->
|
||||
<script src="/bower/bootstrap/dist/js/bootstrap.min.js"></script>
|
||||
<script src="/bower/bootstrap-datepicker/js/bootstrap-datepicker.js"></script>
|
||||
<script src="/bower/jquery-cookie/jquery.cookie.js"></script>
|
||||
<script src="https://login.persona.org/include.js"></script>
|
||||
<script type="text/javascript">
|
||||
var login = document.querySelector("#login");
|
||||
if (login) {
|
||||
login.addEventListener("click", function() {
|
||||
navigator.id.request({ siteName: "Ad hoc contribution logger" });
|
||||
}, false);
|
||||
}
|
||||
|
||||
var logout = document.querySelector("#logout");
|
||||
if (logout) {
|
||||
logout.addEventListener("click", function() {
|
||||
navigator.id.logout();
|
||||
}, false);
|
||||
}
|
||||
|
||||
var currentUser = null;
|
||||
{{#if currentUser}}
|
||||
var currentUser = "{{{currentUser}}}";
|
||||
{{/if}}
|
||||
|
||||
navigator.id.watch({
|
||||
loggedInUser: currentUser,
|
||||
onlogin: function(assertion) {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: '/persona/verify',
|
||||
data: { assertion: assertion, _csrf: '{{{token}}}' },
|
||||
success: function(res, status, xhr) {
|
||||
window.location.reload();
|
||||
},
|
||||
error: function(xhr, status, err) {
|
||||
navigator.id.logout();
|
||||
alert("Login failure: " + err);
|
||||
}
|
||||
});
|
||||
},
|
||||
onlogout: function() {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: '/persona/logout',
|
||||
data: { _csrf: '{{{token}}}' },
|
||||
success: function(res, status, xhr) { window.location.reload(); },
|
||||
error: function(xhr, status, err) { alert("Logout failure: " + err); }
|
||||
});
|
||||
}
|
||||
});</script>
|
||||
<script src="js/main.js"></script>
|
||||
<script src="js/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
<td>{{this}}</td>
|
||||
{{/each}}
|
||||
|
||||
<td><a href="/delete?contributor_id={{contributor_id}}&contribution_date={{contribution_date}}&mofo_team={{mofo_team}}&data_bucket={{data_bucket}}" onclick="return confirm('Are you sure?')" class="btn btn-xm"><span class="glyphicon glyphicon-trash"></span></a></td>
|
||||
<td><a href="/delete?contributor_id={{contributor_id}}&contribution_date={{contribution_date}}&mofo_team={{mofo_team}}&data_bucket={{data_bucket}}" class="btn btn-xm deleteLink"><span class="glyphicon glyphicon-trash"></span></a></td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</table>
|
||||
|
@ -80,7 +80,7 @@
|
|||
<h4 class="modal-title" id="myModalLinkLabel">Quick link</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p>Use this URL as a shortcut to pre-populate this page.</p>
|
||||
<p>Use this URL as a shortcut to pre-populate this form with your What and When fields.</p>
|
||||
<p><input type="text" class="form-control" id="linkToCopy"></p>
|
||||
<p class="small">Save this as a bookmark, or copy and paste into your browser bar.</p>
|
||||
</div>
|
||||
|
@ -91,31 +91,5 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
{{#if type}}
|
||||
var textToFindType = '{{{type}}}';
|
||||
textToFindType = decodeURI(textToFindType);
|
||||
var elType = document.getElementById('databucket');
|
||||
for (var i = 0; i < elType.options.length; i++) {
|
||||
if (elType.options[i].text === textToFindType) {
|
||||
elType.selectedIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
{{/if}}
|
||||
|
||||
{{#if team}}
|
||||
var textToFindTeam = '{{{team}}}';
|
||||
textToFindTeam = decodeURI(textToFindTeam);
|
||||
var elTeam = document.getElementById('teamname');
|
||||
for (var i = 0; i < elTeam.options.length; i++) {
|
||||
if (elTeam.options[i].text === textToFindTeam) {
|
||||
elTeam.selectedIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
{{/if}}
|
||||
|
||||
</script>
|
||||
<input type="hidden" id="hiddenType" value="{{{type}}}">
|
||||
<input type="hidden" id="hiddenTeam" value="{{{team}}}">
|
||||
|
|
8
web.js
8
web.js
|
@ -10,6 +10,11 @@ var fs = require('fs');
|
|||
|
||||
var app = express();
|
||||
|
||||
var cspPolicy = {
|
||||
'default-src': ["'self'", 'https://login.persona.org'],
|
||||
'script-src': ["'self'", 'https://login.persona.org'],
|
||||
};
|
||||
|
||||
// set up handlebars view engine
|
||||
var handlebars = require('express3-handlebars').create({
|
||||
defaultLayout: 'main'
|
||||
|
@ -24,9 +29,9 @@ app.use(express.urlencoded());
|
|||
app.use(express.cookieParser(process.env.COOKIE_SECRET));
|
||||
app.use(express.session({
|
||||
secret: process.env.COOKIE_SECRET,
|
||||
proxy: true,
|
||||
cookie: {
|
||||
httpOnly: true,
|
||||
proxy: true,
|
||||
secure: true,
|
||||
},
|
||||
}));
|
||||
|
@ -38,6 +43,7 @@ app.use(function (req, res, next) {
|
|||
});
|
||||
app.use(helmet.hsts()); // HTTP Strict Transport Security
|
||||
app.use(helmet.xframe('deny')); // X-Frame-Options
|
||||
app.use(helmet.csp(cspPolicy));
|
||||
app.use(app.router);
|
||||
app.use(express.static(__dirname + '/public'));
|
||||
app.use('/bower', express.static(__dirname + '/bower_components'));
|
||||
|
|
Загрузка…
Ссылка в новой задаче