summaryrefslogtreecommitdiffstats
path: root/js/public/RealmIterators.h
diff options
context:
space:
mode:
Diffstat (limited to 'js/public/RealmIterators.h')
-rw-r--r--js/public/RealmIterators.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/js/public/RealmIterators.h b/js/public/RealmIterators.h
new file mode 100644
index 0000000000..13f19dbb8f
--- /dev/null
+++ b/js/public/RealmIterators.h
@@ -0,0 +1,81 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim: set ts=8 sts=2 et sw=2 tw=80:
+ * 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
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Various interfaces to iterate over the Realms given various context such as
+ * principals, compartments and GC zones.
+ */
+
+#ifndef js_RealmIterators_h
+#define js_RealmIterators_h
+
+#include "js/GCAPI.h"
+#include "js/TypeDecls.h"
+
+struct JSPrincipals;
+
+namespace JS {
+
+class JS_PUBLIC_API AutoRequireNoGC;
+
+using IterateRealmCallback = void (*)(JSContext* cx, void* data, Realm* realm,
+ const AutoRequireNoGC& nogc);
+
+/**
+ * This function calls |realmCallback| on every realm. Beware that there is no
+ * guarantee that the realm will survive after the callback returns. Also,
+ * barriers are disabled via the TraceSession.
+ */
+extern JS_PUBLIC_API void IterateRealms(JSContext* cx, void* data,
+ IterateRealmCallback realmCallback);
+
+/**
+ * Like IterateRealms, but only call the callback for realms using |principals|.
+ */
+extern JS_PUBLIC_API void IterateRealmsWithPrincipals(
+ JSContext* cx, JSPrincipals* principals, void* data,
+ IterateRealmCallback realmCallback);
+
+/**
+ * Like IterateRealms, but only iterates realms in |compartment|.
+ */
+extern JS_PUBLIC_API void IterateRealmsInCompartment(
+ JSContext* cx, JS::Compartment* compartment, void* data,
+ IterateRealmCallback realmCallback);
+
+/**
+ * An enum that JSIterateCompartmentCallback can return to indicate
+ * whether to keep iterating.
+ */
+enum class CompartmentIterResult { KeepGoing, Stop };
+
+} // namespace JS
+
+using JSIterateCompartmentCallback =
+ JS::CompartmentIterResult (*)(JSContext*, void*, JS::Compartment*);
+
+/**
+ * This function calls |compartmentCallback| on every compartment until either
+ * all compartments have been iterated or CompartmentIterResult::Stop is
+ * returned. Beware that there is no guarantee that the compartment will survive
+ * after the callback returns. Also, barriers are disabled via the TraceSession.
+ */
+extern JS_PUBLIC_API void JS_IterateCompartments(
+ JSContext* cx, void* data,
+ JSIterateCompartmentCallback compartmentCallback);
+
+/**
+ * This function calls |compartmentCallback| on every compartment in the given
+ * zone until either all compartments have been iterated or
+ * CompartmentIterResult::Stop is returned. Beware that there is no guarantee
+ * that the compartment will survive after the callback returns. Also, barriers
+ * are disabled via the TraceSession.
+ */
+extern JS_PUBLIC_API void JS_IterateCompartmentsInZone(
+ JSContext* cx, JS::Zone* zone, void* data,
+ JSIterateCompartmentCallback compartmentCallback);
+
+#endif /* js_RealmIterators_h */