зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
503f4fa827
Коммит
30f2e473c0
|
@ -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();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче