153 lines
2.7 KiB
JavaScript
153 lines
2.7 KiB
JavaScript
|
// Copyright 2014 the V8 project authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style license that can be
|
||
|
// found in the LICENSE file.
|
||
|
|
||
|
// Flags: --harmony-proxies
|
||
|
|
||
|
|
||
|
// TODO(arv): Once proxies can intercept symbols, add more tests.
|
||
|
|
||
|
|
||
|
function TestBasics() {
|
||
|
var log = [];
|
||
|
|
||
|
var proxy = Proxy.create({
|
||
|
getPropertyDescriptor: function(key) {
|
||
|
log.push(key);
|
||
|
if (key === 'x') {
|
||
|
return {
|
||
|
value: 1,
|
||
|
configurable: true
|
||
|
};
|
||
|
}
|
||
|
return undefined;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
var x = 'local';
|
||
|
|
||
|
with (proxy) {
|
||
|
assertEquals(1, x);
|
||
|
}
|
||
|
|
||
|
// One 'x' for HasBinding and one for GetBindingValue
|
||
|
assertEquals(['assertEquals', 'x', 'x'], log);
|
||
|
}
|
||
|
TestBasics();
|
||
|
|
||
|
|
||
|
function TestInconsistent() {
|
||
|
var log = [];
|
||
|
var calls = 0;
|
||
|
|
||
|
var proxy = Proxy.create({
|
||
|
getPropertyDescriptor: function(key) {
|
||
|
log.push(key);
|
||
|
if (key === 'x' && calls < 1) {
|
||
|
calls++;
|
||
|
return {
|
||
|
value: 1,
|
||
|
configurable: true
|
||
|
};
|
||
|
}
|
||
|
return undefined;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
var x = 'local';
|
||
|
|
||
|
with (proxy) {
|
||
|
assertEquals(void 0, x);
|
||
|
}
|
||
|
|
||
|
// One 'x' for HasBinding and one for GetBindingValue
|
||
|
assertEquals(['assertEquals', 'x', 'x'], log);
|
||
|
}
|
||
|
TestInconsistent();
|
||
|
|
||
|
|
||
|
function TestUseProxyAsUnscopables() {
|
||
|
var x = 1;
|
||
|
var object = {
|
||
|
x: 2
|
||
|
};
|
||
|
var calls = 0;
|
||
|
var proxy = Proxy.create({
|
||
|
has: function(key) {
|
||
|
calls++;
|
||
|
assertEquals('x', key);
|
||
|
return calls === 2;
|
||
|
},
|
||
|
getPropertyDescriptor: function(key) {
|
||
|
assertUnreachable();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
object[Symbol.unscopables] = proxy;
|
||
|
|
||
|
with (object) {
|
||
|
assertEquals(2, x);
|
||
|
assertEquals(1, x);
|
||
|
}
|
||
|
|
||
|
// HasBinding, HasBinding
|
||
|
assertEquals(2, calls);
|
||
|
}
|
||
|
TestUseProxyAsUnscopables();
|
||
|
|
||
|
|
||
|
function TestThrowInHasUnscopables() {
|
||
|
var x = 1;
|
||
|
var object = {
|
||
|
x: 2
|
||
|
};
|
||
|
|
||
|
function CustomError() {}
|
||
|
|
||
|
var calls = 0;
|
||
|
var proxy = Proxy.create({
|
||
|
has: function(key) {
|
||
|
if (calls++ === 0) {
|
||
|
throw new CustomError();
|
||
|
}
|
||
|
assertUnreachable();
|
||
|
},
|
||
|
getPropertyDescriptor: function(key) {
|
||
|
assertUnreachable();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
object[Symbol.unscopables] = proxy;
|
||
|
|
||
|
assertThrows(function() {
|
||
|
with (object) {
|
||
|
x;
|
||
|
}
|
||
|
}, CustomError);
|
||
|
}
|
||
|
TestThrowInHasUnscopables();
|
||
|
|
||
|
|
||
|
var global = this;
|
||
|
function TestGlobalShouldIgnoreUnscopables() {
|
||
|
global.x = 1;
|
||
|
var proxy = Proxy.create({
|
||
|
getPropertyDescriptor: function() {
|
||
|
assertUnreachable();
|
||
|
}
|
||
|
});
|
||
|
global[Symbol.unscopables] = proxy;
|
||
|
|
||
|
assertEquals(1, global.x);
|
||
|
assertEquals(1, x);
|
||
|
|
||
|
global.x = 2;
|
||
|
assertEquals(2, global.x);
|
||
|
assertEquals(2, x);
|
||
|
|
||
|
x = 3;
|
||
|
assertEquals(3, global.x);
|
||
|
assertEquals(3, x);
|
||
|
}
|
||
|
TestGlobalShouldIgnoreUnscopables();
|