Link Checker dialog, r=akkana, sr=ben

This commit is contained in:
cmanske%netscape.com 2002-01-15 15:34:06 +00:00
Родитель 35fa0d9b6f
Коммит 63945048df
4 изменённых файлов: 266 добавлений и 0 удалений

Просмотреть файл

@ -0,0 +1,168 @@
/*
* 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);
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();
}

Просмотреть файл

@ -0,0 +1,58 @@
<?xml version="1.0"?>
<!--
- 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):
-->
<?xml-stylesheet href="chrome://editor/skin/editor.css" type="text/css"?>
<?xml-stylesheet href="chrome://editor/skin/EditorDialog.css" type="text/css"?>
<?xul-overlay href="chrome://global/content/dialogOverlay.xul"?>
<?xul-overlay href="chrome://editor/content/EdDialogOverlay.xul"?>
<!DOCTYPE window SYSTEM "chrome://editor/locale/EdLinkChecker.dtd">
<!-- dialog containing a control requiring initial setup -->
<dialog title="&windowTitle.label;"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
onload="Startup()"
ondialogaccept="return onAccept();"
ondialogcancel="return onCancelLinkChecker();">
<!-- Methods common to all editor dialogs -->
<script type="application/x-javascript" src="chrome://editor/content/editorUtilities.js"/>
<script type="application/x-javascript" src="chrome://editor/content/EdDialogCommon.js"/>
<script type="application/x-javascript" src="chrome://editor/content/EdLinkChecker.js"/>
<script type="application/x-javascript" src="chrome://global/content/dialogOverlay.js" />
<spacer id="location" offsetY="50" persist="offsetX offsetY"/>
<broadcaster id="args" value=""/>
<label value="&urlsNotFound.label;"/>
<label value="&notFoundKey.label;"/>
<tree rows="8" class="list" id="NamedAnchorList"
style="min-height: 8em; min-width: 20em">
<treecolgroup>
<treecol/>
<treecol flex="1"/>
</treecolgroup>
</tree>
<spacer class="spacer"/>
<button id="ChangeURL" label="&changeUrlButton.label;" oncommand="ChangeUrl();"/>
</dialog>

Просмотреть файл

@ -29,8 +29,12 @@ EdHLineProps.xul
EdHLineProps.js
EdImageProps.xul
EdImageProps.js
EdImageOverlay.xul
EdImageOverlay.js
EdLinkProps.xul
EdLinkProps.js
EdLinkChecker.xul
EdLinkChecker.js
EdSpellCheck.xul
EdSpellCheck.js
EdDictionary.xul
@ -41,6 +45,22 @@ EdInsertTable.xul
EdInsertTable.js
EdTableProps.js
EdTableProps.xul
EdFormProps.js
EdFormProps.xul
EdInputProps.js
EdInputProps.xul
EdInputImage.js
EdInputImage.xul
EdTextAreaProps.js
EdTextAreaProps.xul
EdSelectProps.js
EdSelectProps.xul
EdButtonProps.js
EdButtonProps.xul
EdLabelProps.js
EdLabelProps.xul
EdFieldSetProps.js
EdFieldSetProps.xul
EdInsSrc.xul
EdInsSrc.js
EdDialogOverlay.xul

Просмотреть файл

@ -28,8 +28,12 @@ CHROME_CONTENT = \
.\EdDialogCommon.js \
.\EdLinkProps.xul \
.\EdLinkProps.js \
.\EdLinkChecker.xul \
.\EdLinkChecker.js \
.\EdImageProps.xul \
.\EdImageProps.js \
.\EdImageOverlay.xul \
.\EdImageOverlay.js \
.\EdHLineProps.xul \
.\EdHLineProps.js \
.\EdSpellCheck.xul \
@ -42,6 +46,22 @@ CHROME_CONTENT = \
.\EdInsertTable.js \
.\EdTableProps.xul \
.\EdTableProps.js \
.\EdFormProps.xul \
.\EdFormProps.js \
.\EdInputProps.xul \
.\EdInputProps.js \
.\EdInputImage.xul \
.\EdInputImage.js \
.\EdTextAreaProps.xul \
.\EdTextAreaProps.js \
.\EdSelectProps.xul \
.\EdSelectProps.js \
.\EdButtonProps.xul \
.\EdButtonProps.js \
.\EdLabelProps.xul \
.\EdLabelProps.js \
.\EdFieldSetProps.xul \
.\EdFieldSetProps.js \
.\EdInsSrc.xul \
.\EdInsSrc.js \
.\EdInsertChars.xul \