Source code
Revision control
Copy as Markdown
Other Tools
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
#ifndef js_friend_Wrapper_h
#define js_friend_Wrapper_h
#include "js/Wrapper.h"
namespace js {
/*
* APIs to nuke cross compartment wrappers.
*
* These are implemented in js/src/proxy/CrossCompartmentWrapper.cpp.
*/
enum NukeReferencesToWindow { NukeWindowReferences, DontNukeWindowReferences };
enum NukeReferencesFromTarget {
NukeAllReferences,
NukeIncomingReferences,
};
/*
* These filters are designed to be ephemeral stack classes, and thus don't
* do any rooting or holding of their members.
*/
struct CompartmentFilter {
virtual bool match(JS::Compartment* c) const = 0;
};
struct AllCompartments : public CompartmentFilter {
virtual bool match(JS::Compartment* c) const override { return true; }
};
struct SingleCompartment : public CompartmentFilter {
JS::Compartment* ours;
explicit SingleCompartment(JS::Compartment* c) : ours(c) {}
virtual bool match(JS::Compartment* c) const override { return c == ours; }
};
extern JS_PUBLIC_API bool NukeCrossCompartmentWrappers(
JSContext* cx, const CompartmentFilter& sourceFilter, JS::Realm* target,
NukeReferencesToWindow nukeReferencesToWindow,
NukeReferencesFromTarget nukeReferencesFromTarget);
extern JS_PUBLIC_API bool AllowNewWrapper(JS::Compartment* target,
JSObject* obj);
extern JS_PUBLIC_API bool NukedObjectRealm(JSObject* obj);
// If a cross-compartment wrapper source => target exists, nuke it.
extern JS_PUBLIC_API void NukeCrossCompartmentWrapperIfExists(
JSContext* cx, JS::Compartment* source, JSObject* target);
} /* namespace js */
#endif // js_friend_Wrapper_h