Prevent proxying CanvasGradient in Node platform (#9861)

This commit is contained in:
Jukka Kurkela
2021-11-16 03:09:43 +02:00
committed by GitHub
parent 6c63f7a01b
commit c8b885dd3e
2 changed files with 26 additions and 2 deletions

View File

@@ -178,7 +178,8 @@ export function _descriptors(proxy, defaults = {scriptable: true, indexable: tru
}
const readKey = (prefix, name) => prefix ? prefix + _capitalize(name) : name;
const needsSubResolver = (prop, value) => isObject(value) && prop !== 'adapters';
const needsSubResolver = (prop, value) => isObject(value) && prop !== 'adapters' &&
(Object.getPrototypeOf(value) === null || value.constructor === Object);
function _cached(target, prop, resolve) {
if (Object.prototype.hasOwnProperty.call(target, prop)) {
@@ -218,7 +219,7 @@ function _resolveScriptable(prop, value, target, receiver) {
_stack.add(prop);
value = value(_context, _subProxy || receiver);
_stack.delete(prop);
if (isObject(value)) {
if (needsSubResolver(prop, value)) {
// When scriptable option returns an object, create a resolver on that.
value = createSubResolver(_proxy._scopes, _proxy, prop, value);
}

View File

@@ -752,6 +752,29 @@ describe('Chart.helpers.config', function() {
expect(fn()).toEqual('ok');
});
it('should not create proxy for objects with custom constructor', function() {
class MyClass {
constructor() {
this.string = 'test string';
}
method(arg) {
return arg === undefined ? 'ok' : 'fail';
}
}
const defaults = {
test: new MyClass()
};
const resolver = _createResolver([{}, defaults]);
const opts = _attachContext(resolver, {index: 1});
const fn = opts.test.method;
expect(typeof fn).toBe('function');
expect(fn()).toEqual('ok');
expect(opts.test.string).toEqual('test string');
expect(opts.test.constructor).toEqual(MyClass);
});
it('should properly set value to object in array of objects', function() {
const defaults = {};
const options = {