Merge pull request #4678 from atom/writable-member-functions

Make remote member functions writable/configurable
This commit is contained in:
Cheng Zhao 2016-03-05 11:56:56 +09:00
commit 2bd167663d
4 changed files with 16 additions and 3 deletions

View file

@ -16,7 +16,7 @@ const FUNCTION_PROPERTIES = [
let rendererFunctions = {};
// Return the description of object's members:
let getObjectMemebers = function(object) {
let getObjectMembers = function(object) {
let names = Object.getOwnPropertyNames(object);
// For Function, we should not override following properties even though they
// are "own" properties.
@ -46,7 +46,7 @@ let getObjectPrototype = function(object) {
if (proto === null || proto === Object.prototype)
return null;
return {
members: getObjectMemebers(proto),
members: getObjectMembers(proto),
proto: getObjectPrototype(proto),
};
};
@ -101,7 +101,7 @@ var valueToMeta = function(sender, value, optimizeSimpleObject) {
// passed to renderer we would assume the renderer keeps a reference of
// it.
meta.id = objectsRegistry.add(sender, value);
meta.members = getObjectMemebers(value);
meta.members = getObjectMembers(value);
meta.proto = getObjectPrototype(value);
} else if (meta.type === 'buffer') {
meta.value = Array.prototype.slice.call(value, 0);

View file

@ -110,6 +110,8 @@ let setObjectMembers = function(object, metaId, members) {
return metaToValue(ret);
}
};
descriptor.writable = true;
descriptor.configurable = true;
descriptor.value = remoteMemberFunction;
} else if (member.type === 'get') {
descriptor.get = function() {

View file

@ -63,6 +63,16 @@ describe('ipc module', function() {
var obj = new call.constructor;
assert.equal(obj.test, 'test');
});
it('can reassign and delete its member functions', function() {
var remoteFunctions = remote.require(path.join(fixtures, 'module', 'function.js'));
assert.equal(remoteFunctions.aFunction(), 1127);
remoteFunctions.aFunction = function () { return 1234; };
assert.equal(remoteFunctions.aFunction(), 1234);
assert.equal(delete remoteFunctions.aFunction, true);
});
});
describe('remote value in browser', function() {

1
spec/fixtures/module/function.js vendored Normal file
View file

@ -0,0 +1 @@
exports.aFunction = function() { return 1127; };