Imported Upstream version 1.0.0
[platform/upstream/js.git] / js / src / jsapi-tests / testBug604087.cpp
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2  * vim: set ts=8 sw=4 et tw=99:
3  *
4  * Tests JS_TransplantObject
5  */
6
7 #include "tests.h"
8 #include "jswrapper.h"
9
10 struct OuterWrapper : JSWrapper
11 {
12     OuterWrapper() : JSWrapper(0) {}
13
14     virtual bool isOuterWindow() {
15         return true;
16     }
17
18     static OuterWrapper singleton;
19 };
20
21 OuterWrapper
22 OuterWrapper::singleton;
23
24 static JSObject *
25 wrap(JSContext *cx, JSObject *toWrap, JSObject *target)
26 {
27     JSAutoEnterCompartment ac;
28     if (!ac.enter(cx, target))
29         return NULL;
30
31     JSObject *wrapper = toWrap;
32     if (!JS_WrapObject(cx, &wrapper))
33         return NULL;
34     return wrapper;
35 }
36
37 static JSObject *
38 PreWrap(JSContext *cx, JSObject *scope, JSObject *obj, uintN flags)
39 {
40     JS_GC(cx);
41     return obj;
42 }
43
44 static JSObject *
45 Wrap(JSContext *cx, JSObject *obj, JSObject *proto, JSObject *parent, uintN flags)
46 {
47     return JSWrapper::New(cx, obj, proto, parent, &JSCrossCompartmentWrapper::singleton);
48 }
49
50 BEGIN_TEST(testBug604087)
51 {
52     JSObject *outerObj = JSWrapper::New(cx, global, global->getProto(), global,
53                                         &OuterWrapper::singleton);
54     JSObject *compartment2 = JS_NewCompartmentAndGlobalObject(cx, getGlobalClass(), NULL);
55     JSObject *compartment3 = JS_NewCompartmentAndGlobalObject(cx, getGlobalClass(), NULL);
56     JSObject *compartment4 = JS_NewCompartmentAndGlobalObject(cx, getGlobalClass(), NULL);
57
58     JSObject *c2wrapper = wrap(cx, outerObj, compartment2);
59     CHECK(c2wrapper);
60     c2wrapper->setProxyExtra(js::Int32Value(2));
61
62     JSObject *c3wrapper = wrap(cx, outerObj, compartment3);
63     CHECK(c3wrapper);
64     c3wrapper->setProxyExtra(js::Int32Value(3));
65
66     JSObject *c4wrapper = wrap(cx, outerObj, compartment4);
67     CHECK(c4wrapper);
68     c4wrapper->setProxyExtra(js::Int32Value(4));
69     compartment4 = c4wrapper = NULL;
70
71     JSObject *next;
72     {
73         JSAutoEnterCompartment ac;
74         CHECK(ac.enter(cx, compartment2));
75         next = JSWrapper::New(cx, compartment2, compartment2->getProto(), compartment2,
76                               &OuterWrapper::singleton);
77         CHECK(next);
78     }
79
80     JS_SetWrapObjectCallbacks(JS_GetRuntime(cx), Wrap, PreWrap);
81     CHECK(JS_TransplantObject(cx, outerObj, next));
82     return true;
83 }
84 END_TEST(testBug604087)