diff --git a/jquery.timeago.js b/jquery.timeago.js
index 9e05568f..3f67479b 100644
--- a/jquery.timeago.js
+++ b/jquery.timeago.js
@@ -1,6 +1,6 @@
/*
* timeago: a jQuery plugin, version: 0.9.2 (2010-09-14)
- * @requires jQuery v1.2.3 or later
+ * @requires jQuery v1.4.3 or later
*
* Timeago is a jQuery plugin that makes it easy to support automatically
* updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
@@ -99,12 +99,15 @@
});
$.fn.timeago = function() {
+ if (this.length === 0) return;
+
var self = this;
+ var newTimestamps = self.filter(unattachedTimestamps);
self.each(refresh);
var $s = $t.settings;
if ($s.refreshMillis > 0) {
- setInterval(function() { self.each(refresh); }, $s.refreshMillis);
+ setInterval(function() { newTimestamps.each(refresh); }, $s.refreshMillis);
}
return self;
};
@@ -127,6 +130,10 @@
return element.data("timeago");
}
+ function unattachedTimestamps($elements) {
+ return $(this).data("timeago") === undefined;
+ }
+
function inWords(date) {
return $t.inWords(distance(date));
}
diff --git a/test/index.html b/test/index.html
index a53b0259..881ab876 100644
--- a/test/index.html
+++ b/test/index.html
@@ -5,7 +5,7 @@
-
+
diff --git a/test/qunit.js b/test/qunit.js
index 070f6b79..39dac030 100644
--- a/test/qunit.js
+++ b/test/qunit.js
@@ -17,10 +17,11 @@ var QUnit = {
config.currentModule = name;
synchronize(function() {
- if ( config.currentModule ) {
+ if ( config.previousModule ) {
QUnit.moduleDone( config.currentModule, config.moduleStats.bad, config.moduleStats.all );
}
+ config.previousModule = config.currentModule;
config.currentModule = name;
config.moduleTestEnvironment = testEnvironment;
config.moduleStats = { all: 0, bad: 0 };
@@ -84,7 +85,7 @@ var QUnit = {
var li = document.createElement("li");
li.appendChild( b );
li.id = "current-test-output";
- tests.appendChild( li )
+ tests.appendChild( li );
}
try {
@@ -107,7 +108,7 @@ var QUnit = {
callback.call(testEnvironment);
} catch(e) {
fail("Test " + name + " died, exception and test follows", e, callback);
- QUnit.ok( false, "Died on test #" + (config.assertions.length + 1) + ": " + e.message );
+ QUnit.ok( false, "Died on test #" + (config.assertions.length + 1) + ": " + e.message + " - " + QUnit.jsDump.parse(e) );
// else next test will carry the responsibility
saveGlobal();
@@ -128,16 +129,10 @@ var QUnit = {
});
synchronize(function() {
- try {
- QUnit.reset();
- } catch(e) {
- fail("reset() failed, following Test " + name + ", exception and reset fn follows", e, QUnit.reset);
- }
-
if ( config.expected && config.expected != config.assertions.length ) {
QUnit.ok( false, "Expected " + config.expected + " assertions, but " + config.assertions.length + " were run" );
}
-
+
var good = 0, bad = 0,
tests = id("qunit-tests");
@@ -152,7 +147,7 @@ var QUnit = {
var li = document.createElement("li");
li.className = assertion.result ? "pass" : "fail";
- li.innerHTML = assertion.message || "(no message)";
+ li.innerHTML = assertion.message || (assertion.result ? "okay" : "failed");
ol.appendChild( li );
if ( assertion.result ) {
@@ -188,6 +183,7 @@ var QUnit = {
var li = id("current-test-output");
li.id = "";
li.className = bad ? "fail" : "pass";
+ li.style.display = resultDisplayStyle(!bad);
li.removeChild( li.firstChild );
li.appendChild( b );
li.appendChild( ol );
@@ -211,6 +207,12 @@ var QUnit = {
}
}
+ try {
+ QUnit.reset();
+ } catch(e) {
+ fail("reset() failed, following Test " + name + ", exception and reset fn follows", e, QUnit.reset);
+ }
+
QUnit.testDone( testName, bad, config.assertions.length );
if ( !window.setTimeout && !config.queue.length ) {
@@ -233,11 +235,15 @@ var QUnit = {
* @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
*/
ok: function(a, msg) {
+ a = !!a;
+ var details = {
+ result: a,
+ message: msg
+ };
msg = escapeHtml(msg);
- QUnit.log(a, msg);
-
+ QUnit.log(a, msg, details);
config.assertions.push({
- result: !!a,
+ result: a,
message: msg
});
},
@@ -255,27 +261,27 @@ var QUnit = {
* @param String message (optional)
*/
equal: function(actual, expected, message) {
- push(expected == actual, actual, expected, message);
+ QUnit.push(expected == actual, actual, expected, message);
},
notEqual: function(actual, expected, message) {
- push(expected != actual, actual, expected, message);
+ QUnit.push(expected != actual, actual, expected, message);
},
deepEqual: function(actual, expected, message) {
- push(QUnit.equiv(actual, expected), actual, expected, message);
+ QUnit.push(QUnit.equiv(actual, expected), actual, expected, message);
},
notDeepEqual: function(actual, expected, message) {
- push(!QUnit.equiv(actual, expected), actual, expected, message);
+ QUnit.push(!QUnit.equiv(actual, expected), actual, expected, message);
},
strictEqual: function(actual, expected, message) {
- push(expected === actual, actual, expected, message);
+ QUnit.push(expected === actual, actual, expected, message);
},
notStrictEqual: function(actual, expected, message) {
- push(expected !== actual, actual, expected, message);
+ QUnit.push(expected !== actual, actual, expected, message);
},
raises: function(fn, message) {
@@ -403,10 +409,17 @@ extend(QUnit, {
/**
* Resets the test setup. Useful for tests that modify the DOM.
+ *
+ * If jQuery is available, uses jQuery's html(), otherwise just innerHTML.
*/
reset: function() {
if ( window.jQuery ) {
- jQuery("#main, #qunit-fixture").html( config.fixture );
+ jQuery( "#main, #qunit-fixture" ).html( config.fixture );
+ } else {
+ var main = id( 'main' ) || id( 'qunit-fixture' );
+ if ( main ) {
+ main.innerHTML = config.fixture;
+ }
}
},
@@ -469,6 +482,31 @@ extend(QUnit, {
return undefined;
},
+ push: function(result, actual, expected, message) {
+ var details = {
+ result: result,
+ message: message,
+ actual: actual,
+ expected: expected
+ };
+
+ message = escapeHtml(message) || (result ? "okay" : "failed");
+ message = '' + message + "";
+ expected = escapeHtml(QUnit.jsDump.parse(expected));
+ actual = escapeHtml(QUnit.jsDump.parse(actual));
+ var output = message + ', expected: ' + expected + '';
+ if (actual != expected) {
+ output += ' result: ' + actual + ', diff: ' + QUnit.diff(expected, actual);
+ }
+
+ QUnit.log(result, message, details);
+
+ config.assertions.push({
+ result: !!result,
+ message: output
+ });
+ },
+
// Logging callbacks
begin: function() {},
done: function(failures, total) {},
@@ -499,7 +537,16 @@ addEvent(window, "load", function() {
}
var banner = id("qunit-header");
if ( banner ) {
- banner.innerHTML = '' + banner.innerHTML + '';
+ var paramsIndex = location.href.lastIndexOf(location.search);
+ if ( paramsIndex > -1 ) {
+ var mainPageLocation = location.href.slice(0, paramsIndex);
+ if ( mainPageLocation == location.href ) {
+ banner.innerHTML = ' ' + banner.innerHTML + ' ';
+ } else {
+ var testName = decodeURIComponent(location.search.slice(1));
+ banner.innerHTML = '' + banner.innerHTML + ' › ' + testName + '';
+ }
+ }
}
var toolbar = id("qunit-testrunner-toolbar");
@@ -634,8 +681,15 @@ function validTest( name ) {
return run;
}
+function resultDisplayStyle(passed) {
+ return passed && id("qunit-filter-pass") && id("qunit-filter-pass").checked ? 'none' : '';
+}
+
function escapeHtml(s) {
- s = s === null ? "" : s + "";
+ if (!s) {
+ return "";
+ }
+ s = s + "";
return s.replace(/[\&"<>\\]/g, function(s) {
switch(s) {
case "&": return "&";
@@ -648,24 +702,6 @@ function escapeHtml(s) {
});
}
-function push(result, actual, expected, message) {
- message = escapeHtml(message) || (result ? "okay" : "failed");
- message = '' + message + "";
- expected = escapeHtml(QUnit.jsDump.parse(expected));
- actual = escapeHtml(QUnit.jsDump.parse(actual));
- var output = message + ', expected: ' + expected + '';
- if (actual != expected) {
- output += ' result: ' + actual + ', diff: ' + QUnit.diff(expected, actual);
- }
-
- // can't use ok, as that would double-escape messages
- QUnit.log(result, output);
- config.assertions.push({
- result: !!result,
- message: output
- });
-}
-
function synchronize( callback ) {
config.queue.push( callback );
@@ -1255,7 +1291,7 @@ QUnit.diff = (function() {
}
return str;
- }
+ };
})();
})(this);