--- /dev/null
+// Constructs a validate accessibility object
+function WebDeveloperValidateAccessibility()
+{
+ this.file = null;
+ this.formElement = null;
+ this.inputElement = null;
+ this.validationRequest = null;
+}
+
+// Cleans up
+WebDeveloperValidateAccessibility.prototype.cleanUp = function()
+{
+ this.deleteFile();
+
+ // If the validation request is set
+ if(this.validationRequest)
+ {
+ this.validationRequest.abort();
+ }
+}
+
+// Creates a source file
+WebDeveloperValidateAccessibility.prototype.createSourceFile = function(uri)
+{
+ var temporaryDirectory = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("TmpD", Components.interfaces.nsIFile);
+
+ // If the temporary directory exists, is a directory and is writable
+ if(temporaryDirectory.exists() && temporaryDirectory.isDirectory() && temporaryDirectory.isWritable())
+ {
+ var fileName = "";
+ var sourceFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
+
+ // Try to get the host
+ try
+ {
+ fileName = uri.host;
+ }
+ catch(exception)
+ {
+ // Do nothing
+ }
+
+ temporaryDirectory.append("webdeveloper_" + fileName + "_" + new Date().getTime() + ".html");
+ sourceFile.initWithPath(temporaryDirectory.path);
+
+ return sourceFile;
+ }
+ else
+ {
+ webdeveloper_error(document.getElementById("webdeveloper-string-bundle").getFormattedString("webdeveloper_tempDirectoryFailed", [temporaryDirectory.path]));
+
+ return null;
+ }
+}
+
+// Deletes the file
+WebDeveloperValidateAccessibility.prototype.deleteFile = function()
+{
+ // If the file is set
+ if(this.file)
+ {
+ // Try to delete the file
+ try
+ {
+ this.file.remove(false);
+ }
+ catch(exception)
+ {
+ // Do nothing
+ }
+
+ this.file = null;
+ }
+}
+
+// Returns the post data
+WebDeveloperValidateAccessibility.prototype.getPostData = function()
+{
+ // Try to get the post data
+ try
+ {
+ var sessionHistory = getWebNavigation().sessionHistory;
+ var entry = sessionHistory.getEntryAtIndex(sessionHistory.index, false).QueryInterface(Components.interfaces.nsISHEntry);
+
+ return entry.postData;
+ }
+ catch(exception)
+ {
+ return null;
+ }
+}
+
+// Parses the validation results by type
+WebDeveloperValidateAccessibility.prototype.parseValidationResultsByType = function(type)
+{
+ var resultsHTML = this.validationRequest.responseText;
+ var count = resultsHTML.split(type + ".gif").length;
+
+ // If the count is greater than 0
+ if(count > 0)
+ {
+ return count - 1;
+ }
+
+ return 0;
+}
+
+// Retrieves the HTML
+WebDeveloperValidateAccessibility.prototype.retrieveHTML = function()
+{
+ var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
+ var htmlText = null;
+ var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
+ var scriptableStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
+
+ converter.charset = webdeveloper_getContentDocument().characterSet;
+
+ inputStream.init(this.file, 0x01, 0444, null);
+ scriptableStream.init(inputStream);
+
+ htmlText = converter.ConvertToUnicode(scriptableStream.read(scriptableStream.available()));
+
+ scriptableStream.close();
+ inputStream.close();
+
+ return htmlText;
+}
+
+// Saves the HTML
+WebDeveloperValidateAccessibility.prototype.saveHTML = function(uri)
+{
+ var webBrowserPersistInterface = Components.interfaces.nsIWebBrowserPersist;
+ var webBrowserPersist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(webBrowserPersistInterface);
+
+ webBrowserPersist.persistFlags = webBrowserPersistInterface.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION | webBrowserPersistInterface.PERSIST_FLAGS_FROM_CACHE | webBrowserPersistInterface.PERSIST_FLAGS_REPLACE_EXISTING_FILES;
+ webBrowserPersist.progressListener = this;
+
+ webBrowserPersist.saveURI(uri, null, uri, this.getPostData(), null, this.file);
+}
+
+// Submits the background request to validate the accessibility
+WebDeveloperValidateAccessibility.prototype.submitBackgroundRequest = function()
+{
+ var requestBody = "CheckURL=1&URLTest=Your+HTML";
+
+ // If the priority 1 preference is set
+ if(webdeveloper_getBooleanPreference("webdeveloper.validate.local.accessibility.wai.priority1", true))
+ {
+ requestBody += "&p1=1";
+ }
+
+ // If the priority 2 preference is set
+ if(webdeveloper_getBooleanPreference("webdeveloper.validate.local.accessibility.wai.priority2", true))
+ {
+ requestBody += "&p2=1";
+ }
+
+ // If the priority 3 preference is set
+ if(webdeveloper_getBooleanPreference("webdeveloper.validate.local.accessibility.wai.priority3", true))
+ {
+ requestBody += "&p3=1";
+ }
+
+ // If the Section 508 preference is set
+ if(webdeveloper_getBooleanPreference("webdeveloper.validate.local.accessibility.section508", true))
+ {
+ requestBody += "&s508=1";
+ }
+
+ requestBody += "&myHTML=" + encodeURIComponent(this.retrieveHTML());
+ this.validationRequest.onreadystatechange = webdeveloper_updatePageAccessibilityValidationDetails;
+
+ this.validationRequest.open("post", "http://www.hermish.com/check_this.cfm", true);
+
+ // Try to set the request header
+ try
+ {
+ this.validationRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+ this.validationRequest.send(requestBody);
+ }
+ catch(exception)
+ {
+ // Reset the validation request
+ this.validationRequest = new XMLHttpRequest();
+ }
+
+ this.deleteFile();
+}
+
+// Submits the form to validate the accessibility
+WebDeveloperValidateAccessibility.prototype.submitForm = function()
+{
+ this.inputElement.value = this.retrieveHTML();
+
+ this.deleteFile();
+ this.formElement.submit();
+}
+
+// Validate the accessibility of the given URI in the background
+WebDeveloperValidateAccessibility.prototype.validateBackgroundAccessibility = function(uri)
+{
+ this.file = this.createSourceFile(uri);
+
+ // If the validation request is not set
+ if(!this.validationRequest)
+ {
+ this.validationRequest = new XMLHttpRequest();
+ }
+
+ this.saveHTML(uri);
+}
+
+// Validate the accessibility of the given URI
+WebDeveloperValidateAccessibility.prototype.validateAccessibility = function(uri)
+{
+ var oldTab = getBrowser().selectedTab;
+ var oldURL = getBrowser().currentURI.spec;
+ var generatedDocument = webdeveloper_generateDocument("");
+ var bodyElement = webdeveloper_getDocumentBodyElement(generatedDocument);
+ var imageElement = generatedDocument.createElement("img");
+ var inputElement = null;
+ var pElement = generatedDocument.createElement("p");
+ var stringBundle = document.getElementById("webdeveloper-string-bundle");
+
+ generatedDocument.title = stringBundle.getString("webdeveloper_validateAccessibility");
+ this.file = this.createSourceFile(uri);
+ this.formElement = generatedDocument.createElement("form");
+
+ webdeveloper_addGeneratedStyles(generatedDocument);
+
+ imageElement.setAttribute("alt", "loading");
+ imageElement.setAttribute("src", "chrome://webdeveloper/content/images/content/loading.gif");
+ pElement.appendChild(imageElement);
+ pElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_contactingValidator")));
+ pElement.setAttribute("class", "loading");
+ bodyElement.appendChild(pElement);
+
+ this.formElement.setAttribute("action", "http://www.hermish.com/check_this.cfm");
+ this.formElement.setAttribute("method", "post");
+ this.formElement.setAttribute("style", "display: none");
+
+ inputElement = generatedDocument.createElement("input");
+
+ inputElement.setAttribute("name", "CheckURL");
+ inputElement.setAttribute("type", "hidden");
+ inputElement.setAttribute("value", "1");
+ this.formElement.appendChild(inputElement);
+
+ // If the priority 1 preference is set
+ if(webdeveloper_getBooleanPreference("webdeveloper.validate.local.accessibility.wai.priority1", true))
+ {
+ inputElement = generatedDocument.createElement("input");
+
+ inputElement.setAttribute("name", "p1");
+ inputElement.setAttribute("type", "hidden");
+ inputElement.setAttribute("value", "1");
+ this.formElement.appendChild(inputElement);
+ }
+
+ // If the priority 2 preference is set
+ if(webdeveloper_getBooleanPreference("webdeveloper.validate.local.accessibility.wai.priority2", true))
+ {
+ inputElement = generatedDocument.createElement("input");
+
+ inputElement.setAttribute("name", "p2");
+ inputElement.setAttribute("type", "hidden");
+ inputElement.setAttribute("value", "1");
+ this.formElement.appendChild(inputElement);
+ }
+
+ // If the priority 3 preference is set
+ if(webdeveloper_getBooleanPreference("webdeveloper.validate.local.accessibility.wai.priority3", true))
+ {
+ inputElement = generatedDocument.createElement("input");
+
+ inputElement.setAttribute("name", "p3");
+ inputElement.setAttribute("type", "hidden");
+ inputElement.setAttribute("value", "1");
+ this.formElement.appendChild(inputElement);
+ }
+
+ // If the Section 508 preference is set
+ if(webdeveloper_getBooleanPreference("webdeveloper.validate.local.accessibility.section508", true))
+ {
+ inputElement = generatedDocument.createElement("input");
+
+ inputElement.setAttribute("name", "s508");
+ inputElement.setAttribute("type", "hidden");
+ inputElement.setAttribute("value", "1");
+ this.formElement.appendChild(inputElement);
+ }
+
+ inputElement = generatedDocument.createElement("input");
+
+ inputElement.setAttribute("name", "URLTest");
+ inputElement.setAttribute("type", "hidden");
+ inputElement.setAttribute("value", "Your HTML");
+ this.formElement.appendChild(inputElement);
+
+ this.inputElement = generatedDocument.createElement("input");
+
+ this.inputElement.setAttribute("name", "myHTML");
+ this.inputElement.setAttribute("type", "hidden");
+ this.formElement.appendChild(this.inputElement);
+ bodyElement.appendChild(this.formElement);
+
+ // If the open tabs in background preference is set to true
+ if(webdeveloper_getBooleanPreference("webdeveloper.open.tabs.background", true))
+ {
+ getBrowser().selectedTab = oldTab;
+ }
+
+ this.saveHTML(uri);
+}
+
+// Called when the progress state changes
+WebDeveloperValidateAccessibility.prototype.onStateChange = function(webProgress, request, stateFlags, status)
+{
+ // If the progress has stopped
+ if(stateFlags & Components.interfaces.nsIWebProgressListener.STATE_STOP)
+ {
+ // If the file is set and exists
+ if(this.file && this.file.exists())
+ {
+ // If the validation request is set
+ if(this.validationRequest)
+ {
+ this.submitBackgroundRequest();
+ }
+ else
+ {
+ this.submitForm();
+ }
+ }
+ }
+}
+
+// Indicates the interfaces this object supports
+WebDeveloperValidateAccessibility.prototype.QueryInterface = function(id)
+{
+ // If the query is for a supported interface
+ if(id.equals(Components.interfaces.nsISupports) || id.equals(Components.interfaces.nsIWebProgressListener))
+ {
+ return this;
+ }
+
+ throw Components.results.NS_NOINTERFACE;
+}
+
+// Dummy methods requiring implementations
+WebDeveloperValidateAccessibility.prototype.onLocationChange = function(webProgress, request, location) {}
+WebDeveloperValidateAccessibility.prototype.onProgressChange = function(webProgress, request, currentSelfProgress, maximumSelfProgress, currentTotalProgress, maximumTotalProgress) {}
+WebDeveloperValidateAccessibility.prototype.onSecurityChange = function(webProgress, request, state) {}
+WebDeveloperValidateAccessibility.prototype.onStatusChange = function(webProgress, request, status, message) {}