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
URL:
\ No newline at end of file + + + + Control Frame + + + + + + +
+
+URL: +
+
+ + + + + + + +
+
+ + + + + + 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

URL:


Do what Output file locations
File extensions
Baseline: (like ".bas")
Verify: (like ".ver")

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

+
+
+
+ +
+ URL: + +
+
+ +
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + +
Do whatOutput file locations
+
+
+
+
+
+ + + + + + + + + + + + + + + + +
File extensions
Baseline: + (like ".bas")
Verify: + (like ".ver")
+
+
+
+
+ +
+ +
+ + + + +

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); + } + +} + +