gecko-dev/browser/modules/test/contentSearch.js

65 lines
2.4 KiB
JavaScript

/* 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 => {
content.dispatchEvent(
new content.CustomEvent(CLIENT_EVENT_TYPE, {
detail: msg.data,
})
);
// 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,
});
});
}
});
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");
}