2014-08-06 15:50:40 +00:00
|
|
|
// 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.
|
|
|
|
|
|
|
|
|
|
|
|
function TestBasics() {
|
|
|
|
var log = [];
|
|
|
|
|
2015-11-13 14:13:50 +00:00
|
|
|
var proxy = new Proxy({}, {
|
2015-12-14 16:37:02 +00:00
|
|
|
get: function(target, key) {
|
|
|
|
log.push("get " + String(key));
|
|
|
|
if (key === 'x') return 1;
|
|
|
|
},
|
|
|
|
has: function(target, key) {
|
|
|
|
log.push("has " + String(key));
|
|
|
|
if (key === 'x') return true;
|
|
|
|
return false;
|
2014-08-06 15:50:40 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
var x = 'local';
|
|
|
|
|
|
|
|
with (proxy) {
|
|
|
|
assertEquals(1, x);
|
|
|
|
}
|
|
|
|
|
2015-12-14 16:37:02 +00:00
|
|
|
assertEquals(['has assertEquals', 'has x', 'get Symbol(Symbol.unscopables)',
|
|
|
|
'get x'], log);
|
2014-08-06 15:50:40 +00:00
|
|
|
}
|
|
|
|
TestBasics();
|
|
|
|
|
|
|
|
|
|
|
|
function TestInconsistent() {
|
|
|
|
var log = [];
|
|
|
|
|
2015-11-13 14:13:50 +00:00
|
|
|
var proxy = new Proxy({}, {
|
2015-12-14 16:37:02 +00:00
|
|
|
get: function(target, key) {
|
|
|
|
log.push("get " + String(key));
|
2014-08-06 15:50:40 +00:00
|
|
|
return undefined;
|
2015-12-14 16:37:02 +00:00
|
|
|
},
|
|
|
|
has: function(target, key) {
|
|
|
|
log.push("has " + String(key));
|
|
|
|
if (key === 'x') return true;
|
|
|
|
return false;
|
2014-08-06 15:50:40 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
var x = 'local';
|
|
|
|
|
|
|
|
with (proxy) {
|
|
|
|
assertEquals(void 0, x);
|
|
|
|
}
|
|
|
|
|
2015-12-14 16:37:02 +00:00
|
|
|
assertEquals(['has assertEquals', 'has x', 'get Symbol(Symbol.unscopables)',
|
|
|
|
'get x'], log);
|
2014-08-06 15:50:40 +00:00
|
|
|
}
|
|
|
|
TestInconsistent();
|
|
|
|
|
|
|
|
|
|
|
|
function TestUseProxyAsUnscopables() {
|
|
|
|
var x = 1;
|
|
|
|
var object = {
|
|
|
|
x: 2
|
|
|
|
};
|
|
|
|
var calls = 0;
|
2015-11-13 14:13:50 +00:00
|
|
|
var proxy = new Proxy({}, {
|
2015-12-14 16:37:02 +00:00
|
|
|
has: function() {
|
2014-12-16 20:07:27 +00:00
|
|
|
assertUnreachable();
|
2014-08-06 15:50:40 +00:00
|
|
|
},
|
2015-12-14 16:37:02 +00:00
|
|
|
get: function(target, key) {
|
2014-12-16 20:07:27 +00:00
|
|
|
assertEquals('x', key);
|
2015-12-14 16:37:02 +00:00
|
|
|
calls++;
|
|
|
|
return calls === 2 ? true : undefined;
|
2014-08-06 15:50:40 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
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;
|
2015-11-13 14:13:50 +00:00
|
|
|
var proxy = new Proxy({}, {
|
2015-12-14 16:37:02 +00:00
|
|
|
has: function() {
|
2014-08-06 15:50:40 +00:00
|
|
|
assertUnreachable();
|
|
|
|
},
|
2015-12-14 16:37:02 +00:00
|
|
|
get: function(target, key) {
|
2014-12-16 20:07:27 +00:00
|
|
|
if (calls++ === 0) {
|
|
|
|
throw new CustomError();
|
|
|
|
}
|
2014-08-06 15:50:40 +00:00
|
|
|
assertUnreachable();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
object[Symbol.unscopables] = proxy;
|
|
|
|
|
|
|
|
assertThrows(function() {
|
|
|
|
with (object) {
|
|
|
|
x;
|
|
|
|
}
|
|
|
|
}, CustomError);
|
|
|
|
}
|
|
|
|
TestThrowInHasUnscopables();
|
|
|
|
|
|
|
|
|
|
|
|
var global = this;
|
|
|
|
function TestGlobalShouldIgnoreUnscopables() {
|
|
|
|
global.x = 1;
|
2015-11-13 14:13:50 +00:00
|
|
|
var proxy = new Proxy({}, {
|
2015-12-14 16:37:02 +00:00
|
|
|
get: function() {
|
|
|
|
assertUnreachable();
|
|
|
|
},
|
|
|
|
has: function() {
|
2014-08-06 15:50:40 +00:00
|
|
|
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();
|