summaryrefslogtreecommitdiffstats
path: root/browser/modules/test/contentSearch.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/modules/test/contentSearch.js')
-rw-r--r--browser/modules/test/contentSearch.js64
1 files changed, 64 insertions, 0 deletions
diff --git a/browser/modules/test/contentSearch.js b/browser/modules/test/contentSearch.js
new file mode 100644
index 000000000..b5dddfe45
--- /dev/null
+++ b/browser/modules/test/contentSearch.js
@@ -0,0 +1,64 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const TEST_MSG = "ContentSearchTest";
+const SERVICE_EVENT_TYPE = "ContentSearchService";
+const CLIENT_EVENT_TYPE = "ContentSearchClient";
+
+// Forward events from the in-content service to the test.
+content.addEventListener(SERVICE_EVENT_TYPE, event => {
+ // The event dispatch code in content.js clones the event detail into the
+ // content scope. That's generally the right thing, but causes us to end
+ // up with an XrayWrapper to it here, which will screw us up when trying to
+ // serialize the object in sendAsyncMessage. Waive Xrays for the benefit of
+ // the test machinery.
+ sendAsyncMessage(TEST_MSG, Components.utils.waiveXrays(event.detail));
+});
+
+// Forward messages from the test to the in-content service.
+addMessageListener(TEST_MSG, msg => {
+ // If the message is a search, stop the page from loading and then tell the
+ // test that it loaded.
+ if (msg.data.type == "Search") {
+ waitForLoadAndStopIt(msg.data.expectedURL, url => {
+ sendAsyncMessage(TEST_MSG, {
+ type: "loadStopped",
+ url: url,
+ });
+ });
+ }
+
+ content.dispatchEvent(
+ new content.CustomEvent(CLIENT_EVENT_TYPE, {
+ detail: msg.data,
+ })
+ );
+});
+
+function waitForLoadAndStopIt(expectedURL, callback) {
+ let Ci = Components.interfaces;
+ let webProgress = docShell.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIWebProgress);
+ let listener = {
+ onStateChange: function (webProg, req, flags, status) {
+ if (req instanceof Ci.nsIChannel) {
+ let url = req.originalURI.spec;
+ dump("waitForLoadAndStopIt: onStateChange " + url + "\n");
+ let docStart = Ci.nsIWebProgressListener.STATE_IS_DOCUMENT |
+ Ci.nsIWebProgressListener.STATE_START;
+ if ((flags & docStart) && webProg.isTopLevel && url == expectedURL) {
+ webProgress.removeProgressListener(listener);
+ req.cancel(Components.results.NS_ERROR_FAILURE);
+ callback(url);
+ }
+ }
+ },
+ QueryInterface: XPCOMUtils.generateQI([
+ Ci.nsIWebProgressListener,
+ Ci.nsISupportsWeakReference,
+ ]),
+ };
+ webProgress.addProgressListener(listener, Ci.nsIWebProgress.NOTIFY_ALL);
+ dump("waitForLoadAndStopIt: Waiting for URL to load: " + expectedURL + "\n");
+}