summaryrefslogtreecommitdiff
path: root/Source/WebCore/bindings/js/JSDOMGlobalObject.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/bindings/js/JSDOMGlobalObject.h')
-rw-r--r--Source/WebCore/bindings/js/JSDOMGlobalObject.h62
1 files changed, 42 insertions, 20 deletions
diff --git a/Source/WebCore/bindings/js/JSDOMGlobalObject.h b/Source/WebCore/bindings/js/JSDOMGlobalObject.h
index 6eab99967..456d953ba 100644
--- a/Source/WebCore/bindings/js/JSDOMGlobalObject.h
+++ b/Source/WebCore/bindings/js/JSDOMGlobalObject.h
@@ -10,10 +10,10 @@
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
@@ -24,15 +24,17 @@
*
*/
-#ifndef JSDOMGlobalObject_h
-#define JSDOMGlobalObject_h
+#pragma once
#include "PlatformExportMacros.h"
+#include "WebCoreJSBuiltinInternals.h"
+#include <heap/LockDuringMarking.h>
#include <runtime/JSGlobalObject.h>
-#include <runtime/Operations.h>
+#include <runtime/StructureInlines.h>
namespace WebCore {
+ class DeferredPromise;
class Document;
class Event;
class DOMWrapperWorld;
@@ -40,20 +42,25 @@ namespace WebCore {
typedef HashMap<const JSC::ClassInfo*, JSC::WriteBarrier<JSC::Structure>> JSDOMStructureMap;
typedef HashMap<const JSC::ClassInfo*, JSC::WriteBarrier<JSC::JSObject>> JSDOMConstructorMap;
+ typedef HashSet<DeferredPromise*> DeferredPromiseSet;
- class JSDOMGlobalObject : public JSC::JSGlobalObject {
+ class WEBCORE_EXPORT JSDOMGlobalObject : public JSC::JSGlobalObject {
typedef JSC::JSGlobalObject Base;
protected:
struct JSDOMGlobalObjectData;
- JSDOMGlobalObject(JSC::VM&, JSC::Structure*, PassRefPtr<DOMWrapperWorld>, const JSC::GlobalObjectMethodTable* = 0);
+ JSDOMGlobalObject(JSC::VM&, JSC::Structure*, Ref<DOMWrapperWorld>&&, const JSC::GlobalObjectMethodTable* = 0);
static void destroy(JSC::JSCell*);
void finishCreation(JSC::VM&);
void finishCreation(JSC::VM&, JSC::JSObject*);
public:
- JSDOMStructureMap& structures() { return m_structures; }
- JSDOMConstructorMap& constructors() { return m_constructors; }
+ Lock& gcLock() { return m_gcLock; }
+
+ JSDOMStructureMap& structures(const AbstractLocker&) { return m_structures; }
+ JSDOMConstructorMap& constructors(const AbstractLocker&) { return m_constructors; }
+
+ DeferredPromiseSet& deferredPromises(const AbstractLocker&) { return m_deferredPromises; }
ScriptExecutionContext* scriptExecutionContext() const;
@@ -65,13 +72,19 @@ namespace WebCore {
static void visitChildren(JSC::JSCell*, JSC::SlotVisitor&);
- DOMWrapperWorld& world() { return *m_world; }
+ DOMWrapperWorld& world() { return m_world.get(); }
+ bool worldIsNormal() const { return m_worldIsNormal; }
+ static ptrdiff_t offsetOfWorldIsNormal() { return OBJECT_OFFSETOF(JSDOMGlobalObject, m_worldIsNormal); }
+
+ JSBuiltinInternalFunctions& builtinInternalFunctions() { return m_builtinInternalFunctions; }
protected:
- static WEBKIT_EXPORTDATA const JSC::ClassInfo s_info;
+ static const JSC::ClassInfo s_info;
public:
- static const JSC::ClassInfo* info() { return &s_info; }
+ ~JSDOMGlobalObject();
+
+ static constexpr const JSC::ClassInfo* info() { return &s_info; }
static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSValue prototype)
{
@@ -81,20 +94,31 @@ namespace WebCore {
protected:
JSDOMStructureMap m_structures;
JSDOMConstructorMap m_constructors;
+ DeferredPromiseSet m_deferredPromises;
Event* m_currentEvent;
- RefPtr<DOMWrapperWorld> m_world;
+ Ref<DOMWrapperWorld> m_world;
+ uint8_t m_worldIsNormal;
+ Lock m_gcLock;
+
+ private:
+ void addBuiltinGlobals(JSC::VM&);
+ friend void JSBuiltinInternalFunctions::initialize(JSDOMGlobalObject&);
+
+ JSBuiltinInternalFunctions m_builtinInternalFunctions;
};
template<class ConstructorClass>
- inline JSC::JSObject* getDOMConstructor(JSC::VM& vm, const JSDOMGlobalObject* globalObject)
+ inline JSC::JSObject* getDOMConstructor(JSC::VM& vm, const JSDOMGlobalObject& globalObject)
{
- if (JSC::JSObject* constructor = const_cast<JSDOMGlobalObject*>(globalObject)->constructors().get(ConstructorClass::info()).get())
+ if (JSC::JSObject* constructor = const_cast<JSDOMGlobalObject&>(globalObject).constructors(NoLockingNecessary).get(ConstructorClass::info()).get())
return constructor;
- JSC::JSObject* constructor = ConstructorClass::create(vm, ConstructorClass::createStructure(vm, const_cast<JSDOMGlobalObject*>(globalObject), globalObject->objectPrototype()), const_cast<JSDOMGlobalObject*>(globalObject));
- ASSERT(!const_cast<JSDOMGlobalObject*>(globalObject)->constructors().contains(ConstructorClass::info()));
+ JSC::JSObject* constructor = ConstructorClass::create(vm, ConstructorClass::createStructure(vm, const_cast<JSDOMGlobalObject&>(globalObject), ConstructorClass::prototypeForStructure(vm, globalObject)), const_cast<JSDOMGlobalObject&>(globalObject));
+ ASSERT(!const_cast<JSDOMGlobalObject&>(globalObject).constructors(NoLockingNecessary).contains(ConstructorClass::info()));
JSC::WriteBarrier<JSC::JSObject> temp;
- const_cast<JSDOMGlobalObject*>(globalObject)->constructors().add(ConstructorClass::info(), temp).iterator->value.set(vm, globalObject, constructor);
+ JSDOMGlobalObject& mutableGlobalObject = const_cast<JSDOMGlobalObject&>(globalObject);
+ auto locker = JSC::lockDuringMarking(vm.heap, mutableGlobalObject.gcLock());
+ mutableGlobalObject.constructors(locker).add(ConstructorClass::info(), temp).iterator->value.set(vm, &globalObject, constructor);
return constructor;
}
@@ -105,5 +129,3 @@ namespace WebCore {
JSDOMGlobalObject* toJSDOMGlobalObject(ScriptExecutionContext*, DOMWrapperWorld&);
} // namespace WebCore
-
-#endif // JSDOMGlobalObject_h