mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-12 06:08:24 +02:00
***
Bug 1514594: Part 3a - Change ChromeUtils.import to return an exports object; not pollute global. r=mccr8
This changes the behavior of ChromeUtils.import() to return an exports object,
rather than a module global, in all cases except when `null` is passed as a
second argument, and changes the default behavior not to pollute the global
scope with the module's exports. Thus, the following code written for the old
model:
ChromeUtils.import("resource://gre/modules/Services.jsm");
is approximately the same as the following, in the new model:
var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
Since the two behaviors are mutually incompatible, this patch will land with a
scripted rewrite to update all existing callers to use the new model rather
than the old.
***
Bug 1514594: Part 3b - Mass rewrite all JS code to use the new ChromeUtils.import API. rs=Gijs
This was done using the followng script:
https://bitbucket.org/kmaglione/m-c-rewrites/src/tip/processors/cu-import-exports.jsm
***
Bug 1514594: Part 3c - Update ESLint plugin for ChromeUtils.import API changes. r=Standard8
Differential Revision: https://phabricator.services.mozilla.com/D16747
***
Bug 1514594: Part 3d - Remove/fix hundreds of duplicate imports from sync tests. r=Gijs
Differential Revision: https://phabricator.services.mozilla.com/D16748
***
Bug 1514594: Part 3e - Remove no-op ChromeUtils.import() calls. r=Gijs
Differential Revision: https://phabricator.services.mozilla.com/D16749
***
Bug 1514594: Part 3f.1 - Cleanup various test corner cases after mass rewrite. r=Gijs
***
Bug 1514594: Part 3f.2 - Cleanup various non-test corner cases after mass rewrite. r=Gijs
Differential Revision: https://phabricator.services.mozilla.com/D16750
--HG--
extra : rebase_source : 359574ee3064c90f33bf36c2ebe3159a24cc8895
extra : histedit_source : b93c8f42808b1599f9122d7842d2c0b3e656a594%2C64a3a4e3359dc889e2ab2b49461bab9e27fc10a7
108 lines
3.4 KiB
JavaScript
108 lines
3.4 KiB
JavaScript
const {HttpServer} = ChromeUtils.import("resource://testing-common/httpd.js");
|
|
const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
|
|
|
/*
|
|
* Test that when doing HTTP requests, the nsIHttpChannel is detected in
|
|
* both parent and child and shares the same channelId across processes.
|
|
*/
|
|
|
|
let httpserver;
|
|
let port;
|
|
|
|
function startHttpServer() {
|
|
httpserver = new HttpServer();
|
|
|
|
httpserver.registerPathHandler("/resource", (metadata, response) => {
|
|
response.setStatusLine(metadata.httpVersion, 200, "OK");
|
|
response.setHeader("Content-Type", "text/plain", false);
|
|
response.setHeader("Cache-Control", "no-cache", false);
|
|
response.bodyOutputStream.write("data", 4);
|
|
});
|
|
|
|
httpserver.registerPathHandler("/redirect", (metadata, response) => {
|
|
response.setStatusLine(metadata.httpVersion, 302, "Redirect");
|
|
response.setHeader("Location", "/resource", false);
|
|
response.setHeader("Cache-Control", "no-cache", false);
|
|
});
|
|
|
|
httpserver.start(-1);
|
|
port = httpserver.identity.primaryPort;
|
|
}
|
|
|
|
function stopHttpServer(next) {
|
|
httpserver.stop(next);
|
|
}
|
|
|
|
let expectedParentChannels = [];
|
|
let expectedChildMessages = [];
|
|
|
|
let maybeFinishWaitForParentChannels;
|
|
let parentChannelsDone = new Promise(resolve => {
|
|
maybeFinishWaitForParentChannels = () => {
|
|
if (expectedParentChannels.length == 0) {
|
|
dump("All expected parent channels were detected\n");
|
|
resolve();
|
|
}
|
|
};
|
|
});
|
|
|
|
function observer(subject, topic, data) {
|
|
let channel = subject.QueryInterface(Ci.nsIHttpChannel);
|
|
|
|
let uri = channel.URI.spec;
|
|
let origUri = channel.originalURI.spec;
|
|
let id = channel.channelId;
|
|
dump(`Parent detected channel: ${uri} (orig=${origUri}): channelId=${id}\n`);
|
|
|
|
// did we expect a new channel?
|
|
let expected = expectedParentChannels.shift();
|
|
Assert.ok(!!expected);
|
|
|
|
// Start waiting for the messages about request/response from child
|
|
for (let event of expected) {
|
|
let message = `${event}:${id}`;
|
|
dump(`Expecting message from child: ${message}\n`);
|
|
|
|
let messagePromise = do_await_remote_message(message).then(() => {
|
|
dump(`Expected message from child arrived: ${message}\n`);
|
|
});
|
|
expectedChildMessages.push(messagePromise);
|
|
}
|
|
|
|
// If we don't expect any further parent channels, finish the parent wait
|
|
maybeFinishWaitForParentChannels();
|
|
}
|
|
|
|
function run_test() {
|
|
startHttpServer();
|
|
Services.obs.addObserver(observer, "http-on-modify-request");
|
|
run_test_in_child("child_channel_id.js", makeRequests);
|
|
}
|
|
|
|
function makeRequests() {
|
|
// First, a normal request without any redirect. Expect one channel detected
|
|
// in parent, used by both request and response.
|
|
expectedParentChannels.push(["request", "response"]);
|
|
sendCommand(`makeRequest("http://localhost:${port}/resource");`);
|
|
|
|
// Second request will be redirected. Expect two channels, one with the
|
|
// original request, then the redirected one which gets the final response.
|
|
expectedParentChannels.push(["request"], ["response"]);
|
|
sendCommand(`makeRequest("http://localhost:${port}/redirect");`);
|
|
|
|
waitForParentChannels();
|
|
}
|
|
|
|
function waitForParentChannels() {
|
|
parentChannelsDone.then(waitForChildMessages);
|
|
}
|
|
|
|
function waitForChildMessages() {
|
|
dump(`Waiting for ${expectedChildMessages.length} child messages\n`);
|
|
Promise.all(expectedChildMessages).then(finish);
|
|
}
|
|
|
|
function finish() {
|
|
Services.obs.removeObserver(observer, "http-on-modify-request");
|
|
sendCommand("finish();", () => stopHttpServer(do_test_finished));
|
|
}
|