summaryrefslogtreecommitdiffstats
path: root/layout/tools/tests/regression_tests.js
diff options
context:
space:
mode:
Diffstat (limited to 'layout/tools/tests/regression_tests.js')
-rw-r--r--layout/tools/tests/regression_tests.js553
1 files changed, 553 insertions, 0 deletions
diff --git a/layout/tools/tests/regression_tests.js b/layout/tools/tests/regression_tests.js
new file mode 100644
index 000000000..19003b08f
--- /dev/null
+++ b/layout/tools/tests/regression_tests.js
@@ -0,0 +1,553 @@
+
+
+const nsIFilePicker = Components.interfaces.nsIFilePicker;
+const nsILayoutRegressionTester = Components.interfaces.nsILayoutRegressionTester;
+
+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/regressiontester;1"].createInstance(nsILayoutRegressionTester);
+
+ var baseFile = baselineDir.clone();
+ baseFile.append(testFileBasename + baselineExt);
+
+ var verifyFile = verifyDir.clone();
+ verifyFile.append(testFileBasename + verifyExt);
+
+ var filesDiffer = debugObject.compareFrameModels(baseFile, verifyFile, nsILayoutRegressionTester.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/regressiontester;1"].createInstance(nsILayoutRegressionTester);
+
+ 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, nsILayoutRegressionTester.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, gTestURLs.length);
+ 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);
+ }
+
+}
+
+