Merge branch 'master' of github.com:jquery/jquery into fix-8790a-quicker-trigger

This commit is contained in:
Dave Methvin 2011-04-21 22:15:21 -04:00
commit 16312c6b06
23 changed files with 994 additions and 757 deletions

View file

@ -182,8 +182,6 @@ var OPERATORS = array_to_hash([
">>=", ">>=",
"<<=", "<<=",
">>>=", ">>>=",
"~=",
"%=",
"|=", "|=",
"^=", "^=",
"&=", "&=",
@ -191,7 +189,7 @@ var OPERATORS = array_to_hash([
"||" "||"
]); ]);
var WHITESPACE_CHARS = array_to_hash(characters(" \n\r\t")); var WHITESPACE_CHARS = array_to_hash(characters(" \n\r\t\u200b"));
var PUNC_BEFORE_EXPRESSION = array_to_hash(characters("[{}(,.;:")); var PUNC_BEFORE_EXPRESSION = array_to_hash(characters("[{}(,.;:"));
@ -201,20 +199,47 @@ var REGEXP_MODIFIERS = array_to_hash(characters("gmsiy"));
/* -----[ Tokenizer ]----- */ /* -----[ Tokenizer ]----- */
function is_alphanumeric_char(ch) { // regexps adapted from http://xregexp.com/plugins/#unicode
ch = ch.charCodeAt(0); var UNICODE = {
return (ch >= 48 && ch <= 57) || letter: new RegExp("[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0523\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0621-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971\\u0972\\u097B-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D28\\u0D2A-\\u0D39\\u0D3D\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC\\u0EDD\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8B\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10D0-\\u10FA\\u10FC\\u1100-\\u1159\\u115F-\\u11A2\\u11A8-\\u11F9\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u1676\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19A9\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u2094\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2C6F\\u2C71-\\u2C7D\\u2C80-\\u2CE4\\u2D00-\\u2D25\\u2D30-\\u2D65\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31B7\\u31F0-\\u31FF\\u3400\\u4DB5\\u4E00\\u9FC3\\uA000-\\uA48C\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA65F\\uA662-\\uA66E\\uA67F-\\uA697\\uA717-\\uA71F\\uA722-\\uA788\\uA78B\\uA78C\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA90A-\\uA925\\uA930-\\uA946\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAC00\\uD7A3\\uF900-\\uFA2D\\uFA30-\\uFA6A\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]"),
(ch >= 65 && ch <= 90) || non_spacing_mark: new RegExp("[\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065E\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0900-\\u0902\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F90-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1DC0-\\u1DE6\\u1DFD-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26]"),
(ch >= 97 && ch <= 122); space_combining_mark: new RegExp("[\\u0903\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A19-\\u1A1B\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC]"),
connector_punctuation: new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]")
}; };
function is_identifier_char(ch) { function is_letter(ch) {
return is_alphanumeric_char(ch) || ch == "$" || ch == "_"; return UNICODE.letter.test(ch);
}; };
function is_digit(ch) { function is_digit(ch) {
ch = ch.charCodeAt(0); ch = ch.charCodeAt(0);
return ch >= 48 && ch <= 57; return ch >= 48 && ch <= 57; //XXX: find out if "UnicodeDigit" means something else than 0..9
};
function is_alphanumeric_char(ch) {
return is_digit(ch) || is_letter(ch);
};
function is_unicode_combining_mark(ch) {
return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch);
};
function is_unicode_connector_punctuation(ch) {
return UNICODE.connector_punctuation.test(ch);
};
function is_identifier_start(ch) {
return ch == "$" || ch == "_" || is_letter(ch);
};
function is_identifier_char(ch) {
return is_identifier_start(ch)
|| is_unicode_combining_mark(ch)
|| is_digit(ch)
|| is_unicode_connector_punctuation(ch)
|| ch == "\u200c" // zero-width non-joiner <ZWNJ>
|| ch == "\u200d" // zero-width joiner <ZWJ> (in my ECMA-262 PDF, this is also 200c)
;
}; };
function parse_js_number(num) { function parse_js_number(num) {
@ -253,18 +278,19 @@ function is_token(token, type, val) {
var EX_EOF = {}; var EX_EOF = {};
function tokenizer($TEXT, skip_comments) { function tokenizer($TEXT) {
var S = { var S = {
text : $TEXT.replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, ''), text : $TEXT.replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, ''),
pos : 0, pos : 0,
tokpos : 0, tokpos : 0,
line : 0, line : 0,
tokline : 0, tokline : 0,
col : 0, col : 0,
tokcol : 0, tokcol : 0,
newline_before : false, newline_before : false,
regex_allowed : false regex_allowed : false,
comments_before : []
}; };
function peek() { return S.text.charAt(S.pos); }; function peek() { return S.text.charAt(S.pos); };
@ -299,7 +325,7 @@ function tokenizer($TEXT, skip_comments) {
S.tokpos = S.pos; S.tokpos = S.pos;
}; };
function token(type, value) { function token(type, value, is_comment) {
S.regex_allowed = ((type == "operator" && !HOP(UNARY_POSTFIX, value)) || S.regex_allowed = ((type == "operator" && !HOP(UNARY_POSTFIX, value)) ||
(type == "keyword" && HOP(KEYWORDS_BEFORE_EXPRESSION, value)) || (type == "keyword" && HOP(KEYWORDS_BEFORE_EXPRESSION, value)) ||
(type == "punc" && HOP(PUNC_BEFORE_EXPRESSION, value))); (type == "punc" && HOP(PUNC_BEFORE_EXPRESSION, value)));
@ -311,6 +337,10 @@ function tokenizer($TEXT, skip_comments) {
pos : S.tokpos, pos : S.tokpos,
nlb : S.newline_before nlb : S.newline_before
}; };
if (!is_comment) {
ret.comments_before = S.comments_before;
S.comments_before = [];
}
S.newline_before = false; S.newline_before = false;
return ret; return ret;
}; };
@ -351,7 +381,7 @@ function tokenizer($TEXT, skip_comments) {
if (ch == "+") return after_e; if (ch == "+") return after_e;
after_e = false; after_e = false;
if (ch == ".") { if (ch == ".") {
if (!has_dot) if (!has_dot && !has_x)
return has_dot = true; return has_dot = true;
return false; return false;
} }
@ -417,7 +447,7 @@ function tokenizer($TEXT, skip_comments) {
ret = S.text.substring(S.pos, i); ret = S.text.substring(S.pos, i);
S.pos = i; S.pos = i;
} }
return token("comment1", ret); return token("comment1", ret, true);
}; };
function read_multiline_comment() { function read_multiline_comment() {
@ -425,14 +455,41 @@ function tokenizer($TEXT, skip_comments) {
return with_eof_error("Unterminated multiline comment", function(){ return with_eof_error("Unterminated multiline comment", function(){
var i = find("*/", true), var i = find("*/", true),
text = S.text.substring(S.pos, i), text = S.text.substring(S.pos, i),
tok = token("comment2", text); tok = token("comment2", text, true);
S.pos = i + 2; S.pos = i + 2;
S.line += text.split("\n").length - 1; S.line += text.split("\n").length - 1;
S.newline_before = text.indexOf("\n") >= 0; S.newline_before = text.indexOf("\n") >= 0;
// https://github.com/mishoo/UglifyJS/issues/#issue/100
if (/^@cc_on/i.test(text)) {
warn("WARNING: at line " + S.line);
warn("*** Found \"conditional comment\": " + text);
warn("*** UglifyJS DISCARDS ALL COMMENTS. This means your code might no longer work properly in Internet Explorer.");
}
return tok; return tok;
}); });
}; };
function read_name() {
var backslash = false, name = "", ch;
while ((ch = peek()) != null) {
if (!backslash) {
if (ch == "\\") backslash = true, next();
else if (is_identifier_char(ch)) name += next();
else break;
}
else {
if (ch != "u") parse_error("Expecting UnicodeEscapeSequence -- uXXXX");
ch = read_escaped_char();
if (!is_identifier_char(ch)) parse_error("Unicode char: " + ch.charCodeAt(0) + " is not valid in identifier");
name += ch;
backslash = false;
}
}
return name;
};
function read_regexp() { function read_regexp() {
return with_eof_error("Unterminated regular expression", function(){ return with_eof_error("Unterminated regular expression", function(){
var prev_backslash = false, regexp = "", ch, in_class = false; var prev_backslash = false, regexp = "", ch, in_class = false;
@ -452,15 +509,14 @@ function tokenizer($TEXT, skip_comments) {
} else { } else {
regexp += ch; regexp += ch;
} }
var mods = read_while(function(ch){ var mods = read_name();
return HOP(REGEXP_MODIFIERS, ch);
});
return token("regexp", [ regexp, mods ]); return token("regexp", [ regexp, mods ]);
}); });
}; };
function read_operator(prefix) { function read_operator(prefix) {
function grow(op) { function grow(op) {
if (!peek()) return op;
var bigger = op + peek(); var bigger = op + peek();
if (HOP(OPERATORS, bigger)) { if (HOP(OPERATORS, bigger)) {
next(); next();
@ -472,19 +528,18 @@ function tokenizer($TEXT, skip_comments) {
return token("operator", grow(prefix || next())); return token("operator", grow(prefix || next()));
}; };
var handle_slash = skip_comments ? function() { function handle_slash() {
next(); next();
var regex_allowed = S.regex_allowed; var regex_allowed = S.regex_allowed;
switch (peek()) { switch (peek()) {
case "/": read_line_comment(); S.regex_allowed = regex_allowed; return next_token(); case "/":
case "*": read_multiline_comment(); S.regex_allowed = regex_allowed; return next_token(); S.comments_before.push(read_line_comment());
} S.regex_allowed = regex_allowed;
return S.regex_allowed ? read_regexp() : read_operator("/"); return next_token();
} : function() { case "*":
next(); S.comments_before.push(read_multiline_comment());
switch (peek()) { S.regex_allowed = regex_allowed;
case "/": return read_line_comment(); return next_token();
case "*": return read_multiline_comment();
} }
return S.regex_allowed ? read_regexp() : read_operator("/"); return S.regex_allowed ? read_regexp() : read_operator("/");
}; };
@ -497,7 +552,7 @@ function tokenizer($TEXT, skip_comments) {
}; };
function read_word() { function read_word() {
var word = read_while(is_identifier_char); var word = read_name();
return !HOP(KEYWORDS, word) return !HOP(KEYWORDS, word)
? token("name", word) ? token("name", word)
: HOP(OPERATORS, word) : HOP(OPERATORS, word)
@ -529,7 +584,7 @@ function tokenizer($TEXT, skip_comments) {
if (ch == ".") return handle_dot(); if (ch == ".") return handle_dot();
if (ch == "/") return handle_slash(); if (ch == "/") return handle_slash();
if (HOP(OPERATOR_CHARS, ch)) return read_operator(); if (HOP(OPERATOR_CHARS, ch)) return read_operator();
if (is_identifier_char(ch)) return read_word(); if (ch == "\\" || is_identifier_start(ch)) return read_word();
parse_error("Unexpected character '" + ch + "'"); parse_error("Unexpected character '" + ch + "'");
}; };
@ -565,7 +620,7 @@ var ASSIGNMENT = (function(a, ret, i){
} }
return ret; return ret;
})( })(
["+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "~=", "%=", "|=", "^=", "&="], ["+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&="],
{ "=": true }, { "=": true },
0 0
); );
@ -608,16 +663,16 @@ function NodeWithToken(str, start, end) {
NodeWithToken.prototype.toString = function() { return this.name; }; NodeWithToken.prototype.toString = function() { return this.name; };
function parse($TEXT, strict_mode, embed_tokens) { function parse($TEXT, exigent_mode, embed_tokens) {
var S = { var S = {
input: tokenizer($TEXT, true), input : typeof $TEXT == "string" ? tokenizer($TEXT, true) : $TEXT,
token: null, token : null,
prev: null, prev : null,
peeked: null, peeked : null,
in_function: 0, in_function : 0,
in_loop: 0, in_loop : 0,
labels: [] labels : []
}; };
S.token = next(); S.token = next();
@ -671,7 +726,7 @@ function parse($TEXT, strict_mode, embed_tokens) {
function expect(punc) { return expect_token("punc", punc); }; function expect(punc) { return expect_token("punc", punc); };
function can_insert_semicolon() { function can_insert_semicolon() {
return !strict_mode && ( return !exigent_mode && (
S.token.nlb || is("eof") || is("punc", "}") S.token.nlb || is("eof") || is("punc", "}")
); );
}; };
@ -693,14 +748,14 @@ function parse($TEXT, strict_mode, embed_tokens) {
}; };
function add_tokens(str, start, end) { function add_tokens(str, start, end) {
return new NodeWithToken(str, start, end); return str instanceof NodeWithToken ? str : new NodeWithToken(str, start, end);
}; };
var statement = embed_tokens ? function() { var statement = embed_tokens ? function() {
var start = S.token; var start = S.token;
var stmt = $statement(); var ast = $statement.apply(this, arguments);
stmt[0] = add_tokens(stmt[0], start, prev()); ast[0] = add_tokens(ast[0], start, prev());
return stmt; return ast;
} : $statement; } : $statement;
function $statement() { function $statement() {
@ -802,7 +857,7 @@ function parse($TEXT, strict_mode, embed_tokens) {
function labeled_statement(label) { function labeled_statement(label) {
S.labels.push(label); S.labels.push(label);
var start = S.token, stat = statement(); var start = S.token, stat = statement();
if (strict_mode && !HOP(STATEMENTS_WITH_LABELS, stat[0])) if (exigent_mode && !HOP(STATEMENTS_WITH_LABELS, stat[0]))
unexpected(start); unexpected(start);
S.labels.pop(); S.labels.pop();
return as("label", label, stat); return as("label", label, stat);
@ -827,29 +882,42 @@ function parse($TEXT, strict_mode, embed_tokens) {
function for_() { function for_() {
expect("("); expect("(");
var has_var = is("keyword", "var"); var init = null;
if (has_var) if (!is("punc", ";")) {
next(); init = is("keyword", "var")
if (is("name") && is_token(peek(), "operator", "in")) { ? (next(), var_(true))
// for (i in foo) : expression(true, true);
var name = S.token.value; if (is("operator", "in"))
next(); next(); return for_in(init);
var obj = expression();
expect(")");
return as("for-in", has_var, name, obj, in_loop(statement));
} else {
// classic for
var init = is("punc", ";") ? null : has_var ? var_() : expression();
expect(";");
var test = is("punc", ";") ? null : expression();
expect(";");
var step = is("punc", ")") ? null : expression();
expect(")");
return as("for", init, test, step, in_loop(statement));
} }
return regular_for(init);
}; };
function function_(in_statement) { function regular_for(init) {
expect(";");
var test = is("punc", ";") ? null : expression();
expect(";");
var step = is("punc", ")") ? null : expression();
expect(")");
return as("for", init, test, step, in_loop(statement));
};
function for_in(init) {
var lhs = init[0] == "var" ? as("name", init[1][0]) : init;
next();
var obj = expression();
expect(")");
return as("for-in", init, lhs, obj, in_loop(statement));
};
var function_ = embed_tokens ? function() {
var start = prev();
var ast = $function_.apply(this, arguments);
ast[0] = add_tokens(ast[0], start, prev());
return ast;
} : $function_;
function $function_(in_statement) {
var name = is("name") ? prog1(S.token.value, next) : null; var name = is("name") ? prog1(S.token.value, next) : null;
if (in_statement && !name) if (in_statement && !name)
unexpected(); unexpected();
@ -946,7 +1014,7 @@ function parse($TEXT, strict_mode, embed_tokens) {
return as("try", body, bcatch, bfinally); return as("try", body, bcatch, bfinally);
}; };
function vardefs() { function vardefs(no_in) {
var a = []; var a = [];
for (;;) { for (;;) {
if (!is("name")) if (!is("name"))
@ -955,7 +1023,7 @@ function parse($TEXT, strict_mode, embed_tokens) {
next(); next();
if (is("operator", "=")) { if (is("operator", "=")) {
next(); next();
a.push([ name, expression(false) ]); a.push([ name, expression(false, no_in) ]);
} else { } else {
a.push([ name ]); a.push([ name ]);
} }
@ -966,8 +1034,8 @@ function parse($TEXT, strict_mode, embed_tokens) {
return a; return a;
}; };
function var_() { function var_(no_in) {
return as("var", vardefs()); return as("var", vardefs(no_in));
}; };
function const_() { function const_() {
@ -1022,27 +1090,30 @@ function parse($TEXT, strict_mode, embed_tokens) {
unexpected(); unexpected();
}; };
function expr_list(closing, allow_trailing_comma) { function expr_list(closing, allow_trailing_comma, allow_empty) {
var first = true, a = []; var first = true, a = [];
while (!is("punc", closing)) { while (!is("punc", closing)) {
if (first) first = false; else expect(","); if (first) first = false; else expect(",");
if (allow_trailing_comma && is("punc", closing)) if (allow_trailing_comma && is("punc", closing)) break;
break; if (is("punc", ",") && allow_empty) {
a.push(expression(false)); a.push([ "atom", "undefined" ]);
} else {
a.push(expression(false));
}
} }
next(); next();
return a; return a;
}; };
function array_() { function array_() {
return as("array", expr_list("]", !strict_mode)); return as("array", expr_list("]", !exigent_mode, true));
}; };
function object_() { function object_() {
var first = true, a = []; var first = true, a = [];
while (!is("punc", "}")) { while (!is("punc", "}")) {
if (first) first = false; else expect(","); if (first) first = false; else expect(",");
if (!strict_mode && is("punc", "}")) if (!exigent_mode && is("punc", "}"))
// allow trailing comma // allow trailing comma
break; break;
var type = S.token.type; var type = S.token.type;
@ -1105,61 +1176,65 @@ function parse($TEXT, strict_mode, embed_tokens) {
return as(tag, op, expr); return as(tag, op, expr);
}; };
function expr_op(left, min_prec) { function expr_op(left, min_prec, no_in) {
var op = is("operator") ? S.token.value : null; var op = is("operator") ? S.token.value : null;
if (op && op == "in" && no_in) op = null;
var prec = op != null ? PRECEDENCE[op] : null; var prec = op != null ? PRECEDENCE[op] : null;
if (prec != null && prec > min_prec) { if (prec != null && prec > min_prec) {
next(); next();
var right = expr_op(expr_atom(true), prec); var right = expr_op(expr_atom(true), prec, no_in);
return expr_op(as("binary", op, left, right), min_prec); return expr_op(as("binary", op, left, right), min_prec, no_in);
} }
return left; return left;
}; };
function expr_ops() { function expr_ops(no_in) {
return expr_op(expr_atom(true), 0); return expr_op(expr_atom(true), 0, no_in);
}; };
function maybe_conditional() { function maybe_conditional(no_in) {
var expr = expr_ops(); var expr = expr_ops(no_in);
if (is("operator", "?")) { if (is("operator", "?")) {
next(); next();
var yes = expression(false); var yes = expression(false);
expect(":"); expect(":");
return as("conditional", expr, yes, expression(false)); return as("conditional", expr, yes, expression(false, no_in));
} }
return expr; return expr;
}; };
function is_assignable(expr) { function is_assignable(expr) {
if (!exigent_mode) return true;
switch (expr[0]) { switch (expr[0]) {
case "dot": case "dot":
case "sub": case "sub":
case "new":
case "call":
return true; return true;
case "name": case "name":
return expr[1] != "this"; return expr[1] != "this";
} }
}; };
function maybe_assign() { function maybe_assign(no_in) {
var left = maybe_conditional(), val = S.token.value; var left = maybe_conditional(no_in), val = S.token.value;
if (is("operator") && HOP(ASSIGNMENT, val)) { if (is("operator") && HOP(ASSIGNMENT, val)) {
if (is_assignable(left)) { if (is_assignable(left)) {
next(); next();
return as("assign", ASSIGNMENT[val], left, maybe_assign()); return as("assign", ASSIGNMENT[val], left, maybe_assign(no_in));
} }
croak("Invalid assignment"); croak("Invalid assignment");
} }
return left; return left;
}; };
function expression(commas) { function expression(commas, no_in) {
if (arguments.length == 0) if (arguments.length == 0)
commas = true; commas = true;
var expr = maybe_assign(); var expr = maybe_assign(no_in);
if (commas && is("punc", ",")) { if (commas && is("punc", ",")) {
next(); next();
return as("seq", expr, expression()); return as("seq", expr, expression(true, no_in));
} }
return expr; return expr;
}; };
@ -1222,6 +1297,8 @@ function HOP(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop); return Object.prototype.hasOwnProperty.call(obj, prop);
}; };
var warn = function() {};
/* -----[ Exports ]----- */ /* -----[ Exports ]----- */
exports.tokenizer = tokenizer; exports.tokenizer = tokenizer;
@ -1237,3 +1314,6 @@ exports.KEYWORDS = KEYWORDS;
exports.ATOMIC_START_TOKEN = ATOMIC_START_TOKEN; exports.ATOMIC_START_TOKEN = ATOMIC_START_TOKEN;
exports.OPERATORS = OPERATORS; exports.OPERATORS = OPERATORS;
exports.is_alphanumeric_char = is_alphanumeric_char; exports.is_alphanumeric_char = is_alphanumeric_char;
exports.set_logger = function(logger) {
warn = logger;
};

File diff suppressed because it is too large Load diff

View file

@ -95,7 +95,7 @@ function addToPrefiltersOrTransports( structure ) {
}; };
} }
//Base inspection function for prefilters and transports // Base inspection function for prefilters and transports
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR, function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
dataType /* internal */, inspected /* internal */ ) { dataType /* internal */, inspected /* internal */ ) {
@ -389,6 +389,7 @@ jQuery.extend({
ifModifiedKey, ifModifiedKey,
// Headers (they are sent all at once) // Headers (they are sent all at once)
requestHeaders = {}, requestHeaders = {},
requestHeadersNames = {},
// Response headers // Response headers
responseHeadersString, responseHeadersString,
responseHeaders, responseHeaders,
@ -412,7 +413,9 @@ jQuery.extend({
// Caches the header // Caches the header
setRequestHeader: function( name, value ) { setRequestHeader: function( name, value ) {
if ( !state ) { if ( !state ) {
requestHeaders[ name.toLowerCase() ] = { n: name, v: value }; var lname = name.toLowerCase();
name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
requestHeaders[ name ] = value;
} }
return this; return this;
}, },

View file

@ -1,21 +1,14 @@
(function( jQuery ) { (function( jQuery ) {
var // #5280: next active xhr id and list of active xhrs' callbacks var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
xhrId = jQuery.now(), xhrOnUnloadAbort = window.ActiveXObject ? function() {
xhrCallbacks,
// XHR used to determine supports properties
testXHR;
// #5280: Internet Explorer will keep connections alive if we don't abort on unload
function xhrOnUnloadAbort() {
jQuery( window ).unload(function() {
// Abort all pending requests // Abort all pending requests
for ( var key in xhrCallbacks ) { for ( var key in xhrCallbacks ) {
xhrCallbacks[ key ]( 0, 1 ); xhrCallbacks[ key ]( 0, 1 );
} }
}); } : false,
} xhrId = 0,
xhrCallbacks;
// Functions to create xhrs // Functions to create xhrs
function createStandardXHR() { function createStandardXHR() {
@ -45,15 +38,13 @@ jQuery.ajaxSettings.xhr = window.ActiveXObject ?
// For all other browsers, use the standard XMLHttpRequest object // For all other browsers, use the standard XMLHttpRequest object
createStandardXHR; createStandardXHR;
// Test if we can create an xhr object // Determine support properties
testXHR = jQuery.ajaxSettings.xhr(); (function( xhr ) {
jQuery.support.ajax = !!testXHR; jQuery.extend( jQuery.support, {
ajax: !!xhr,
// Does this browser support crossDomain XHR requests cors: !!xhr && ( "withCredentials" in xhr )
jQuery.support.cors = testXHR && ( "withCredentials" in testXHR ); });
})( jQuery.ajaxSettings.xhr() );
// No need for the temporary xhr anymore
testXHR = undefined;
// Create transport if the browser can provide an xhr // Create transport if the browser can provide an xhr
if ( jQuery.support.ajax ) { if ( jQuery.support.ajax ) {
@ -104,7 +95,7 @@ if ( jQuery.support.ajax ) {
// Need an extra try/catch for cross domain requests in Firefox 3 // Need an extra try/catch for cross domain requests in Firefox 3
try { try {
for ( i in headers ) { for ( i in headers ) {
xhr.setRequestHeader( headers[ i ].n, headers[ i ].v ); xhr.setRequestHeader( i, headers[ i ] );
} }
} catch( _ ) {} } catch( _ ) {}
@ -136,7 +127,9 @@ if ( jQuery.support.ajax ) {
// Do not keep as active anymore // Do not keep as active anymore
if ( handle ) { if ( handle ) {
xhr.onreadystatechange = jQuery.noop; xhr.onreadystatechange = jQuery.noop;
delete xhrCallbacks[ handle ]; if ( xhrOnUnloadAbort ) {
delete xhrCallbacks[ handle ];
}
} }
// If it's an abort // If it's an abort
@ -197,15 +190,18 @@ if ( jQuery.support.ajax ) {
if ( !s.async || xhr.readyState === 4 ) { if ( !s.async || xhr.readyState === 4 ) {
callback(); callback();
} else { } else {
// Create the active xhrs callbacks list if needed handle = ++xhrId;
// and attach the unload handler if ( xhrOnUnloadAbort ) {
if ( !xhrCallbacks ) { // Create the active xhrs callbacks list if needed
xhrCallbacks = {}; // and attach the unload handler
xhrOnUnloadAbort(); if ( !xhrCallbacks ) {
xhrCallbacks = {};
jQuery( window ).unload( xhrOnUnloadAbort );
}
// Add to list of active xhrs callbacks
xhrCallbacks[ handle ] = callback;
} }
// Add to list of active xhrs callbacks xhr.onreadystatechange = callback;
handle = xhrId++;
xhr.onreadystatechange = xhrCallbacks[ handle ] = callback;
} }
}, },

View file

@ -158,7 +158,7 @@ jQuery.fn.extend({
if ( elem ) { if ( elem ) {
hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
if ( hooks && "get" in hooks && (ret = hooks.get( elem )) !== undefined ) { if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
return ret; return ret;
} }
@ -197,7 +197,7 @@ jQuery.fn.extend({
hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
// If set returns undefined, fall back to normal setting // If set returns undefined, fall back to normal setting
if ( !hooks || ("set" in hooks && hooks.set( this, val ) === undefined) ) { if ( !hooks || ("set" in hooks && hooks.set( this, val, "value" ) === undefined) ) {
this.value = val; this.value = val;
} }
}); });
@ -360,6 +360,15 @@ jQuery.extend({
// We can't allow the type property to be changed (since it causes problems in IE) // We can't allow the type property to be changed (since it causes problems in IE)
if ( rtype.test( elem.nodeName ) && elem.parentNode ) { if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
jQuery.error( "type property can't be changed" ); jQuery.error( "type property can't be changed" );
} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
// Setting the type on a radio button after the value resets the value in IE6-9
// Reset value to it's default in case type is set after value
var val = elem.getAttribute("value");
elem.setAttribute( "type", value );
if ( val ) {
elem.value = val;
}
return value;
} }
} }
}, },
@ -432,9 +441,11 @@ if ( !jQuery.support.getSetAttribute ) {
}); });
// Use this for any attribute on a form in IE6/7 // Use this for any attribute on a form in IE6/7
// And the name attribute formHook = jQuery.attrHooks.name = jQuery.attrHooks.value = jQuery.valHooks.button = {
formHook = jQuery.attrHooks.name = {
get: function( elem, name ) { get: function( elem, name ) {
if ( name === "value" && !jQuery.nodeName( elem, "button" ) ) {
return elem.getAttribute( name );
}
var ret = elem.getAttributeNode( name ); var ret = elem.getAttributeNode( name );
// Return undefined if not specified instead of empty string // Return undefined if not specified instead of empty string
return ret && ret.specified ? return ret && ret.specified ?
@ -470,7 +481,10 @@ if ( !jQuery.support.getSetAttribute ) {
jQuery.each([ "selected", "checked", "readOnly", "disabled" ], function( i, name ) { jQuery.each([ "selected", "checked", "readOnly", "disabled" ], function( i, name ) {
jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
set: function( elem, value ) { set: function( elem, value ) {
if ( value === false ) { if ( value === true ) {
elem.setAttribute( name, name );
return value;
} else if ( value === false ) {
jQuery.removeAttr( elem, name ); jQuery.removeAttr( elem, name );
return value; return value;
} }

View file

@ -731,7 +731,7 @@ jQuery.extend({
} }
} }
// Go thorugh every key on the object, // Go through every key on the object,
} else { } else {
for ( key in elems ) { for ( key in elems ) {
value = callback( elems[ key ], key, arg ); value = callback( elems[ key ], key, arg );
@ -752,45 +752,23 @@ jQuery.extend({
// Bind a function to a context, optionally partially applying any // Bind a function to a context, optionally partially applying any
// arguments. // arguments.
proxy: function( fn, context ) { proxy: function( fn, context ) {
var args, proxy;
// XXX BACKCOMPAT: Support old string method.
if ( typeof context === "string" ) { if ( typeof context === "string" ) {
fn = fn[ context ]; var tmp = fn[ context ];
context = arguments[0]; context = fn;
fn = tmp;
} }
// Quick check to determine if target is callable, in the spec // Quick check to determine if target is callable, in the spec
// this throws a TypeError, but we will just return undefined. // this throws a TypeError, but we will just return undefined.
if ( ! jQuery.isFunction( fn ) ) { if ( !jQuery.isFunction( fn ) ) {
return undefined; return undefined;
} }
if ( jQuery.support.nativeBind ) { // Simulated bind
// Native bind var args = slice.call( arguments, 2 ),
args = slice.call( arguments, 1 ); proxy = function() {
if ( args.length ) { return fn.apply( context, args.concat( slice.call( arguments ) ) );
proxy = Function.prototype.bind.apply( fn, args ); };
} else {
proxy = fn.bind( context );
}
} else {
// Simulated bind
args = slice.call( arguments, 2 );
if ( args.length ) {
proxy = function() {
return arguments.length ?
fn.apply( context, args.concat( slice.call( arguments ) ) ) :
fn.apply( context, args );
};
} else {
proxy = function() {
return arguments.length ?
fn.apply( context, arguments ) :
fn.call( context );
};
}
}
// Set the guid of unique handler to the same of original handler, so it can be removed // Set the guid of unique handler to the same of original handler, so it can be removed
proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;

90
src/effects.js vendored
View file

@ -28,19 +28,22 @@ jQuery.fn.extend({
} else { } else {
for ( var i = 0, j = this.length; i < j; i++ ) { for ( var i = 0, j = this.length; i < j; i++ ) {
elem = this[i]; elem = this[i];
display = elem.style.display;
// Reset the inline display of this element to learn if it is if ( elem.style ) {
// being hidden by cascaded rules or not display = elem.style.display;
if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
display = elem.style.display = "";
}
// Set elements which have been overridden with display: none // Reset the inline display of this element to learn if it is
// in a stylesheet to whatever the default browser style is // being hidden by cascaded rules or not
// for such an element if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
if ( display === "" && jQuery.css( elem, "display" ) === "none" ) { display = elem.style.display = "";
jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName)); }
// Set elements which have been overridden with display: none
// in a stylesheet to whatever the default browser style is
// for such an element
if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
}
} }
} }
@ -48,10 +51,13 @@ jQuery.fn.extend({
// to avoid the constant reflow // to avoid the constant reflow
for ( i = 0; i < j; i++ ) { for ( i = 0; i < j; i++ ) {
elem = this[i]; elem = this[i];
display = elem.style.display;
if ( display === "" || display === "none" ) { if ( elem.style ) {
elem.style.display = jQuery._data(elem, "olddisplay") || ""; display = elem.style.display;
if ( display === "" || display === "none" ) {
elem.style.display = jQuery._data(elem, "olddisplay") || "";
}
} }
} }
@ -65,17 +71,21 @@ jQuery.fn.extend({
} else { } else {
for ( var i = 0, j = this.length; i < j; i++ ) { for ( var i = 0, j = this.length; i < j; i++ ) {
var display = jQuery.css( this[i], "display" ); if ( this[i].style ) {
var display = jQuery.css( this[i], "display" );
if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) { if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
jQuery._data( this[i], "olddisplay", display ); jQuery._data( this[i], "olddisplay", display );
}
} }
} }
// Set the display of the elements in a second loop // Set the display of the elements in a second loop
// to avoid the constant reflow // to avoid the constant reflow
for ( i = 0; i < j; i++ ) { for ( i = 0; i < j; i++ ) {
this[i].style.display = "none"; if ( this[i].style ) {
this[i].style.display = "none";
}
} }
return this; return this;
@ -165,7 +175,7 @@ jQuery.fn.extend({
this.style.display = "inline-block"; this.style.display = "inline-block";
} else { } else {
var display = defaultDisplay(this.nodeName); display = defaultDisplay(this.nodeName);
// inline-level elements accept inline-block; // inline-level elements accept inline-block;
// block-level elements need to be inline with layout // block-level elements need to be inline with layout
@ -266,6 +276,27 @@ jQuery.fn.extend({
}); });
// Animations created synchronously will run synchronously
function createFxNow() {
setTimeout( clearFxNow, 0 );
return ( fxNow = jQuery.now() );
}
function clearFxNow() {
fxNow = undefined;
}
// Generate parameters to create a standard animation
function genFx( type, num ) {
var obj = {};
jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
obj[ this ] = type;
});
return obj;
}
// Generate shortcuts for custom animations // Generate shortcuts for custom animations
jQuery.each({ jQuery.each({
slideDown: genFx("show", 1), slideDown: genFx("show", 1),
@ -581,25 +612,4 @@ function defaultDisplay( nodeName ) {
return elemdisplay[ nodeName ]; return elemdisplay[ nodeName ];
} }
// Animations created synchronously will run synchronously
function createFxNow() {
setTimeout( clearFxNow, 0 );
return ( fxNow = jQuery.now() );
}
function clearFxNow() {
fxNow = undefined;
}
// Generate parameters to create a standard animation
function genFx( type, num ) {
var obj = {};
jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
obj[ this ] = type;
});
return obj;
}
})( jQuery ); })( jQuery );

View file

@ -63,7 +63,7 @@ jQuery.event = {
elemData.handle = eventHandle = function( e ) { elemData.handle = eventHandle = function( e ) {
// Discard the second event of a jQuery.event.trigger() and // Discard the second event of a jQuery.event.trigger() and
// when an event is called after a page has unloaded // when an event is called after a page has unloaded
return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
jQuery.event.handle.apply( eventHandle.elem, arguments ) : jQuery.event.handle.apply( eventHandle.elem, arguments ) :
undefined; undefined;
}; };
@ -910,7 +910,7 @@ jQuery.each(["bind", "one"], function( i, name ) {
return this; return this;
} }
if ( jQuery.isFunction( data ) || data === false ) { if ( arguments.length === 2 || data === false ) {
fn = data; fn = data;
data = undefined; data = undefined;
} }
@ -1063,7 +1063,7 @@ jQuery.each(["live", "die"], function( i, name ) {
preType = type; preType = type;
if ( type === "focus" || type === "blur" ) { if ( liveMap[ type ] ) {
types.push( liveMap[ type ] + namespaces ); types.push( liveMap[ type ] + namespaces );
type = type + namespaces; type = type + namespaces;
@ -1134,6 +1134,11 @@ function liveHandler( event ) {
if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
event.type = handleObj.preType; event.type = handleObj.preType;
related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
// Make sure not to accidentally match a child element with the same selector
if ( related && jQuery.contains( elem, related ) ) {
related = elem;
}
} }
if ( !related || related !== elem ) { if ( !related || related !== elem ) {

View file

@ -70,7 +70,7 @@ jQuery.fn.extend({
} }
return elem; return elem;
}).append(this); }).append( this );
} }
return this; return this;
@ -379,13 +379,13 @@ function cloneCopyEvent( src, dest ) {
} }
function cloneFixAttributes( src, dest ) { function cloneFixAttributes( src, dest ) {
var nodeName;
// We do not need to do anything for non-Elements // We do not need to do anything for non-Elements
if ( dest.nodeType !== 1 ) { if ( dest.nodeType !== 1 ) {
return; return;
} }
var nodeName = dest.nodeName.toLowerCase();
// clearAttributes removes the attributes, which we don't want, // clearAttributes removes the attributes, which we don't want,
// but also removes the attachEvent events, which we *do* want // but also removes the attachEvent events, which we *do* want
if ( dest.clearAttributes ) { if ( dest.clearAttributes ) {
@ -398,6 +398,8 @@ function cloneFixAttributes( src, dest ) {
dest.mergeAttributes( src ); dest.mergeAttributes( src );
} }
nodeName = dest.nodeName.toLowerCase();
// IE6-8 fail to clone children inside object elements that use // IE6-8 fail to clone children inside object elements that use
// the proprietary classid attribute value (rather than the type // the proprietary classid attribute value (rather than the type
// attribute) to identify the type of content to display // attribute) to identify the type of content to display
@ -446,11 +448,10 @@ jQuery.buildFragment = function( args, nodes, scripts ) {
args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) { args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
cacheable = true; cacheable = true;
cacheresults = jQuery.fragments[ args[0] ]; cacheresults = jQuery.fragments[ args[0] ];
if ( cacheresults ) { if ( cacheresults && cacheresults !== 1 ) {
if ( cacheresults !== 1 ) { fragment = cacheresults;
fragment = cacheresults;
}
} }
} }
@ -508,6 +509,21 @@ function getAll( elem ) {
} }
} }
// Used in clean, fixes the defaultChecked property
function fixDefaultChecked( elem ) {
if ( elem.type === "checkbox" || elem.type === "radio" ) {
elem.defaultChecked = elem.checked;
}
}
// Finds all inputs and passes them to fixDefaultChecked
function findInputs( elem ) {
if ( jQuery.nodeName( elem, "input" ) ) {
fixDefaultChecked( elem );
} else if ( elem.getElementsByTagName ) {
jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
}
}
jQuery.extend({ jQuery.extend({
clone: function( elem, dataAndEvents, deepDataAndEvents ) { clone: function( elem, dataAndEvents, deepDataAndEvents ) {
var clone = elem.cloneNode(true), var clone = elem.cloneNode(true),
@ -578,54 +594,67 @@ jQuery.extend({
} }
// Convert html string into DOM nodes // Convert html string into DOM nodes
if ( typeof elem === "string" && !rhtml.test( elem ) ) { if ( typeof elem === "string" ) {
elem = context.createTextNode( elem ); if ( !rhtml.test( elem ) ) {
elem = context.createTextNode( elem );
} else {
// Fix "XHTML"-style tags in all browsers
elem = elem.replace(rxhtmlTag, "<$1></$2>");
} else if ( typeof elem === "string" ) { // Trim whitespace, otherwise indexOf won't work as expected
// Fix "XHTML"-style tags in all browsers var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
elem = elem.replace(rxhtmlTag, "<$1></$2>"); wrap = wrapMap[ tag ] || wrapMap._default,
depth = wrap[0],
div = context.createElement("div");
// Trim whitespace, otherwise indexOf won't work as expected // Go to html and back, then peel off extra wrappers
var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(), div.innerHTML = wrap[1] + elem + wrap[2];
wrap = wrapMap[ tag ] || wrapMap._default,
depth = wrap[0],
div = context.createElement("div");
// Go to html and back, then peel off extra wrappers // Move to the right depth
div.innerHTML = wrap[1] + elem + wrap[2]; while ( depth-- ) {
div = div.lastChild;
}
// Move to the right depth // Remove IE's autoinserted <tbody> from table fragments
while ( depth-- ) { if ( !jQuery.support.tbody ) {
div = div.lastChild;
}
// Remove IE's autoinserted <tbody> from table fragments // String was a <table>, *may* have spurious <tbody>
if ( !jQuery.support.tbody ) { var hasBody = rtbody.test(elem),
tbody = tag === "table" && !hasBody ?
div.firstChild && div.firstChild.childNodes :
// String was a <table>, *may* have spurious <tbody> // String was a bare <thead> or <tfoot>
var hasBody = rtbody.test(elem), wrap[1] === "<table>" && !hasBody ?
tbody = tag === "table" && !hasBody ? div.childNodes :
div.firstChild && div.firstChild.childNodes : [];
// String was a bare <thead> or <tfoot> for ( var j = tbody.length - 1; j >= 0 ; --j ) {
wrap[1] === "<table>" && !hasBody ? if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
div.childNodes : tbody[ j ].parentNode.removeChild( tbody[ j ] );
[]; }
for ( var j = tbody.length - 1; j >= 0 ; --j ) {
if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
tbody[ j ].parentNode.removeChild( tbody[ j ] );
} }
} }
} // IE completely kills leading whitespace when innerHTML is used
if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
}
// IE completely kills leading whitespace when innerHTML is used elem = div.childNodes;
if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
} }
}
elem = div.childNodes; // Resets defaultChecked for any radios and checkboxes
// about to be appended to the DOM in IE 6/7 (#8060)
var len;
if ( !jQuery.support.appendChecked ) {
if ( elem[0] && typeof (len = elem.length) === "number" ) {
for ( i = 0; i < len; i++ ) {
findInputs( elem[i] );
}
} else {
findInputs( elem );
}
} }
if ( elem.nodeType ) { if ( elem.nodeType ) {

@ -1 +1 @@
Subproject commit 69ecd019852c1421cbd81fe6ceb4e22a81022ea7 Subproject commit 4bcc09702d6dadfd0b90c7de3c8b206e97ff97f4

View file

@ -77,10 +77,6 @@ jQuery.support = (function() {
// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
getSetAttribute: div.className !== "t", getSetAttribute: div.className !== "t",
// Test for presence of native Function#bind.
// Not in: >= Chrome 6, >= FireFox 3, Safari 5?, IE 9?, Opera 11?
nativeBind: jQuery.isFunction( Function.prototype.bind ),
// Will be defined later // Will be defined later
submitBubbles: true, submitBubbles: true,
changeBubbles: true, changeBubbles: true,
@ -119,6 +115,11 @@ jQuery.support = (function() {
div.cloneNode( true ).fireEvent( "onclick" ); div.cloneNode( true ).fireEvent( "onclick" );
} }
input = document.createElement("input");
input.value = "t";
input.setAttribute("type", "radio");
support.radioValue = input.value === "t";
div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>"; div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
fragment = document.createDocumentFragment(); fragment = document.createDocumentFragment();
@ -185,6 +186,14 @@ jQuery.support = (function() {
support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
div.innerHTML = ""; div.innerHTML = "";
// Check if a disconnected checkbox will retain its checked
// value of true after appended to the DOM
input = document.createElement("input");
input.setAttribute("type", "checkbox");
input.checked = true;
div.appendChild( input );
support.appendChecked = input.checked;
// Check if div with explicit width and no margin-right incorrectly // Check if div with explicit width and no margin-right incorrectly
// gets computed margin-right based on width of container. For more // gets computed margin-right based on width of container. For more
// info see bug #3333 // info see bug #3333

View file

@ -160,7 +160,7 @@ jQuery.fn.extend({
add: function( selector, context ) { add: function( selector, context ) {
var set = typeof selector === "string" ? var set = typeof selector === "string" ?
jQuery( selector, context ) : jQuery( selector, context ) :
jQuery.makeArray( selector ), jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
all = jQuery.merge( this.get(), set ); all = jQuery.merge( this.get(), set );
return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?

View file

@ -58,10 +58,10 @@
<div id="nothiddendiv" style="height:1px;background:white;" class="nothiddendiv"> <div id="nothiddendiv" style="height:1px;background:white;" class="nothiddendiv">
<div id="nothiddendivchild"></div> <div id="nothiddendivchild"></div>
</div> </div>
<!-- this iframe is outside the #main so it won't reload constantly wasting time, but it means the tests must be "safe" and clean up after themselves --> <!-- this iframe is outside the #qunit-fixture so it won't reload constantly wasting time, but it means the tests must be "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;"> <dl id="dl" style="position:absolute;top:-32767px;left:-32767px;width:1px">
<div id="main"> <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="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"> <p id="ap">
Here are some links in a normal paragraph: <a id="google" href="http://www.google.com/" title="Google!">Google</a>, Here are some links in a normal paragraph: <a id="google" href="http://www.google.com/" title="Google!">Google</a>,

@ -1 +1 @@
Subproject commit d404faf8f587fcbe6b8907943022e6318dd51e0c Subproject commit 9887663380693009874e8c76f0bf77a921931766

View file

@ -1782,7 +1782,7 @@ test("jQuery.ajaxSetup({timeout: Number}) - with global timeout", function() {
passed++; passed++;
if ( passed == 2 ) { if ( passed == 2 ) {
ok( true, "Check local and global callbacks after timeout" ); ok( true, "Check local and global callbacks after timeout" );
jQuery("#main").unbind("ajaxError"); jQuery("#qunit-fixture").unbind("ajaxError");
start(); start();
} }
}; };
@ -1792,7 +1792,7 @@ test("jQuery.ajaxSetup({timeout: Number}) - with global timeout", function() {
start(); start();
}; };
jQuery("#main").ajaxError(pass); jQuery("#qunit-fixture").ajaxError(pass);
jQuery.ajax({ jQuery.ajax({
type: "GET", type: "GET",

View file

@ -77,7 +77,7 @@ test("prop(String, Object)", function() {
}); });
test("attr(String)", function() { test("attr(String)", function() {
expect(32); expect(35);
equals( jQuery("#text1").attr("type"), "text", "Check for type attribute" ); equals( jQuery("#text1").attr("type"), "text", "Check for type attribute" );
equals( jQuery("#radio1").attr("type"), "radio", "Check for type attribute" ); equals( jQuery("#radio1").attr("type"), "radio", "Check for type attribute" );
@ -90,6 +90,7 @@ test("attr(String)", function() {
equals( jQuery("#name").attr("name"), "name", "Check for name attribute" ); equals( jQuery("#name").attr("name"), "name", "Check for name attribute" );
equals( jQuery("#text1").attr("name"), "action", "Check for name attribute" ); equals( jQuery("#text1").attr("name"), "action", "Check for name attribute" );
ok( jQuery("#form").attr("action").indexOf("formaction") >= 0, "Check for action attribute" ); ok( jQuery("#form").attr("action").indexOf("formaction") >= 0, "Check for action attribute" );
equals( jQuery("#text1").attr("value", "t").attr("value"), "t", "Check setting the value attribute" );
equals( jQuery("#form").attr("blah", "blah").attr("blah"), "blah", "Set non-existant attribute on a form" ); equals( jQuery("#form").attr("blah", "blah").attr("blah"), "blah", "Set non-existant attribute on a form" );
equals( jQuery("#foo").attr("height"), undefined, "Non existent height attribute should return undefined" ); equals( jQuery("#foo").attr("height"), undefined, "Non existent height attribute should return undefined" );
@ -108,7 +109,7 @@ test("attr(String)", function() {
equals( jQuery("#area1").attr("maxLength"), "30", "Check for maxLength attribute" ); equals( jQuery("#area1").attr("maxLength"), "30", "Check for maxLength attribute" );
// using innerHTML in IE causes href attribute to be serialized to the full path // using innerHTML in IE causes href attribute to be serialized to the full path
jQuery("<a/>").attr({ "id": "tAnchor5", "href": "#5" }).appendTo("#main"); jQuery("<a/>").attr({ "id": "tAnchor5", "href": "#5" }).appendTo("#qunit-fixture");
equals( jQuery("#tAnchor5").attr("href"), "#5", "Check for non-absolute href (an anchor)" ); equals( jQuery("#tAnchor5").attr("href"), "#5", "Check for non-absolute href (an anchor)" );
// list attribute is readonly by default in browsers that support it // list attribute is readonly by default in browsers that support it
@ -136,6 +137,11 @@ test("attr(String)", function() {
ok( !!~jQuery("#dl").attr("style").indexOf("position"), "Check style attribute getter, also normalize css props to lowercase" ); ok( !!~jQuery("#dl").attr("style").indexOf("position"), "Check style attribute getter, also normalize css props to lowercase" );
ok( !!~jQuery("#foo").attr("style", "position:absolute;").attr("style").indexOf("position"), "Check style setter" ); ok( !!~jQuery("#foo").attr("style", "position:absolute;").attr("style").indexOf("position"), "Check style setter" );
// Check value on button element (#1954)
var $button = jQuery("<button value='foobar'>text</button>").insertAfter("#button");
equals( $button.attr("value"), "foobar", "Value retrieval on a button does not return innerHTML" );
equals( $button.attr("value", "baz").html(), "text", "Setting the value does not change innerHTML" );
ok( jQuery("<div/>").attr("doesntexist") === undefined, "Make sure undefined is returned when no attribute is found." ); ok( jQuery("<div/>").attr("doesntexist") === undefined, "Make sure undefined is returned when no attribute is found." );
ok( jQuery().attr("doesntexist") === undefined, "Make sure undefined is returned when no element is there." ); ok( jQuery().attr("doesntexist") === undefined, "Make sure undefined is returned when no element is there." );
}); });
@ -171,7 +177,7 @@ test("attr(Hash)", function() {
}); });
test("attr(String, Object)", function() { test("attr(String, Object)", function() {
expect(29); expect(30);
var div = jQuery("div").attr("foo", "bar"), var div = jQuery("div").attr("foo", "bar"),
fail = false; fail = false;
@ -285,6 +291,9 @@ test("attr(String, Object)", function() {
ok( thrown, "Exception thrown when trying to change type property" ); ok( thrown, "Exception thrown when trying to change type property" );
equals( "button", button.attr("type"), "Verify that you can't change the type of a button element" ); equals( "button", button.attr("type"), "Verify that you can't change the type of a button element" );
var $radio = jQuery("<input>", { "value": "sup", "type": "radio" }).appendTo("#testForm");
equals( $radio.val(), "sup", "Value is not reset when type is set after value on a radio" );
// Setting attributes on svg elements (bug #3116) // Setting attributes on svg elements (bug #3116)
var $svg = jQuery("<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' baseProfile='full' width='200' height='200'>" var $svg = jQuery("<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' baseProfile='full' width='200' height='200'>"
+ "<circle cx='200' cy='200' r='150' />" + "<circle cx='200' cy='200' r='150' />"
@ -426,7 +435,7 @@ test("removeProp(String)", function() {
}); });
test("val()", function() { test("val()", function() {
expect(23); expect(25);
document.getElementById("text1").value = "bla"; document.getElementById("text1").value = "bla";
equals( jQuery("#text1").val(), "bla", "Check for modified value of input element" ); equals( jQuery("#text1").val(), "bla", "Check for modified value of input element" );
@ -488,6 +497,10 @@ test("val()", function() {
same( checks.serialize(), "test=1&test=on", "Get multiple checked values." ); same( checks.serialize(), "test=1&test=on", "Get multiple checked values." );
checks.remove(); checks.remove();
var $button = jQuery("<button value='foobar'>text</button>").insertAfter("#button");
equals( $button.val(), "foobar", "Value retrieval on a button does not return innerHTML" );
equals( $button.val("baz").html(), "text", "Setting the value does not change innerHTML" );
}); });
var testVal = function(valueObj) { var testVal = function(valueObj) {
@ -547,6 +560,7 @@ test( "val(Array of Numbers) (Bug #7123)", function() {
test("val(Function) with incoming value", function() { test("val(Function) with incoming value", function() {
expect(10); expect(10);
QUnit.reset();
var oldVal = jQuery("#text1").val(); var oldVal = jQuery("#text1").val();
jQuery("#text1").val(function(i, val) { jQuery("#text1").val(function(i, val) {
@ -599,7 +613,7 @@ test("val(Function) with incoming value", function() {
test("val(select) after form.reset() (Bug #2551)", function() { test("val(select) after form.reset() (Bug #2551)", function() {
expect(3); expect(3);
jQuery("<form id='kk' name='kk'><select id='kkk'><option value='cf'>cf</option><option value='gf'>gf</option></select></form>").appendTo("#main"); jQuery("<form id='kk' name='kk'><select id='kkk'><option value='cf'>cf</option><option value='gf'>gf</option></select></form>").appendTo("#qunit-fixture");
jQuery("#kkk").val( "gf" ); jQuery("#kkk").val( "gf" );

View file

@ -29,7 +29,7 @@ test("jQuery()", function() {
equals( jQuery(window).length, 1, "Correct number of elements generated for jQuery(window)" ); equals( jQuery(window).length, 1, "Correct number of elements generated for jQuery(window)" );
var main = jQuery("#main"); var main = jQuery("#qunit-fixture");
same( jQuery("div p", main).get(), q("sndp", "en", "sap"), "Basic selector with jQuery object as context" ); same( jQuery("div p", main).get(), q("sndp", "en", "sap"), "Basic selector with jQuery object as context" );
/* /*
@ -115,54 +115,54 @@ test("selector state", function() {
equals( test.selector, "", "Body Selector" ); equals( test.selector, "", "Body Selector" );
equals( test.context, document.body, "Body Context" ); equals( test.context, document.body, "Body Context" );
test = jQuery("#main"); test = jQuery("#qunit-fixture");
equals( test.selector, "#main", "#main Selector" ); equals( test.selector, "#qunit-fixture", "#qunit-fixture Selector" );
equals( test.context, document, "#main Context" ); equals( test.context, document, "#qunit-fixture Context" );
test = jQuery("#notfoundnono"); test = jQuery("#notfoundnono");
equals( test.selector, "#notfoundnono", "#notfoundnono Selector" ); equals( test.selector, "#notfoundnono", "#notfoundnono Selector" );
equals( test.context, document, "#notfoundnono Context" ); equals( test.context, document, "#notfoundnono Context" );
test = jQuery("#main", document); test = jQuery("#qunit-fixture", document);
equals( test.selector, "#main", "#main Selector" ); equals( test.selector, "#qunit-fixture", "#qunit-fixture Selector" );
equals( test.context, document, "#main Context" ); equals( test.context, document, "#qunit-fixture Context" );
test = jQuery("#main", document.body); test = jQuery("#qunit-fixture", document.body);
equals( test.selector, "#main", "#main Selector" ); equals( test.selector, "#qunit-fixture", "#qunit-fixture Selector" );
equals( test.context, document.body, "#main Context" ); equals( test.context, document.body, "#qunit-fixture Context" );
// Test cloning // Test cloning
test = jQuery(test); test = jQuery(test);
equals( test.selector, "#main", "#main Selector" ); equals( test.selector, "#qunit-fixture", "#qunit-fixture Selector" );
equals( test.context, document.body, "#main Context" ); equals( test.context, document.body, "#qunit-fixture Context" );
test = jQuery(document.body).find("#main"); test = jQuery(document.body).find("#qunit-fixture");
equals( test.selector, "#main", "#main find Selector" ); equals( test.selector, "#qunit-fixture", "#qunit-fixture find Selector" );
equals( test.context, document.body, "#main find Context" ); equals( test.context, document.body, "#qunit-fixture find Context" );
test = jQuery("#main").filter("div"); test = jQuery("#qunit-fixture").filter("div");
equals( test.selector, "#main.filter(div)", "#main filter Selector" ); equals( test.selector, "#qunit-fixture.filter(div)", "#qunit-fixture filter Selector" );
equals( test.context, document, "#main filter Context" ); equals( test.context, document, "#qunit-fixture filter Context" );
test = jQuery("#main").not("div"); test = jQuery("#qunit-fixture").not("div");
equals( test.selector, "#main.not(div)", "#main not Selector" ); equals( test.selector, "#qunit-fixture.not(div)", "#qunit-fixture not Selector" );
equals( test.context, document, "#main not Context" ); equals( test.context, document, "#qunit-fixture not Context" );
test = jQuery("#main").filter("div").not("div"); test = jQuery("#qunit-fixture").filter("div").not("div");
equals( test.selector, "#main.filter(div).not(div)", "#main filter, not Selector" ); equals( test.selector, "#qunit-fixture.filter(div).not(div)", "#qunit-fixture filter, not Selector" );
equals( test.context, document, "#main filter, not Context" ); equals( test.context, document, "#qunit-fixture filter, not Context" );
test = jQuery("#main").filter("div").not("div").end(); test = jQuery("#qunit-fixture").filter("div").not("div").end();
equals( test.selector, "#main.filter(div)", "#main filter, not, end Selector" ); equals( test.selector, "#qunit-fixture.filter(div)", "#qunit-fixture filter, not, end Selector" );
equals( test.context, document, "#main filter, not, end Context" ); equals( test.context, document, "#qunit-fixture filter, not, end Context" );
test = jQuery("#main").parent("body"); test = jQuery("#qunit-fixture").parent("body");
equals( test.selector, "#main.parent(body)", "#main parent Selector" ); equals( test.selector, "#qunit-fixture.parent(body)", "#qunit-fixture parent Selector" );
equals( test.context, document, "#main parent Context" ); equals( test.context, document, "#qunit-fixture parent Context" );
test = jQuery("#main").eq(0); test = jQuery("#qunit-fixture").eq(0);
equals( test.selector, "#main.slice(0,1)", "#main eq Selector" ); equals( test.selector, "#qunit-fixture.slice(0,1)", "#qunit-fixture eq Selector" );
equals( test.context, document, "#main eq Context" ); equals( test.context, document, "#qunit-fixture eq Context" );
var d = "<div />"; var d = "<div />";
equals( equals(
@ -228,7 +228,7 @@ test("noConflict", function() {
equals( jQuery.noConflict(true), $$, "noConflict returned the jQuery object" ); equals( jQuery.noConflict(true), $$, "noConflict returned the jQuery object" );
equals( jQuery, originaljQuery, "Make sure jQuery was reverted." ); equals( jQuery, originaljQuery, "Make sure jQuery was reverted." );
equals( $, original$, "Make sure $ was reverted." ); equals( $, original$, "Make sure $ was reverted." );
ok( $$("#main").html("test"), "Make sure that jQuery still works." ); ok( $$("#qunit-fixture").html("test"), "Make sure that jQuery still works." );
jQuery = $$; jQuery = $$;
}); });
@ -571,29 +571,29 @@ test("end()", function() {
test("length", function() { test("length", function() {
expect(1); expect(1);
equals( jQuery("#main p").length, 6, "Get Number of Elements Found" ); equals( jQuery("#qunit-fixture p").length, 6, "Get Number of Elements Found" );
}); });
test("size()", function() { test("size()", function() {
expect(1); expect(1);
equals( jQuery("#main p").size(), 6, "Get Number of Elements Found" ); equals( jQuery("#qunit-fixture p").size(), 6, "Get Number of Elements Found" );
}); });
test("get()", function() { test("get()", function() {
expect(1); expect(1);
same( jQuery("#main p").get(), q("firstp","ap","sndp","en","sap","first"), "Get All Elements" ); same( jQuery("#qunit-fixture p").get(), q("firstp","ap","sndp","en","sap","first"), "Get All Elements" );
}); });
test("toArray()", function() { test("toArray()", function() {
expect(1); expect(1);
same( jQuery("#main p").toArray(), same( jQuery("#qunit-fixture p").toArray(),
q("firstp","ap","sndp","en","sap","first"), q("firstp","ap","sndp","en","sap","first"),
"Convert jQuery object to an Array" ) "Convert jQuery object to an Array" )
}) })
test("get(Number)", function() { test("get(Number)", function() {
expect(2); expect(2);
equals( jQuery("#main p").get(0), document.getElementById("firstp"), "Get A Single Element" ); equals( jQuery("#qunit-fixture p").get(0), document.getElementById("firstp"), "Get A Single Element" );
strictEqual( jQuery("#firstp").get(1), undefined, "Try get with index larger elements count" ); strictEqual( jQuery("#firstp").get(1), undefined, "Try get with index larger elements count" );
}); });
@ -910,7 +910,7 @@ test("jQuery.isEmptyObject", function(){
}); });
test("jQuery.proxy", function(){ test("jQuery.proxy", function(){
expect(6); expect(7);
var test = function(){ equals( this, thisObject, "Make sure that scope is set properly." ); }; var test = function(){ equals( this, thisObject, "Make sure that scope is set properly." ); };
var thisObject = { foo: "bar", method: test }; var thisObject = { foo: "bar", method: test };
@ -921,6 +921,9 @@ test("jQuery.proxy", function(){
// Basic scoping // Basic scoping
jQuery.proxy( test, thisObject )(); jQuery.proxy( test, thisObject )();
// Another take on it
jQuery.proxy( thisObject, "method" )();
// Make sure it doesn't freak out // Make sure it doesn't freak out
equals( jQuery.proxy( null, thisObject ), undefined, "Make sure no function was returned." ); equals( jQuery.proxy( null, thisObject ), undefined, "Make sure no function was returned." );

View file

@ -3,7 +3,7 @@ module("css", { teardown: moduleTeardown });
test("css(String|Hash)", function() { test("css(String|Hash)", function() {
expect( 42 ); expect( 42 );
equals( jQuery("#main").css("display"), "block", "Check for css property \"display\""); equals( jQuery("#qunit-fixture").css("display"), "block", "Check for css property \"display\"");
ok( jQuery("#nothiddendiv").is(":visible"), "Modifying CSS display: Assert element is visible"); ok( jQuery("#nothiddendiv").is(":visible"), "Modifying CSS display: Assert element is visible");
jQuery("#nothiddendiv").css({display: "none"}); jQuery("#nothiddendiv").css({display: "none"});

View file

@ -316,7 +316,7 @@ test("data-* attributes", function() {
div.remove(); div.remove();
child.appendTo("#main"); child.appendTo("#qunit-fixture");
equals( child.data("myobj"), "old data", "Value accessed from data-* attribute"); equals( child.data("myobj"), "old data", "Value accessed from data-* attribute");
child.data("myobj", "replaced"); child.data("myobj", "replaced");
@ -406,7 +406,7 @@ test("data-* attributes", function() {
} }
var metadata = "<ol><li class='test test2' data-foo='bar' data-bar='baz' data-arr='[1,2]'>Some stuff</li><li class='test test2' data-test='bar' data-bar='baz'>Some stuff</li><li class='test test2' data-zoooo='bar' data-bar='{\"test\":\"baz\"}'>Some stuff</li><li class='test test2' data-number=true data-stuff='[2,8]'>Some stuff</li></ol>", var metadata = "<ol><li class='test test2' data-foo='bar' data-bar='baz' data-arr='[1,2]'>Some stuff</li><li class='test test2' data-test='bar' data-bar='baz'>Some stuff</li><li class='test test2' data-zoooo='bar' data-bar='{\"test\":\"baz\"}'>Some stuff</li><li class='test test2' data-number=true data-stuff='[2,8]'>Some stuff</li></ol>",
elem = jQuery(metadata).appendTo("#main"); elem = jQuery(metadata).appendTo("#qunit-fixture");
elem.find("li").each(testData); elem.find("li").each(testData);
elem.remove(); elem.remove();

24
test/unit/effects.js vendored
View file

@ -2,7 +2,7 @@ module("effects", { teardown: moduleTeardown });
test("sanity check", function() { test("sanity check", function() {
expect(1); expect(1);
ok( jQuery("#dl:visible, #main:visible, #foo:visible").length === 3, "QUnit state is correct for testing effects" ); ok( jQuery("#dl:visible, #qunit-fixture:visible, #foo:visible").length === 3, "QUnit state is correct for testing effects" );
}); });
test("show()", function() { test("show()", function() {
@ -14,7 +14,7 @@ test("show()", function() {
equals( hiddendiv.css("display"), "block", "Make sure a pre-hidden div is visible." ); equals( hiddendiv.css("display"), "block", "Make sure a pre-hidden div is visible." );
var div = jQuery("<div>").hide().appendTo("#main").show(); var div = jQuery("<div>").hide().appendTo("#qunit-fixture").show();
equal( div.css("display"), "block", "Make sure pre-hidden divs show" ); equal( div.css("display"), "block", "Make sure pre-hidden divs show" );
@ -32,7 +32,7 @@ test("show()", function() {
hiddendiv.css("display",""); hiddendiv.css("display","");
var pass = true, div = jQuery("#main div"); var pass = true, div = jQuery("#qunit-fixture div");
div.show().each(function(){ div.show().each(function(){
if ( this.style.display == "none" ) pass = false; if ( this.style.display == "none" ) pass = false;
}); });
@ -62,7 +62,7 @@ test("show()", function() {
}); });
// #show-tests * is set display: none in CSS // #show-tests * is set display: none in CSS
jQuery("#main").append("<div id='show-tests'><div><p><a href='#'></a></p><code></code><pre></pre><span></span></div><table><thead><tr><th></th></tr></thead><tbody><tr><td></td></tr></tbody></table><ul><li></li></ul></div><table id='test-table'></table>"); jQuery("#qunit-fixture").append("<div id='show-tests'><div><p><a href='#'></a></p><code></code><pre></pre><span></span></div><table><thead><tr><th></th></tr></thead><tbody><tr><td></td></tr></tbody></table><ul><li></li></ul></div><table id='test-table'></table>");
var old = jQuery("#test-table").show().css("display") !== "table"; var old = jQuery("#test-table").show().css("display") !== "table";
jQuery("#test-table").remove(); jQuery("#test-table").remove();
@ -88,6 +88,10 @@ test("show()", function() {
var elem = jQuery(selector, "#show-tests").show(); var elem = jQuery(selector, "#show-tests").show();
equals( elem.css("display"), expected, "Show using correct display type for " + selector ); equals( elem.css("display"), expected, "Show using correct display type for " + selector );
}); });
// Make sure that showing or hiding a text node doesn't cause an error
jQuery("<div>test</div> text <span>test</span>").show().remove();
jQuery("<div>test</div> text <span>test</span>").hide().remove();
}); });
test("show(Number) - other displays", function() { test("show(Number) - other displays", function() {
@ -96,7 +100,7 @@ test("show(Number) - other displays", function() {
stop(); stop();
// #show-tests * is set display: none in CSS // #show-tests * is set display: none in CSS
jQuery("#main").append("<div id='show-tests'><div><p><a href='#'></a></p><code></code><pre></pre><span></span></div><table><thead><tr><th></th></tr></thead><tbody><tr><td></td></tr></tbody></table><ul><li></li></ul></div><table id='test-table'></table>"); jQuery("#qunit-fixture").append("<div id='show-tests'><div><p><a href='#'></a></p><code></code><pre></pre><span></span></div><table><thead><tr><th></th></tr></thead><tbody><tr><td></td></tr></tbody></table><ul><li></li></ul></div><table id='test-table'></table>");
var old = jQuery("#test-table").show().css("display") !== "table", var old = jQuery("#test-table").show().css("display") !== "table",
num = 0; num = 0;
@ -138,7 +142,7 @@ test("Persist correct display value", function() {
stop(); stop();
// #show-tests * is set display: none in CSS // #show-tests * is set display: none in CSS
jQuery("#main").append("<div id='show-tests'><span style='position:absolute;'>foo</span></div>"); jQuery("#qunit-fixture").append("<div id='show-tests'><span style='position:absolute;'>foo</span></div>");
var $span = jQuery("#show-tests span"), var $span = jQuery("#show-tests span"),
displayNone = $span.css("display"), displayNone = $span.css("display"),
@ -581,7 +585,7 @@ jQuery.checkOverflowDisplay = function(){
} }
test( "jQuery.fx.prototype.cur()", 6, function() { test( "jQuery.fx.prototype.cur()", 6, function() {
var div = jQuery( "<div></div>" ).appendTo( "#main" ).css({ var div = jQuery( "<div></div>" ).appendTo( "#qunit-fixture" ).css({
color: "#ABC", color: "#ABC",
border: "5px solid black", border: "5px solid black",
left: "auto", left: "auto",
@ -954,7 +958,7 @@ test("hide hidden elements (bug #7141)", function() {
expect(3); expect(3);
QUnit.reset(); QUnit.reset();
var div = jQuery("<div style='display:none'></div>").appendTo("#main"); var div = jQuery("<div style='display:none'></div>").appendTo("#qunit-fixture");
equals( div.css("display"), "none", "Element is hidden by default" ); equals( div.css("display"), "none", "Element is hidden by default" );
div.hide(); div.hide();
ok( !jQuery._data(div, "olddisplay"), "olddisplay is undefined after hiding an already-hidden element" ); ok( !jQuery._data(div, "olddisplay"), "olddisplay is undefined after hiding an already-hidden element" );
@ -969,7 +973,7 @@ test("hide hidden elements, with animation (bug #7141)", function() {
QUnit.reset(); QUnit.reset();
stop(); stop();
var div = jQuery("<div style='display:none'></div>").appendTo("#main"); var div = jQuery("<div style='display:none'></div>").appendTo("#qunit-fixture");
equals( div.css("display"), "none", "Element is hidden by default" ); equals( div.css("display"), "none", "Element is hidden by default" );
div.hide(1, function () { div.hide(1, function () {
ok( !jQuery._data(div, "olddisplay"), "olddisplay is undefined after hiding an already-hidden element" ); ok( !jQuery._data(div, "olddisplay"), "olddisplay is undefined after hiding an already-hidden element" );
@ -982,7 +986,7 @@ test("hide hidden elements, with animation (bug #7141)", function() {
test("animate unit-less properties (#4966)", 2, function() { test("animate unit-less properties (#4966)", 2, function() {
stop(); stop();
var div = jQuery( "<div style='z-index: 0; position: absolute;'></div>" ).appendTo( "#main" ); var div = jQuery( "<div style='z-index: 0; position: absolute;'></div>" ).appendTo( "#qunit-fixture" );
equal( div.css( "z-index" ), "0", "z-index is 0" ); equal( div.css( "z-index" ), "0", "z-index is 0" );
div.animate({ zIndex: 2 }, function() { div.animate({ zIndex: 2 }, function() {
equal( div.css( "z-index" ), "2", "z-index is 2" ); equal( div.css( "z-index" ), "2", "z-index is 2" );

View file

@ -15,7 +15,7 @@ test("null or undefined handler", function() {
}); });
test("bind(), with data", function() { test("bind(), with data", function() {
expect(3); expect(4);
var handler = function(event) { var handler = function(event) {
ok( event.data, "bind() with data, check passed data exists" ); ok( event.data, "bind() with data, check passed data exists" );
equals( event.data.foo, "bar", "bind() with data, Check value of passed data" ); equals( event.data.foo, "bar", "bind() with data, Check value of passed data" );
@ -23,6 +23,12 @@ test("bind(), with data", function() {
jQuery("#firstp").bind("click", {foo: "bar"}, handler).click().unbind("click", handler); jQuery("#firstp").bind("click", {foo: "bar"}, handler).click().unbind("click", handler);
ok( !jQuery._data(jQuery("#firstp")[0], "events"), "Event handler unbound when using data." ); ok( !jQuery._data(jQuery("#firstp")[0], "events"), "Event handler unbound when using data." );
var test = function(){};
var handler2 = function(event) {
equals( event.data, test, "bind() with function data, Check value of passed data" );
};
jQuery("#firstp").bind("click", test, handler2).click().unbind("click", handler2);
}); });
test("click(), with data", function() { test("click(), with data", function() {
@ -163,7 +169,7 @@ test("bind(), namespace with special add", function() {
}); });
// Should trigger 2 // Should trigger 2
div.appendTo("#main").remove(); div.appendTo("#qunit-fixture").remove();
delete jQuery.event.special.test; delete jQuery.event.special.test;
}); });
@ -301,7 +307,7 @@ test("live/delegate immediate propagation", function() {
test("bind/delegate bubbling, isDefaultPrevented", function() { test("bind/delegate bubbling, isDefaultPrevented", function() {
expect(2); expect(2);
var $anchor2 = jQuery( "#anchor2" ), var $anchor2 = jQuery( "#anchor2" ),
$main = jQuery( "#main" ), $main = jQuery( "#qunit-fixture" ),
fakeClick = function($jq) { fakeClick = function($jq) {
// Use a native click so we don't get jQuery simulated bubbling // Use a native click so we don't get jQuery simulated bubbling
if ( document.createEvent ) { if ( document.createEvent ) {
@ -409,7 +415,7 @@ test("bind(), namespaced events, cloned events", 18, function() {
}).trigger("tester"); }).trigger("tester");
// Make sure events stick with appendTo'd elements (which are cloned) #2027 // Make sure events stick with appendTo'd elements (which are cloned) #2027
jQuery("<a href='#fail' class='test'>test</a>").click(function(){ return false; }).appendTo("#main"); jQuery("<a href='#fail' class='test'>test</a>").click(function(){ return false; }).appendTo("#qunit-fixture");
ok( jQuery("a.test:first").triggerHandler("click") === false, "Handler is bound to appendTo'd elements" ); ok( jQuery("a.test:first").triggerHandler("click") === false, "Handler is bound to appendTo'd elements" );
}); });
@ -532,7 +538,7 @@ test("bind(name, false), unbind(name, false)", function() {
expect(3); expect(3);
var main = 0; var main = 0;
jQuery("#main").bind("click", function(e){ main++; }); jQuery("#qunit-fixture").bind("click", function(e){ main++; });
jQuery("#ap").trigger("click"); jQuery("#ap").trigger("click");
equals( main, 1, "Verify that the trigger happened correctly." ); equals( main, 1, "Verify that the trigger happened correctly." );
@ -547,14 +553,14 @@ test("bind(name, false), unbind(name, false)", function() {
equals( main, 1, "Verify that the trigger happened correctly." ); equals( main, 1, "Verify that the trigger happened correctly." );
// manually clean up events from elements outside the fixture // manually clean up events from elements outside the fixture
jQuery("#main").unbind("click"); jQuery("#qunit-fixture").unbind("click");
}); });
test("live(name, false), die(name, false)", function() { test("live(name, false), die(name, false)", function() {
expect(3); expect(3);
var main = 0; var main = 0;
jQuery("#main").live("click", function(e){ main++; }); jQuery("#qunit-fixture").live("click", function(e){ main++; });
jQuery("#ap").trigger("click"); jQuery("#ap").trigger("click");
equals( main, 1, "Verify that the trigger happened correctly." ); equals( main, 1, "Verify that the trigger happened correctly." );
@ -567,7 +573,7 @@ test("live(name, false), die(name, false)", function() {
jQuery("#ap").die("click", false); jQuery("#ap").die("click", false);
jQuery("#ap").trigger("click"); jQuery("#ap").trigger("click");
equals( main, 1, "Verify that the trigger happened correctly." ); equals( main, 1, "Verify that the trigger happened correctly." );
jQuery("#main").die("click"); jQuery("#qunit-fixture").die("click");
}); });
test("delegate(selector, name, false), undelegate(selector, name, false)", function() { test("delegate(selector, name, false), undelegate(selector, name, false)", function() {
@ -575,7 +581,7 @@ test("delegate(selector, name, false), undelegate(selector, name, false)", funct
var main = 0; var main = 0;
jQuery("#main").delegate("#ap", "click", function(e){ main++; }); jQuery("#qunit-fixture").delegate("#ap", "click", function(e){ main++; });
jQuery("#ap").trigger("click"); jQuery("#ap").trigger("click");
equals( main, 1, "Verify that the trigger happened correctly." ); equals( main, 1, "Verify that the trigger happened correctly." );
@ -588,7 +594,7 @@ test("delegate(selector, name, false), undelegate(selector, name, false)", funct
jQuery("#ap").undelegate("#groups", "click", false); jQuery("#ap").undelegate("#groups", "click", false);
jQuery("#groups").trigger("click"); jQuery("#groups").trigger("click");
equals( main, 1, "Verify that the trigger happened correctly." ); equals( main, 1, "Verify that the trigger happened correctly." );
jQuery("#main").undelegate("#ap", "click"); jQuery("#qunit-fixture").undelegate("#ap", "click");
}); });
test("bind()/trigger()/unbind() on plain object", function() { test("bind()/trigger()/unbind() on plain object", function() {
@ -792,7 +798,7 @@ test("trigger() bubbling", function() {
jQuery(document).bind("click", function(e){ if ( e.target !== document) { doc++; } }); jQuery(document).bind("click", function(e){ if ( e.target !== document) { doc++; } });
jQuery("html").bind("click", function(e){ html++; }); jQuery("html").bind("click", function(e){ html++; });
jQuery("body").bind("click", function(e){ body++; }); jQuery("body").bind("click", function(e){ body++; });
jQuery("#main").bind("click", function(e){ main++; }); jQuery("#qunit-fixture").bind("click", function(e){ main++; });
jQuery("#ap").bind("click", function(){ ap++; return false; }); jQuery("#ap").bind("click", function(){ ap++; return false; });
jQuery("html").trigger("click"); jQuery("html").trigger("click");
@ -806,7 +812,7 @@ test("trigger() bubbling", function() {
equals( html, 2, "Body bubble" ); equals( html, 2, "Body bubble" );
equals( body, 1, "Body bubble" ); equals( body, 1, "Body bubble" );
jQuery("#main").trigger("click"); jQuery("#qunit-fixture").trigger("click");
equals( win, 3, "Main bubble" ); equals( win, 3, "Main bubble" );
equals( doc, 3, "Main bubble" ); equals( doc, 3, "Main bubble" );
equals( html, 3, "Main bubble" ); equals( html, 3, "Main bubble" );
@ -822,11 +828,11 @@ test("trigger() bubbling", function() {
// manually clean up events from elements outside the fixture // manually clean up events from elements outside the fixture
jQuery(document).unbind("click"); jQuery(document).unbind("click");
jQuery("html, body, #main").unbind("click"); jQuery("html, body, #qunit-fixture").unbind("click");
}); });
test("trigger(type, [data], [fn])", function() { test("trigger(type, [data], [fn])", function() {
expect(14); expect(16);
var handler = function(event, a, b, c) { var handler = function(event, a, b, c) {
equals( event.type, "click", "check passed data" ); equals( event.type, "click", "check passed data" );
@ -843,7 +849,24 @@ test("trigger(type, [data], [fn])", function() {
ok( true, "Native call was triggered" ); ok( true, "Native call was triggered" );
}; };
// Triggers handlrs and native
$elem.live('mouseenter', function(){
ok( true, 'Trigger mouseenter bound by live' );
});
$elem.live('mouseleave', function(){
ok( true, 'Trigger mouseleave bound by live' );
});
$elem.trigger('mouseenter');
$elem.trigger('mouseleave');
$elem.die('mouseenter');
$elem.die('mouseleave');
// Triggers handlrs and native
// Trigger 5 // Trigger 5
$elem.bind("click", handler).trigger("click", [1, "2", "abc"]); $elem.bind("click", handler).trigger("click", [1, "2", "abc"]);
@ -866,7 +889,7 @@ test("trigger(type, [data], [fn])", function() {
pass = true; pass = true;
try { try {
jQuery("#main table:first").bind("test:test", function(){}).trigger("test:test"); jQuery("#qunit-fixture table:first").bind("test:test", function(){}).trigger("test:test");
} catch (e) { } catch (e) {
pass = false; pass = false;
} }
@ -1183,11 +1206,11 @@ test(".live()/.die()", function() {
jQuery("div").die("submit"); jQuery("div").die("submit");
// Test binding with a different context // Test binding with a different context
var clicked = 0, container = jQuery("#main")[0]; var clicked = 0, container = jQuery("#qunit-fixture")[0];
jQuery("#foo", container).live("click", function(e){ clicked++; }); jQuery("#foo", container).live("click", function(e){ clicked++; });
jQuery("div").trigger("click"); jQuery("div").trigger("click");
jQuery("#foo").trigger("click"); jQuery("#foo").trigger("click");
jQuery("#main").trigger("click"); jQuery("#qunit-fixture").trigger("click");
jQuery("body").trigger("click"); jQuery("body").trigger("click");
equals( clicked, 2, "live with a context" ); equals( clicked, 2, "live with a context" );
@ -1710,11 +1733,11 @@ test(".delegate()/.undelegate()", function() {
jQuery("#body").undelegate("div", "submit"); jQuery("#body").undelegate("div", "submit");
// Test binding with a different context // Test binding with a different context
var clicked = 0, container = jQuery("#main")[0]; var clicked = 0, container = jQuery("#qunit-fixture")[0];
jQuery("#main").delegate("#foo", "click", function(e){ clicked++; }); jQuery("#qunit-fixture").delegate("#foo", "click", function(e){ clicked++; });
jQuery("div").trigger("click"); jQuery("div").trigger("click");
jQuery("#foo").trigger("click"); jQuery("#foo").trigger("click");
jQuery("#main").trigger("click"); jQuery("#qunit-fixture").trigger("click");
jQuery("body").trigger("click"); jQuery("body").trigger("click");
equals( clicked, 2, "delegate with a context" ); equals( clicked, 2, "delegate with a context" );
@ -1722,7 +1745,7 @@ test(".delegate()/.undelegate()", function() {
ok( jQuery._data(container, "events").live, "delegate with a context" ); ok( jQuery._data(container, "events").live, "delegate with a context" );
// Test unbinding with a different context // Test unbinding with a different context
jQuery("#main").undelegate("#foo", "click"); jQuery("#qunit-fixture").undelegate("#foo", "click");
jQuery("#foo").trigger("click"); jQuery("#foo").trigger("click");
equals( clicked, 2, "undelegate with a context"); equals( clicked, 2, "undelegate with a context");

View file

@ -227,7 +227,7 @@ test("unwrap()", function() {
}); });
var testAppend = function(valueObj) { var testAppend = function(valueObj) {
expect(37); expect(40);
var defaultText = "Try them out:" var defaultText = "Try them out:"
var result = jQuery("#first").append(valueObj("<b>buga</b>")); var result = jQuery("#first").append(valueObj("<b>buga</b>"));
equals( result.text(), defaultText + "buga", "Check if text appending works" ); equals( result.text(), defaultText + "buga", "Check if text appending works" );
@ -330,6 +330,20 @@ var testAppend = function(valueObj) {
d.contents().appendTo("#nonnodes"); d.contents().appendTo("#nonnodes");
d.remove(); d.remove();
ok( jQuery("#nonnodes").contents().length >= 2, "Check node,textnode,comment append cleanup worked" ); ok( jQuery("#nonnodes").contents().length >= 2, "Check node,textnode,comment append cleanup worked" );
QUnit.reset();
var $input = jQuery("<input />").attr({ "type": "checkbox", "checked": true }).appendTo('#testForm');
equals( $input[0].checked, true, "A checked checkbox that is appended stays checked" );
QUnit.reset();
var $radios = jQuery("input:radio[name='R1']"),
$radioNot = jQuery("<input type='radio' name='R1' checked='checked'/>").insertAfter( $radios ),
$radio = $radios.eq(1).click();
$radioNot[0].checked = false;
$radios.parent().wrap("<div></div>");
equals( $radio[0].checked, true, "Reappending radios uphold which radio is checked" );
equals( $radioNot[0].checked, false, "Reappending radios uphold not being checked" );
QUnit.reset();
} }
test("append(String|Element|Array&lt;Element&gt;|jQuery)", function() { test("append(String|Element|Array&lt;Element&gt;|jQuery)", function() {
@ -483,19 +497,19 @@ test("appendTo(String|Element|Array&lt;Element&gt;|jQuery)", function() {
var div = jQuery("<div/>").click(function(){ var div = jQuery("<div/>").click(function(){
ok(true, "Running a cloned click."); ok(true, "Running a cloned click.");
}); });
div.appendTo("#main, #moretests"); div.appendTo("#qunit-fixture, #moretests");
jQuery("#main div:last").click(); jQuery("#qunit-fixture div:last").click();
jQuery("#moretests div:last").click(); jQuery("#moretests div:last").click();
QUnit.reset(); QUnit.reset();
var div = jQuery("<div/>").appendTo("#main, #moretests"); var div = jQuery("<div/>").appendTo("#qunit-fixture, #moretests");
equals( div.length, 2, "appendTo returns the inserted elements" ); equals( div.length, 2, "appendTo returns the inserted elements" );
div.addClass("test"); div.addClass("test");
ok( jQuery("#main div:last").hasClass("test"), "appendTo element was modified after the insertion" ); ok( jQuery("#qunit-fixture div:last").hasClass("test"), "appendTo element was modified after the insertion" );
ok( jQuery("#moretests div:last").hasClass("test"), "appendTo element was modified after the insertion" ); ok( jQuery("#moretests div:last").hasClass("test"), "appendTo element was modified after the insertion" );
QUnit.reset(); QUnit.reset();
@ -507,10 +521,10 @@ test("appendTo(String|Element|Array&lt;Element&gt;|jQuery)", function() {
div = jQuery("#moretests div"); div = jQuery("#moretests div");
var num = jQuery("#main div").length; var num = jQuery("#qunit-fixture div").length;
div.remove().appendTo("#main"); div.remove().appendTo("#qunit-fixture");
equals( jQuery("#main div").length, num, "Make sure all the removed divs were inserted." ); equals( jQuery("#qunit-fixture div").length, num, "Make sure all the removed divs were inserted." );
QUnit.reset(); QUnit.reset();
}); });
@ -750,7 +764,7 @@ var testReplaceWith = function(val) {
ok( !jQuery("#yahoo")[0], "Verify that original element is gone, after element" ); ok( !jQuery("#yahoo")[0], "Verify that original element is gone, after element" );
QUnit.reset(); QUnit.reset();
jQuery("#main").append("<div id='bar'><div id='baz'</div></div>"); jQuery("#qunit-fixture").append("<div id='bar'><div id='baz'</div></div>");
jQuery("#baz").replaceWith("Baz"); jQuery("#baz").replaceWith("Baz");
equals( jQuery("#bar").text(),"Baz", "Replace element with text" ); equals( jQuery("#bar").text(),"Baz", "Replace element with text" );
ok( !jQuery("#baz")[0], "Verify that original element is gone, after element" ); ok( !jQuery("#baz")[0], "Verify that original element is gone, after element" );
@ -813,14 +827,14 @@ var testReplaceWith = function(val) {
QUnit.reset(); QUnit.reset();
jQuery("#main").append("<div id='replaceWith'></div>"); jQuery("#qunit-fixture").append("<div id='replaceWith'></div>");
equals( jQuery("#main").find("div[id=replaceWith]").length, 1, "Make sure only one div exists." ); equals( jQuery("#qunit-fixture").find("div[id=replaceWith]").length, 1, "Make sure only one div exists." );
jQuery("#replaceWith").replaceWith( val("<div id='replaceWith'></div>") ); jQuery("#replaceWith").replaceWith( val("<div id='replaceWith'></div>") );
equals( jQuery("#main").find("div[id=replaceWith]").length, 1, "Make sure only one div exists." ); equals( jQuery("#qunit-fixture").find("div[id=replaceWith]").length, 1, "Make sure only one div exists." );
jQuery("#replaceWith").replaceWith( val("<div id='replaceWith'></div>") ); jQuery("#replaceWith").replaceWith( val("<div id='replaceWith'></div>") );
equals( jQuery("#main").find("div[id=replaceWith]").length, 1, "Make sure only one div exists." ); equals( jQuery("#qunit-fixture").find("div[id=replaceWith]").length, 1, "Make sure only one div exists." );
} }
test("replaceWith(String|Element|Array&lt;Element&gt;|jQuery)", function() { test("replaceWith(String|Element|Array&lt;Element&gt;|jQuery)", function() {
@ -881,7 +895,7 @@ test("jQuery.clone() (#8017)", function() {
ok( jQuery.clone && jQuery.isFunction( jQuery.clone ) , "jQuery.clone() utility exists and is a function."); ok( jQuery.clone && jQuery.isFunction( jQuery.clone ) , "jQuery.clone() utility exists and is a function.");
var main = jQuery("#main")[0], var main = jQuery("#qunit-fixture")[0],
clone = jQuery.clone( main ); clone = jQuery.clone( main );
equals( main.childNodes.length, clone.childNodes.length, "Simple child length to ensure a large dom tree copies correctly" ); equals( main.childNodes.length, clone.childNodes.length, "Simple child length to ensure a large dom tree copies correctly" );
@ -890,7 +904,7 @@ test("jQuery.clone() (#8017)", function() {
test("clone() (#8070)", function () { test("clone() (#8070)", function () {
expect(2); expect(2);
jQuery("<select class='test8070'></select><select class='test8070'></select>").appendTo("#main"); jQuery("<select class='test8070'></select><select class='test8070'></select>").appendTo("#qunit-fixture");
var selects = jQuery(".test8070"); var selects = jQuery(".test8070");
selects.append("<OPTION>1</OPTION><OPTION>2</OPTION>"); selects.append("<OPTION>1</OPTION><OPTION>2</OPTION>");
@ -1062,7 +1076,7 @@ var testHtml = function(valueObj) {
jQuery.scriptorder = 0; jQuery.scriptorder = 0;
var div = jQuery("#main > div"); var div = jQuery("#qunit-fixture > div");
div.html(valueObj("<b>test</b>")); div.html(valueObj("<b>test</b>"));
var pass = true; var pass = true;
for ( var i = 0; i < div.size(); i++ ) { for ( var i = 0; i < div.size(); i++ ) {
@ -1079,10 +1093,10 @@ var testHtml = function(valueObj) {
ok( /^\xA0$|^&nbsp;$/.test( space ), "Make sure entities are passed through correctly." ); ok( /^\xA0$|^&nbsp;$/.test( space ), "Make sure entities are passed through correctly." );
equals( jQuery("<div/>").html(valueObj("&amp;"))[0].innerHTML, "&amp;", "Make sure entities are passed through correctly." ); equals( jQuery("<div/>").html(valueObj("&amp;"))[0].innerHTML, "&amp;", "Make sure entities are passed through correctly." );
jQuery("#main").html(valueObj("<style>.foobar{color:green;}</style>")); jQuery("#qunit-fixture").html(valueObj("<style>.foobar{color:green;}</style>"));
equals( jQuery("#main").children().length, 1, "Make sure there is a child element." ); equals( jQuery("#qunit-fixture").children().length, 1, "Make sure there is a child element." );
equals( jQuery("#main").children()[0].nodeName.toUpperCase(), "STYLE", "And that a style element was inserted." ); equals( jQuery("#qunit-fixture").children()[0].nodeName.toUpperCase(), "STYLE", "And that a style element was inserted." );
QUnit.reset(); QUnit.reset();
// using contents will get comments regular, text, and comment nodes // using contents will get comments regular, text, and comment nodes
@ -1093,9 +1107,9 @@ var testHtml = function(valueObj) {
j.find("b").removeData(); j.find("b").removeData();
equals( j.html().replace(/ xmlns="[^"]+"/g, "").toLowerCase(), "<b>bold</b>", "Check node,textnode,comment with html()" ); equals( j.html().replace(/ xmlns="[^"]+"/g, "").toLowerCase(), "<b>bold</b>", "Check node,textnode,comment with html()" );
jQuery("#main").html(valueObj("<select/>")); jQuery("#qunit-fixture").html(valueObj("<select/>"));
jQuery("#main select").html(valueObj("<option>O1</option><option selected='selected'>O2</option><option>O3</option>")); jQuery("#qunit-fixture select").html(valueObj("<option>O1</option><option selected='selected'>O2</option><option>O3</option>"));
equals( jQuery("#main select").val(), "O2", "Selected option correct" ); equals( jQuery("#qunit-fixture select").val(), "O2", "Selected option correct" );
var $div = jQuery("<div />"); var $div = jQuery("<div />");
equals( $div.html(valueObj( 5 )).html(), "5", "Setting a number as html" ); equals( $div.html(valueObj( 5 )).html(), "5", "Setting a number as html" );
@ -1113,23 +1127,23 @@ var testHtml = function(valueObj) {
QUnit.reset(); QUnit.reset();
jQuery("#main").html(valueObj("<script type='something/else'>ok( false, 'Non-script evaluated.' );</script><script type='text/javascript'>ok( true, 'text/javascript is evaluated.' );</script><script>ok( true, 'No type is evaluated.' );</script><div><script type='text/javascript'>ok( true, 'Inner text/javascript is evaluated.' );</script><script>ok( true, 'Inner No type is evaluated.' );</script><script type='something/else'>ok( false, 'Non-script evaluated.' );</script></div>")); jQuery("#qunit-fixture").html(valueObj("<script type='something/else'>ok( false, 'Non-script evaluated.' );</script><script type='text/javascript'>ok( true, 'text/javascript is evaluated.' );</script><script>ok( true, 'No type is evaluated.' );</script><div><script type='text/javascript'>ok( true, 'Inner text/javascript is evaluated.' );</script><script>ok( true, 'Inner No type is evaluated.' );</script><script type='something/else'>ok( false, 'Non-script evaluated.' );</script></div>"));
var child = jQuery("#main").find("script"); var child = jQuery("#qunit-fixture").find("script");
equals( child.length, 2, "Make sure that two non-JavaScript script tags are left." ); equals( child.length, 2, "Make sure that two non-JavaScript script tags are left." );
equals( child[0].type, "something/else", "Verify type of script tag." ); equals( child[0].type, "something/else", "Verify type of script tag." );
equals( child[1].type, "something/else", "Verify type of script tag." ); equals( child[1].type, "something/else", "Verify type of script tag." );
jQuery("#main").html(valueObj("<script>ok( true, 'Test repeated injection of script.' );</script>")); jQuery("#qunit-fixture").html(valueObj("<script>ok( true, 'Test repeated injection of script.' );</script>"));
jQuery("#main").html(valueObj("<script>ok( true, 'Test repeated injection of script.' );</script>")); jQuery("#qunit-fixture").html(valueObj("<script>ok( true, 'Test repeated injection of script.' );</script>"));
jQuery("#main").html(valueObj("<script>ok( true, 'Test repeated injection of script.' );</script>")); jQuery("#qunit-fixture").html(valueObj("<script>ok( true, 'Test repeated injection of script.' );</script>"));
jQuery("#main").html(valueObj("<script type='text/javascript'>ok( true, 'jQuery().html().evalScripts() Evals Scripts Twice in Firefox, see #975 (1)' );</script>")); jQuery("#qunit-fixture").html(valueObj("<script type='text/javascript'>ok( true, 'jQuery().html().evalScripts() Evals Scripts Twice in Firefox, see #975 (1)' );</script>"));
jQuery("#main").html(valueObj("foo <form><script type='text/javascript'>ok( true, 'jQuery().html().evalScripts() Evals Scripts Twice in Firefox, see #975 (2)' );</script></form>")); jQuery("#qunit-fixture").html(valueObj("foo <form><script type='text/javascript'>ok( true, 'jQuery().html().evalScripts() Evals Scripts Twice in Firefox, see #975 (2)' );</script></form>"));
jQuery("#main").html(valueObj("<script>equals(jQuery.scriptorder++, 0, 'Script is executed in order');equals(jQuery('#scriptorder').length, 1,'Execute after html (even though appears before)')<\/script><span id='scriptorder'><script>equals(jQuery.scriptorder++, 1, 'Script (nested) is executed in order');equals(jQuery('#scriptorder').length, 1,'Execute after html')<\/script></span><script>equals(jQuery.scriptorder++, 2, 'Script (unnested) is executed in order');equals(jQuery('#scriptorder').length, 1,'Execute after html')<\/script>")); jQuery("#qunit-fixture").html(valueObj("<script>equals(jQuery.scriptorder++, 0, 'Script is executed in order');equals(jQuery('#scriptorder').length, 1,'Execute after html (even though appears before)')<\/script><span id='scriptorder'><script>equals(jQuery.scriptorder++, 1, 'Script (nested) is executed in order');equals(jQuery('#scriptorder').length, 1,'Execute after html')<\/script></span><script>equals(jQuery.scriptorder++, 2, 'Script (unnested) is executed in order');equals(jQuery('#scriptorder').length, 1,'Execute after html')<\/script>"));
} }
test("html(String)", function() { test("html(String)", function() {
@ -1143,18 +1157,18 @@ test("html(Function)", function() {
QUnit.reset(); QUnit.reset();
jQuery("#main").html(function(){ jQuery("#qunit-fixture").html(function(){
return jQuery(this).text(); return jQuery(this).text();
}); });
ok( !/</.test( jQuery("#main").html() ), "Replace html with text." ); ok( !/</.test( jQuery("#qunit-fixture").html() ), "Replace html with text." );
ok( jQuery("#main").html().length > 0, "Make sure text exists." ); ok( jQuery("#qunit-fixture").html().length > 0, "Make sure text exists." );
}); });
test("html(Function) with incoming value", function() { test("html(Function) with incoming value", function() {
expect(20); expect(20);
var div = jQuery("#main > div"), old = div.map(function(){ return jQuery(this).html() }); var div = jQuery("#qunit-fixture > div"), old = div.map(function(){ return jQuery(this).html() });
div.html(function(i, val) { div.html(function(i, val) {
equals( val, old[i], "Make sure the incoming value is correct." ); equals( val, old[i], "Make sure the incoming value is correct." );
@ -1251,7 +1265,7 @@ var testRemove = function(method) {
var count = 0; var count = 0;
var first = jQuery("#ap").children(":first"); var first = jQuery("#ap").children(":first");
var cleanUp = first.click(function() { count++ })[method]().appendTo("#main").click(); var cleanUp = first.click(function() { count++ })[method]().appendTo("#qunit-fixture").click();
equals( method == "remove" ? 0 : 1, count ); equals( method == "remove" ? 0 : 1, count );
@ -1359,7 +1373,7 @@ test("jQuery.buildFragment - no plain-text caching (Bug #6779)", function() {
expect(1); expect(1);
// DOM manipulation fails if added text matches an Object method // DOM manipulation fails if added text matches an Object method
var $f = jQuery( "<div />" ).appendTo( "#main" ), var $f = jQuery( "<div />" ).appendTo( "#qunit-fixture" ),
bad = [ "start-", "toString", "hasOwnProperty", "append", "here&there!", "-end" ]; bad = [ "start-", "toString", "hasOwnProperty", "append", "here&there!", "-end" ];
for ( var i=0; i < bad.length; i++ ) { for ( var i=0; i < bad.length; i++ ) {

View file

@ -8,9 +8,9 @@ test("find(String)", function() {
var j = jQuery("#nonnodes").contents(); var j = jQuery("#nonnodes").contents();
equals( j.find("div").length, 0, "Check node,textnode,comment to find zero divs" ); equals( j.find("div").length, 0, "Check node,textnode,comment to find zero divs" );
same( jQuery("#main").find("> div").get(), q("foo", "moretests", "tabindex-tests", "liveHandlerOrder", "siblingTest"), "find child elements" ); same( jQuery("#qunit-fixture").find("> div").get(), q("foo", "moretests", "tabindex-tests", "liveHandlerOrder", "siblingTest"), "find child elements" );
same( jQuery("#main").find("> #foo, > #moretests").get(), q("foo", "moretests"), "find child elements" ); same( jQuery("#qunit-fixture").find("> #foo, > #moretests").get(), q("foo", "moretests"), "find child elements" );
same( jQuery("#main").find("> #foo > p").get(), q("sndp", "en", "sap"), "find child elements" ); same( jQuery("#qunit-fixture").find("> #foo > p").get(), q("sndp", "en", "sap"), "find child elements" );
}); });
test("find(node|jQuery object)", function() { test("find(node|jQuery object)", function() {
@ -155,9 +155,9 @@ test("filter(Selector|undefined)", function() {
test("filter(Function)", function() { test("filter(Function)", function() {
expect(2); expect(2);
same( jQuery("#main p").filter(function() { return !jQuery("a", this).length }).get(), q("sndp", "first"), "filter(Function)" ); same( jQuery("#qunit-fixture p").filter(function() { return !jQuery("a", this).length }).get(), q("sndp", "first"), "filter(Function)" );
same( jQuery("#main p").filter(function(i, elem) { return !jQuery("a", elem).length }).get(), q("sndp", "first"), "filter(Function) using arg" ); same( jQuery("#qunit-fixture p").filter(function(i, elem) { return !jQuery("a", elem).length }).get(), q("sndp", "first"), "filter(Function) using arg" );
}); });
test("filter(Element)", function() { test("filter(Element)", function() {
@ -186,7 +186,7 @@ test("closest()", function() {
same( jQuery("body").closest("body").get(), q("body"), "closest(body)" ); same( jQuery("body").closest("body").get(), q("body"), "closest(body)" );
same( jQuery("body").closest("html").get(), q("html"), "closest(html)" ); same( jQuery("body").closest("html").get(), q("html"), "closest(html)" );
same( jQuery("body").closest("div").get(), [], "closest(div)" ); same( jQuery("body").closest("div").get(), [], "closest(div)" );
same( jQuery("#main").closest("span,#html").get(), q("html"), "closest(span,#html)" ); same( jQuery("#qunit-fixture").closest("span,#html").get(), q("html"), "closest(span,#html)" );
same( jQuery("div:eq(1)").closest("div:first").get(), [], "closest(div:first)" ); same( jQuery("div:eq(1)").closest("div:first").get(), [], "closest(div:first)" );
same( jQuery("div").closest("body:first div:last").get(), q("fx-tests"), "closest(body:first div:last)" ); same( jQuery("div").closest("body:first div:last").get(), q("fx-tests"), "closest(body:first div:last)" );
@ -198,7 +198,7 @@ test("closest()", function() {
same( jq.closest("#nothiddendiv", document.body).get(), q("nothiddendiv"), "Context not reached." ); same( jq.closest("#nothiddendiv", document.body).get(), q("nothiddendiv"), "Context not reached." );
//Test that .closest() returns unique'd set //Test that .closest() returns unique'd set
equals( jQuery("#main p").closest("#main").length, 1, "Closest should return a unique set" ); equals( jQuery("#qunit-fixture p").closest("#qunit-fixture").length, 1, "Closest should return a unique set" );
// Test on disconnected node // Test on disconnected node
equals( jQuery("<div><p></p></div>").find("p").closest("table").length, 0, "Make sure disconnected closest work." ); equals( jQuery("<div><p></p></div>").find("p").closest("table").length, 0, "Make sure disconnected closest work." );
@ -213,8 +213,8 @@ test("closest(Array)", function() {
same( jQuery("body").closest(["body"]), [{selector:"body", elem:document.body, level:1}], "closest([body])" ); same( jQuery("body").closest(["body"]), [{selector:"body", elem:document.body, level:1}], "closest([body])" );
same( jQuery("body").closest(["html"]), [{selector:"html", elem:document.documentElement, level:2}], "closest([html])" ); same( jQuery("body").closest(["html"]), [{selector:"html", elem:document.documentElement, level:2}], "closest([html])" );
same( jQuery("body").closest(["div"]), [], "closest([div])" ); same( jQuery("body").closest(["div"]), [], "closest([div])" );
same( jQuery("#yahoo").closest(["div"]), [{"selector":"div", "elem": document.getElementById("foo"), "level": 3}, { "selector": "div", "elem": document.getElementById("main"), "level": 4 }], "closest([div])" ); same( jQuery("#yahoo").closest(["div"]), [{"selector":"div", "elem": document.getElementById("foo"), "level": 3}, { "selector": "div", "elem": document.getElementById("qunit-fixture"), "level": 4 }], "closest([div])" );
same( jQuery("#main").closest(["span,#html"]), [{selector:"span,#html", elem:document.documentElement, level:4}], "closest([span,#html])" ); same( jQuery("#qunit-fixture").closest(["span,#html"]), [{selector:"span,#html", elem:document.documentElement, level:4}], "closest([span,#html])" );
same( jQuery("body").closest(["body","html"]), [{selector:"body", elem:document.body, level:1}, {selector:"html", elem:document.documentElement, level:2}], "closest([body, html])" ); same( jQuery("body").closest(["body","html"]), [{selector:"body", elem:document.body, level:1}, {selector:"html", elem:document.documentElement, level:2}], "closest([body, html])" );
same( jQuery("body").closest(["span","html"]), [{selector:"html", elem:document.documentElement, level:2}], "closest([body, html])" ); same( jQuery("body").closest(["span","html"]), [{selector:"html", elem:document.documentElement, level:2}], "closest([body, html])" );
@ -224,7 +224,7 @@ test("closest(jQuery)", function() {
expect(8); expect(8);
var $child = jQuery("#nothiddendivchild"), var $child = jQuery("#nothiddendivchild"),
$parent = jQuery("#nothiddendiv"), $parent = jQuery("#nothiddendiv"),
$main = jQuery("#main"), $main = jQuery("#qunit-fixture"),
$body = jQuery("body"); $body = jQuery("body");
ok( $child.closest( $parent ).is("#nothiddendiv"), "closest( jQuery('#nothiddendiv') )" ); ok( $child.closest( $parent ).is("#nothiddendiv"), "closest( jQuery('#nothiddendiv') )" );
ok( $child.closest( $parent[0] ).is("#nothiddendiv"), "closest( jQuery('#nothiddendiv') ) :: node" ); ok( $child.closest( $parent[0] ).is("#nothiddendiv"), "closest( jQuery('#nothiddendiv') ) :: node" );
@ -238,7 +238,7 @@ test("closest(jQuery)", function() {
test("not(Selector|undefined)", function() { test("not(Selector|undefined)", function() {
expect(11); expect(11);
equals( jQuery("#main > p#ap > a").not("#google").length, 2, "not('selector')" ); equals( jQuery("#qunit-fixture > p#ap > a").not("#google").length, 2, "not('selector')" );
same( jQuery("p").not(".result").get(), q("firstp", "ap", "sndp", "en", "sap", "first"), "not('.class')" ); same( jQuery("p").not(".result").get(), q("firstp", "ap", "sndp", "en", "sap", "first"), "not('.class')" );
same( jQuery("p").not("#ap, #sndp, .result").get(), q("firstp", "en", "sap", "first"), "not('selector, selector')" ); same( jQuery("p").not("#ap, #sndp, .result").get(), q("firstp", "en", "sap", "first"), "not('selector, selector')" );
same( jQuery("#form option").not("option.emptyopt:contains('Nothing'),[selected],[value='1']").get(), q("option1c", "option1d", "option2c", "option3d", "option3e", "option4e","option5b"), "not('complex selector')"); same( jQuery("#form option").not("option.emptyopt:contains('Nothing'),[selected],[value='1']").get(), q("option1c", "option1d", "option2c", "option3d", "option3e", "option4e","option5b"), "not('complex selector')");
@ -262,13 +262,13 @@ test("not(Element)", function() {
}); });
test("not(Function)", function() { test("not(Function)", function() {
same( jQuery("#main p").not(function() { return jQuery("a", this).length }).get(), q("sndp", "first"), "not(Function)" ); same( jQuery("#qunit-fixture p").not(function() { return jQuery("a", this).length }).get(), q("sndp", "first"), "not(Function)" );
}); });
test("not(Array)", function() { test("not(Array)", function() {
expect(2); expect(2);
equals( jQuery("#main > p#ap > a").not(document.getElementById("google")).length, 2, "not(DOMElement)" ); equals( jQuery("#qunit-fixture > p#ap > a").not(document.getElementById("google")).length, 2, "not(DOMElement)" );
equals( jQuery("p").not(document.getElementsByTagName("p")).length, 0, "not(Array-like DOM collection)" ); equals( jQuery("p").not(document.getElementsByTagName("p")).length, 0, "not(Array-like DOM collection)" );
}); });
@ -281,37 +281,37 @@ test("not(jQuery)", function() {
test("has(Element)", function() { test("has(Element)", function() {
expect(2); expect(2);
var obj = jQuery("#main").has(jQuery("#sndp")[0]); var obj = jQuery("#qunit-fixture").has(jQuery("#sndp")[0]);
same( obj.get(), q("main"), "Keeps elements that have the element as a descendant" ); same( obj.get(), q("qunit-fixture"), "Keeps elements that have the element as a descendant" );
var multipleParent = jQuery("#main, #header").has(jQuery("#sndp")[0]); var multipleParent = jQuery("#qunit-fixture, #header").has(jQuery("#sndp")[0]);
same( obj.get(), q("main"), "Does not include elements that do not have the element as a descendant" ); same( obj.get(), q("qunit-fixture"), "Does not include elements that do not have the element as a descendant" );
}); });
test("has(Selector)", function() { test("has(Selector)", function() {
expect(3); expect(3);
var obj = jQuery("#main").has("#sndp"); var obj = jQuery("#qunit-fixture").has("#sndp");
same( obj.get(), q("main"), "Keeps elements that have any element matching the selector as a descendant" ); same( obj.get(), q("qunit-fixture"), "Keeps elements that have any element matching the selector as a descendant" );
var multipleParent = jQuery("#main, #header").has("#sndp"); var multipleParent = jQuery("#qunit-fixture, #header").has("#sndp");
same( obj.get(), q("main"), "Does not include elements that do not have the element as a descendant" ); same( obj.get(), q("qunit-fixture"), "Does not include elements that do not have the element as a descendant" );
var multipleHas = jQuery("#main").has("#sndp, #first"); var multipleHas = jQuery("#qunit-fixture").has("#sndp, #first");
same( multipleHas.get(), q("main"), "Only adds elements once" ); same( multipleHas.get(), q("qunit-fixture"), "Only adds elements once" );
}); });
test("has(Arrayish)", function() { test("has(Arrayish)", function() {
expect(3); expect(3);
var simple = jQuery("#main").has(jQuery("#sndp")); var simple = jQuery("#qunit-fixture").has(jQuery("#sndp"));
same( simple.get(), q("main"), "Keeps elements that have any element in the jQuery list as a descendant" ); same( simple.get(), q("qunit-fixture"), "Keeps elements that have any element in the jQuery list as a descendant" );
var multipleParent = jQuery("#main, #header").has(jQuery("#sndp")); var multipleParent = jQuery("#qunit-fixture, #header").has(jQuery("#sndp"));
same( multipleParent.get(), q("main"), "Does not include elements that do not have an element in the jQuery list as a descendant" ); same( multipleParent.get(), q("qunit-fixture"), "Does not include elements that do not have an element in the jQuery list as a descendant" );
var multipleHas = jQuery("#main").has(jQuery("#sndp, #first")); var multipleHas = jQuery("#qunit-fixture").has(jQuery("#sndp, #first"));
same( simple.get(), q("main"), "Only adds elements once" ); same( simple.get(), q("qunit-fixture"), "Only adds elements once" );
}); });
test("andSelf()", function() { test("andSelf()", function() {
@ -319,7 +319,7 @@ test("andSelf()", function() {
same( jQuery("#en").siblings().andSelf().get(), q("sndp", "en", "sap"), "Check for siblings and self" ); same( jQuery("#en").siblings().andSelf().get(), q("sndp", "en", "sap"), "Check for siblings and self" );
same( jQuery("#foo").children().andSelf().get(), q("foo", "sndp", "en", "sap"), "Check for children and self" ); same( jQuery("#foo").children().andSelf().get(), q("foo", "sndp", "en", "sap"), "Check for children and self" );
same( jQuery("#sndp, #en").parent().andSelf().get(), q("foo","sndp","en"), "Check for parent and self" ); same( jQuery("#sndp, #en").parent().andSelf().get(), q("foo","sndp","en"), "Check for parent and self" );
same( jQuery("#groups").parents("p, div").andSelf().get(), q("main", "ap", "groups"), "Check for parents and self" ); same( jQuery("#groups").parents("p, div").andSelf().get(), q("qunit-fixture", "ap", "groups"), "Check for parents and self" );
}); });
test("siblings([String])", function() { test("siblings([String])", function() {
@ -352,9 +352,9 @@ test("parents([String])", function() {
expect(5); expect(5);
equals( jQuery("#groups").parents()[0].id, "ap", "Simple parents check" ); equals( jQuery("#groups").parents()[0].id, "ap", "Simple parents check" );
equals( jQuery("#groups").parents("p")[0].id, "ap", "Filtered parents check" ); equals( jQuery("#groups").parents("p")[0].id, "ap", "Filtered parents check" );
equals( jQuery("#groups").parents("div")[0].id, "main", "Filtered parents check2" ); equals( jQuery("#groups").parents("div")[0].id, "qunit-fixture", "Filtered parents check2" );
same( jQuery("#groups").parents("p, div").get(), q("ap", "main"), "Check for multiple filters" ); same( jQuery("#groups").parents("p, div").get(), q("ap", "qunit-fixture"), "Check for multiple filters" );
same( jQuery("#en, #sndp").parents().get(), q("foo", "main", "dl", "body", "html"), "Check for unique results from parents" ); same( jQuery("#en, #sndp").parents().get(), q("foo", "qunit-fixture", "dl", "body", "html"), "Check for unique results from parents" );
}); });
test("parentsUntil([String])", function() { test("parentsUntil([String])", function() {
@ -367,7 +367,7 @@ test("parentsUntil([String])", function() {
same( jQuery("#groups").parentsUntil("#html").get(), parents.not(":last").get(), "Simple parentsUntil check" ); same( jQuery("#groups").parentsUntil("#html").get(), parents.not(":last").get(), "Simple parentsUntil check" );
equals( jQuery("#groups").parentsUntil("#ap").length, 0, "Simple parentsUntil check" ); equals( jQuery("#groups").parentsUntil("#ap").length, 0, "Simple parentsUntil check" );
same( jQuery("#groups").parentsUntil("#html, #body").get(), parents.slice( 0, 3 ).get(), "Less simple parentsUntil check" ); same( jQuery("#groups").parentsUntil("#html, #body").get(), parents.slice( 0, 3 ).get(), "Less simple parentsUntil check" );
same( jQuery("#groups").parentsUntil("#html", "div").get(), jQuery("#main").get(), "Filtered parentsUntil check" ); same( jQuery("#groups").parentsUntil("#html", "div").get(), jQuery("#qunit-fixture").get(), "Filtered parentsUntil check" );
same( jQuery("#groups").parentsUntil("#html", "p,div,dl").get(), parents.slice( 0, 3 ).get(), "Multiple-filtered parentsUntil check" ); same( jQuery("#groups").parentsUntil("#html", "p,div,dl").get(), parents.slice( 0, 3 ).get(), "Multiple-filtered parentsUntil check" );
equals( jQuery("#groups").parentsUntil("#html", "span").length, 0, "Filtered parentsUntil check, no match" ); equals( jQuery("#groups").parentsUntil("#html", "span").length, 0, "Filtered parentsUntil check, no match" );
same( jQuery("#groups, #ap").parentsUntil("#html", "p,div,dl").get(), parents.slice( 0, 3 ).get(), "Multi-source, multiple-filtered parentsUntil check" ); same( jQuery("#groups, #ap").parentsUntil("#html", "p,div,dl").get(), parents.slice( 0, 3 ).get(), "Multi-source, multiple-filtered parentsUntil check" );
@ -480,7 +480,7 @@ test("contents()", function() {
}); });
test("add(String|Element|Array|undefined)", function() { test("add(String|Element|Array|undefined)", function() {
expect(16); expect(17);
same( jQuery("#sndp").add("#en").add("#sap").get(), q("sndp", "en", "sap"), "Check elements from document" ); same( jQuery("#sndp").add("#en").add("#sap").get(), q("sndp", "en", "sap"), "Check elements from document" );
same( jQuery("#sndp").add( jQuery("#en")[0] ).add( jQuery("#sap") ).get(), q("sndp", "en", "sap"), "Check elements from document" ); same( jQuery("#sndp").add( jQuery("#en")[0] ).add( jQuery("#sap") ).get(), q("sndp", "en", "sap"), "Check elements from document" );
ok( jQuery([]).add(jQuery("#form")[0].elements).length >= 13, "Check elements from array" ); ok( jQuery([]).add(jQuery("#form")[0].elements).length >= 13, "Check elements from array" );
@ -519,7 +519,8 @@ test("add(String|Element|Array|undefined)", function() {
var notDefined; var notDefined;
equals( jQuery([]).add(notDefined).length, 0, "Check that undefined adds nothing" ); equals( jQuery([]).add(notDefined).length, 0, "Check that undefined adds nothing" );
ok( jQuery([]).add( document.getElementById("form") ).length >= 13, "Add a form (adds the elements)" ); equals( jQuery([]).add( document.getElementById("form") ).length, 1, "Add a form" );
equals( jQuery([]).add( document.getElementById("select1") ).length, 1, "Add a select" );
}); });
test("add(String, Context)", function() { test("add(String, Context)", function() {