mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1048695 part 2. Make interface members not be exposed based on their nonExposedGlobals. r=peterv
This commit is contained in:
parent
3be5a67cfa
commit
2322dab953
@ -2534,6 +2534,55 @@ CheckAllPermissions(JSContext* aCx, JSObject* aObj, const char* const aPermissio
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
IsNonExposedGlobal(JSContext* aCx, JSObject* aGlobal,
|
||||
uint32_t aNonExposedGlobals)
|
||||
{
|
||||
MOZ_ASSERT(aNonExposedGlobals, "Why did we get called?");
|
||||
MOZ_ASSERT((aNonExposedGlobals &
|
||||
~(GlobalNames::Window |
|
||||
GlobalNames::BackstagePass |
|
||||
GlobalNames::DedicatedWorkerGlobalScope |
|
||||
GlobalNames::SharedWorkerGlobalScope |
|
||||
GlobalNames::ServiceWorkerGlobalScope |
|
||||
GlobalNames::WorkerDebuggerGlobalScope)) == 0,
|
||||
"Unknown non-exposed global type");
|
||||
|
||||
const char* name = js::GetObjectClass(aGlobal)->name;
|
||||
|
||||
if ((aNonExposedGlobals & GlobalNames::Window) &&
|
||||
!strcmp(name, "Window")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((aNonExposedGlobals & GlobalNames::BackstagePass) &&
|
||||
!strcmp(name, "BackstagePass")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((aNonExposedGlobals & GlobalNames::DedicatedWorkerGlobalScope) &&
|
||||
!strcmp(name, "DedicatedWorkerGlobalScope")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((aNonExposedGlobals & GlobalNames::SharedWorkerGlobalScope) &&
|
||||
!strcmp(name, "SharedWorkerGlobalScope")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((aNonExposedGlobals & GlobalNames::ServiceWorkerGlobalScope) &&
|
||||
!strcmp(name, "ServiceWorkerGlobalScope")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((aNonExposedGlobals & GlobalNames::WorkerDebuggerGlobalScope) &&
|
||||
!strcmp(name, "WorkerDebuggerGlobalScopex")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
HandlePrerenderingViolation(nsPIDOMWindow* aWindow)
|
||||
{
|
||||
|
@ -3160,16 +3160,6 @@ AssertReturnTypeMatchesJitinfo(const JSJitInfo* aJitinfo,
|
||||
JS::Handle<JS::Value> aValue);
|
||||
#endif
|
||||
|
||||
// Returns true if aObj's global has any of the permissions named in aPermissions
|
||||
// set to nsIPermissionManager::ALLOW_ACTION. aPermissions must be null-terminated.
|
||||
bool
|
||||
CheckAnyPermissions(JSContext* aCx, JSObject* aObj, const char* const aPermissions[]);
|
||||
|
||||
// Returns true if aObj's global has all of the permissions named in aPermissions
|
||||
// set to nsIPermissionManager::ALLOW_ACTION. aPermissions must be null-terminated.
|
||||
bool
|
||||
CheckAllPermissions(JSContext* aCx, JSObject* aObj, const char* const aPermissions[]);
|
||||
|
||||
// This function is called by the bindings layer for methods/getters/setters
|
||||
// that are not safe to be called in prerendering mode. It checks to make sure
|
||||
// that the |this| object is not running in a global that is in prerendering
|
||||
|
@ -39,12 +39,24 @@ typedef bool
|
||||
JS::Handle<JSObject*> obj,
|
||||
JS::AutoIdVector& props);
|
||||
|
||||
// Returns true if aObj's global has any of the permissions named in
|
||||
// aPermissions set to nsIPermissionManager::ALLOW_ACTION. aPermissions must be
|
||||
// null-terminated.
|
||||
bool
|
||||
CheckAnyPermissions(JSContext* aCx, JSObject* aObj, const char* const aPermissions[]);
|
||||
|
||||
// Returns true if aObj's global has all of the permissions named in
|
||||
// aPermissions set to nsIPermissionManager::ALLOW_ACTION. aPermissions must be
|
||||
// null-terminated.
|
||||
bool
|
||||
CheckAllPermissions(JSContext* aCx, JSObject* aObj, const char* const aPermissions[]);
|
||||
|
||||
// Returns true if the given global is of a type whose bit is set in
|
||||
// aNonExposedGlobals.
|
||||
bool
|
||||
IsNonExposedGlobal(JSContext* aCx, JSObject* aGlobal,
|
||||
uint32_t aNonExposedGlobals);
|
||||
|
||||
struct ConstantSpec
|
||||
{
|
||||
const char* name;
|
||||
@ -68,6 +80,20 @@ static const uint32_t WorkerDebuggerGlobalScope = 1u << 5;
|
||||
template<typename T>
|
||||
struct Prefable {
|
||||
inline bool isEnabled(JSContext* cx, JS::Handle<JSObject*> obj) const {
|
||||
// Reading "enabled" on a worker thread is technically undefined behavior,
|
||||
// because it's written only on main threads, with no barriers of any sort.
|
||||
// So we want to avoid doing that. But we don't particularly want to make
|
||||
// expensive NS_IsMainThread calls here.
|
||||
//
|
||||
// The good news is that "enabled" is only written for things that have a
|
||||
// Pref annotation, and such things can never be exposed on non-Window
|
||||
// globals; our IDL parser enforces that. So as long as we check our
|
||||
// exposure set before checking "enabled" we will be ok.
|
||||
if (nonExposedGlobals &&
|
||||
IsNonExposedGlobal(cx, js::GetGlobalForObjectCrossCompartment(obj),
|
||||
nonExposedGlobals)) {
|
||||
return false;
|
||||
}
|
||||
if (!enabled) {
|
||||
return false;
|
||||
}
|
||||
|
@ -49,6 +49,6 @@ partial interface EventTarget {
|
||||
// chrome easier. This returns the window which can be used to create
|
||||
// events to fire at this EventTarget, or null if there isn't one.
|
||||
partial interface EventTarget {
|
||||
[ChromeOnly, Exposed=Window, BinaryName="ownerGlobalForBindings"]
|
||||
[ChromeOnly, Exposed=(Window,System), BinaryName="ownerGlobalForBindings"]
|
||||
readonly attribute WindowProxy? ownerGlobal;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user