Reviewed by John.
[WebKit-https.git] / WebCore / kwq / DOMInternal.h
1 /*
2  * Copyright (C) 2004 Apple Computer, 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 COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #import <WebCore/DOM.h>
27
28 namespace DOM {
29     class CSSStyleDeclarationImpl;
30     class CSSStyleSheetImpl;
31     class DocumentFragmentImpl;
32     class DocumentImpl;
33     class ElementImpl;
34     class NodeFilterImpl;
35     class NodeImpl;
36     class NodeIteratorImpl;
37     class NodeListImpl;
38     class RangeImpl;
39     class StyleSheetListImpl;
40     class TreeWalkerImpl;
41 }
42
43 @interface DOMNode (WebCoreInternal)
44 + (DOMNode *)_nodeWithImpl:(DOM::NodeImpl *)impl;
45 - (DOM::NodeImpl *)_nodeImpl;
46 @end
47
48 @interface DOMNodeList (WebCoreInternal)
49 + (DOMNodeList *)_nodeListWithImpl:(DOM::NodeListImpl *)impl;
50 @end
51
52 @interface DOMElement (WebCoreInternal)
53 + (DOMElement *)_elementWithImpl:(DOM::ElementImpl *)impl;
54 - (DOM::ElementImpl *)_elementImpl;
55 @end
56
57 @interface DOMDocument (WebCoreInternal)
58 + (DOMDocument *)_documentWithImpl:(DOM::DocumentImpl *)impl;
59 - (DOM::DocumentImpl *)_documentImpl;
60 - (DOMElement *)_ownerElement;
61 @end
62
63 @interface DOMDocumentFragment (WebCoreInternal)
64 + (DOMDocumentFragment *)_documentFragmentWithImpl:(DOM::DocumentFragmentImpl *)impl;
65 - (DOM::DocumentFragmentImpl *)_fragmentImpl;
66 @end
67
68 @interface DOMRange (WebCoreInternal)
69 + (DOMRange *)_rangeWithImpl:(DOM::RangeImpl *)impl;
70 - (DOM::RangeImpl *)_rangeImpl;
71 @end
72
73 @interface DOMNodeIterator (WebCoreInternal)
74 + (DOMNodeIterator *)_nodeIteratorWithImpl:(DOM::NodeIteratorImpl *)impl filter:(id <DOMNodeFilter>)filter;
75 @end
76
77 @interface DOMTreeWalker (WebCoreInternal)
78 + (DOMTreeWalker *)_treeWalkerWithImpl:(DOM::TreeWalkerImpl *)impl filter:(id <DOMNodeFilter>)filter;
79 @end
80
81 @interface DOMObject (WebCoreInternal)
82 - (id)_init;
83 @end
84
85 @interface DOMCSSStyleDeclaration (WebCoreInternal)
86 + (DOMCSSStyleDeclaration *)_styleDeclarationWithImpl:(DOM::CSSStyleDeclarationImpl *)impl;
87 - (DOM::CSSStyleDeclarationImpl *)_styleDeclarationImpl;
88 @end
89
90 @interface DOMStyleSheetList (WebCoreInternal)
91 + (DOMStyleSheetList *)_styleSheetListWithImpl:(DOM::StyleSheetListImpl *)impl;
92 @end
93
94 @interface DOMCSSStyleSheet (WebCoreInternal)
95 + (DOMCSSStyleSheet *)_CSSStyleSheetWithImpl:(DOM::CSSStyleSheetImpl *)impl;
96 @end
97
98 @interface DOMNodeFilter : DOMObject <DOMNodeFilter>
99 + (DOMNodeFilter *)_nodeFilterWithImpl:(DOM::NodeFilterImpl *)impl;
100 @end
101
102 // Helper functions for DOM wrappers and gluing to Objective-C
103
104 // Like reinterpret_cast, but a compiler error if you use it on the wrong type.
105 template <class Target, class Source> Target DOM_cast(Source) { Source::failToCompile(); }
106
107 // Type safe DOM wrapper access.
108
109 id getDOMWrapperImpl(DOMObjectInternal *impl);
110 void addDOMWrapperImpl(id wrapper, DOMObjectInternal *impl);
111
112 template <class Source> inline id getDOMWrapper(Source impl) { return getDOMWrapperImpl(DOM_cast<DOMObjectInternal *>(impl)); }
113 template <class Source> inline void addDOMWrapper(id wrapper, Source impl) { addDOMWrapperImpl(wrapper, DOM_cast<DOMObjectInternal *>(impl)); }
114 void removeDOMWrapper(DOMObjectInternal *impl);
115
116 void raiseDOMException(int code);
117
118 inline void raiseOnDOMError(int code) 
119 {
120     if (code) 
121         raiseDOMException(code);
122 }
123
124 // Implementation details for the above.
125
126 #define ALLOW_DOM_CAST(type) \
127     namespace DOM { class type; } \
128     template <> inline DOMObjectInternal *DOM_cast<DOMObjectInternal *, DOM::type *>(DOM::type *p) \
129         { return reinterpret_cast<DOMObjectInternal *>(p); } \
130     template <> inline DOM::type *DOM_cast<DOM::type *, DOMObjectInternal *>(DOMObjectInternal *p) \
131         { return reinterpret_cast<DOM::type *>(p); }
132
133 // No class should appear in this list if it's base class is already here.
134 ALLOW_DOM_CAST(CounterImpl)
135 ALLOW_DOM_CAST(CSSRuleImpl)
136 ALLOW_DOM_CAST(CSSRuleListImpl)
137 ALLOW_DOM_CAST(CSSStyleDeclarationImpl)
138 ALLOW_DOM_CAST(CSSStyleSheetImpl)
139 ALLOW_DOM_CAST(CSSValueImpl)
140 ALLOW_DOM_CAST(DOMImplementationImpl)
141 ALLOW_DOM_CAST(HTMLCollectionImpl)
142 ALLOW_DOM_CAST(HTMLOptionsCollectionImpl)
143 ALLOW_DOM_CAST(MediaListImpl)
144 ALLOW_DOM_CAST(NamedNodeMapImpl)
145 ALLOW_DOM_CAST(NodeFilterImpl)
146 ALLOW_DOM_CAST(NodeImpl)
147 ALLOW_DOM_CAST(NodeIteratorImpl)
148 ALLOW_DOM_CAST(NodeListImpl)
149 ALLOW_DOM_CAST(RangeImpl)
150 ALLOW_DOM_CAST(RectImpl)
151 ALLOW_DOM_CAST(StyleSheetImpl)
152 ALLOW_DOM_CAST(StyleSheetListImpl)
153 ALLOW_DOM_CAST(TreeWalkerImpl)