diff options
Diffstat (limited to 'browser/modules/test/contentSearch.js')
-rw-r--r-- | browser/modules/test/contentSearch.js | 64 |
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"); +} |