1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/layout/tools/tests/regression_tests.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,553 @@ 1.4 + 1.5 + 1.6 +const nsIFilePicker = Components.interfaces.nsIFilePicker; 1.7 +const nsILayoutRegressionTester = Components.interfaces.nsILayoutRegressionTester; 1.8 + 1.9 +const kTestTypeBaseline = 1; 1.10 +const kTestTypeVerify = 2; 1.11 +const kTestTypeVerifyAndCompare = 3; 1.12 +const kTestTypeCompare = 4; 1.13 + 1.14 +const kTestSourceSingleFile = 1; 1.15 +const kTestSourceDirList = 2; 1.16 + 1.17 +var gTestcaseDirArray = new Array; // array of nsILocalFiles 1.18 + 1.19 +var gBaselineOutputDir; // nsIFile 1.20 +var gVerifyOutputDir; // nsIFile 1.21 + 1.22 +var gBaselineFileExtension; // string 1.23 +var gVerifyFileExtension; // string 1.24 + 1.25 +var gTestType; // baseline, verify, compare etc. 1.26 + 1.27 +var gTestWindow; 1.28 +var gTestURLs = new Array; 1.29 +var gTestURLsIndex; 1.30 + 1.31 +function DoOnload() 1.32 +{ 1.33 + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 1.34 + 1.35 + // clear any values that the form manager may have unhelpfully filled in 1.36 + document.testForm.singleTestFileInput.value = ""; 1.37 + document.testForm.baselineOutputDir.value = ""; 1.38 + document.testForm.verifyOutputDir.value = ""; 1.39 + 1.40 + InitFormFromPrefs(); 1.41 + 1.42 + UpdateRunTestsButton(); 1.43 +} 1.44 + 1.45 +function InitFormFromPrefs() 1.46 +{ 1.47 + // load prefs 1.48 + try { 1.49 + var testURL = GetStringPref("nglayout.debug.testcaseURL"); 1.50 + document.testForm.singleTestFileInput.value = testURL; 1.51 + 1.52 + var baselineDirURL = GetStringPref("nglayout.debug.baselineDirURL"); 1.53 + gBaselineOutputDir = GetFileFromURISpec(baselineDirURL); 1.54 + document.testForm.baselineOutputDir.value = gBaselineOutputDir.path; 1.55 + 1.56 + var verifyDirURL = GetStringPref("nglayout.debug.verifyDirURL"); 1.57 + gVerifyOutputDir = GetFileFromURISpec(verifyDirURL); 1.58 + document.testForm.verifyOutputDir.value = gVerifyOutputDir.path; 1.59 + 1.60 + var dirIndex = 0; 1.61 + while (true) // we'll throw when we reach a nonexistent pref 1.62 + { 1.63 + var curDir = GetStringPref("nglayout.debug.testcaseDir" + dirIndex); 1.64 + var dirFileSpec = GetFileFromURISpec(curDir); 1.65 + gTestcaseDirArray.push(dirFileSpec); 1.66 + dirIndex ++; 1.67 + } 1.68 + } 1.69 + catch(e) 1.70 + { 1.71 + } 1.72 + 1.73 + RebuildTestDirsSelect(); 1.74 +} 1.75 + 1.76 +function SaveFormToPrefs() 1.77 +{ 1.78 + SaveStringPref("nglayout.debug.testcaseURL", document.testForm.singleTestFileInput.value); 1.79 + 1.80 + // save prefs 1.81 + if (gBaselineOutputDir) 1.82 + { 1.83 + var baselineDirURL = GetURISpecFromFile(gBaselineOutputDir); 1.84 + SaveStringPref("nglayout.debug.baselineDirURL", baselineDirURL); 1.85 + } 1.86 + 1.87 + if (gVerifyOutputDir) 1.88 + { 1.89 + var verifyDirURL = GetURISpecFromFile(gVerifyOutputDir); 1.90 + SaveStringPref("nglayout.debug.verifyDirURL", verifyDirURL); 1.91 + } 1.92 + 1.93 + var dirIndex; 1.94 + for (dirIndex = 0; dirIndex < gTestcaseDirArray.length; dirIndex ++) 1.95 + { 1.96 + var curURL = GetURISpecFromFile(gTestcaseDirArray[dirIndex]); 1.97 + SaveStringPref("nglayout.debug.testcaseDir" + dirIndex, curURL); 1.98 + } 1.99 + try 1.100 + { 1.101 + // clear prefs for higher indices until we throw 1.102 + while (1) 1.103 + { 1.104 + ClearPref("nglayout.debug.testcaseDir" + dirIndex); 1.105 + } 1.106 + } 1.107 + catch(e) 1.108 + { 1.109 + } 1.110 + 1.111 +} 1.112 + 1.113 +function GetURISpecFromFile(inFile) 1.114 +{ 1.115 + var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); 1.116 + var fileHandler = ioService.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler); 1.117 + return fileHandler.getURLSpecFromFile(inFile); 1.118 +} 1.119 + 1.120 +function GetFileFromURISpec(uriSpec) 1.121 +{ 1.122 + var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); 1.123 + var fileHandler = ioService.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler); 1.124 + return fileHandler.getFileFromURLSpec(uriSpec); 1.125 +} 1.126 + 1.127 +function SaveStringPref(inPrefName, inPrefValue) 1.128 +{ 1.129 + var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); 1.130 + prefs.setCharPref(inPrefName, inPrefValue); 1.131 +} 1.132 + 1.133 +function GetStringPref(inPrefName) 1.134 +{ 1.135 + var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); 1.136 + return prefs.getCharPref(inPrefName); 1.137 +} 1.138 + 1.139 +function ClearPref(inPrefName) 1.140 +{ 1.141 + var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); 1.142 + prefs.clearUserPref(inPrefName); 1.143 +} 1.144 + 1.145 +function WriteOutput(aText, aReplace, aColorString) 1.146 +{ 1.147 + var outputDiv = document.getElementById("results"); 1.148 + 1.149 + if (aReplace) 1.150 + ClearOutput(); 1.151 + 1.152 + var childDiv = document.createElement("div"); 1.153 + var textNode = document.createTextNode(aText); 1.154 + childDiv.appendChild(textNode); 1.155 + childDiv.setAttribute("style", "color: " + aColorString + ";"); 1.156 + outputDiv.appendChild(childDiv); 1.157 +} 1.158 + 1.159 +function ClearOutput() 1.160 +{ 1.161 + var outputDiv = document.getElementById("results"); 1.162 + var curChild; 1.163 + while (curChild = outputDiv.firstChild) 1.164 + outputDiv.removeChild(curChild); 1.165 +} 1.166 + 1.167 +// returns an nsIFile 1.168 +function PickDirectory() 1.169 +{ 1.170 + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 1.171 + 1.172 + var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); 1.173 + fp.init(window, "Pick a directory", nsIFilePicker.modeGetFolder); 1.174 + var result = fp.show(); 1.175 + if (result == nsIFilePicker.returnCancel) 1.176 + throw("User cancelled"); 1.177 + 1.178 + var chosenDir = fp.file; 1.179 + return chosenDir; 1.180 +} 1.181 + 1.182 + 1.183 +// returns a url string 1.184 +function PickFileURL() 1.185 +{ 1.186 + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 1.187 + 1.188 + var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); 1.189 + fp.init(window, "Pick a directory", nsIFilePicker.modeOpen); 1.190 + fp.appendFilters(nsIFilePicker.filterHTML + nsIFilePicker.filterText); 1.191 + 1.192 + var result = fp.show(); 1.193 + if (result == nsIFilePicker.returnCancel) 1.194 + throw("User cancelled"); 1.195 + 1.196 + return fp.fileURL.spec; 1.197 +} 1.198 + 1.199 +function RebuildTestDirsSelect() 1.200 +{ 1.201 + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 1.202 + var dirsSelect = document.getElementById("testDirsSelect"); 1.203 + 1.204 + // rebuild it from gTestcaseDirArray 1.205 + while (dirsSelect.length) 1.206 + dirsSelect.remove(0); 1.207 + 1.208 + var i; 1.209 + for (i = 0; i < gTestcaseDirArray.length; i ++) 1.210 + { 1.211 + var curDir = gTestcaseDirArray[i]; 1.212 + 1.213 + var optionElement = document.createElement("option"); 1.214 + var textNode = document.createTextNode(curDir.leafName); 1.215 + 1.216 + optionElement.appendChild(textNode); 1.217 + dirsSelect.add(optionElement, null); 1.218 + } 1.219 + 1.220 + UpdateRunTestsButton(); 1.221 +} 1.222 + 1.223 +// set the 'single testcase' file 1.224 +function ChooseTestcaseFile() 1.225 +{ 1.226 + var dirInput = document.getElementById("singleTestFileInput"); 1.227 + dirInput.value = PickFileURL(); 1.228 + 1.229 + UpdateRunTestsButton(); 1.230 +} 1.231 + 1.232 +function AppendTestcaseDir() 1.233 +{ 1.234 + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 1.235 + 1.236 + var chosenDir = PickDirectory(); 1.237 + // does the array already contain this dir? 1.238 + var i; 1.239 + for (i = 0; i < gTestcaseDirArray.length; i ++) 1.240 + { 1.241 + var curElement = gTestcaseDirArray[i]; 1.242 + if (curElement.equals(chosenDir)) // nsIFile::Equals 1.243 + return; 1.244 + } 1.245 + 1.246 + gTestcaseDirArray[gTestcaseDirArray.length] = chosenDir; 1.247 + RebuildTestDirsSelect(); 1.248 +} 1.249 + 1.250 +function RemoveTestcaseDir() 1.251 +{ 1.252 + var dirsSelect = document.getElementById("testDirsSelect"); 1.253 + if (dirsSelect.selectedIndex != -1) 1.254 + { 1.255 + gTestcaseDirArray.splice(dirsSelect.selectedIndex, 1); 1.256 + RebuildTestDirsSelect(); 1.257 + } 1.258 +} 1.259 + 1.260 +function InputOptionsValid() 1.261 +{ 1.262 + if (document.testForm.testType[0].checked) 1.263 + { 1.264 + // need a test file 1.265 + var testcaseURL = document.testForm.singleTestFileInput.value; 1.266 + if (testcaseURL.length == 0) return false; 1.267 + } 1.268 + else if (document.testForm.testType[1].checked) 1.269 + { 1.270 + // need at least one dir 1.271 + if (gTestcaseDirArray.length == 0) return false; 1.272 + } 1.273 + else 1.274 + return false; 1.275 + 1.276 + return true; 1.277 +} 1.278 + 1.279 +function OutputOptionsValid() 1.280 +{ 1.281 + var testType = GetTestType(); 1.282 + 1.283 + switch (testType) 1.284 + { 1.285 + case kTestTypeBaseline: 1.286 + if (!gBaselineOutputDir) return false; 1.287 + break; 1.288 + 1.289 + case kTestTypeVerify: 1.290 + if (!gVerifyOutputDir) return false; 1.291 + break; 1.292 + 1.293 + case kTestTypeVerifyAndCompare: 1.294 + case kTestTypeCompare: 1.295 + if (!gBaselineOutputDir || !gVerifyOutputDir) return false; 1.296 + break; 1.297 + } 1.298 + 1.299 + return true; 1.300 +} 1.301 + 1.302 +function UpdateRunTestsButton() 1.303 +{ 1.304 + var testType = GetTestType(); 1.305 + var dataValid = OutputOptionsValid(); 1.306 + if (testType != kTestTypeCompare) 1.307 + dataValid &= InputOptionsValid(); 1.308 + document.testForm.runTests.disabled = !dataValid; 1.309 +} 1.310 + 1.311 +// returns nsIFile, sets the input value 1.312 +function ChooseOutputDirectory(inputElementID) 1.313 +{ 1.314 + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 1.315 + var chosenDir = PickDirectory(); 1.316 + 1.317 + var inputElement = document.getElementById(inputElementID); 1.318 + inputElement.value = chosenDir.path; 1.319 + 1.320 + return chosenDir; 1.321 +} 1.322 + 1.323 + 1.324 +function CompareFrameDumps(testFileBasename, baselineDir, baselineExt, verifyDir, verifyExt) 1.325 +{ 1.326 + var debugObject = Components.classes["@mozilla.org/layout-debug/regressiontester;1"].createInstance(nsILayoutRegressionTester); 1.327 + 1.328 + var baseFile = baselineDir.clone(); 1.329 + baseFile.append(testFileBasename + baselineExt); 1.330 + 1.331 + var verifyFile = verifyDir.clone(); 1.332 + verifyFile.append(testFileBasename + verifyExt); 1.333 + 1.334 + var filesDiffer = debugObject.compareFrameModels(baseFile, verifyFile, nsILayoutRegressionTester.COMPARE_FLAGS_BRIEF); 1.335 + if (filesDiffer) 1.336 + { 1.337 + WriteOutput("Test file '" + baseFile.leafName + "' failed", false, "red"); 1.338 + } 1.339 + else 1.340 + { 1.341 + WriteOutput("Test file '" + baseFile.leafName + "' passed", false, "green"); 1.342 + } 1.343 +} 1.344 + 1.345 +function DumpFrames(testWindow, testFileName, outputDir, outputFileExtension) 1.346 +{ 1.347 + var debugObject = Components.classes["@mozilla.org/layout-debug/regressiontester;1"].createInstance(nsILayoutRegressionTester); 1.348 + 1.349 + var outputFile = outputDir.clone(); 1.350 + outputFile.append(testFileName.replace(".html", outputFileExtension)); 1.351 + 1.352 + dump("Dumping frame model for " + testFileName + " to " + outputFile.leafName + "\n"); 1.353 + var result = debugObject.dumpFrameModel(testWindow, outputFile, nsILayoutRegressionTester.DUMP_FLAGS_MASK_DEFAULT); 1.354 + if (result != 0) 1.355 + { 1.356 + WriteOutput("dumpFrameModel for " + testFileName + " failed", false, "orange"); 1.357 + } 1.358 +} 1.359 + 1.360 +function LoadTestURL(testWindow, theURL) 1.361 +{ 1.362 + dump("Loading test " + theURL + "\n"); 1.363 + // we use a 1/2 second delay to give time for async reflows to happen 1.364 + testWindow.onload = setTimeout("HandleTestWindowLoad(gTestWindow)", 1000); 1.365 + testWindow.location.href = theURL; 1.366 +} 1.367 + 1.368 +function HandleTestWindowLoad(testWindow) 1.369 +{ 1.370 + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 1.371 + 1.372 + var outputDir; 1.373 + var outputFileExtension; 1.374 + var runCompare = false; 1.375 + 1.376 + switch (gTestType) 1.377 + { 1.378 + case kTestTypeBaseline: 1.379 + outputDir = gBaselineOutputDir; 1.380 + outputFileExtension = gBaselineFileExtension; 1.381 + break; 1.382 + 1.383 + case kTestTypeVerify: 1.384 + outputDir = gVerifyOutputDir; 1.385 + outputFileExtension = gVerifyFileExtension; 1.386 + break; 1.387 + 1.388 + case kTestTypeVerifyAndCompare: 1.389 + outputDir = gVerifyOutputDir; 1.390 + outputFileExtension = gVerifyFileExtension; 1.391 + runCompare = true; 1.392 + break; 1.393 + 1.394 + case kTestTypeCompare: 1.395 + dump("Should never get here"); 1.396 + break; 1.397 + } 1.398 + 1.399 + var loadedURL = testWindow.location.href; 1.400 + var loadedFile = loadedURL.substring(loadedURL.lastIndexOf('/') + 1); 1.401 + 1.402 + DumpFrames(testWindow, loadedFile, outputDir, outputFileExtension); 1.403 + 1.404 + if (runCompare) 1.405 + { 1.406 + var testFileBasename = loadedFile.replace(".html", ""); 1.407 + CompareFrameDumps(testFileBasename, gBaselineOutputDir, gBaselineFileExtension, gVerifyOutputDir, gVerifyFileExtension); 1.408 + } 1.409 + 1.410 + // now fire of the next one, if we have one 1.411 + var nextURL = gTestURLs[gTestURLsIndex++]; 1.412 + if (nextURL) 1.413 + LoadTestURL(testWindow, nextURL); 1.414 + else 1.415 + testWindow.close(); 1.416 +} 1.417 + 1.418 + 1.419 +function AddDirectoryEntriesToTestList(inDirFile, inRequiredExtension) 1.420 +{ 1.421 + var enumerator = inDirFile.directoryEntries; 1.422 + 1.423 + while (enumerator.hasMoreElements()) 1.424 + { 1.425 + var curFile = enumerator.getNext(); 1.426 + curFile = curFile.QueryInterface(Components.interfaces.nsIFile); 1.427 + 1.428 + var leafName = curFile.leafName; 1.429 + if (leafName.indexOf(inRequiredExtension) != -1) 1.430 + { 1.431 + var fileURI = GetURISpecFromFile(curFile); 1.432 + gTestURLs.push(fileURI); 1.433 + } 1.434 + } 1.435 +} 1.436 + 1.437 + 1.438 +// returns an array of filenames 1.439 +function DirectoryEntriesToArray(inDirFile, inRequiredExtension) 1.440 +{ 1.441 + var fileArray = new Array; 1.442 + 1.443 + var enumerator = inDirFile.directoryEntries; 1.444 + while (enumerator.hasMoreElements()) 1.445 + { 1.446 + var curFile = enumerator.getNext(); 1.447 + curFile = curFile.QueryInterface(Components.interfaces.nsIFile); 1.448 + var leafName = curFile.leafName; 1.449 + if (leafName.indexOf(inRequiredExtension) != -1) 1.450 + { 1.451 + fileArray.push(leafName); 1.452 + } 1.453 + } 1.454 + 1.455 + return fileArray; 1.456 +} 1.457 + 1.458 + 1.459 +function BuildTestURLsList(testSourceType) 1.460 +{ 1.461 + // clear the array 1.462 + gTestURLs.splice(0, gTestURLs.length); 1.463 + gTestURLsIndex = 0; 1.464 + 1.465 + if (testSourceType == kTestSourceSingleFile) 1.466 + { 1.467 + var testURL = document.testForm.singleTestFileInput.value; 1.468 + if (testURL.substr(-5) != ".html") 1.469 + { 1.470 + // append /index.html if we have to 1.471 + if (testURL.substr(-1) != "/") 1.472 + testURL += "/"; 1.473 + testURL += "index.html"; 1.474 + } 1.475 + gTestURLs[0] = testURL; 1.476 + } 1.477 + else 1.478 + { 1.479 + for (var i = 0; i < gTestcaseDirArray.length; i++) 1.480 + { 1.481 + var dirFile = gTestcaseDirArray[i]; // nsIFile for the dir 1.482 + AddDirectoryEntriesToTestList(dirFile, ".html"); 1.483 + } 1.484 + } 1.485 +} 1.486 + 1.487 +function CompareFilesInDir(inBaseDir, inBaseExtension, inVerifyDir, inVerifyExtension) 1.488 +{ 1.489 + var comapareFiles = DirectoryEntriesToArray(inBaseDir, inBaseExtension); 1.490 + 1.491 + for (var i = 0; i < comapareFiles.length; i ++) 1.492 + { 1.493 + var curFilename = comapareFiles[i]; 1.494 + var testFileBasename = curFilename.replace(inBaseExtension, ""); 1.495 + CompareFrameDumps(testFileBasename, inBaseDir, inBaseExtension, inVerifyDir, inVerifyExtension); 1.496 + } 1.497 +} 1.498 + 1.499 +function GetTestType() 1.500 +{ 1.501 + if (document.testForm.doWhat[0].checked) 1.502 + return kTestTypeBaseline; 1.503 + 1.504 + if (document.testForm.doWhat[1].checked) 1.505 + return kTestTypeVerify; 1.506 + 1.507 + if (document.testForm.doWhat[2].checked) 1.508 + return kTestTypeVerifyAndCompare; 1.509 + 1.510 + if (document.testForm.doWhat[3].checked) 1.511 + return kTestTypeCompare; 1.512 + 1.513 + return 0; 1.514 +} 1.515 + 1.516 +function RunTests() 1.517 +{ 1.518 + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 1.519 + 1.520 + ClearOutput(); 1.521 + SaveFormToPrefs(); 1.522 + 1.523 + var testSourceType; 1.524 + if (document.testForm.testType[0].checked) 1.525 + testSourceType = kTestSourceSingleFile; 1.526 + else 1.527 + testSourceType = kTestSourceDirList; 1.528 + 1.529 + gTestType = GetTestType(); 1.530 + 1.531 + gBaselineFileExtension = document.testForm.baselineFileExtension.value; 1.532 + gVerifyFileExtension = document.testForm.verifyFileExtension.value; 1.533 + 1.534 + if (gTestType == kTestTypeCompare) 1.535 + { 1.536 + // to compare, we'll just run through all the files in the 1.537 + // baseline and verify dirs, and compare those that exist in 1.538 + // both. 1.539 + CompareFilesInDir(gBaselineOutputDir, gBaselineFileExtension, gVerifyOutputDir, gVerifyFileExtension); 1.540 + } 1.541 + else 1.542 + { 1.543 + BuildTestURLsList(testSourceType); 1.544 + 1.545 + gTestWindow = window.open("about:blank", "Test window", 1.546 + "width=800,height=600,status=yes,toolbars=no"); 1.547 + 1.548 + // start the first load 1.549 + var testURL = gTestURLs[0]; 1.550 + gTestURLsIndex = 1; 1.551 + LoadTestURL(gTestWindow, testURL); 1.552 + } 1.553 + 1.554 +} 1.555 + 1.556 +