diff --git a/mozilla/layout/tools/tests/content_dumping.html b/mozilla/layout/tools/tests/content_dumping.html
index c52040997cb..3858e17e0c7 100644
--- a/mozilla/layout/tools/tests/content_dumping.html
+++ b/mozilla/layout/tools/tests/content_dumping.html
@@ -1 +1,107 @@
-
Control Frame
\ No newline at end of file
+
+
+
+ Control Frame
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mozilla/layout/tools/tests/debug_utils.html b/mozilla/layout/tools/tests/debug_utils.html
index 05b65733b35..0fed4104be6 100644
--- a/mozilla/layout/tools/tests/debug_utils.html
+++ b/mozilla/layout/tools/tests/debug_utils.html
@@ -1 +1,110 @@
-
Layout Debug Utilities
Layout Debug Utils
Note that these only work in debug builds
Global settings
Per-Window settings
Dumping
\ No newline at end of file
+
+
+
+ Layout Debug Utilities
+
+
+
+
+Layout Debug Utils
+
+Note that these only work in debug builds
+
+
Global settings
+
+
+
+Per-Window settings
+
+
+
+Dumping
+
+
+
+
+
+
+
+
diff --git a/mozilla/layout/tools/tests/regression_tests.html b/mozilla/layout/tools/tests/regression_tests.html
index 7cd73db4ec4..a306770073f 100644
--- a/mozilla/layout/tools/tests/regression_tests.html
+++ b/mozilla/layout/tools/tests/regression_tests.html
@@ -1 +1,132 @@
-
Layout Regression Test Harness
Layout Regression Test Harness
The JavaScript in this file requires that you grant it XPConnect access,
via the dialog that appears when you first load the file. Note that the code
herein creates directories and files, so there is the possibility that it
may do damage to the contents of your hard disk. You have been warned!
Tests
Results
\ No newline at end of file
+
+
+
+ Layout Regression Test Harness
+
+
+
+
+
+
+
+
+Layout Regression Test Harness
+
+
+The JavaScript in this file requires that you grant it XPConnect access,
+via the dialog that appears when you first load the file. Note that the code
+herein creates directories and files, so there is the possibility that it
+may do damage to the contents of your hard disk. You have been warned!
+
+
+Tests
+
+
+
+
+
+Results
+
+
+
+
+
+
diff --git a/mozilla/layout/tools/tests/regression_tests.js b/mozilla/layout/tools/tests/regression_tests.js
index e5ec354c3d4..0f8e71380ca 100644
--- a/mozilla/layout/tools/tests/regression_tests.js
+++ b/mozilla/layout/tools/tests/regression_tests.js
@@ -1 +1,553 @@
-
const nsIFilePicker = Components.interfaces.nsIFilePicker;
const nsIFrameDebugObject = Components.interfaces.nsIFrameDebugObject;
const kTestTypeBaseline = 1;
const kTestTypeVerify = 2;
const kTestTypeVerifyAndCompare = 3;
const kTestTypeCompare = 4;
const kTestSourceSingleFile = 1;
const kTestSourceDirList = 2;
var gTestcaseDirArray = new Array; // array of nsILocalFiles
var gBaselineOutputDir; // nsIFile
var gVerifyOutputDir; // nsIFile
var gBaselineFileExtension; // string
var gVerifyFileExtension; // string
var gTestType; // baseline, verify, compare etc.
var gTestWindow;
var gTestURLs = new Array;
var gTestURLsIndex;
function DoOnload()
{
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
// clear any values that the form manager may have unhelpfully filled in
document.testForm.singleTestFileInput.value = "";
document.testForm.baselineOutputDir.value = "";
document.testForm.verifyOutputDir.value = "";
InitFormFromPrefs();
UpdateRunTestsButton();
}
function InitFormFromPrefs()
{
// load prefs
try {
var testURL = GetStringPref("nglayout.debug.testcaseURL");
document.testForm.singleTestFileInput.value = testURL;
var baselineDirURL = GetStringPref("nglayout.debug.baselineDirURL");
gBaselineOutputDir = GetFileFromURISpec(baselineDirURL);
document.testForm.baselineOutputDir.value = gBaselineOutputDir.path;
var verifyDirURL = GetStringPref("nglayout.debug.verifyDirURL");
gVerifyOutputDir = GetFileFromURISpec(verifyDirURL);
document.testForm.verifyOutputDir.value = gVerifyOutputDir.path;
var dirIndex = 0;
while (true) // we'll throw when we reach a nonexistent pref
{
var curDir = GetStringPref("nglayout.debug.testcaseDir" + dirIndex);
var dirFileSpec = GetFileFromURISpec(curDir);
gTestcaseDirArray.push(dirFileSpec);
dirIndex ++;
}
}
catch(e)
{
}
RebuildTestDirsSelect();
}
function SaveFormToPrefs()
{
SaveStringPref("nglayout.debug.testcaseURL", document.testForm.singleTestFileInput.value);
// save prefs
if (gBaselineOutputDir)
{
var baselineDirURL = GetURISpecFromFile(gBaselineOutputDir);
SaveStringPref("nglayout.debug.baselineDirURL", baselineDirURL);
}
if (gVerifyOutputDir)
{
var verifyDirURL = GetURISpecFromFile(gVerifyOutputDir);
SaveStringPref("nglayout.debug.verifyDirURL", verifyDirURL);
}
var dirIndex;
for (dirIndex = 0; dirIndex < gTestcaseDirArray.length; dirIndex ++)
{
var curURL = GetURISpecFromFile(gTestcaseDirArray[dirIndex]);
SaveStringPref("nglayout.debug.testcaseDir" + dirIndex, curURL);
}
try
{
// clear prefs for higher indices until we throw
while (1)
{
ClearPref("nglayout.debug.testcaseDir" + dirIndex);
}
}
catch(e)
{
}
}
function GetURISpecFromFile(inFile)
{
var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
var fileHandler = ioService.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler);
return fileHandler.getURLSpecFromFile(inFile);
}
function GetFileFromURISpec(uriSpec)
{
var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
var fileHandler = ioService.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler);
return fileHandler.getFileFromURLSpec(uriSpec);
}
function SaveStringPref(inPrefName, inPrefValue)
{
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
prefs.setCharPref(inPrefName, inPrefValue);
}
function GetStringPref(inPrefName)
{
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
return prefs.getCharPref(inPrefName);
}
function ClearPref(inPrefName)
{
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
prefs.clearUserPref(inPrefName);
}
function WriteOutput(aText, aReplace, aColorString)
{
var outputDiv = document.getElementById("results");
if (aReplace)
ClearOutput();
var childDiv = document.createElement("div");
var textNode = document.createTextNode(aText);
childDiv.appendChild(textNode);
childDiv.setAttribute("style", "color: " + aColorString + ";");
outputDiv.appendChild(childDiv);
}
function ClearOutput()
{
var outputDiv = document.getElementById("results");
var curChild;
while (curChild = outputDiv.firstChild)
outputDiv.removeChild(curChild);
}
// returns an nsIFile
function PickDirectory()
{
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
fp.init(window, "Pick a directory", nsIFilePicker.modeGetFolder);
var result = fp.show();
if (result == nsIFilePicker.returnCancel)
throw("User cancelled");
var chosenDir = fp.file;
return chosenDir;
}
// returns a url string
function PickFileURL()
{
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
fp.init(window, "Pick a directory", nsIFilePicker.modeOpen);
fp.appendFilters(nsIFilePicker.filterHTML + nsIFilePicker.filterText);
var result = fp.show();
if (result == nsIFilePicker.returnCancel)
throw("User cancelled");
return fp.fileURL.spec;
}
function RebuildTestDirsSelect()
{
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var dirsSelect = document.getElementById("testDirsSelect");
// rebuild it from gTestcaseDirArray
while (dirsSelect.length)
dirsSelect.remove(0);
var i;
for (i = 0; i < gTestcaseDirArray.length; i ++)
{
var curDir = gTestcaseDirArray[i];
var optionElement = document.createElement("option");
var textNode = document.createTextNode(curDir.leafName);
optionElement.appendChild(textNode);
dirsSelect.add(optionElement, null);
}
UpdateRunTestsButton();
}
// set the 'single testcase' file
function ChooseTestcaseFile()
{
var dirInput = document.getElementById("singleTestFileInput");
dirInput.value = PickFileURL();
UpdateRunTestsButton();
}
function AppendTestcaseDir()
{
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var chosenDir = PickDirectory();
// does the array already contain this dir?
var i;
for (i = 0; i < gTestcaseDirArray.length; i ++)
{
var curElement = gTestcaseDirArray[i];
if (curElement.equals(chosenDir)) // nsIFile::Equals
return;
}
gTestcaseDirArray[gTestcaseDirArray.length] = chosenDir;
RebuildTestDirsSelect();
}
function RemoveTestcaseDir()
{
var dirsSelect = document.getElementById("testDirsSelect");
if (dirsSelect.selectedIndex != -1)
{
gTestcaseDirArray.splice(dirsSelect.selectedIndex, 1);
RebuildTestDirsSelect();
}
}
function InputOptionsValid()
{
if (document.testForm.testType[0].checked)
{
// need a test file
var testcaseURL = document.testForm.singleTestFileInput.value;
if (testcaseURL.length == 0) return false;
}
else if (document.testForm.testType[1].checked)
{
// need at least one dir
if (gTestcaseDirArray.length == 0) return false;
}
else
return false;
return true;
}
function OutputOptionsValid()
{
var testType = GetTestType();
switch (testType)
{
case kTestTypeBaseline:
if (!gBaselineOutputDir) return false;
break;
case kTestTypeVerify:
if (!gVerifyOutputDir) return false;
break;
case kTestTypeVerifyAndCompare:
case kTestTypeCompare:
if (!gBaselineOutputDir || !gVerifyOutputDir) return false;
break;
}
return true;
}
function UpdateRunTestsButton()
{
var testType = GetTestType();
var dataValid = OutputOptionsValid();
if (testType != kTestTypeCompare)
dataValid &= InputOptionsValid();
document.testForm.runTests.disabled = !dataValid;
}
// returns nsIFile, sets the input value
function ChooseOutputDirectory(inputElementID)
{
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var chosenDir = PickDirectory();
var inputElement = document.getElementById(inputElementID);
inputElement.value = chosenDir.path;
return chosenDir;
}
function CompareFrameDumps(testFileBasename, baselineDir, baselineExt, verifyDir, verifyExt)
{
var debugObject = Components.classes["@mozilla.org/layout_debug/framedebugobject;1"].createInstance(nsIFrameDebugObject);
var baseFile = baselineDir.clone();
baseFile.append(testFileBasename + baselineExt);
var verifyFile = verifyDir.clone();
verifyFile.append(testFileBasename + verifyExt);
var filesDiffer = debugObject.compareFrameModels(baseFile, verifyFile, nsIFrameDebugObject.COMPARE_FLAGS_BRIEF);
if (filesDiffer)
{
WriteOutput("Test file '" + baseFile.leafName + "' failed", false, "red");
}
else
{
WriteOutput("Test file '" + baseFile.leafName + "' passed", false, "green");
}
}
function DumpFrames(testWindow, testFileName, outputDir, outputFileExtension)
{
var debugObject = Components.classes["@mozilla.org/layout_debug/framedebugobject;1"].createInstance(nsIFrameDebugObject);
var outputFile = outputDir.clone();
outputFile.append(testFileName.replace(".html", outputFileExtension));
dump("Dumping frame model for " + testFileName + " to " + outputFile.leafName + "\n");
var result = debugObject.dumpFrameModel(testWindow, outputFile, nsIFrameDebugObject.DUMP_FLAGS_MASK_DEFAULT);
if (result != 0)
{
WriteOutput("dumpFrameModel for " + testFileName + " failed", false, "orange");
}
}
function LoadTestURL(testWindow, theURL)
{
dump("Loading test " + theURL + "\n");
// we use a 1/2 second delay to give time for async reflows to happen
testWindow.onload = setTimeout("HandleTestWindowLoad(gTestWindow)", 1000);
testWindow.location.href = theURL;
}
function HandleTestWindowLoad(testWindow)
{
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var outputDir;
var outputFileExtension;
var runCompare = false;
switch (gTestType)
{
case kTestTypeBaseline:
outputDir = gBaselineOutputDir;
outputFileExtension = gBaselineFileExtension;
break;
case kTestTypeVerify:
outputDir = gVerifyOutputDir;
outputFileExtension = gVerifyFileExtension;
break;
case kTestTypeVerifyAndCompare:
outputDir = gVerifyOutputDir;
outputFileExtension = gVerifyFileExtension;
runCompare = true;
break;
case kTestTypeCompare:
dump("Should never get here");
break;
}
var loadedURL = testWindow.location.href;
var loadedFile = loadedURL.substring(loadedURL.lastIndexOf('/') + 1);
DumpFrames(testWindow, loadedFile, outputDir, outputFileExtension);
if (runCompare)
{
var testFileBasename = loadedFile.replace(".html", "");
CompareFrameDumps(testFileBasename, gBaselineOutputDir, gBaselineFileExtension, gVerifyOutputDir, gVerifyFileExtension);
}
// now fire of the next one, if we have one
var nextURL = gTestURLs[gTestURLsIndex++];
if (nextURL)
LoadTestURL(testWindow, nextURL);
else
testWindow.close();
}
function AddDirectoryEntriesToTestList(inDirFile, inRequiredExtension)
{
var enumerator = inDirFile.directoryEntries;
while (enumerator.hasMoreElements())
{
var curFile = enumerator.getNext();
curFile = curFile.QueryInterface(Components.interfaces.nsIFile);
var leafName = curFile.leafName;
if (leafName.indexOf(inRequiredExtension) != -1)
{
var fileURI = GetURISpecFromFile(curFile);
gTestURLs.push(fileURI);
}
}
}
// returns an array of filenames
function DirectoryEntriesToArray(inDirFile, inRequiredExtension)
{
var fileArray = new Array;
var enumerator = inDirFile.directoryEntries;
while (enumerator.hasMoreElements())
{
var curFile = enumerator.getNext();
curFile = curFile.QueryInterface(Components.interfaces.nsIFile);
var leafName = curFile.leafName;
if (leafName.indexOf(inRequiredExtension) != -1)
{
fileArray.push(leafName);
}
}
return fileArray;
}
function BuildTestURLsList(testSourceType)
{
// clear the array
gTestURLs.splice(0);
gTestURLsIndex = 0;
if (testSourceType == kTestSourceSingleFile)
{
var testURL = document.testForm.singleTestFileInput.value;
if (testURL.substr(-5) != ".html")
{
// append /index.html if we have to
if (testURL.substr(-1) != "/")
testURL += "/";
testURL += "index.html";
}
gTestURLs[0] = testURL;
}
else
{
for (var i = 0; i < gTestcaseDirArray.length; i++)
{
var dirFile = gTestcaseDirArray[i]; // nsIFile for the dir
AddDirectoryEntriesToTestList(dirFile, ".html");
}
}
}
function CompareFilesInDir(inBaseDir, inBaseExtension, inVerifyDir, inVerifyExtension)
{
var comapareFiles = DirectoryEntriesToArray(inBaseDir, inBaseExtension);
for (var i = 0; i < comapareFiles.length; i ++)
{
var curFilename = comapareFiles[i];
var testFileBasename = curFilename.replace(inBaseExtension, "");
CompareFrameDumps(testFileBasename, inBaseDir, inBaseExtension, inVerifyDir, inVerifyExtension);
}
}
function GetTestType()
{
if (document.testForm.doWhat[0].checked)
return kTestTypeBaseline;
if (document.testForm.doWhat[1].checked)
return kTestTypeVerify;
if (document.testForm.doWhat[2].checked)
return kTestTypeVerifyAndCompare;
if (document.testForm.doWhat[3].checked)
return kTestTypeCompare;
return 0;
}
function RunTests()
{
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
ClearOutput();
SaveFormToPrefs();
var testSourceType;
if (document.testForm.testType[0].checked)
testSourceType = kTestSourceSingleFile;
else
testSourceType = kTestSourceDirList;
gTestType = GetTestType();
gBaselineFileExtension = document.testForm.baselineFileExtension.value;
gVerifyFileExtension = document.testForm.verifyFileExtension.value;
if (gTestType == kTestTypeCompare)
{
// to compare, we'll just run through all the files in the
// baseline and verify dirs, and compare those that exist in
// both.
CompareFilesInDir(gBaselineOutputDir, gBaselineFileExtension, gVerifyOutputDir, gVerifyFileExtension);
}
else
{
BuildTestURLsList(testSourceType);
gTestWindow = window.open("about:blank", "Test window",
"width=800,height=600,status=yes,toolbars=no");
// start the first load
var testURL = gTestURLs[0];
gTestURLsIndex = 1;
LoadTestURL(gTestWindow, testURL);
}
}
\ No newline at end of file
+
+
+const nsIFilePicker = Components.interfaces.nsIFilePicker;
+const nsIFrameDebugObject = Components.interfaces.nsIFrameDebugObject;
+
+const kTestTypeBaseline = 1;
+const kTestTypeVerify = 2;
+const kTestTypeVerifyAndCompare = 3;
+const kTestTypeCompare = 4;
+
+const kTestSourceSingleFile = 1;
+const kTestSourceDirList = 2;
+
+var gTestcaseDirArray = new Array; // array of nsILocalFiles
+
+var gBaselineOutputDir; // nsIFile
+var gVerifyOutputDir; // nsIFile
+
+var gBaselineFileExtension; // string
+var gVerifyFileExtension; // string
+
+var gTestType; // baseline, verify, compare etc.
+
+var gTestWindow;
+var gTestURLs = new Array;
+var gTestURLsIndex;
+
+function DoOnload()
+{
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+
+ // clear any values that the form manager may have unhelpfully filled in
+ document.testForm.singleTestFileInput.value = "";
+ document.testForm.baselineOutputDir.value = "";
+ document.testForm.verifyOutputDir.value = "";
+
+ InitFormFromPrefs();
+
+ UpdateRunTestsButton();
+}
+
+function InitFormFromPrefs()
+{
+ // load prefs
+ try {
+ var testURL = GetStringPref("nglayout.debug.testcaseURL");
+ document.testForm.singleTestFileInput.value = testURL;
+
+ var baselineDirURL = GetStringPref("nglayout.debug.baselineDirURL");
+ gBaselineOutputDir = GetFileFromURISpec(baselineDirURL);
+ document.testForm.baselineOutputDir.value = gBaselineOutputDir.path;
+
+ var verifyDirURL = GetStringPref("nglayout.debug.verifyDirURL");
+ gVerifyOutputDir = GetFileFromURISpec(verifyDirURL);
+ document.testForm.verifyOutputDir.value = gVerifyOutputDir.path;
+
+ var dirIndex = 0;
+ while (true) // we'll throw when we reach a nonexistent pref
+ {
+ var curDir = GetStringPref("nglayout.debug.testcaseDir" + dirIndex);
+ var dirFileSpec = GetFileFromURISpec(curDir);
+ gTestcaseDirArray.push(dirFileSpec);
+ dirIndex ++;
+ }
+ }
+ catch(e)
+ {
+ }
+
+ RebuildTestDirsSelect();
+}
+
+function SaveFormToPrefs()
+{
+ SaveStringPref("nglayout.debug.testcaseURL", document.testForm.singleTestFileInput.value);
+
+ // save prefs
+ if (gBaselineOutputDir)
+ {
+ var baselineDirURL = GetURISpecFromFile(gBaselineOutputDir);
+ SaveStringPref("nglayout.debug.baselineDirURL", baselineDirURL);
+ }
+
+ if (gVerifyOutputDir)
+ {
+ var verifyDirURL = GetURISpecFromFile(gVerifyOutputDir);
+ SaveStringPref("nglayout.debug.verifyDirURL", verifyDirURL);
+ }
+
+ var dirIndex;
+ for (dirIndex = 0; dirIndex < gTestcaseDirArray.length; dirIndex ++)
+ {
+ var curURL = GetURISpecFromFile(gTestcaseDirArray[dirIndex]);
+ SaveStringPref("nglayout.debug.testcaseDir" + dirIndex, curURL);
+ }
+ try
+ {
+ // clear prefs for higher indices until we throw
+ while (1)
+ {
+ ClearPref("nglayout.debug.testcaseDir" + dirIndex);
+ }
+ }
+ catch(e)
+ {
+ }
+
+}
+
+function GetURISpecFromFile(inFile)
+{
+ var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
+ var fileHandler = ioService.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler);
+ return fileHandler.getURLSpecFromFile(inFile);
+}
+
+function GetFileFromURISpec(uriSpec)
+{
+ var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
+ var fileHandler = ioService.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler);
+ return fileHandler.getFileFromURLSpec(uriSpec);
+}
+
+function SaveStringPref(inPrefName, inPrefValue)
+{
+ var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
+ prefs.setCharPref(inPrefName, inPrefValue);
+}
+
+function GetStringPref(inPrefName)
+{
+ var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
+ return prefs.getCharPref(inPrefName);
+}
+
+function ClearPref(inPrefName)
+{
+ var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
+ prefs.clearUserPref(inPrefName);
+}
+
+function WriteOutput(aText, aReplace, aColorString)
+{
+ var outputDiv = document.getElementById("results");
+
+ if (aReplace)
+ ClearOutput();
+
+ var childDiv = document.createElement("div");
+ var textNode = document.createTextNode(aText);
+ childDiv.appendChild(textNode);
+ childDiv.setAttribute("style", "color: " + aColorString + ";");
+ outputDiv.appendChild(childDiv);
+}
+
+function ClearOutput()
+{
+ var outputDiv = document.getElementById("results");
+ var curChild;
+ while (curChild = outputDiv.firstChild)
+ outputDiv.removeChild(curChild);
+}
+
+// returns an nsIFile
+function PickDirectory()
+{
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+
+ var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
+ fp.init(window, "Pick a directory", nsIFilePicker.modeGetFolder);
+ var result = fp.show();
+ if (result == nsIFilePicker.returnCancel)
+ throw("User cancelled");
+
+ var chosenDir = fp.file;
+ return chosenDir;
+}
+
+
+// returns a url string
+function PickFileURL()
+{
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+
+ var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
+ fp.init(window, "Pick a directory", nsIFilePicker.modeOpen);
+ fp.appendFilters(nsIFilePicker.filterHTML + nsIFilePicker.filterText);
+
+ var result = fp.show();
+ if (result == nsIFilePicker.returnCancel)
+ throw("User cancelled");
+
+ return fp.fileURL.spec;
+}
+
+function RebuildTestDirsSelect()
+{
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+ var dirsSelect = document.getElementById("testDirsSelect");
+
+ // rebuild it from gTestcaseDirArray
+ while (dirsSelect.length)
+ dirsSelect.remove(0);
+
+ var i;
+ for (i = 0; i < gTestcaseDirArray.length; i ++)
+ {
+ var curDir = gTestcaseDirArray[i];
+
+ var optionElement = document.createElement("option");
+ var textNode = document.createTextNode(curDir.leafName);
+
+ optionElement.appendChild(textNode);
+ dirsSelect.add(optionElement, null);
+ }
+
+ UpdateRunTestsButton();
+}
+
+// set the 'single testcase' file
+function ChooseTestcaseFile()
+{
+ var dirInput = document.getElementById("singleTestFileInput");
+ dirInput.value = PickFileURL();
+
+ UpdateRunTestsButton();
+}
+
+function AppendTestcaseDir()
+{
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+
+ var chosenDir = PickDirectory();
+ // does the array already contain this dir?
+ var i;
+ for (i = 0; i < gTestcaseDirArray.length; i ++)
+ {
+ var curElement = gTestcaseDirArray[i];
+ if (curElement.equals(chosenDir)) // nsIFile::Equals
+ return;
+ }
+
+ gTestcaseDirArray[gTestcaseDirArray.length] = chosenDir;
+ RebuildTestDirsSelect();
+}
+
+function RemoveTestcaseDir()
+{
+ var dirsSelect = document.getElementById("testDirsSelect");
+ if (dirsSelect.selectedIndex != -1)
+ {
+ gTestcaseDirArray.splice(dirsSelect.selectedIndex, 1);
+ RebuildTestDirsSelect();
+ }
+}
+
+function InputOptionsValid()
+{
+ if (document.testForm.testType[0].checked)
+ {
+ // need a test file
+ var testcaseURL = document.testForm.singleTestFileInput.value;
+ if (testcaseURL.length == 0) return false;
+ }
+ else if (document.testForm.testType[1].checked)
+ {
+ // need at least one dir
+ if (gTestcaseDirArray.length == 0) return false;
+ }
+ else
+ return false;
+
+ return true;
+}
+
+function OutputOptionsValid()
+{
+ var testType = GetTestType();
+
+ switch (testType)
+ {
+ case kTestTypeBaseline:
+ if (!gBaselineOutputDir) return false;
+ break;
+
+ case kTestTypeVerify:
+ if (!gVerifyOutputDir) return false;
+ break;
+
+ case kTestTypeVerifyAndCompare:
+ case kTestTypeCompare:
+ if (!gBaselineOutputDir || !gVerifyOutputDir) return false;
+ break;
+ }
+
+ return true;
+}
+
+function UpdateRunTestsButton()
+{
+ var testType = GetTestType();
+ var dataValid = OutputOptionsValid();
+ if (testType != kTestTypeCompare)
+ dataValid &= InputOptionsValid();
+ document.testForm.runTests.disabled = !dataValid;
+}
+
+// returns nsIFile, sets the input value
+function ChooseOutputDirectory(inputElementID)
+{
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+ var chosenDir = PickDirectory();
+
+ var inputElement = document.getElementById(inputElementID);
+ inputElement.value = chosenDir.path;
+
+ return chosenDir;
+}
+
+
+function CompareFrameDumps(testFileBasename, baselineDir, baselineExt, verifyDir, verifyExt)
+{
+ var debugObject = Components.classes["@mozilla.org/layout_debug/framedebugobject;1"].createInstance(nsIFrameDebugObject);
+
+ var baseFile = baselineDir.clone();
+ baseFile.append(testFileBasename + baselineExt);
+
+ var verifyFile = verifyDir.clone();
+ verifyFile.append(testFileBasename + verifyExt);
+
+ var filesDiffer = debugObject.compareFrameModels(baseFile, verifyFile, nsIFrameDebugObject.COMPARE_FLAGS_BRIEF);
+ if (filesDiffer)
+ {
+ WriteOutput("Test file '" + baseFile.leafName + "' failed", false, "red");
+ }
+ else
+ {
+ WriteOutput("Test file '" + baseFile.leafName + "' passed", false, "green");
+ }
+}
+
+function DumpFrames(testWindow, testFileName, outputDir, outputFileExtension)
+{
+ var debugObject = Components.classes["@mozilla.org/layout_debug/framedebugobject;1"].createInstance(nsIFrameDebugObject);
+
+ var outputFile = outputDir.clone();
+ outputFile.append(testFileName.replace(".html", outputFileExtension));
+
+ dump("Dumping frame model for " + testFileName + " to " + outputFile.leafName + "\n");
+ var result = debugObject.dumpFrameModel(testWindow, outputFile, nsIFrameDebugObject.DUMP_FLAGS_MASK_DEFAULT);
+ if (result != 0)
+ {
+ WriteOutput("dumpFrameModel for " + testFileName + " failed", false, "orange");
+ }
+}
+
+function LoadTestURL(testWindow, theURL)
+{
+ dump("Loading test " + theURL + "\n");
+ // we use a 1/2 second delay to give time for async reflows to happen
+ testWindow.onload = setTimeout("HandleTestWindowLoad(gTestWindow)", 1000);
+ testWindow.location.href = theURL;
+}
+
+function HandleTestWindowLoad(testWindow)
+{
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+
+ var outputDir;
+ var outputFileExtension;
+ var runCompare = false;
+
+ switch (gTestType)
+ {
+ case kTestTypeBaseline:
+ outputDir = gBaselineOutputDir;
+ outputFileExtension = gBaselineFileExtension;
+ break;
+
+ case kTestTypeVerify:
+ outputDir = gVerifyOutputDir;
+ outputFileExtension = gVerifyFileExtension;
+ break;
+
+ case kTestTypeVerifyAndCompare:
+ outputDir = gVerifyOutputDir;
+ outputFileExtension = gVerifyFileExtension;
+ runCompare = true;
+ break;
+
+ case kTestTypeCompare:
+ dump("Should never get here");
+ break;
+ }
+
+ var loadedURL = testWindow.location.href;
+ var loadedFile = loadedURL.substring(loadedURL.lastIndexOf('/') + 1);
+
+ DumpFrames(testWindow, loadedFile, outputDir, outputFileExtension);
+
+ if (runCompare)
+ {
+ var testFileBasename = loadedFile.replace(".html", "");
+ CompareFrameDumps(testFileBasename, gBaselineOutputDir, gBaselineFileExtension, gVerifyOutputDir, gVerifyFileExtension);
+ }
+
+ // now fire of the next one, if we have one
+ var nextURL = gTestURLs[gTestURLsIndex++];
+ if (nextURL)
+ LoadTestURL(testWindow, nextURL);
+ else
+ testWindow.close();
+}
+
+
+function AddDirectoryEntriesToTestList(inDirFile, inRequiredExtension)
+{
+ var enumerator = inDirFile.directoryEntries;
+
+ while (enumerator.hasMoreElements())
+ {
+ var curFile = enumerator.getNext();
+ curFile = curFile.QueryInterface(Components.interfaces.nsIFile);
+
+ var leafName = curFile.leafName;
+ if (leafName.indexOf(inRequiredExtension) != -1)
+ {
+ var fileURI = GetURISpecFromFile(curFile);
+ gTestURLs.push(fileURI);
+ }
+ }
+}
+
+
+// returns an array of filenames
+function DirectoryEntriesToArray(inDirFile, inRequiredExtension)
+{
+ var fileArray = new Array;
+
+ var enumerator = inDirFile.directoryEntries;
+ while (enumerator.hasMoreElements())
+ {
+ var curFile = enumerator.getNext();
+ curFile = curFile.QueryInterface(Components.interfaces.nsIFile);
+ var leafName = curFile.leafName;
+ if (leafName.indexOf(inRequiredExtension) != -1)
+ {
+ fileArray.push(leafName);
+ }
+ }
+
+ return fileArray;
+}
+
+
+function BuildTestURLsList(testSourceType)
+{
+ // clear the array
+ gTestURLs.splice(0);
+ gTestURLsIndex = 0;
+
+ if (testSourceType == kTestSourceSingleFile)
+ {
+ var testURL = document.testForm.singleTestFileInput.value;
+ if (testURL.substr(-5) != ".html")
+ {
+ // append /index.html if we have to
+ if (testURL.substr(-1) != "/")
+ testURL += "/";
+ testURL += "index.html";
+ }
+ gTestURLs[0] = testURL;
+ }
+ else
+ {
+ for (var i = 0; i < gTestcaseDirArray.length; i++)
+ {
+ var dirFile = gTestcaseDirArray[i]; // nsIFile for the dir
+ AddDirectoryEntriesToTestList(dirFile, ".html");
+ }
+ }
+}
+
+function CompareFilesInDir(inBaseDir, inBaseExtension, inVerifyDir, inVerifyExtension)
+{
+ var comapareFiles = DirectoryEntriesToArray(inBaseDir, inBaseExtension);
+
+ for (var i = 0; i < comapareFiles.length; i ++)
+ {
+ var curFilename = comapareFiles[i];
+ var testFileBasename = curFilename.replace(inBaseExtension, "");
+ CompareFrameDumps(testFileBasename, inBaseDir, inBaseExtension, inVerifyDir, inVerifyExtension);
+ }
+}
+
+function GetTestType()
+{
+ if (document.testForm.doWhat[0].checked)
+ return kTestTypeBaseline;
+
+ if (document.testForm.doWhat[1].checked)
+ return kTestTypeVerify;
+
+ if (document.testForm.doWhat[2].checked)
+ return kTestTypeVerifyAndCompare;
+
+ if (document.testForm.doWhat[3].checked)
+ return kTestTypeCompare;
+
+ return 0;
+}
+
+function RunTests()
+{
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+
+ ClearOutput();
+ SaveFormToPrefs();
+
+ var testSourceType;
+ if (document.testForm.testType[0].checked)
+ testSourceType = kTestSourceSingleFile;
+ else
+ testSourceType = kTestSourceDirList;
+
+ gTestType = GetTestType();
+
+ gBaselineFileExtension = document.testForm.baselineFileExtension.value;
+ gVerifyFileExtension = document.testForm.verifyFileExtension.value;
+
+ if (gTestType == kTestTypeCompare)
+ {
+ // to compare, we'll just run through all the files in the
+ // baseline and verify dirs, and compare those that exist in
+ // both.
+ CompareFilesInDir(gBaselineOutputDir, gBaselineFileExtension, gVerifyOutputDir, gVerifyFileExtension);
+ }
+ else
+ {
+ BuildTestURLsList(testSourceType);
+
+ gTestWindow = window.open("about:blank", "Test window",
+ "width=800,height=600,status=yes,toolbars=no");
+
+ // start the first load
+ var testURL = gTestURLs[0];
+ gTestURLsIndex = 1;
+ LoadTestURL(gTestWindow, testURL);
+ }
+
+}
+
+