05153d7db7e92f241bd3a7c6600b9f6734721e31
[WebKit-https.git] / Source / WebCore / bindings / js / JSDOMWrapper.h
1 /*
2  *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
3  *  Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved.
4  *  Copyright (C) 2007 Samuel Weinig <sam@webkit.org>
5  *  Copyright (C) 2009 Google, Inc. All rights reserved.
6  *
7  *  This library is free software; you can redistribute it and/or
8  *  modify it under the terms of the GNU Lesser General Public
9  *  License as published by the Free Software Foundation; either
10  *  version 2 of the License, or (at your option) any later version.
11  *
12  *  This library is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  *  Lesser General Public License for more details.
16  *
17  *  You should have received a copy of the GNU Lesser General Public
18  *  License along with this library; if not, write to the Free Software
19  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21
22 #ifndef JSDOMWrapper_h
23 #define JSDOMWrapper_h
24
25 #include "JSDOMGlobalObject.h"
26 #include <runtime/JSDestructibleObject.h>
27
28 namespace WebCore {
29
30 class ScriptExecutionContext;
31
32 static const uint8_t JSNodeType = JSC::LastJSCObjectType + 1;
33 static const uint8_t JSDocumentWrapperType = JSC::LastJSCObjectType + 2;
34 static const uint8_t JSElementType = JSC::LastJSCObjectType + 3;
35
36 class JSDOMWrapper : public JSC::JSDestructibleObject {
37 public:
38     typedef JSC::JSDestructibleObject Base;
39
40     JSDOMGlobalObject* globalObject() const { return JSC::jsCast<JSDOMGlobalObject*>(JSC::JSNonFinalObject::globalObject()); }
41     ScriptExecutionContext* scriptExecutionContext() const { return globalObject()->scriptExecutionContext(); }
42
43 protected:
44     JSDOMWrapper(JSC::Structure* structure, JSC::JSGlobalObject& globalObject) 
45         : Base(globalObject.vm(), structure)
46     {
47         ASSERT(scriptExecutionContext());
48     }
49 };
50
51 template<typename ImplementationClass> class JSDOMWrapperWithImplementation : public JSDOMWrapper {
52 public:
53     typedef JSDOMWrapper Base;
54
55     ImplementationClass& impl() const { return *m_impl; }
56     ~JSDOMWrapperWithImplementation() { std::exchange(m_impl, nullptr)->deref(); }
57
58 protected:
59     JSDOMWrapperWithImplementation(JSC::Structure* structure, JSC::JSGlobalObject& globalObject, Ref<ImplementationClass>&& impl)
60         : Base(structure, globalObject)
61         , m_impl(&impl.leakRef()) { }
62
63 private:
64     ImplementationClass* m_impl;
65 };
66
67 } // namespace WebCore
68
69 #endif // JSDOMWrapper_h