Bug 788914 - Generate vanilla cross-compartment wrappers when UniversalXPConnect is enabled. r=mrbkap
--- a/js/xpconnect/src/xpcprivate.h
+++ b/js/xpconnect/src/xpcprivate.h
@@ -4375,26 +4375,31 @@ GetCompartmentPrivate(JSObject *object)
{
MOZ_ASSERT(object);
JSCompartment *compartment = js::GetObjectCompartment(object);
MOZ_ASSERT(compartment);
return GetCompartmentPrivate(compartment);
}
+inline bool IsUniversalXPConnectEnabled(JSCompartment *compartment)
+{
+ CompartmentPrivate *priv =
+ static_cast<CompartmentPrivate*>(JS_GetCompartmentPrivate(compartment));
+ if (!priv)
+ return false;
+ return priv->universalXPConnectEnabled;
+}
+
inline bool IsUniversalXPConnectEnabled(JSContext *cx)
{
JSCompartment *compartment = js::GetContextCompartment(cx);
if (!compartment)
return false;
- CompartmentPrivate *priv =
- static_cast<CompartmentPrivate*>(JS_GetCompartmentPrivate(compartment));
- if (!priv)
- return false;
- return priv->universalXPConnectEnabled;
+ return IsUniversalXPConnectEnabled(compartment);
}
inline void EnableUniversalXPConnect(JSContext *cx)
{
JSCompartment *compartment = js::GetContextCompartment(cx);
if (!compartment)
return;
CompartmentPrivate *priv =
--- a/js/xpconnect/wrappers/WrapperFactory.cpp
+++ b/js/xpconnect/wrappers/WrapperFactory.cpp
@@ -344,16 +344,18 @@ WrapperFactory::Rewrap(JSContext *cx, JS
typedef XrayWrapper<CrossCompartmentWrapper> Xray;
usingXray = true;
wrapper = &Xray::singleton;
} else {
wrapper = &CrossCompartmentWrapper::singleton;
}
}
}
+ } else if (xpc::IsUniversalXPConnectEnabled(target)) {
+ wrapper = &CrossCompartmentWrapper::singleton;
} else if (AccessCheck::isChrome(origin)) {
JSFunction *fun = JS_GetObjectFunction(obj);
if (fun) {
if (JS_IsBuiltinEvalFunction(fun) || JS_IsBuiltinFunctionConstructor(fun)) {
JS_ReportError(cx, "Not allowed to access chrome eval or Function from content");
return nullptr;
}
}