Mozilla/mozilla/editor/ui/dialogs/content/EdLinkChecker.js
bzbarsky%mit.edu 2dc1647f57 Use the URI Checker to get headers for Save As. Bug 118719,
r=law,akkana,cmanske, sr=darin


git-svn-id: svn://10.0.0.236/trunk@113945 18797224-902f-48f8-a5cc-f745e15eee43
2002-02-08 00:10:55 +00:00

170 lines
5.1 KiB
JavaScript

/*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is Mozilla Communicator client code, released
* March 31, 1998.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Akkana Peck (akkana@netscape.com)
* Charles Manxke (cmanske@netscape.com)
*/
// Variables used across all the links being checked:
var gNumLinksToCheck = 0; // The number of nsILinkCheckers
var gLinksBeingChecked = {}; // Array of nsIURICheckers
var gURIRefObjects = {}; // Array of nsIURIRefObjects
var gNumLinksCalledBack = 0;
var gStartedAllChecks = false;
var gLinkCheckTimerID = 0;
// Implement nsIRequestObserver:
var gRequestObserver =
{
// urichecker requires that we have an OnStartRequest even tho it's a nop.
onStartRequest: function(request, ctxt) { },
// onStopRequest is where we really handle the status.
onStopRequest: function(request, ctxt, status)
{
var linkChecker = request.QueryInterface(Components.interfaces.nsIURIChecker);
if (linkChecker)
{
gNumLinksCalledBack++;
linkChecker.status = status;
for (var i = 0; i < gNumLinksCalledBack; i++)
{
if (linkChecker == gLinksBeingChecked[i])
gLinksBeingChecked[i].status = status;
}
if (gStartedAllChecks && gNumLinksCalledBack >= gNumLinksToCheck)
{
clearTimeout(gLinkCheckTimerID);
LinkCheckTimeOut();
}
}
}
}
function Startup()
{
if (!InitEditorShell())
return;
// Set window location relative to parent window (based on persisted attributes)
SetWindowLocation();
// Get all objects that refer to other locations
var objects = editorShell.GetLinkedObjects();
// Loop over the nodes that have links:
for (var i = 0; i < objects.Count(); i++)
{
var refobj = objects.GetElementAt(gNumLinksToCheck).QueryInterface(Components.interfaces.nsIURIRefObject);
// Loop over the links in this node:
if (refobj)
{
try {
var uri;
while ((uri = refobj.GetNextURI()))
{
// Use the real class in netlib:
// Note that there may be more than one link per refobj
gURIRefObjects[gNumLinksToCheck] = refobj;
// Make a new nsIURIChecker
gLinksBeingChecked[gNumLinksToCheck]
= Components.classes["@mozilla.org/network/urichecker;1"]
.createInstance()
.QueryInterface(Components.interfaces.nsIURIChecker);
// XXX Calling this is related to crash deleting gLinksBeingChecked when dialog is closed
// (if this isn't called, no crash)
gLinksBeingChecked[gNumLinksToCheck].asyncCheckURI(uri, gRequestObserver, null,
Components.interfaces.nsIRequest.LOAD_NORMAL);
gNumLinksToCheck++;
};
} catch (e) {
dump(" Exception ERROR in Link checker. e.result="+e.result+", gNumLinksToCheck="+gNumLinksToCheck+"\n");
}
}
}
// Done with the loop, now we can be prepared for the finish:
gStartedAllChecks = true;
// Start timer to limit how long we wait for link checking
gLinkCheckTimerID = setTimeout("LinkCheckTimeOut()", 5000);
}
function LinkCheckTimeOut()
{
// We might have gotten here via a late timeout
if (gNumLinksToCheck <= 0)
return;
gLinkCheckTimerID = 0;
dump("*** LinkCheckTimeout: Heard from " + gNumLinksCalledBack + " of "+gNumLinksToCheck + "\n");
gNumLinksToCheck = 0;
gStartedAllChecks = false;
if ("length" in gLinksBeingChecked)
{
for (var i=0; i < gLinksBeingChecked.length; i++)
{
var linkChecker = gLinksBeingChecked[i].QueryInterface(Components.interfaces.nsIURIChecker);
// nsIURIChecker status values:
// NS_BINDING_SUCCEEDED link is valid
// NS_BINDING_FAILED link is invalid (gave an error)
// NS_BINDING_ABORTED timed out, or cancelled
switch (linkChecker.status)
{
case 0: // NS_BINDING_SUCCEEDED
dump(" " + linkChecker.name + " OK!\n");
break;
case 0x804b0001: // NS_BINDING_FAILED
dump(">> " + linkChecker.name + " is broken\n");
break;
case 0x804b0002: // NS_BINDING_ABORTED
dump(">> " + linkChecker.name + " timed out\n");
break;
default:
dump(">> " + linkChecker.name + " not checked\n");
break;
}
}
}
}
function ChangeUrl()
{
}
function onAccept()
{
SaveWindowLocation();
return true; // do close the window
}
function onCancelLinkChecker()
{
if (gLinkCheckTimerID)
clearTimeout(gLinkCheckTimerID);
/*
LinkCheckTimeOut();
*/
return onCancel();
}