bug 580128 - Fix more compartment warnings. Work of multiple people. r=gal/peterv/jst

This commit is contained in:
Blake Kaplan 2010-10-10 15:37:19 -07:00
Родитель 969bd22678
Коммит 644aa16e54
5 изменённых файлов: 24 добавлений и 3 удалений

Просмотреть файл

@ -151,7 +151,7 @@ nsXBLProtoImplMethod::InstallMember(nsIScriptContext* aContext,
JSAutoRequest ar(cx);
JSAutoEnterCompartment ac;
if (!ac.enter(cx, mJSMethodObject)) {
if (!ac.enter(cx, globalObject)) {
return NS_ERROR_UNEXPECTED;
}
@ -312,6 +312,10 @@ nsXBLProtoImplAnonymousMethod::Execute(nsIContent* aBoundElement)
JSObject* thisObject = JSVAL_TO_OBJECT(v);
JSAutoRequest ar(cx);
JSAutoEnterCompartment ac;
if (!ac.enter(cx, thisObject))
return NS_ERROR_UNEXPECTED;
// Clone the function object, using thisObject as the parent so "this" is in
// the scope chain of the resulting function (for backwards compat to the

Просмотреть файл

@ -176,6 +176,11 @@ nsXBLProtoImplProperty::InstallMember(nsIScriptContext* aContext,
if ((mJSGetterObject || mJSSetterObject) && targetClassObject) {
JSObject * getter = nsnull;
JSAutoRequest ar(cx);
JSAutoEnterCompartment ac;
if (!ac.enter(cx, globalObject))
return NS_ERROR_UNEXPECTED;
if (mJSGetterObject)
if (!(getter = ::JS_CloneFunctionObject(cx, mJSGetterObject, globalObject)))
return NS_ERROR_OUT_OF_MEMORY;

Просмотреть файл

@ -1187,8 +1187,10 @@ bool
JSAutoEnterCompartment::enter(JSContext *cx, JSObject *target)
{
JS_ASSERT(!call);
if (cx->compartment == target->getCompartment())
if (cx->compartment == target->getCompartment()) {
call = reinterpret_cast<JSCrossCompartmentCall*>(1);
return true;
}
call = JS_EnterCrossCompartmentCall(cx, target);
return call != NULL;
}

Просмотреть файл

@ -979,12 +979,14 @@ class JS_PUBLIC_API(JSAutoEnterCompartment)
bool entered() const { return call != NULL; }
~JSAutoEnterCompartment() {
if (call)
if (call && call != reinterpret_cast<JSCrossCompartmentCall*>(1))
JS_LeaveCrossCompartmentCall(call);
}
void swap(JSAutoEnterCompartment &other) {
JSCrossCompartmentCall *tmp = call;
if (tmp == reinterpret_cast<JSCrossCompartmentCall*>(1))
tmp = NULL;
call = other.call;
other.call = tmp;
}

Просмотреть файл

@ -217,6 +217,14 @@ mozJSSubScriptLoader::LoadSubScript (const PRUnichar * aURL
fprintf (stderr, "Final global: %p\n", target_obj);
#endif
}
else if (target_obj->isWrapper())
{
target_obj = target_obj->unwrap();
}
JSAutoEnterCompartment ac;
if (!ac.enter(cx, target_obj))
return NS_ERROR_UNEXPECTED;
/* load up the url. From here on, failures are reflected as ``custom''
* js exceptions */