mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-30 13:45:27 +00:00
554 lines
15 KiB
JavaScript
554 lines
15 KiB
JavaScript
|
|
|
|
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);
|
|
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);
|
|
}
|
|
|
|
}
|
|
|
|
|