Bug 777528 - Expose compartment names to the JS engine (r=luke)

This commit is contained in:
Bill McCloskey 2012-07-25 18:25:47 -07:00
parent 2795774129
commit 9803075c7f
4 changed files with 35 additions and 5 deletions

View File

@ -731,6 +731,7 @@ JSRuntime::JSRuntime()
interpreterFrames(NULL),
cxCallback(NULL),
destroyCompartmentCallback(NULL),
compartmentNameCallback(NULL),
activityCallback(NULL),
activityCallbackArg(NULL),
#ifdef JS_THREADSAFE
@ -1398,6 +1399,12 @@ JS_SetDestroyCompartmentCallback(JSRuntime *rt, JSDestroyCompartmentCallback cal
rt->destroyCompartmentCallback = callback;
}
JS_PUBLIC_API(void)
JS_SetCompartmentNameCallback(JSRuntime *rt, JSCompartmentNameCallback callback)
{
rt->compartmentNameCallback = callback;
}
JS_PUBLIC_API(JSWrapObjectCallback)
JS_SetWrapObjectCallbacks(JSRuntime *rt,
JSWrapObjectCallback callback,

View File

@ -2007,6 +2007,10 @@ typedef JSObject *
typedef void
(* JSDestroyCompartmentCallback)(JSFreeOp *fop, JSCompartment *compartment);
typedef void
(* JSCompartmentNameCallback)(JSRuntime *rt, JSCompartment *compartment,
char *buf, size_t bufsize);
/*
* Read structured data from the reader r. This hook is used to read a value
* previously serialized by a call to the WriteStructuredCloneOp hook.
@ -3119,6 +3123,9 @@ JS_GetImplementationVersion(void);
extern JS_PUBLIC_API(void)
JS_SetDestroyCompartmentCallback(JSRuntime *rt, JSDestroyCompartmentCallback callback);
extern JS_PUBLIC_API(void)
JS_SetCompartmentNameCallback(JSRuntime *rt, JSCompartmentNameCallback callback);
extern JS_PUBLIC_API(JSWrapObjectCallback)
JS_SetWrapObjectCallbacks(JSRuntime *rt,
JSWrapObjectCallback callback,

View File

@ -447,6 +447,9 @@ struct JSRuntime : js::RuntimeFriendFields
/* Compartment destroy callback. */
JSDestroyCompartmentCallback destroyCompartmentCallback;
/* Call this to get the name of a compartment. */
JSCompartmentNameCallback compartmentNameCallback;
js::ActivityCallback activityCallback;
void *activityCallbackArg;

View File

@ -1112,7 +1112,7 @@ XPCJSRuntime::~XPCJSRuntime()
}
static void
GetCompartmentName(JSCompartment *c, nsCString &name)
GetCompartmentName(JSCompartment *c, nsCString &name, bool replaceSlashes)
{
if (js::IsAtomsCompartment(c)) {
name.AssignLiteral("atoms");
@ -1131,11 +1131,12 @@ GetCompartmentName(JSCompartment *c, nsCString &name)
name.Append(location);
}
}
// A hack: replace forward slashes with '\\' so they aren't
// treated as path separators. Users of the reporters
// (such as about:memory) have to undo this change.
name.ReplaceChar('/', '\\');
if (replaceSlashes)
name.ReplaceChar('/', '\\');
} else {
name.AssignLiteral("null-principal");
}
@ -1611,7 +1612,7 @@ class JSCompartmentsMultiReporter MOZ_FINAL : public nsIMemoryMultiReporter
// silently ignore OOM errors
Paths *paths = static_cast<Paths *>(data);
nsCString path;
GetCompartmentName(c, path);
GetCompartmentName(c, path, true);
path.Insert(js::IsSystemCompartment(c)
? NS_LITERAL_CSTRING("compartments/system/")
: NS_LITERAL_CSTRING("compartments/user/"),
@ -1724,7 +1725,7 @@ class XPCJSRuntimeStats : public JS::RuntimeStats
JS::CompartmentStats *cstats) MOZ_OVERRIDE {
nsCAutoString cJSPathPrefix, cDOMPathPrefix;
nsCString cName;
GetCompartmentName(c, cName);
GetCompartmentName(c, cName, true);
// Get the compartment's global.
nsXPConnect *xpc = nsXPConnect::GetXPConnect();
@ -1940,6 +1941,17 @@ AccumulateTelemetryCallback(int id, uint32_t sample)
}
}
static void
CompartmentNameCallback(JSRuntime *rt, JSCompartment *comp,
char *buf, size_t bufsize)
{
nsCString name;
GetCompartmentName(comp, name, false);
if (name.Length() >= bufsize)
name.Truncate(bufsize - 1);
memcpy(buf, name.get(), name.Length() + 1);
}
bool XPCJSRuntime::gNewDOMBindingsEnabled;
bool XPCJSRuntime::gExperimentalBindingsEnabled;
@ -2027,6 +2039,7 @@ XPCJSRuntime::XPCJSRuntime(nsXPConnect* aXPConnect)
#endif
JS_SetContextCallback(mJSRuntime, ContextCallback);
JS_SetDestroyCompartmentCallback(mJSRuntime, CompartmentDestroyedCallback);
JS_SetCompartmentNameCallback(mJSRuntime, CompartmentNameCallback);
JS_SetGCCallback(mJSRuntime, GCCallback);
JS_SetFinalizeCallback(mJSRuntime, FinalizeCallback);
JS_SetExtraGCRootsTracer(mJSRuntime, TraceBlackJS, this);