1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 * vim: set ts=8 sw=4 et tw=99:
4 * Tests JS_TransplantObject
10 struct OuterWrapper : JSWrapper
12 OuterWrapper() : JSWrapper(0) {}
14 virtual bool isOuterWindow() {
18 static OuterWrapper singleton;
22 OuterWrapper::singleton;
25 wrap(JSContext *cx, JSObject *toWrap, JSObject *target)
27 JSAutoEnterCompartment ac;
28 if (!ac.enter(cx, target))
31 JSObject *wrapper = toWrap;
32 if (!JS_WrapObject(cx, &wrapper))
38 PreWrap(JSContext *cx, JSObject *scope, JSObject *obj, uintN flags)
45 Wrap(JSContext *cx, JSObject *obj, JSObject *proto, JSObject *parent, uintN flags)
47 return JSWrapper::New(cx, obj, proto, parent, &JSCrossCompartmentWrapper::singleton);
50 BEGIN_TEST(testBug604087)
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);
58 JSObject *c2wrapper = wrap(cx, outerObj, compartment2);
60 c2wrapper->setProxyExtra(js::Int32Value(2));
62 JSObject *c3wrapper = wrap(cx, outerObj, compartment3);
64 c3wrapper->setProxyExtra(js::Int32Value(3));
66 JSObject *c4wrapper = wrap(cx, outerObj, compartment4);
68 c4wrapper->setProxyExtra(js::Int32Value(4));
69 compartment4 = c4wrapper = NULL;
73 JSAutoEnterCompartment ac;
74 CHECK(ac.enter(cx, compartment2));
75 next = JSWrapper::New(cx, compartment2, compartment2->getProto(), compartment2,
76 &OuterWrapper::singleton);
80 JS_SetWrapObjectCallbacks(JS_GetRuntime(cx), Wrap, PreWrap);
81 CHECK(JS_TransplantObject(cx, outerObj, next));
84 END_TEST(testBug604087)