summaryrefslogtreecommitdiffstats
path: root/toolkit/modules/tests/MockDocument.jsm
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/modules/tests/MockDocument.jsm')
-rw-r--r--toolkit/modules/tests/MockDocument.jsm50
1 files changed, 50 insertions, 0 deletions
diff --git a/toolkit/modules/tests/MockDocument.jsm b/toolkit/modules/tests/MockDocument.jsm
new file mode 100644
index 000000000..3cae9bb91
--- /dev/null
+++ b/toolkit/modules/tests/MockDocument.jsm
@@ -0,0 +1,50 @@
+/**
+ * Provides infrastructure for tests that would require mock document.
+ */
+
+"use strict";
+
+this.EXPORTED_SYMBOLS = ["MockDocument"]
+
+const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
+
+Cu.importGlobalProperties(["URL"]);
+
+const MockDocument = {
+ /**
+ * Create a document for the given URL containing the given HTML with the ownerDocument of all <form>s having a mocked location.
+ */
+ createTestDocument(aDocumentURL, aContent = "<form>", aType = "text/html") {
+ let parser = Cc["@mozilla.org/xmlextras/domparser;1"].
+ createInstance(Ci.nsIDOMParser);
+ parser.init();
+ let parsedDoc = parser.parseFromString(aContent, aType);
+
+ for (let element of parsedDoc.forms) {
+ this.mockOwnerDocumentProperty(element, parsedDoc, aDocumentURL);
+ }
+ return parsedDoc;
+ },
+
+ mockOwnerDocumentProperty(aElement, aDoc, aURL) {
+ // Mock the document.location object so we can unit test without a frame. We use a proxy
+ // instead of just assigning to the property since it's not configurable or writable.
+ let document = new Proxy(aDoc, {
+ get(target, property, receiver) {
+ // document.location is normally null when a document is outside of a "browsing context".
+ // See https://html.spec.whatwg.org/#the-location-interface
+ if (property == "location") {
+ return new URL(aURL);
+ }
+ return target[property];
+ },
+ });
+
+ // Assign element.ownerDocument to the proxy so document.location works.
+ Object.defineProperty(aElement, "ownerDocument", {
+ value: document,
+ });
+ },
+
+};
+