[DOMJIT] Implement Node accessors in DOMJIT
[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 #pragma once
23
24 #include "JSDOMGlobalObject.h"
25 #include <runtime/JSDestructibleObject.h>
26
27 namespace WebCore {
28
29 class JSDOMWindow;
30 class ScriptExecutionContext;
31
32 static const uint8_t JSDOMWrapperType = JSC::LastJSCObjectType + 1;
33 static const uint8_t JSNodeType = JSC::LastJSCObjectType + 2;
34 static const uint8_t JSDocumentWrapperType = JSC::LastJSCObjectType + 3;
35 static const uint8_t JSElementType = JSC::LastJSCObjectType + 4;
36
37 class JSDOMObject : public JSC::JSDestructibleObject {
38 public:
39     typedef JSC::JSDestructibleObject Base;
40     static constexpr bool isDOMWrapper = false;
41
42     JSDOMGlobalObject* globalObject() const { return JSC::jsCast<JSDOMGlobalObject*>(JSC::JSNonFinalObject::globalObject()); }
43     ScriptExecutionContext* scriptExecutionContext() const { return globalObject()->scriptExecutionContext(); }
44
45     JSDOMWindow& domWindow() const;
46
47 protected:
48     JSDOMObject(JSC::Structure* structure, JSC::JSGlobalObject& globalObject)
49         : Base(globalObject.vm(), structure)
50     {
51         ASSERT(scriptExecutionContext());
52     }
53 };
54
55 template<typename ImplementationClass> class JSDOMWrapper : public JSDOMObject {
56 public:
57     typedef JSDOMObject Base;
58     typedef ImplementationClass DOMWrapped;
59     static constexpr bool isDOMWrapper = true;
60
61     ImplementationClass& wrapped() const { return const_cast<ImplementationClass&>(m_wrapped.get()); }
62     static ptrdiff_t offsetOfWrapped() { return OBJECT_OFFSETOF(JSDOMWrapper<ImplementationClass>, m_wrapped); }
63
64 protected:
65     JSDOMWrapper(JSC::Structure* structure, JSC::JSGlobalObject& globalObject, Ref<ImplementationClass>&& impl)
66         : Base(structure, globalObject)
67         , m_wrapped(WTFMove(impl)) { }
68
69 private:
70     Ref<ImplementationClass> m_wrapped;
71 };
72
73 ALWAYS_INLINE bool isJSDOMWrapperType(JSC::JSValue value)
74 {
75     if (UNLIKELY(!value.isCell()))
76         return false;
77     return value.asCell()->type() >= JSDOMWrapperType;
78 }
79
80 template<typename ImplementationClass> struct JSDOMWrapperConverterTraits;
81
82 template<typename JSClass, typename Enable = void>
83 struct JSDOMObjectInspector {
84 public:
85     static constexpr bool isSimpleWrapper = false;
86     static constexpr bool isComplexWrapper = false;
87     static constexpr bool isBuiltin = true;
88 };
89
90 template<typename JSClass>
91 struct JSDOMObjectInspector<JSClass, typename std::enable_if<JSClass::isDOMWrapper>::type> {
92 private:
93     template<typename T> static constexpr auto test(int) -> decltype(T::create(), bool()) { return true; }
94     template<typename T> static constexpr bool test(...) { return false; }
95
96 public:
97     static constexpr bool isSimpleWrapper = test<typename JSClass::DOMWrapped>(0);
98     static constexpr bool isComplexWrapper = !isSimpleWrapper;
99     static constexpr bool isBuiltin = false;
100 };
101
102 } // namespace WebCore