mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-17 22:32:51 +00:00
Bug 777528 - Expose compartment names to the JS engine (r=luke)
This commit is contained in:
parent
2795774129
commit
9803075c7f
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user