mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 754771 - Add identifying information to all system compartments. r=bz
This commit is contained in:
parent
63a5c4284b
commit
35431284b1
@ -44,7 +44,7 @@ class nsXBLDocGlobalObject : public nsIScriptGlobalObject,
|
|||||||
public nsIScriptObjectPrincipal
|
public nsIScriptObjectPrincipal
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
nsXBLDocGlobalObject(nsIScriptGlobalObjectOwner *aGlobalObjectOwner);
|
nsXBLDocGlobalObject(nsXBLDocumentInfo *aGlobalObjectOwner);
|
||||||
|
|
||||||
// nsISupports interface
|
// nsISupports interface
|
||||||
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
||||||
@ -82,7 +82,7 @@ protected:
|
|||||||
nsCOMPtr<nsIScriptContext> mScriptContext;
|
nsCOMPtr<nsIScriptContext> mScriptContext;
|
||||||
JSObject *mJSObject;
|
JSObject *mJSObject;
|
||||||
|
|
||||||
nsIScriptGlobalObjectOwner* mGlobalObjectOwner; // weak reference
|
nsXBLDocumentInfo* mGlobalObjectOwner; // weak reference
|
||||||
static JSClass gSharedGlobalClass;
|
static JSClass gSharedGlobalClass;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -181,7 +181,7 @@ JSClass nsXBLDocGlobalObject::gSharedGlobalClass = {
|
|||||||
// nsXBLDocGlobalObject
|
// nsXBLDocGlobalObject
|
||||||
//
|
//
|
||||||
|
|
||||||
nsXBLDocGlobalObject::nsXBLDocGlobalObject(nsIScriptGlobalObjectOwner *aGlobalObjectOwner)
|
nsXBLDocGlobalObject::nsXBLDocGlobalObject(nsXBLDocumentInfo *aGlobalObjectOwner)
|
||||||
: mJSObject(nsnull),
|
: mJSObject(nsnull),
|
||||||
mGlobalObjectOwner(aGlobalObjectOwner) // weak reference
|
mGlobalObjectOwner(aGlobalObjectOwner) // weak reference
|
||||||
{
|
{
|
||||||
@ -281,6 +281,11 @@ nsXBLDocGlobalObject::EnsureScriptEnvironment()
|
|||||||
false, &mJSObject, &compartment);
|
false, &mJSObject, &compartment);
|
||||||
NS_ENSURE_SUCCESS(rv, NS_OK);
|
NS_ENSURE_SUCCESS(rv, NS_OK);
|
||||||
|
|
||||||
|
// Set the location information for the new global, so that tools like
|
||||||
|
// about:memory may use that information
|
||||||
|
nsIURI *ownerURI = mGlobalObjectOwner->DocumentURI();
|
||||||
|
xpc::SetLocationForGlobal(mJSObject, ownerURI);
|
||||||
|
|
||||||
::JS_SetGlobalObject(cx, mJSObject);
|
::JS_SetGlobalObject(cx, mJSObject);
|
||||||
|
|
||||||
// Add an owning reference from JS back to us. This'll be
|
// Add an owning reference from JS back to us. This'll be
|
||||||
|
@ -701,6 +701,11 @@ nsXULPDGlobalObject::EnsureScriptEnvironment()
|
|||||||
mContext = ctxNew;
|
mContext = ctxNew;
|
||||||
mJSObject = global;
|
mJSObject = global;
|
||||||
|
|
||||||
|
// Set the location information for the new global, so that tools like
|
||||||
|
// about:memory may use that information
|
||||||
|
nsIURI *ownerURI = mGlobalObjectOwner->GetURI();
|
||||||
|
xpc::SetLocationForGlobal(mJSObject, ownerURI);
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1822,7 +1822,9 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument,
|
|||||||
// Every script context we are initialized with must create a
|
// Every script context we are initialized with must create a
|
||||||
// new global.
|
// new global.
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> &holder = mInnerWindowHolder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> &holder = mInnerWindowHolder;
|
||||||
rv = mContext->CreateNativeGlobalForInner(sgo, isChrome,
|
rv = mContext->CreateNativeGlobalForInner(sgo,
|
||||||
|
aDocument->GetDocumentURI(),
|
||||||
|
isChrome,
|
||||||
aDocument->NodePrincipal(),
|
aDocument->NodePrincipal(),
|
||||||
&newInnerWindow->mJSObject,
|
&newInnerWindow->mJSObject,
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
|
@ -25,6 +25,7 @@ class nsIObjectOutputStream;
|
|||||||
template<class> class nsScriptObjectHolder;
|
template<class> class nsScriptObjectHolder;
|
||||||
class nsIScriptObjectPrincipal;
|
class nsIScriptObjectPrincipal;
|
||||||
class nsIDOMWindow;
|
class nsIDOMWindow;
|
||||||
|
class nsIURI;
|
||||||
|
|
||||||
typedef void (*nsScriptTerminationFunc)(nsISupports* aRef);
|
typedef void (*nsScriptTerminationFunc)(nsISupports* aRef);
|
||||||
|
|
||||||
@ -44,8 +45,8 @@ NS_DEFINE_STATIC_IID_ACCESSOR(nsIScriptContextPrincipal,
|
|||||||
NS_ISCRIPTCONTEXTPRINCIPAL_IID)
|
NS_ISCRIPTCONTEXTPRINCIPAL_IID)
|
||||||
|
|
||||||
#define NS_ISCRIPTCONTEXT_IID \
|
#define NS_ISCRIPTCONTEXT_IID \
|
||||||
{ 0xf1c8c13e, 0xc23b, 0x434e, \
|
{ 0xec47ccd4, 0x5f6a, 0x40d6, \
|
||||||
{ 0xa4, 0x77, 0xe0, 0x2f, 0xc3, 0x73, 0xf8, 0x71 } }
|
{ 0xbc, 0x2f, 0x5a, 0x1e, 0xd3, 0xe4, 0xb4, 0xff } }
|
||||||
|
|
||||||
/* This MUST match JSVERSION_DEFAULT. This version stuff if we don't
|
/* This MUST match JSVERSION_DEFAULT. This version stuff if we don't
|
||||||
know what language we have is a little silly... */
|
know what language we have is a little silly... */
|
||||||
@ -265,6 +266,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual nsresult CreateNativeGlobalForInner(
|
virtual nsresult CreateNativeGlobalForInner(
|
||||||
nsIScriptGlobalObject *aNewInner,
|
nsIScriptGlobalObject *aNewInner,
|
||||||
|
nsIURI *aURI,
|
||||||
bool aIsChrome,
|
bool aIsChrome,
|
||||||
nsIPrincipal *aPrincipal,
|
nsIPrincipal *aPrincipal,
|
||||||
JSObject** aNativeGlobal,
|
JSObject** aNativeGlobal,
|
||||||
|
@ -2069,6 +2069,7 @@ nsJSContext::GetNativeGlobal()
|
|||||||
nsresult
|
nsresult
|
||||||
nsJSContext::CreateNativeGlobalForInner(
|
nsJSContext::CreateNativeGlobalForInner(
|
||||||
nsIScriptGlobalObject *aNewInner,
|
nsIScriptGlobalObject *aNewInner,
|
||||||
|
nsIURI *aURI,
|
||||||
bool aIsChrome,
|
bool aIsChrome,
|
||||||
nsIPrincipal *aPrincipal,
|
nsIPrincipal *aPrincipal,
|
||||||
JSObject** aNativeGlobal, nsISupports **aHolder)
|
JSObject** aNativeGlobal, nsISupports **aHolder)
|
||||||
@ -2092,6 +2093,12 @@ nsJSContext::CreateNativeGlobalForInner(
|
|||||||
}
|
}
|
||||||
jsholder->GetJSObject(aNativeGlobal);
|
jsholder->GetJSObject(aNativeGlobal);
|
||||||
jsholder.forget(aHolder);
|
jsholder.forget(aHolder);
|
||||||
|
|
||||||
|
// Set the location information for the new global, so that tools like
|
||||||
|
// about:memory may use that information
|
||||||
|
MOZ_ASSERT(aNativeGlobal && *aNativeGlobal);
|
||||||
|
xpc::SetLocationForGlobal(*aNativeGlobal, aURI);
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,6 +109,7 @@ public:
|
|||||||
virtual JSObject* GetNativeGlobal();
|
virtual JSObject* GetNativeGlobal();
|
||||||
virtual nsresult CreateNativeGlobalForInner(
|
virtual nsresult CreateNativeGlobalForInner(
|
||||||
nsIScriptGlobalObject *aGlobal,
|
nsIScriptGlobalObject *aGlobal,
|
||||||
|
nsIURI *aURI,
|
||||||
bool aIsChrome,
|
bool aIsChrome,
|
||||||
nsIPrincipal *aPrincipal,
|
nsIPrincipal *aPrincipal,
|
||||||
JSObject** aNativeGlobal,
|
JSObject** aNativeGlobal,
|
||||||
|
@ -569,6 +569,10 @@ mozJSComponentLoader::LoadModule(FileLocation &aFile)
|
|||||||
// Cache this module for later
|
// Cache this module for later
|
||||||
mModules.Put(spec, entry);
|
mModules.Put(spec, entry);
|
||||||
|
|
||||||
|
// Set the location information for the new global, so that tools like
|
||||||
|
// about:memory may use that information
|
||||||
|
xpc::SetLocationForGlobal(entry->global, spec);
|
||||||
|
|
||||||
// The hash owns the ModuleEntry now, forget about it
|
// The hash owns the ModuleEntry now, forget about it
|
||||||
return entry.forget();
|
return entry.forget();
|
||||||
}
|
}
|
||||||
@ -1126,6 +1130,10 @@ mozJSComponentLoader::ImportInto(const nsACString & aLocation,
|
|||||||
return NS_ERROR_FILE_NOT_FOUND;
|
return NS_ERROR_FILE_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the location information for the new global, so that tools like
|
||||||
|
// about:memory may use that information
|
||||||
|
xpc::SetLocationForGlobal(newEntry->global, aLocation);
|
||||||
|
|
||||||
mod = newEntry;
|
mod = newEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3250,9 +3250,9 @@ xpc_CreateSandboxObject(JSContext * cx, jsval * vp, nsISupports *prinOrSop, JSOb
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
xpc::CompartmentPrivate *compartmentPrivate =
|
// Set the location information for the new global, so that tools like
|
||||||
static_cast<xpc::CompartmentPrivate*>(JS_GetCompartmentPrivate(compartment));
|
// about:memory may use that information
|
||||||
compartmentPrivate->location = sandboxName;
|
xpc::SetLocationForGlobal(sandbox, sandboxName);
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
@ -1175,11 +1175,12 @@ GetCompartmentName(JSCompartment *c, nsCString &name)
|
|||||||
// (e.g. components owned by the system or null principal).
|
// (e.g. components owned by the system or null principal).
|
||||||
xpc::CompartmentPrivate *compartmentPrivate =
|
xpc::CompartmentPrivate *compartmentPrivate =
|
||||||
static_cast<xpc::CompartmentPrivate*>(JS_GetCompartmentPrivate(c));
|
static_cast<xpc::CompartmentPrivate*>(JS_GetCompartmentPrivate(c));
|
||||||
if (compartmentPrivate &&
|
if (compartmentPrivate) {
|
||||||
!compartmentPrivate->location.IsEmpty() &&
|
const nsACString& location = compartmentPrivate->GetLocation();
|
||||||
!compartmentPrivate->location.Equals(name)) {
|
if (!location.IsEmpty() && !location.Equals(name)) {
|
||||||
name.AppendLiteral(", ");
|
name.AppendLiteral(", ");
|
||||||
name.Append(compartmentPrivate->location);
|
name.Append(location);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// A hack: replace forward slashes with '\\' so they aren't
|
// A hack: replace forward slashes with '\\' so they aren't
|
||||||
|
@ -2610,6 +2610,36 @@ DumpJSHeap(FILE* file)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
SetLocationForGlobal(JSObject *global, const nsACString& location)
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(global);
|
||||||
|
|
||||||
|
JSCompartment *compartment = js::GetObjectCompartment(global);
|
||||||
|
MOZ_ASSERT(compartment, "No compartment for global");
|
||||||
|
|
||||||
|
xpc::CompartmentPrivate *priv =
|
||||||
|
static_cast<xpc::CompartmentPrivate *>(JS_GetCompartmentPrivate(compartment));
|
||||||
|
MOZ_ASSERT(priv, "No compartment private");
|
||||||
|
|
||||||
|
priv->SetLocation(location);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SetLocationForGlobal(JSObject *global, nsIURI *locationURI)
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(global);
|
||||||
|
|
||||||
|
JSCompartment *compartment = js::GetObjectCompartment(global);
|
||||||
|
MOZ_ASSERT(compartment, "No compartment for global");
|
||||||
|
|
||||||
|
xpc::CompartmentPrivate *priv =
|
||||||
|
static_cast<xpc::CompartmentPrivate *>(JS_GetCompartmentPrivate(compartment));
|
||||||
|
MOZ_ASSERT(priv, "No compartment private");
|
||||||
|
|
||||||
|
priv->SetLocation(locationURI);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace xpc
|
} // namespace xpc
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
@ -4342,8 +4342,9 @@ XPC_GetIdentityObject(JSContext *cx, JSObject *obj);
|
|||||||
|
|
||||||
namespace xpc {
|
namespace xpc {
|
||||||
|
|
||||||
struct CompartmentPrivate
|
class CompartmentPrivate
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
typedef nsDataHashtable<nsPtrHashKey<XPCWrappedNative>, JSObject *> ExpandoMap;
|
typedef nsDataHashtable<nsPtrHashKey<XPCWrappedNative>, JSObject *> ExpandoMap;
|
||||||
typedef nsTHashtable<nsPtrHashKey<JSObject> > DOMExpandoMap;
|
typedef nsTHashtable<nsPtrHashKey<JSObject> > DOMExpandoMap;
|
||||||
|
|
||||||
@ -4360,7 +4361,6 @@ struct CompartmentPrivate
|
|||||||
// NB: we don't want this map to hold a strong reference to the wrapper.
|
// NB: we don't want this map to hold a strong reference to the wrapper.
|
||||||
nsAutoPtr<ExpandoMap> expandoMap;
|
nsAutoPtr<ExpandoMap> expandoMap;
|
||||||
nsAutoPtr<DOMExpandoMap> domExpandoMap;
|
nsAutoPtr<DOMExpandoMap> domExpandoMap;
|
||||||
nsCString location;
|
|
||||||
|
|
||||||
bool RegisterExpandoObject(XPCWrappedNative *wn, JSObject *expando) {
|
bool RegisterExpandoObject(XPCWrappedNative *wn, JSObject *expando) {
|
||||||
if (!expandoMap) {
|
if (!expandoMap) {
|
||||||
@ -4403,6 +4403,33 @@ struct CompartmentPrivate
|
|||||||
if (domExpandoMap)
|
if (domExpandoMap)
|
||||||
domExpandoMap->RemoveEntry(expando);
|
domExpandoMap->RemoveEntry(expando);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const nsACString& GetLocation() {
|
||||||
|
if (locationURI) {
|
||||||
|
if (NS_FAILED(locationURI->GetSpec(location)))
|
||||||
|
location = NS_LITERAL_CSTRING("<unknown location>");
|
||||||
|
locationURI = nsnull;
|
||||||
|
}
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
void SetLocation(const nsACString& aLocation) {
|
||||||
|
if (aLocation.IsEmpty())
|
||||||
|
return;
|
||||||
|
if (!location.IsEmpty() || locationURI)
|
||||||
|
return;
|
||||||
|
location = aLocation;
|
||||||
|
}
|
||||||
|
void SetLocation(nsIURI *aLocationURI) {
|
||||||
|
if (!aLocationURI)
|
||||||
|
return;
|
||||||
|
if (!location.IsEmpty() || locationURI)
|
||||||
|
return;
|
||||||
|
locationURI = aLocationURI;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
nsCString location;
|
||||||
|
nsCOMPtr<nsIURI> locationURI;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -229,6 +229,9 @@ nsIPrincipal *GetCompartmentPrincipal(JSCompartment *compartment);
|
|||||||
void DumpJSHeap(FILE* file);
|
void DumpJSHeap(FILE* file);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void SetLocationForGlobal(JSObject *global, const nsACString& location);
|
||||||
|
void SetLocationForGlobal(JSObject *global, nsIURI *locationURI);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define quick stubs on the given object, @a proto.
|
* Define quick stubs on the given object, @a proto.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user