| Index: test/cctest/test-global-object.cc
|
| diff --git a/test/cctest/test-global-object.cc b/test/cctest/test-global-object.cc
|
| index 9cc755e4e1dd2b06f23d02a4709bf2f9c65408c3..c696086061b8d2331db733922cc90d67a5852202 100644
|
| --- a/test/cctest/test-global-object.cc
|
| +++ b/test/cctest/test-global-object.cc
|
| @@ -25,10 +25,15 @@
|
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
| +#include "src/api.h"
|
| #include "src/v8.h"
|
| -
|
| #include "test/cctest/cctest.h"
|
|
|
| +using ::v8::Array;
|
| +using ::v8::Context;
|
| +using ::v8::Local;
|
| +using ::v8::Value;
|
| +
|
| // This test fails if properties on the prototype of the global object appear
|
| // as declared globals.
|
| TEST(StrictUndeclaredGlobalVariable) {
|
| @@ -47,3 +52,48 @@ TEST(StrictUndeclaredGlobalVariable) {
|
| v8::String::Utf8Value exception(try_catch.Exception());
|
| CHECK_EQ(0, strcmp("ReferenceError: x is not defined", *exception));
|
| }
|
| +
|
| +
|
| +TEST(KeysGlobalObject_Regress2764) {
|
| + LocalContext env1;
|
| + v8::HandleScope scope(env1->GetIsolate());
|
| +
|
| + // Create second environment.
|
| + v8::Handle<Context> env2 = Context::New(env1->GetIsolate());
|
| +
|
| + Local<Value> token = v8_str("foo");
|
| +
|
| + // Set same security token for env1 and env2.
|
| + env1->SetSecurityToken(token);
|
| + env2->SetSecurityToken(token);
|
| +
|
| + // Create a reference to env2 global from env1 global.
|
| + env1->Global()->Set(v8_str("global2"), env2->Global());
|
| + // Set some global variables in global2
|
| + env2->Global()->Set(v8_str("a"), v8_str("a"));
|
| + env2->Global()->Set(v8_str("42"), v8_str("42"));
|
| +
|
| + // List all entries from global2.
|
| + Local<Array> result;
|
| + result = Local<Array>::Cast(CompileRun("Object.keys(global2)"));
|
| + CHECK_EQ(2u, result->Length());
|
| + CHECK(v8_str("42")->Equals(result->Get(0)));
|
| + CHECK(v8_str("a")->Equals(result->Get(1)));
|
| +
|
| + result =
|
| + Local<Array>::Cast(CompileRun("Object.getOwnPropertyNames(global2)"));
|
| + CHECK_LT(2u, result->Length());
|
| + // Check that all elements are in the property names
|
| + ExpectTrue("-1 < Object.getOwnPropertyNames(global2).indexOf('42')");
|
| + ExpectTrue("-1 < Object.getOwnPropertyNames(global2).indexOf('a')");
|
| +
|
| + // Hold on to global from env2 and detach global from env2.
|
| + env2->DetachGlobal();
|
| +
|
| + // List again all entries from the detached global2.
|
| + result = Local<Array>::Cast(CompileRun("Object.keys(global2)"));
|
| + CHECK_EQ(0u, result->Length());
|
| + result =
|
| + Local<Array>::Cast(CompileRun("Object.getOwnPropertyNames(global2)"));
|
| + CHECK_EQ(0u, result->Length());
|
| +}
|
|
|