- From: Ville Skytta via cvs-syncmail <cvsmail@w3.org>
- Date: Thu, 25 May 2006 21:10:28 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/2006/ack
In directory hutz:/tmp/cvs-serv2561
Modified Files:
ack.pl check.js
Log Message:
Clean up and robustify JavaScript, mainly fixes problems with keeping the
number of links checked up to date and in bounds, as well as avoids
Firefox pause/resume exceptions. The state of each link is now maintained in
each link object instead of the request, and request objects are cleaned up
more aggressively.
Index: check.js
===================================================================
RCS file: /sources/public/2006/ack/check.js,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- check.js 26 Apr 2006 22:20:14 -0000 1.3
+++ check.js 25 May 2006 21:10:25 -0000 1.4
@@ -11,161 +11,183 @@
//
// $Id$
-var reqs = new Array();
-var total = 0;
-var done = 0;
-
-var hostid_re = /\/\/([^\/]+)\//;
+var REQS = new Array();
+var TOTAL = 0;
+var DONE = 0;
+var BASE = "grab.pl?";
-var base = "grab.pl?";
+function el(id)
+{
+ return id == null ? null : document.getElementById(id);
+}
-function setTextContent(el, text)
+function clear(el)
{
while (el.firstChild) {
el.removeChild(el.firstChild);
}
+}
+
+function setTextContent(el, text)
+{
+ clear(el);
el.appendChild(document.createTextNode(text));
}
-function hostid(url)
+function getLink(key)
{
- var hits = url.match(hostid_re);
- return (hits == null) ? "__unknown__" + new Date().getTime() : hits[1];
+ return el("L" + key);
+}
+
+function getStatusElement(key)
+{
+ return el("S" + key);
}
function checkAll()
{
+ pauseResume(el("pr"));
var links = document.getElementsByTagName("a");
- total = links.length;
- updateCount();
+ TOTAL = links.length;
+ updateCount(0);
for (var i = 0; i < links.length; i++) {
- var n = links.item(i);
- if (n.id == null) continue; if (n.id == "") continue;
- check(n.href, n.id.substring(1));
+ check(links.item(i));
}
}
function pauseResume(el)
{
+ el.disabled = false;
+ if (el.paused == null) el.paused = true;
el.paused ? resumeCheck() : pauseCheck();
el.paused = !el.paused;
el.value = el.paused ? "Resume" : "Pause";
}
-function updateCount()
+function updateCount(n)
{
- var el = document.getElementById("stat");
- setTextContent(el, "(" + done + " of " + total + " checked)");
+ DONE += n;
+ setTextContent(el("stat"), "(" + DONE + " of " + TOTAL + " checked)");
}
function pauseCheck()
{
- for (var i in reqs) {
- if (i == null) continue;
- if (reqs[i] == null) continue;
- if (reqs[i].readyState < 4) {
- reqs[i].abort();
- setTextContent(document.getElementById("S" + i), "paused");
+ for (var key in REQS) {
+ if (REQS[key] == null) continue;
+ if (REQS[key].readyState < 4) REQS[key].abort();
+ REQS[key] = null;
+ var link = getLink(key);
+ if (!link.done) {
+ link.checking = false;
+ setTextContent(getStatusElement(key), "paused");
}
}
}
-function resumeCheck()
+function resumeCheck(pr)
{
var links = document.getElementsByTagName("a");
for (var i = 0; i < links.length; i++) {
- var n = links.item(i);
- if (n.id == null) continue; if (n.id == "") continue;
- var key = n.id.substring(1);
- var req = reqs[key];
- if (req == null) continue;
- if (req.readyState < 4) {
- check(n.href, key);
- }
+ var link = links.item(i);
+ if (!link.done) check(link);
}
}
-function check(url, key)
+function check(link)
{
- document.getElementById("S" + key).className = "na";
- var req = reqs[key];
- if (req == null) {
- try {
- req = new XMLHttpRequest();
- } catch (e) { /* ignore */ }
+ if (link.id == null || link.id == "" || link.checking) return;
+ link.checking = true;
+ var key = link.id.substring(1);
+ getStatusElement(key).className = "na";
+ var req = null;
+ try {
+ req = new XMLHttpRequest();
+ } catch (e) { /* ignore */ }
+ if (req == null)
try {
req = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) { /* ignore */ }
+ if (req == null)
try {
req = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) { /* ignore */ }
- reqs[key] = req;
- }
- //alert(req);
+ REQS[key] = req;
if (req != null) {
- var el = document.getElementById("pr");
- el.value = "Pause"; el.disabled = false;
+ if (link.done) updateCount(-1);
req.onreadystatechange = function() { check_cb(key); }
// TODO: s/escape/encodeURIComponent/ ?
- req.open("HEAD", base + "url=" + escape(url) + ";ref=" + escape(document.getElementById("url").defaultValue), true);
+ req.open("HEAD", BASE + "url=" + escape(link.href) + ";ref=" + escape(el("url").defaultValue), true);
req.send("");
}
}
function check_cb(key)
{
- var req = reqs[key];
- var el = document.getElementById("S" + key);
+ var req = REQS[key];
+ var statusText = getStatusElement(key);
if (req.readyState == 0) {
- setTextContent(el, "uninitialized");
+ setTextContent(statusText, "uninitialized");
}
else if (req.readyState == 1) {
- setTextContent(el, "initialized");
+ setTextContent(statusText, "initialized");
}
else if (req.readyState == 2) {
- setTextContent(el, "connected");
+ setTextContent(statusText, "connected");
}
else if (req.readyState == 3) {
- setTextContent(el, "receiving data");
+ setTextContent(statusText, "receiving data");
}
else if (req.readyState == 4) {
- var st = req.getResponseHeader("X-LinkCheck-Status");
+ var reqStatus = null;
+ try {
+ reqStatus = req.status;
+ }
+ catch (e) { /* Ignore, check value of reqStatus instead */ }
+ if (reqStatus == null || reqStatus == 0) { // 0 ~ MSIE sometimes?
+ // Paused/aborted? Ignore.
+ req = REQS[key] = null;
+ return;
+ }
+
+ var linkStatus = req.getResponseHeader("X-LinkCheck-Status");
var msg = "complete: " + req.getResponseHeader("X-LinkCheck-Message");
var redirect = "";
try {
redirect = req.getResponseHeader("X-LinkCheck-Redirect");
} catch (e) { /* duh */ }
+ req = REQS[key] = null;
+
if (redirect == null || redirect == "") {
- setTextContent(el, msg);
+ setTextContent(statusText, msg);
}
else {
- while (el.firstChild) {
- el.removeChild(el.firstChild);
- }
- el.appendChild(document.createTextNode(msg));
- el.appendChild(document.createElement("br"));
- el.appendChild(document.createTextNode("\u21d2\u00a0")); // "-> "
+ clear(statusText);
+ statusText.appendChild(document.createTextNode(msg));
+ statusText.appendChild(document.createElement("br"));
+ statusText.appendChild(document.createTextNode("\u21d2\u00a0")); // "-> "
var a = document.createElement("a");
a.setAttribute("href", redirect);
a.appendChild(document.createTextNode(redirect));
- el.appendChild(a);
+ statusText.appendChild(a);
}
- if (req.status != 200 || st > 399) {
- el.className = "error";
+ if (reqStatus != 200 || linkStatus > 399) {
+ statusText.className = "error";
}
- else if (st > 299) {
- el.className = "redirect";
+ else if (linkStatus > 299) {
+ statusText.className = "redirect";
}
else {
- el.className = "ok";
+ statusText.className = "ok";
}
- req = reqs[key] = null;
- done++;
- updateCount();
- if (done >= total) {
- var pr = document.getElementById("pr");
+ var link = getLink(key);
+ link.done = true;
+ link.checking = false;
+ updateCount(1);
+ if (DONE >= TOTAL) {
+ var pr = el("pr");
pr.value = "Completed";
+ pr.paused = false;
pr.disabled = true;
}
}
Index: ack.pl
===================================================================
RCS file: /sources/public/2006/ack/ack.pl,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- ack.pl 25 May 2006 15:21:46 -0000 1.8
+++ ack.pl 25 May 2006 21:10:25 -0000 1.9
@@ -119,7 +119,7 @@
my $l = length($_);
my $foo = encode_entities($l > ML ?
substr($_, 0, ML/2) . "[...]" . substr($_, $l - ML/2) : $_);
- print "<tr><td><a id=\"L$md5\" href=\"$url\" onclick=\"check(this.href,'$md5');return false\">$foo</a>";
+ print "<tr><td><a id=\"L$md5\" href=\"$url\" onclick=\"check(this);return false\">$foo</a>";
print " ($links{$_})" if ($links{$_} > 1);
print "</td><td class=\"na\" id=\"S$md5\">uninitialized</td></tr>\n";
}
Received on Thursday, 25 May 2006 21:10:31 UTC