3
const nsIFilePicker = Components.interfaces.nsIFilePicker;
4
const nsILayoutRegressionTester = Components.interfaces.nsILayoutRegressionTester;
6
const kTestTypeBaseline = 1;
7
const kTestTypeVerify = 2;
8
const kTestTypeVerifyAndCompare = 3;
9
const kTestTypeCompare = 4;
11
const kTestSourceSingleFile = 1;
12
const kTestSourceDirList = 2;
14
var gTestcaseDirArray = new Array; // array of nsILocalFiles
16
var gBaselineOutputDir; // nsIFile
17
var gVerifyOutputDir; // nsIFile
19
var gBaselineFileExtension; // string
20
var gVerifyFileExtension; // string
22
var gTestType; // baseline, verify, compare etc.
25
var gTestURLs = new Array;
30
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
32
// clear any values that the form manager may have unhelpfully filled in
33
document.testForm.singleTestFileInput.value = "";
34
document.testForm.baselineOutputDir.value = "";
35
document.testForm.verifyOutputDir.value = "";
39
UpdateRunTestsButton();
42
function InitFormFromPrefs()
46
var testURL = GetStringPref("nglayout.debug.testcaseURL");
47
document.testForm.singleTestFileInput.value = testURL;
49
var baselineDirURL = GetStringPref("nglayout.debug.baselineDirURL");
50
gBaselineOutputDir = GetFileFromURISpec(baselineDirURL);
51
document.testForm.baselineOutputDir.value = gBaselineOutputDir.path;
53
var verifyDirURL = GetStringPref("nglayout.debug.verifyDirURL");
54
gVerifyOutputDir = GetFileFromURISpec(verifyDirURL);
55
document.testForm.verifyOutputDir.value = gVerifyOutputDir.path;
58
while (true) // we'll throw when we reach a nonexistent pref
60
var curDir = GetStringPref("nglayout.debug.testcaseDir" + dirIndex);
61
var dirFileSpec = GetFileFromURISpec(curDir);
62
gTestcaseDirArray.push(dirFileSpec);
70
RebuildTestDirsSelect();
73
function SaveFormToPrefs()
75
SaveStringPref("nglayout.debug.testcaseURL", document.testForm.singleTestFileInput.value);
78
if (gBaselineOutputDir)
80
var baselineDirURL = GetURISpecFromFile(gBaselineOutputDir);
81
SaveStringPref("nglayout.debug.baselineDirURL", baselineDirURL);
86
var verifyDirURL = GetURISpecFromFile(gVerifyOutputDir);
87
SaveStringPref("nglayout.debug.verifyDirURL", verifyDirURL);
91
for (dirIndex = 0; dirIndex < gTestcaseDirArray.length; dirIndex ++)
93
var curURL = GetURISpecFromFile(gTestcaseDirArray[dirIndex]);
94
SaveStringPref("nglayout.debug.testcaseDir" + dirIndex, curURL);
98
// clear prefs for higher indices until we throw
101
ClearPref("nglayout.debug.testcaseDir" + dirIndex);
110
function GetURISpecFromFile(inFile)
112
var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
113
var fileHandler = ioService.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler);
114
return fileHandler.getURLSpecFromFile(inFile);
117
function GetFileFromURISpec(uriSpec)
119
var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
120
var fileHandler = ioService.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler);
121
return fileHandler.getFileFromURLSpec(uriSpec);
124
function SaveStringPref(inPrefName, inPrefValue)
126
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
127
prefs.setCharPref(inPrefName, inPrefValue);
130
function GetStringPref(inPrefName)
132
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
133
return prefs.getCharPref(inPrefName);
136
function ClearPref(inPrefName)
138
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
139
prefs.clearUserPref(inPrefName);
142
function WriteOutput(aText, aReplace, aColorString)
144
var outputDiv = document.getElementById("results");
149
var childDiv = document.createElement("div");
150
var textNode = document.createTextNode(aText);
151
childDiv.appendChild(textNode);
152
childDiv.setAttribute("style", "color: " + aColorString + ";");
153
outputDiv.appendChild(childDiv);
156
function ClearOutput()
158
var outputDiv = document.getElementById("results");
160
while (curChild = outputDiv.firstChild)
161
outputDiv.removeChild(curChild);
164
// returns an nsIFile
165
function PickDirectory()
167
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
169
var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
170
fp.init(window, "Pick a directory", nsIFilePicker.modeGetFolder);
171
var result = fp.show();
172
if (result == nsIFilePicker.returnCancel)
173
throw("User cancelled");
175
var chosenDir = fp.file;
180
// returns a url string
181
function PickFileURL()
183
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
185
var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
186
fp.init(window, "Pick a directory", nsIFilePicker.modeOpen);
187
fp.appendFilters(nsIFilePicker.filterHTML + nsIFilePicker.filterText);
189
var result = fp.show();
190
if (result == nsIFilePicker.returnCancel)
191
throw("User cancelled");
193
return fp.fileURL.spec;
196
function RebuildTestDirsSelect()
198
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
199
var dirsSelect = document.getElementById("testDirsSelect");
201
// rebuild it from gTestcaseDirArray
202
while (dirsSelect.length)
203
dirsSelect.remove(0);
206
for (i = 0; i < gTestcaseDirArray.length; i ++)
208
var curDir = gTestcaseDirArray[i];
210
var optionElement = document.createElement("option");
211
var textNode = document.createTextNode(curDir.leafName);
213
optionElement.appendChild(textNode);
214
dirsSelect.add(optionElement, null);
217
UpdateRunTestsButton();
220
// set the 'single testcase' file
221
function ChooseTestcaseFile()
223
var dirInput = document.getElementById("singleTestFileInput");
224
dirInput.value = PickFileURL();
226
UpdateRunTestsButton();
229
function AppendTestcaseDir()
231
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
233
var chosenDir = PickDirectory();
234
// does the array already contain this dir?
236
for (i = 0; i < gTestcaseDirArray.length; i ++)
238
var curElement = gTestcaseDirArray[i];
239
if (curElement.equals(chosenDir)) // nsIFile::Equals
243
gTestcaseDirArray[gTestcaseDirArray.length] = chosenDir;
244
RebuildTestDirsSelect();
247
function RemoveTestcaseDir()
249
var dirsSelect = document.getElementById("testDirsSelect");
250
if (dirsSelect.selectedIndex != -1)
252
gTestcaseDirArray.splice(dirsSelect.selectedIndex, 1);
253
RebuildTestDirsSelect();
257
function InputOptionsValid()
259
if (document.testForm.testType[0].checked)
262
var testcaseURL = document.testForm.singleTestFileInput.value;
263
if (testcaseURL.length == 0) return false;
265
else if (document.testForm.testType[1].checked)
267
// need at least one dir
268
if (gTestcaseDirArray.length == 0) return false;
276
function OutputOptionsValid()
278
var testType = GetTestType();
282
case kTestTypeBaseline:
283
if (!gBaselineOutputDir) return false;
286
case kTestTypeVerify:
287
if (!gVerifyOutputDir) return false;
290
case kTestTypeVerifyAndCompare:
291
case kTestTypeCompare:
292
if (!gBaselineOutputDir || !gVerifyOutputDir) return false;
299
function UpdateRunTestsButton()
301
var testType = GetTestType();
302
var dataValid = OutputOptionsValid();
303
if (testType != kTestTypeCompare)
304
dataValid &= InputOptionsValid();
305
document.testForm.runTests.disabled = !dataValid;
308
// returns nsIFile, sets the input value
309
function ChooseOutputDirectory(inputElementID)
311
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
312
var chosenDir = PickDirectory();
314
var inputElement = document.getElementById(inputElementID);
315
inputElement.value = chosenDir.path;
321
function CompareFrameDumps(testFileBasename, baselineDir, baselineExt, verifyDir, verifyExt)
323
var debugObject = Components.classes["@mozilla.org/layout-debug/regressiontester;1"].createInstance(nsILayoutRegressionTester);
325
var baseFile = baselineDir.clone();
326
baseFile.append(testFileBasename + baselineExt);
328
var verifyFile = verifyDir.clone();
329
verifyFile.append(testFileBasename + verifyExt);
331
var filesDiffer = debugObject.compareFrameModels(baseFile, verifyFile, nsILayoutRegressionTester.COMPARE_FLAGS_BRIEF);
334
WriteOutput("Test file '" + baseFile.leafName + "' failed", false, "red");
338
WriteOutput("Test file '" + baseFile.leafName + "' passed", false, "green");
342
function DumpFrames(testWindow, testFileName, outputDir, outputFileExtension)
344
var debugObject = Components.classes["@mozilla.org/layout-debug/regressiontester;1"].createInstance(nsILayoutRegressionTester);
346
var outputFile = outputDir.clone();
347
outputFile.append(testFileName.replace(".html", outputFileExtension));
349
dump("Dumping frame model for " + testFileName + " to " + outputFile.leafName + "\n");
350
var result = debugObject.dumpFrameModel(testWindow, outputFile, nsILayoutRegressionTester.DUMP_FLAGS_MASK_DEFAULT);
353
WriteOutput("dumpFrameModel for " + testFileName + " failed", false, "orange");
357
function LoadTestURL(testWindow, theURL)
359
dump("Loading test " + theURL + "\n");
360
// we use a 1/2 second delay to give time for async reflows to happen
361
testWindow.onload = setTimeout("HandleTestWindowLoad(gTestWindow)", 1000);
362
testWindow.location.href = theURL;
365
function HandleTestWindowLoad(testWindow)
367
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
370
var outputFileExtension;
371
var runCompare = false;
375
case kTestTypeBaseline:
376
outputDir = gBaselineOutputDir;
377
outputFileExtension = gBaselineFileExtension;
380
case kTestTypeVerify:
381
outputDir = gVerifyOutputDir;
382
outputFileExtension = gVerifyFileExtension;
385
case kTestTypeVerifyAndCompare:
386
outputDir = gVerifyOutputDir;
387
outputFileExtension = gVerifyFileExtension;
391
case kTestTypeCompare:
392
dump("Should never get here");
396
var loadedURL = testWindow.location.href;
397
var loadedFile = loadedURL.substring(loadedURL.lastIndexOf('/') + 1);
399
DumpFrames(testWindow, loadedFile, outputDir, outputFileExtension);
403
var testFileBasename = loadedFile.replace(".html", "");
404
CompareFrameDumps(testFileBasename, gBaselineOutputDir, gBaselineFileExtension, gVerifyOutputDir, gVerifyFileExtension);
407
// now fire of the next one, if we have one
408
var nextURL = gTestURLs[gTestURLsIndex++];
410
LoadTestURL(testWindow, nextURL);
416
function AddDirectoryEntriesToTestList(inDirFile, inRequiredExtension)
418
var enumerator = inDirFile.directoryEntries;
420
while (enumerator.hasMoreElements())
422
var curFile = enumerator.getNext();
423
curFile = curFile.QueryInterface(Components.interfaces.nsIFile);
425
var leafName = curFile.leafName;
426
if (leafName.indexOf(inRequiredExtension) != -1)
428
var fileURI = GetURISpecFromFile(curFile);
429
gTestURLs.push(fileURI);
435
// returns an array of filenames
436
function DirectoryEntriesToArray(inDirFile, inRequiredExtension)
438
var fileArray = new Array;
440
var enumerator = inDirFile.directoryEntries;
441
while (enumerator.hasMoreElements())
443
var curFile = enumerator.getNext();
444
curFile = curFile.QueryInterface(Components.interfaces.nsIFile);
445
var leafName = curFile.leafName;
446
if (leafName.indexOf(inRequiredExtension) != -1)
448
fileArray.push(leafName);
456
function BuildTestURLsList(testSourceType)
462
if (testSourceType == kTestSourceSingleFile)
464
var testURL = document.testForm.singleTestFileInput.value;
465
if (testURL.substr(-5) != ".html")
467
// append /index.html if we have to
468
if (testURL.substr(-1) != "/")
470
testURL += "index.html";
472
gTestURLs[0] = testURL;
476
for (var i = 0; i < gTestcaseDirArray.length; i++)
478
var dirFile = gTestcaseDirArray[i]; // nsIFile for the dir
479
AddDirectoryEntriesToTestList(dirFile, ".html");
484
function CompareFilesInDir(inBaseDir, inBaseExtension, inVerifyDir, inVerifyExtension)
486
var comapareFiles = DirectoryEntriesToArray(inBaseDir, inBaseExtension);
488
for (var i = 0; i < comapareFiles.length; i ++)
490
var curFilename = comapareFiles[i];
491
var testFileBasename = curFilename.replace(inBaseExtension, "");
492
CompareFrameDumps(testFileBasename, inBaseDir, inBaseExtension, inVerifyDir, inVerifyExtension);
496
function GetTestType()
498
if (document.testForm.doWhat[0].checked)
499
return kTestTypeBaseline;
501
if (document.testForm.doWhat[1].checked)
502
return kTestTypeVerify;
504
if (document.testForm.doWhat[2].checked)
505
return kTestTypeVerifyAndCompare;
507
if (document.testForm.doWhat[3].checked)
508
return kTestTypeCompare;
515
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
521
if (document.testForm.testType[0].checked)
522
testSourceType = kTestSourceSingleFile;
524
testSourceType = kTestSourceDirList;
526
gTestType = GetTestType();
528
gBaselineFileExtension = document.testForm.baselineFileExtension.value;
529
gVerifyFileExtension = document.testForm.verifyFileExtension.value;
531
if (gTestType == kTestTypeCompare)
533
// to compare, we'll just run through all the files in the
534
// baseline and verify dirs, and compare those that exist in
536
CompareFilesInDir(gBaselineOutputDir, gBaselineFileExtension, gVerifyOutputDir, gVerifyFileExtension);
540
BuildTestURLsList(testSourceType);
542
gTestWindow = window.open("about:blank", "Test window",
543
"width=800,height=600,status=yes,toolbars=no");
545
// start the first load
546
var testURL = gTestURLs[0];
548
LoadTestURL(gTestWindow, testURL);