diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/bindings/js/JSDOMGlobalObject.h | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/bindings/js/JSDOMGlobalObject.h')
-rw-r--r-- | Source/WebCore/bindings/js/JSDOMGlobalObject.h | 62 |
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 |