Bug 1297229 Run experiments APIs through schemas r=kmag

It is not directly related to the current bug but I added a test
for browser.extentionTypes while I was here.

MozReview-Commit-ID: 2XifKm3ZhrY

--HG--
extra : rebase_source : 855e44ebf7d595211de46a0ecbfedca107430662
This commit is contained in:
Andrew Swan 2016-08-22 16:50:32 -07:00
Родитель 503f4fa827
Коммит 30f2e473c0
3 изменённых файлов: 43 добавлений и 26 удалений

Просмотреть файл

@ -88,7 +88,6 @@ var {
EventEmitter, EventEmitter,
LocaleData, LocaleData,
Messenger, Messenger,
injectAPI,
instanceOf, instanceOf,
flushJarCache, flushJarCache,
} = ExtensionUtils; } = ExtensionUtils;
@ -180,11 +179,8 @@ var Management = {
this.schemaApis.push({namespace, getAPI}); this.schemaApis.push({namespace, getAPI});
}, },
// Mash together into a single object all the APIs registered by the // Mash together all the APIs from apis into obj.
// functions above. Return the merged object. generateAPIs(context, apis, obj, namespaces = null) {
generateAPIs(context, apis, namespaces = null) {
let obj = {};
// Recursively copy properties from source to dest. // Recursively copy properties from source to dest.
function copy(dest, source) { function copy(dest, source) {
for (let prop in source) { for (let prop in source) {
@ -213,7 +209,6 @@ var Management = {
api = api.getAPI(context); api = api.getAPI(context);
copy(obj, api); copy(obj, api);
} }
return obj;
}, },
// The ext-*.js scripts can ask to be notified for certain hooks. // The ext-*.js scripts can ask to be notified for certain hooks.
@ -625,11 +620,11 @@ GlobalManager = {
}, },
injectInObject(context, defaultCallback, dest, namespaces = null) { injectInObject(context, defaultCallback, dest, namespaces = null) {
let schemaApi = Management.generateAPIs(context, Management.schemaApis, namespaces); let apis = {
extensionTypes: {},
// Add in any extra API namespaces which do not have implementations };
// outside of their schema file. Management.generateAPIs(context, Management.schemaApis, apis, namespaces);
schemaApi.extensionTypes = {}; Management.generateAPIs(context, context.extension.apis, apis, namespaces);
let schemaWrapper = { let schemaWrapper = {
get principal() { get principal() {
@ -645,11 +640,11 @@ GlobalManager = {
}, },
callFunction(path, name, args) { callFunction(path, name, args) {
return findPathInObject(schemaApi, path)[name](...args); return findPathInObject(apis, path)[name](...args);
}, },
callFunctionNoReturn(path, name, args) { callFunctionNoReturn(path, name, args) {
findPathInObject(schemaApi, path)[name](...args); findPathInObject(apis, path)[name](...args);
}, },
callAsyncFunction(path, name, args, callback) { callAsyncFunction(path, name, args, callback) {
@ -662,7 +657,7 @@ GlobalManager = {
let promise; let promise;
try { try {
promise = findPathInObject(schemaApi, path)[name](...args); promise = findPathInObject(apis, path)[name](...args);
} catch (e) { } catch (e) {
promise = Promise.reject(e); promise = Promise.reject(e);
} }
@ -674,31 +669,28 @@ GlobalManager = {
if (namespaces && !namespaces.includes(namespace)) { if (namespaces && !namespaces.includes(namespace)) {
return false; return false;
} }
return findPathInObject(schemaApi, [namespace]) != null; return findPathInObject(apis, [namespace]) != null;
}, },
getProperty(path, name) { getProperty(path, name) {
return findPathInObject(schemaApi, path)[name]; return findPathInObject(apis, path)[name];
}, },
setProperty(path, name, value) { setProperty(path, name, value) {
findPathInObject(schemaApi, path)[name] = value; findPathInObject(apis, path)[name] = value;
}, },
addListener(path, name, listener, args) { addListener(path, name, listener, args) {
findPathInObject(schemaApi, path)[name].addListener.call(null, listener, ...args); findPathInObject(apis, path)[name].addListener.call(null, listener, ...args);
}, },
removeListener(path, name, listener) { removeListener(path, name, listener) {
findPathInObject(schemaApi, path)[name].removeListener.call(null, listener); findPathInObject(apis, path)[name].removeListener.call(null, listener);
}, },
hasListener(path, name, listener) { hasListener(path, name, listener) {
return findPathInObject(schemaApi, path)[name].hasListener.call(null, listener); return findPathInObject(apis, path)[name].hasListener.call(null, listener);
}, },
}; };
Schemas.inject(dest, schemaWrapper); Schemas.inject(dest, schemaWrapper);
let experimentalApis = Management.generateAPIs(context, context.extension.apis, namespaces);
injectAPI(experimentalApis, dest);
}, },
observe(document, topic, data) { observe(document, topic, data) {

Просмотреть файл

@ -89,7 +89,16 @@ add_task(function* test_experiments_api() {
}, },
background() { background() {
browser.meh.hello("Here I am"); // The test code below checks that hello() is called at the right
// time with the string "Here I am". Verify that the api schema is
// being correctly interpreted by calling hello() with bad arguments
// and only calling hello() with the magic string if the call with
// bad arguments throws.
try {
browser.meh.hello("I should not see this", "since two arguments are bad");
} catch (err) {
browser.meh.hello("Here I am");
}
}, },
}); });
@ -152,7 +161,6 @@ add_task(function* test_experiments_api() {
let hello = yield promise; let hello = yield promise;
equal(hello, "Here I am", "Should get hello from add-on"); equal(hello, "Here I am", "Should get hello from add-on");
// Cleanup. // Cleanup.
apiAddon.uninstall(); apiAddon.uninstall();

Просмотреть файл

@ -50,3 +50,20 @@ add_task(function* test_background() {
yield extension.awaitFinish(); yield extension.awaitFinish();
yield extension.unload(); yield extension.unload();
}); });
add_task(function* test_extensionTypes() {
let extensionData = {
background: function() {
browser.test.assertEq(typeof browser.extensionTypes, "object", "browser.extensionTypes exists");
browser.test.assertEq(typeof browser.extensionTypes.RunAt, "object", "browser.extensionTypes.RunAt exists");
browser.test.notifyPass("extentionTypes test passed");
},
};
let extension = ExtensionTestUtils.loadExtension(extensionData);
yield extension.startup();
yield extension.awaitFinish();
yield extension.unload();
});