Add and deploy WK_API_ENABLED guards
[WebKit-https.git] / Source / WebKit2 / WebProcess / InjectedBundle / API / mac / WKDOMInternals.mm
1 /*
2  * Copyright (C) 2012 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27
28 #import "WKDOMInternals.h"
29
30 #if WK_API_ENABLED
31
32 #import <WebCore/Document.h>
33 #import <WebCore/Element.h>
34 #import <WebCore/Node.h>
35 #import <WebCore/Range.h>
36 #import <WebCore/Text.h>
37
38 // Classes to instantiate.
39 #import "WKDOMElement.h"
40 #import "WKDOMDocument.h"
41 #import "WKDOMText.h"
42
43 namespace WebKit {
44
45 template<typename WebCoreType, typename WKDOMType>
46 static WKDOMType toWKDOMType(WebCoreType impl, DOMCache<WebCoreType, WKDOMType>& cache);
47
48 // -- Caches -- 
49
50 DOMCache<WebCore::Node*, WKDOMNode *>& WKDOMNodeCache()
51 {
52     typedef DOMCache<WebCore::Node*, WKDOMNode *> Cache;
53     DEFINE_STATIC_LOCAL(Cache, cache, ());
54     return cache;
55 }
56
57 DOMCache<WebCore::Range*, WKDOMRange *>& WKDOMRangeCache()
58 {
59     typedef DOMCache<WebCore::Range*, WKDOMRange *> Cache;
60     DEFINE_STATIC_LOCAL(Cache, cache, ());
61     return cache;
62 }
63
64 // -- Node and classes derived from Node. --
65
66 static Class WKDOMNodeClass(WebCore::Node* impl)
67 {
68     switch (impl->nodeType()) {
69     case WebCore::Node::ELEMENT_NODE:
70         return [WKDOMElement class];
71     case WebCore::Node::DOCUMENT_NODE:
72         return [WKDOMDocument class];
73     case WebCore::Node::TEXT_NODE:
74         return [WKDOMText class];
75     case WebCore::Node::ATTRIBUTE_NODE:
76     case WebCore::Node::CDATA_SECTION_NODE:
77     case WebCore::Node::ENTITY_REFERENCE_NODE:
78     case WebCore::Node::ENTITY_NODE:
79     case WebCore::Node::PROCESSING_INSTRUCTION_NODE:
80     case WebCore::Node::COMMENT_NODE:
81     case WebCore::Node::DOCUMENT_TYPE_NODE:
82     case WebCore::Node::DOCUMENT_FRAGMENT_NODE:
83     case WebCore::Node::NOTATION_NODE:
84     case WebCore::Node::XPATH_NAMESPACE_NODE:
85         return [WKDOMNode class];
86     }
87     ASSERT_NOT_REACHED();
88     return nil;
89 }
90
91 static WKDOMNode *initWithImpl(WebCore::Node* impl)
92 {
93     return [[WKDOMNodeClass(impl) alloc] _initWithImpl:impl];
94 }
95
96 WebCore::Node* toWebCoreNode(WKDOMNode *wrapper)
97 {
98     return wrapper ? wrapper->_impl.get() : 0;
99 }
100
101 WKDOMNode *toWKDOMNode(WebCore::Node* impl)
102 {
103     return toWKDOMType<WebCore::Node*, WKDOMNode *>(impl, WKDOMNodeCache());
104 }
105
106 WebCore::Element* toWebCoreElement(WKDOMElement *wrapper)
107 {
108     return wrapper ? reinterpret_cast<WebCore::Element*>(wrapper->_impl.get()) : 0;
109 }
110
111 WKDOMElement *toWKDOMElement(WebCore::Element* impl)
112 {
113     return static_cast<WKDOMElement*>(toWKDOMNode(static_cast<WebCore::Node*>(impl)));
114 }
115
116 WebCore::Document* toWebCoreDocument(WKDOMDocument *wrapper)
117 {
118     return wrapper ? reinterpret_cast<WebCore::Document*>(wrapper->_impl.get()) : 0;
119 }
120
121 WKDOMDocument *toWKDOMDocument(WebCore::Document* impl)
122 {
123     return static_cast<WKDOMDocument*>(toWKDOMNode(static_cast<WebCore::Node*>(impl)));
124 }
125
126 WebCore::Text* toWebCoreText(WKDOMText *wrapper)
127 {
128     return wrapper ? reinterpret_cast<WebCore::Text*>(wrapper->_impl.get()) : 0;
129 }
130
131 WKDOMText *toWKDOMText(WebCore::Text* impl)
132 {
133     return static_cast<WKDOMText*>(toWKDOMNode(static_cast<WebCore::Node*>(impl)));
134 }
135
136 // -- Range. --
137
138 static WKDOMRange *initWithImpl(WebCore::Range* impl)
139 {
140     return [[WKDOMRange alloc] _initWithImpl:impl];
141 }
142
143 WebCore::Range* toWebCoreRange(WKDOMRange * wrapper)
144 {
145     return wrapper ? wrapper->_impl.get() : 0;
146 }
147
148 WKDOMRange *toWKDOMRange(WebCore::Range* impl)
149 {
150     return toWKDOMType<WebCore::Range*, WKDOMRange *>(impl, WKDOMRangeCache());
151 }
152
153 // -- Helpers --
154
155 template<typename WebCoreType, typename WKDOMType>
156 static WKDOMType toWKDOMType(WebCoreType impl, DOMCache<WebCoreType, WKDOMType>& cache)
157 {
158     if (!impl)
159         return nil;
160     if (WKDOMType wrapper = cache.get(impl))
161         return [[wrapper retain] autorelease];
162     WKDOMType wrapper = initWithImpl(impl);
163     if (!wrapper)
164         return nil;
165     return [wrapper autorelease];
166 }
167
168 NSArray *toNSArray(const Vector<WebCore::IntRect>& rects)
169 {
170     size_t size = rects.size();
171     NSMutableArray *array = [NSMutableArray arrayWithCapacity:size];
172     for (size_t i = 0; i < size; ++i)
173         [array addObject:[NSValue valueWithRect:rects[i]]];
174     return array;
175 }
176
177 } // namespace WebKit
178
179 #endif // WK_API_ENABLED