mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-12 14:20:14 +02:00
This replaces the JS policy service stubs with a pure C++ version which directly makes policy decisions based on active WebExtensionPolicy objects. This is the first step in a larger refactoring, which will remove the ExtensionManagement module entirely, and replace the current add-on policy service with direct, non-virtual access to native WebExtensionPolicy objects. It will also be followed by related changes to migrate the content script and extension page matching to native code, based on the existing MatchPattern and WebExtensionPolicy bindings. MozReview-Commit-ID: 2MpbmXZGiPZ --HG-- extra : rebase_source : 8b268618164b45605143e858665e592de829a6fa
133 lines
3.9 KiB
JavaScript
133 lines
3.9 KiB
JavaScript
"use strict";
|
|
|
|
const convService = Cc["@mozilla.org/streamConverters;1"]
|
|
.getService(Ci.nsIStreamConverterService);
|
|
|
|
const UUID = "72b61ee3-aceb-476c-be1b-0822b036c9f1";
|
|
const ADDON_ID = "test@web.extension";
|
|
const URI = NetUtil.newURI(`moz-extension://${UUID}/file.css`);
|
|
|
|
const FROM_TYPE = "application/vnd.mozilla.webext.unlocalized";
|
|
const TO_TYPE = "text/css";
|
|
|
|
|
|
function StringStream(string) {
|
|
let stream = Cc["@mozilla.org/io/string-input-stream;1"]
|
|
.createInstance(Ci.nsIStringInputStream);
|
|
|
|
stream.data = string;
|
|
return stream;
|
|
}
|
|
|
|
|
|
// Initialize the policy service with a stub localizer for our
|
|
// add-on ID.
|
|
add_task(async function init() {
|
|
let policy = new WebExtensionPolicy({
|
|
id: ADDON_ID,
|
|
mozExtensionHostname: UUID,
|
|
baseURL: "file:///",
|
|
|
|
allowedOrigins: new MatchPatternSet([]),
|
|
|
|
localizeCallback(string) {
|
|
return string.replace(/__MSG_(.*?)__/g, "<localized-$1>");
|
|
},
|
|
});
|
|
|
|
policy.active = true;
|
|
|
|
do_register_cleanup(() => {
|
|
policy.active = false;
|
|
});
|
|
});
|
|
|
|
|
|
// Test that the synchronous converter works as expected with a
|
|
// simple string.
|
|
add_task(async function testSynchronousConvert() {
|
|
let stream = StringStream("Foo __MSG_xxx__ bar __MSG_yyy__ baz");
|
|
|
|
let resultStream = convService.convert(stream, FROM_TYPE, TO_TYPE, URI);
|
|
|
|
let result = NetUtil.readInputStreamToString(resultStream, resultStream.available());
|
|
|
|
equal(result, "Foo <localized-xxx> bar <localized-yyy> baz");
|
|
});
|
|
|
|
|
|
// Test that the asynchronous converter works as expected with input
|
|
// split into multiple chunks, and a boundary in the middle of a
|
|
// replacement token.
|
|
add_task(async function testAsyncConvert() {
|
|
let listener;
|
|
let awaitResult = new Promise((resolve, reject) => {
|
|
listener = {
|
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener]),
|
|
|
|
onDataAvailable(request, context, inputStream, offset, count) {
|
|
this.resultParts.push(NetUtil.readInputStreamToString(inputStream, count));
|
|
},
|
|
|
|
onStartRequest() {
|
|
ok(!("resultParts" in this));
|
|
this.resultParts = [];
|
|
},
|
|
|
|
onStopRequest(request, context, statusCode) {
|
|
if (!Components.isSuccessCode(statusCode)) {
|
|
reject(new Error(statusCode));
|
|
}
|
|
|
|
resolve(this.resultParts.join("\n"));
|
|
},
|
|
};
|
|
});
|
|
|
|
let parts = ["Foo __MSG_x", "xx__ bar __MSG_yyy__ baz"];
|
|
|
|
let converter = convService.asyncConvertData(FROM_TYPE, TO_TYPE, listener, URI);
|
|
converter.onStartRequest(null, null);
|
|
|
|
for (let part of parts) {
|
|
converter.onDataAvailable(null, null, StringStream(part), 0, part.length);
|
|
}
|
|
|
|
converter.onStopRequest(null, null, Cr.NS_OK);
|
|
|
|
|
|
let result = await awaitResult;
|
|
equal(result, "Foo <localized-xxx> bar <localized-yyy> baz");
|
|
});
|
|
|
|
|
|
// Test that attempting to initialize a converter with the URI of a
|
|
// nonexistent WebExtension fails.
|
|
add_task(async function testInvalidUUID() {
|
|
let uri = NetUtil.newURI("moz-extension://eb4f3be8-41c9-4970-aa6d-b84d1ecc02b2/file.css");
|
|
let stream = StringStream("Foo __MSG_xxx__ bar __MSG_yyy__ baz");
|
|
|
|
// Assert.throws raise a TypeError exception when the expected param
|
|
// is an arrow function. (See Bug 1237961 for rationale)
|
|
let expectInvalidContextException = function(e) {
|
|
return e.result === Cr.NS_ERROR_INVALID_ARG && /Invalid context/.test(e);
|
|
};
|
|
|
|
Assert.throws(() => {
|
|
convService.convert(stream, FROM_TYPE, TO_TYPE, uri);
|
|
}, expectInvalidContextException);
|
|
|
|
Assert.throws(() => {
|
|
let listener = {QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener])};
|
|
|
|
convService.asyncConvertData(FROM_TYPE, TO_TYPE, listener, uri);
|
|
}, expectInvalidContextException);
|
|
});
|
|
|
|
|
|
// Test that an empty stream does not throw an NS_ERROR_ILLEGAL_VALUE.
|
|
add_task(async function testEmptyStream() {
|
|
let stream = StringStream("");
|
|
let resultStream = convService.convert(stream, FROM_TYPE, TO_TYPE, URI);
|
|
equal(resultStream.data, "");
|
|
});
|