blob: 07cf460f5d04be3ffae3f47e7adaf23957bfa139 [file] [log] [blame]
kocienda03a86c72004-02-26 19:16:09 +00001/*
ddkilzera7bfea32006-06-24 20:51:21 +00002 * Copyright (C) 2004-2006 Apple Computer, Inc. All rights reserved.
3 * Copyright (C) 2006 James G. Speth (speth@end.com)
weiniga8192c02006-08-28 03:33:34 +00004 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
kocienda03a86c72004-02-26 19:16:09 +00005 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
darin8d1badc2006-03-06 16:50:13 +00009 * 1. Redistributions of source code must retain the above copyright
kocienda03a86c72004-02-26 19:16:09 +000010 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
16 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
19 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
darinbbe64662006-01-16 17:52:23 +000028#import "config.h"
kocienda49ed5392004-03-11 23:37:58 +000029#import "DOM.h"
kocienda03a86c72004-02-26 19:16:09 +000030
darinb9481ed2006-03-20 02:57:59 +000031#import "CDATASection.h"
eseidelb3f42132006-05-16 02:08:51 +000032#import "CSSStyleSheet.h"
darinb4483822006-06-02 06:30:49 +000033#import "Comment.h"
thatcher6bf9b3b2006-09-06 02:30:25 +000034#import "DOMImplementationFront.h"
darinbbe64662006-01-16 17:52:23 +000035#import "DOMInternal.h"
36#import "DOMPrivate.h"
weiniga8192c02006-08-28 03:33:34 +000037#import "DeprecatedValueList.h"
darinb9481ed2006-03-20 02:57:59 +000038#import "Document.h"
darinb4483822006-06-02 06:30:49 +000039#import "DocumentFragment.h"
darinb9481ed2006-03-20 02:57:59 +000040#import "DocumentType.h"
eseidel6e4fe452006-05-15 23:53:33 +000041#import "EntityReference.h"
weinig681a5172006-06-19 22:58:36 +000042#import "Event.h"
darin8d1badc2006-03-06 16:50:13 +000043#import "EventListener.h"
darinbe6eb6b2006-09-06 16:23:32 +000044#import "FontData.h"
darin947a31b2006-02-24 03:08:41 +000045#import "FoundationExtras.h"
darinb9481ed2006-03-20 02:57:59 +000046#import "FrameMac.h"
ggaren5711f092006-06-14 05:54:06 +000047#import "HTMLDocument.h"
darinb4483822006-06-02 06:30:49 +000048#import "HTMLNames.h"
tomernicf5193622006-07-11 23:58:44 +000049#import "HTMLPlugInElement.h"
weiniga8192c02006-08-28 03:33:34 +000050#import "IntRect.h"
darinb4483822006-06-02 06:30:49 +000051#import "NodeFilter.h"
52#import "NodeFilterCondition.h"
53#import "NodeIterator.h"
darinb9481ed2006-03-20 02:57:59 +000054#import "NodeList.h"
eseidel6e4fe452006-05-15 23:53:33 +000055#import "ProcessingInstruction.h"
darin7f1d1702006-05-10 07:12:56 +000056#import "QualifiedName.h"
darinb4483822006-06-02 06:30:49 +000057#import "Range.h"
darinb9481ed2006-03-20 02:57:59 +000058#import "RenderImage.h"
weiniga8192c02006-08-28 03:33:34 +000059#import "Text.h"
darinb4483822006-06-02 06:30:49 +000060#import "TreeWalker.h"
thatcher7aabf5d2006-07-18 00:27:46 +000061#import "WebScriptObjectPrivate.h"
weiniga8192c02006-08-28 03:33:34 +000062#import "csshelper.h"
darin644b75e2006-02-21 06:59:15 +000063#import <objc/objc-class.h>
weinigac936282006-09-29 20:29:16 +000064#import <wtf/HashMap.h>
kocienda03a86c72004-02-26 19:16:09 +000065
weinigc0f8d232006-10-11 03:46:36 +000066#ifdef SVG_SUPPORT
67#import "SVGDocument.h"
68#import "SVGElement.h"
69#import "SVGNames.h"
70#endif
darin8d1badc2006-03-06 16:50:13 +000071
weinigc0f8d232006-10-11 03:46:36 +000072namespace WebCore {
73
74class ObjCEventListener : public EventListener {
ggarena5ee9a42005-09-20 07:55:54 +000075public:
weinig6d74c0d2006-09-18 21:40:34 +000076 static ObjCEventListener* find(id <DOMEventListener>);
77 static ObjCEventListener* create(id <DOMEventListener>);
ggarena5ee9a42005-09-20 07:55:54 +000078
79private:
80 ObjCEventListener(id <DOMEventListener>);
81 virtual ~ObjCEventListener();
82
weinigc0f8d232006-10-11 03:46:36 +000083 virtual void handleEvent(Event*, bool isWindowEvent);
ggarena5ee9a42005-09-20 07:55:54 +000084
85 id <DOMEventListener> m_listener;
86};
87
mjs7ad7ee62006-01-24 07:31:21 +000088typedef HashMap<id, ObjCEventListener*> ListenerMap;
darin7f1d1702006-05-10 07:12:56 +000089static ListenerMap* listenerMap;
ggarena5ee9a42005-09-20 07:55:54 +000090
weinigc0f8d232006-10-11 03:46:36 +000091} // namespace WebCore
92
weiniga8192c02006-08-28 03:33:34 +000093
kocienda03a86c72004-02-26 19:16:09 +000094//------------------------------------------------------------------------------------------
kociendaf9c26e62004-03-03 00:42:49 +000095// DOMNode
96
weinigc0f8d232006-10-11 03:46:36 +000097namespace WebCore {
98
99typedef HashMap<const QualifiedName*, Class> ObjCClassMap;
100static ObjCClassMap* elementClassMap;
101
102static void addElementClass(const QualifiedName& tag, Class objCClass)
darin7f1d1702006-05-10 07:12:56 +0000103{
weinigc0f8d232006-10-11 03:46:36 +0000104 elementClassMap->set(&tag, objCClass);
darin7f1d1702006-05-10 07:12:56 +0000105}
106
weinigc0f8d232006-10-11 03:46:36 +0000107static void createElementClassMap()
darin7f1d1702006-05-10 07:12:56 +0000108{
109 // Create the table.
110 elementClassMap = new ObjCClassMap;
darin7f1d1702006-05-10 07:12:56 +0000111
112 // FIXME: Reflect marquee once the API has been determined.
weinigc0f8d232006-10-11 03:46:36 +0000113
114 // Populate it with HTML and SVG element classes.
115 addElementClass(HTMLNames::aTag, [DOMHTMLAnchorElement class]);
116 addElementClass(HTMLNames::appletTag, [DOMHTMLAppletElement class]);
117 addElementClass(HTMLNames::areaTag, [DOMHTMLAreaElement class]);
118 addElementClass(HTMLNames::baseTag, [DOMHTMLBaseElement class]);
119 addElementClass(HTMLNames::basefontTag, [DOMHTMLBaseFontElement class]);
120 addElementClass(HTMLNames::bodyTag, [DOMHTMLBodyElement class]);
121 addElementClass(HTMLNames::brTag, [DOMHTMLBRElement class]);
122 addElementClass(HTMLNames::buttonTag, [DOMHTMLButtonElement class]);
123 addElementClass(HTMLNames::canvasTag, [DOMHTMLImageElement class]);
124 addElementClass(HTMLNames::captionTag, [DOMHTMLTableCaptionElement class]);
125 addElementClass(HTMLNames::colTag, [DOMHTMLTableColElement class]);
126 addElementClass(HTMLNames::colgroupTag, [DOMHTMLTableColElement class]);
127 addElementClass(HTMLNames::dirTag, [DOMHTMLDirectoryElement class]);
128 addElementClass(HTMLNames::divTag, [DOMHTMLDivElement class]);
129 addElementClass(HTMLNames::dlTag, [DOMHTMLDListElement class]);
130 addElementClass(HTMLNames::fieldsetTag, [DOMHTMLFieldSetElement class]);
131 addElementClass(HTMLNames::fontTag, [DOMHTMLFontElement class]);
132 addElementClass(HTMLNames::formTag, [DOMHTMLFormElement class]);
133 addElementClass(HTMLNames::frameTag, [DOMHTMLFrameElement class]);
134 addElementClass(HTMLNames::framesetTag, [DOMHTMLFrameSetElement class]);
135 addElementClass(HTMLNames::h1Tag, [DOMHTMLHeadingElement class]);
136 addElementClass(HTMLNames::h2Tag, [DOMHTMLHeadingElement class]);
137 addElementClass(HTMLNames::h3Tag, [DOMHTMLHeadingElement class]);
138 addElementClass(HTMLNames::h4Tag, [DOMHTMLHeadingElement class]);
139 addElementClass(HTMLNames::h5Tag, [DOMHTMLHeadingElement class]);
140 addElementClass(HTMLNames::h6Tag, [DOMHTMLHeadingElement class]);
141 addElementClass(HTMLNames::headTag, [DOMHTMLHeadElement class]);
142 addElementClass(HTMLNames::hrTag, [DOMHTMLHRElement class]);
143 addElementClass(HTMLNames::htmlTag, [DOMHTMLHtmlElement class]);
144 addElementClass(HTMLNames::iframeTag, [DOMHTMLIFrameElement class]);
145 addElementClass(HTMLNames::imgTag, [DOMHTMLImageElement class]);
146 addElementClass(HTMLNames::inputTag, [DOMHTMLInputElement class]);
147 addElementClass(HTMLNames::isindexTag, [DOMHTMLIsIndexElement class]);
148 addElementClass(HTMLNames::labelTag, [DOMHTMLLabelElement class]);
149 addElementClass(HTMLNames::legendTag, [DOMHTMLLegendElement class]);
150 addElementClass(HTMLNames::liTag, [DOMHTMLLIElement class]);
151 addElementClass(HTMLNames::linkTag, [DOMHTMLLinkElement class]);
152 addElementClass(HTMLNames::listingTag, [DOMHTMLPreElement class]);
153 addElementClass(HTMLNames::mapTag, [DOMHTMLMapElement class]);
154 addElementClass(HTMLNames::menuTag, [DOMHTMLMenuElement class]);
155 addElementClass(HTMLNames::metaTag, [DOMHTMLMetaElement class]);
156 addElementClass(HTMLNames::objectTag, [DOMHTMLObjectElement class]);
157 addElementClass(HTMLNames::olTag, [DOMHTMLOListElement class]);
158 addElementClass(HTMLNames::optgroupTag, [DOMHTMLOptGroupElement class]);
159 addElementClass(HTMLNames::optionTag, [DOMHTMLOptionElement class]);
160 addElementClass(HTMLNames::pTag, [DOMHTMLParagraphElement class]);
161 addElementClass(HTMLNames::paramTag, [DOMHTMLParamElement class]);
162 addElementClass(HTMLNames::preTag, [DOMHTMLPreElement class]);
163 addElementClass(HTMLNames::qTag, [DOMHTMLQuoteElement class]);
164 addElementClass(HTMLNames::scriptTag, [DOMHTMLScriptElement class]);
165 addElementClass(HTMLNames::selectTag, [DOMHTMLSelectElement class]);
166 addElementClass(HTMLNames::styleTag, [DOMHTMLStyleElement class]);
167 addElementClass(HTMLNames::tableTag, [DOMHTMLTableElement class]);
168 addElementClass(HTMLNames::tbodyTag, [DOMHTMLTableSectionElement class]);
169 addElementClass(HTMLNames::tdTag, [DOMHTMLTableCellElement class]);
170 addElementClass(HTMLNames::textareaTag, [DOMHTMLTextAreaElement class]);
171 addElementClass(HTMLNames::tfootTag, [DOMHTMLTableSectionElement class]);
172 addElementClass(HTMLNames::theadTag, [DOMHTMLTableSectionElement class]);
173 addElementClass(HTMLNames::titleTag, [DOMHTMLTitleElement class]);
174 addElementClass(HTMLNames::trTag, [DOMHTMLTableRowElement class]);
175 addElementClass(HTMLNames::ulTag, [DOMHTMLUListElement class]);
176
177#ifdef SVG_SUPPORT
178 addElementClass(SVGNames::aTag, [DOMSVGAElement class]);
179 addElementClass(SVGNames::animateTag, [DOMSVGAnimateElement class]);
180 addElementClass(SVGNames::animateColorTag, [DOMSVGAnimateColorElement class]);
181 addElementClass(SVGNames::animateTransformTag, [DOMSVGAnimateTransformElement class]);
182 addElementClass(SVGNames::circleTag, [DOMSVGCircleElement class]);
183 addElementClass(SVGNames::clipPathTag, [DOMSVGClipPathElement class]);
184 addElementClass(SVGNames::cursorTag, [DOMSVGCursorElement class]);
185 addElementClass(SVGNames::defsTag, [DOMSVGDefsElement class]);
186 addElementClass(SVGNames::descTag, [DOMSVGDescElement class]);
187 addElementClass(SVGNames::ellipseTag, [DOMSVGEllipseElement class]);
188 addElementClass(SVGNames::feBlendTag, [DOMSVGFEBlendElement class]);
189 addElementClass(SVGNames::feColorMatrixTag, [DOMSVGFEColorMatrixElement class]);
190 addElementClass(SVGNames::feComponentTransferTag, [DOMSVGFEComponentTransferElement class]);
191 addElementClass(SVGNames::feCompositeTag, [DOMSVGFECompositeElement class]);
192 addElementClass(SVGNames::feDiffuseLightingTag, [DOMSVGFEDiffuseLightingElement class]);
193 addElementClass(SVGNames::feDisplacementMapTag, [DOMSVGFEDisplacementMapElement class]);
194 addElementClass(SVGNames::feDistantLightTag, [DOMSVGFEDistantLightElement class]);
195 addElementClass(SVGNames::feFloodTag, [DOMSVGFEFloodElement class]);
196 addElementClass(SVGNames::feFuncATag, [DOMSVGFEFuncAElement class]);
197 addElementClass(SVGNames::feFuncBTag, [DOMSVGFEFuncBElement class]);
198 addElementClass(SVGNames::feFuncGTag, [DOMSVGFEFuncGElement class]);
199 addElementClass(SVGNames::feFuncRTag, [DOMSVGFEFuncRElement class]);
200 addElementClass(SVGNames::feGaussianBlurTag, [DOMSVGFEGaussianBlurElement class]);
201 addElementClass(SVGNames::feImageTag, [DOMSVGFEImageElement class]);
202 addElementClass(SVGNames::feMergeTag, [DOMSVGFEMergeElement class]);
203 addElementClass(SVGNames::feMergeNodeTag, [DOMSVGFEMergeNodeElement class]);
204 addElementClass(SVGNames::feOffsetTag, [DOMSVGFEOffsetElement class]);
205 addElementClass(SVGNames::fePointLightTag, [DOMSVGFEPointLightElement class]);
206 addElementClass(SVGNames::feSpecularLightingTag, [DOMSVGFESpecularLightingElement class]);
207 addElementClass(SVGNames::feSpotLightTag, [DOMSVGFESpotLightElement class]);
208 addElementClass(SVGNames::feTileTag, [DOMSVGFETileElement class]);
209 addElementClass(SVGNames::feTurbulenceTag, [DOMSVGFETurbulenceElement class]);
210 addElementClass(SVGNames::filterTag, [DOMSVGFilterElement class]);
211 addElementClass(SVGNames::foreignObjectTag, [DOMSVGForeignObjectElement class]);
212 addElementClass(SVGNames::gTag, [DOMSVGGElement class]);
213 addElementClass(SVGNames::imageTag, [DOMSVGImageElement class]);
214 addElementClass(SVGNames::lineTag, [DOMSVGLineElement class]);
215 addElementClass(SVGNames::linearGradientTag, [DOMSVGLinearGradientElement class]);
216 addElementClass(SVGNames::markerTag, [DOMSVGMarkerElement class]);
217 addElementClass(SVGNames::maskTag, [DOMSVGMaskElement class]);
218 addElementClass(SVGNames::metadataTag, [DOMSVGMetadataElement class]);
219 addElementClass(SVGNames::pathTag, [DOMSVGPathElement class]);
220 addElementClass(SVGNames::patternTag, [DOMSVGPatternElement class]);
221 addElementClass(SVGNames::polygonTag, [DOMSVGPolygonElement class]);
222 addElementClass(SVGNames::polylineTag, [DOMSVGPolylineElement class]);
223 addElementClass(SVGNames::radialGradientTag, [DOMSVGRadialGradientElement class]);
224 addElementClass(SVGNames::rectTag, [DOMSVGRectElement class]);
225 addElementClass(SVGNames::scriptTag, [DOMSVGScriptElement class]);
226 addElementClass(SVGNames::setTag, [DOMSVGSetElement class]);
227 addElementClass(SVGNames::stopTag, [DOMSVGStopElement class]);
228 addElementClass(SVGNames::styleTag, [DOMSVGStyleElement class]);
229 addElementClass(SVGNames::svgTag, [DOMSVGSVGElement class]);
230 addElementClass(SVGNames::switchTag, [DOMSVGSwitchElement class]);
231 addElementClass(SVGNames::symbolTag, [DOMSVGSymbolElement class]);
232 addElementClass(SVGNames::textTag, [DOMSVGTextElement class]);
233 addElementClass(SVGNames::titleTag, [DOMSVGTitleElement class]);
234 addElementClass(SVGNames::trefTag, [DOMSVGTRefElement class]);
235 addElementClass(SVGNames::tspanTag, [DOMSVGTSpanElement class]);
236 addElementClass(SVGNames::useTag, [DOMSVGUseElement class]);
237 addElementClass(SVGNames::viewTag, [DOMSVGViewElement class]);
238#endif
darin7f1d1702006-05-10 07:12:56 +0000239}
240
weinigc0f8d232006-10-11 03:46:36 +0000241static Class elementClass(const QualifiedName& tag, Class defaultClass)
darin7f1d1702006-05-10 07:12:56 +0000242{
243 if (!elementClassMap)
weinigc0f8d232006-10-11 03:46:36 +0000244 createElementClassMap();
245 Class objcClass = elementClassMap->get(&tag);
darin7f1d1702006-05-10 07:12:56 +0000246 if (!objcClass)
weinigc0f8d232006-10-11 03:46:36 +0000247 objcClass = defaultClass;
darin7f1d1702006-05-10 07:12:56 +0000248 return objcClass;
249}
250
weinigc0f8d232006-10-11 03:46:36 +0000251} // namespace WebCore
252
kociendaf9c26e62004-03-03 00:42:49 +0000253@implementation DOMNode (WebCoreInternal)
kocienda03a86c72004-02-26 19:16:09 +0000254
weiniga8192c02006-08-28 03:33:34 +0000255// FIXME: should this go in the main implementation?
256- (NSString *)description
257{
weinigc6bbaeb2006-09-15 22:23:50 +0000258 if (!_internal)
259 return [NSString stringWithFormat:@"<%@: null>", [[self class] description], self];
weinigc0f8d232006-10-11 03:46:36 +0000260
weiniga8192c02006-08-28 03:33:34 +0000261 NSString *value = [self nodeValue];
weinigc6bbaeb2006-09-15 22:23:50 +0000262 if (value)
weiniga8192c02006-08-28 03:33:34 +0000263 return [NSString stringWithFormat:@"<%@ [%@]: %p '%@'>",
264 [[self class] description], [self nodeName], _internal, value];
weinigc6bbaeb2006-09-15 22:23:50 +0000265
266 return [NSString stringWithFormat:@"<%@ [%@]: %p>", [[self class] description], [self nodeName], _internal];
weiniga8192c02006-08-28 03:33:34 +0000267}
268
weinig6d74c0d2006-09-18 21:40:34 +0000269- (id)_initWithNode:(WebCore::Node *)impl
kocienda117559f2004-03-01 17:04:26 +0000270{
kociendaf9c26e62004-03-03 00:42:49 +0000271 ASSERT(impl);
kociendabb0f4522004-03-02 17:03:56 +0000272
kociendaf9c26e62004-03-03 00:42:49 +0000273 [super _init];
weinig4f67b132006-09-24 19:34:43 +0000274 _internal = reinterpret_cast<DOMObjectInternal*>(impl);
kocienda117559f2004-03-01 17:04:26 +0000275 impl->ref();
weinigb5e08162006-10-09 23:49:21 +0000276 WebCore::addDOMWrapper(self, impl);
kocienda117559f2004-03-01 17:04:26 +0000277 return self;
278}
279
weinig6d74c0d2006-09-18 21:40:34 +0000280+ (DOMNode *)_nodeWith:(WebCore::Node *)impl
kocienda117559f2004-03-01 17:04:26 +0000281{
282 if (!impl)
283 return nil;
weinigc0f8d232006-10-11 03:46:36 +0000284
kocienda117559f2004-03-01 17:04:26 +0000285 id cachedInstance;
weinigb5e08162006-10-09 23:49:21 +0000286 cachedInstance = WebCore::getDOMWrapper(impl);
kocienda117559f2004-03-01 17:04:26 +0000287 if (cachedInstance)
288 return [[cachedInstance retain] autorelease];
weinigc0f8d232006-10-11 03:46:36 +0000289
kociendaf9c26e62004-03-03 00:42:49 +0000290 Class wrapperClass = nil;
291 switch (impl->nodeType()) {
weinig6d74c0d2006-09-18 21:40:34 +0000292 case WebCore::Node::ELEMENT_NODE:
darin7f1d1702006-05-10 07:12:56 +0000293 if (impl->isHTMLElement())
weinigc0f8d232006-10-11 03:46:36 +0000294 wrapperClass = WebCore::elementClass(static_cast<WebCore::HTMLElement*>(impl)->tagQName(), [DOMHTMLElement class]);
295#ifdef SVG_SUPPORT
296 else if (impl->isSVGElement())
297 wrapperClass = WebCore::elementClass(static_cast<WebCore::SVGElement*>(impl)->tagQName(), [DOMSVGElement class]);
298#endif
darin7f1d1702006-05-10 07:12:56 +0000299 else
cblu6cf4a1ff2004-04-16 19:51:34 +0000300 wrapperClass = [DOMElement class];
cblu6cf4a1ff2004-04-16 19:51:34 +0000301 break;
weinig6d74c0d2006-09-18 21:40:34 +0000302 case WebCore::Node::ATTRIBUTE_NODE:
cblu6cf4a1ff2004-04-16 19:51:34 +0000303 wrapperClass = [DOMAttr class];
304 break;
weinig6d74c0d2006-09-18 21:40:34 +0000305 case WebCore::Node::TEXT_NODE:
cblu6cf4a1ff2004-04-16 19:51:34 +0000306 wrapperClass = [DOMText class];
307 break;
weinig6d74c0d2006-09-18 21:40:34 +0000308 case WebCore::Node::CDATA_SECTION_NODE:
cblu6cf4a1ff2004-04-16 19:51:34 +0000309 wrapperClass = [DOMCDATASection class];
310 break;
weinig6d74c0d2006-09-18 21:40:34 +0000311 case WebCore::Node::ENTITY_REFERENCE_NODE:
cblu6cf4a1ff2004-04-16 19:51:34 +0000312 wrapperClass = [DOMEntityReference class];
313 break;
weinig6d74c0d2006-09-18 21:40:34 +0000314 case WebCore::Node::ENTITY_NODE:
cblu6cf4a1ff2004-04-16 19:51:34 +0000315 wrapperClass = [DOMEntity class];
316 break;
weinig6d74c0d2006-09-18 21:40:34 +0000317 case WebCore::Node::PROCESSING_INSTRUCTION_NODE:
cblu6cf4a1ff2004-04-16 19:51:34 +0000318 wrapperClass = [DOMProcessingInstruction class];
319 break;
weinig6d74c0d2006-09-18 21:40:34 +0000320 case WebCore::Node::COMMENT_NODE:
cblu6cf4a1ff2004-04-16 19:51:34 +0000321 wrapperClass = [DOMComment class];
322 break;
weinig6d74c0d2006-09-18 21:40:34 +0000323 case WebCore::Node::DOCUMENT_NODE:
324 if (static_cast<WebCore::Document*>(impl)->isHTMLDocument())
cblu6cf4a1ff2004-04-16 19:51:34 +0000325 wrapperClass = [DOMHTMLDocument class];
weinigc0f8d232006-10-11 03:46:36 +0000326#ifdef SVG_SUPPORT
327 else if (static_cast<WebCore::Document*>(impl)->isSVGDocument())
328 wrapperClass = [DOMSVGDocument class];
329#endif
darin7f1d1702006-05-10 07:12:56 +0000330 else
cblu6cf4a1ff2004-04-16 19:51:34 +0000331 wrapperClass = [DOMDocument class];
cblu6cf4a1ff2004-04-16 19:51:34 +0000332 break;
weinig6d74c0d2006-09-18 21:40:34 +0000333 case WebCore::Node::DOCUMENT_TYPE_NODE:
cblu6cf4a1ff2004-04-16 19:51:34 +0000334 wrapperClass = [DOMDocumentType class];
335 break;
weinig6d74c0d2006-09-18 21:40:34 +0000336 case WebCore::Node::DOCUMENT_FRAGMENT_NODE:
cblu6cf4a1ff2004-04-16 19:51:34 +0000337 wrapperClass = [DOMDocumentFragment class];
338 break;
weinig6d74c0d2006-09-18 21:40:34 +0000339 case WebCore::Node::NOTATION_NODE:
cblu6cf4a1ff2004-04-16 19:51:34 +0000340 wrapperClass = [DOMNotation class];
341 break;
weinig6d74c0d2006-09-18 21:40:34 +0000342 case WebCore::Node::XPATH_NAMESPACE_NODE:
andersca75fd42c2006-05-08 21:27:25 +0000343 // FIXME: Create an XPath objective C wrapper
344 // See http://bugzilla.opendarwin.org/show_bug.cgi?id=8755
345 return nil;
kociendabb0f4522004-03-02 17:03:56 +0000346 }
darinb9481ed2006-03-20 02:57:59 +0000347 return [[[wrapperClass alloc] _initWithNode:impl] autorelease];
kociendaf9c26e62004-03-03 00:42:49 +0000348}
349
weinig6d74c0d2006-09-18 21:40:34 +0000350- (WebCore::Node *)_node
kociendaf9c26e62004-03-03 00:42:49 +0000351{
weinig4f67b132006-09-24 19:34:43 +0000352 return reinterpret_cast<WebCore::Node*>(_internal);
kocienda03a86c72004-02-26 19:16:09 +0000353}
354
rjw31032172004-10-12 22:43:55 +0000355- (const KJS::Bindings::RootObject *)_executionContext
356{
weinig6d74c0d2006-09-18 21:40:34 +0000357 if (WebCore::Node *n = [self _node]) {
358 if (WebCore::FrameMac *f = Mac(n->document()->frame()))
ggaren42e58c62006-03-18 02:04:37 +0000359 return f->executionContextForDOM();
weiniga8192c02006-08-28 03:33:34 +0000360 }
ggaren42e58c62006-03-18 02:04:37 +0000361 return 0;
rjw31032172004-10-12 22:43:55 +0000362}
363
kocienda117559f2004-03-01 17:04:26 +0000364@end
kocienda03a86c72004-02-26 19:16:09 +0000365
weinig6b675332006-09-16 03:30:49 +0000366@implementation DOMNode (DOMNodeExtensions)
367
weinig6d74c0d2006-09-18 21:40:34 +0000368// FIXME: this should be implemented in the implementation
weinig6b675332006-09-16 03:30:49 +0000369- (NSRect)boundingBox
370{
371 WebCore::RenderObject *renderer = [self _node]->renderer();
372 if (renderer)
373 return renderer->absoluteBoundingBoxRect();
374 return NSZeroRect;
375}
376
weinig6d74c0d2006-09-18 21:40:34 +0000377// FIXME: this should be implemented in the implementation
weinig6b675332006-09-16 03:30:49 +0000378- (NSArray *)lineBoxRects
379{
380 WebCore::RenderObject *renderer = [self _node]->renderer();
381 if (renderer) {
382 Vector<WebCore::IntRect> rects;
383 renderer->lineBoxRects(rects);
384 size_t size = rects.size();
385 NSMutableArray *results = [NSMutableArray arrayWithCapacity:size];
386 for (size_t i = 0; i < size; ++i)
387 [results addObject:[NSValue valueWithRect:rects[i]]];
388 return results;
389 }
390 return nil;
391}
392
393@end
394
thatcher697713a2006-09-22 23:34:07 +0000395// FIXME: this should be auto-generated
darin80751b62006-07-15 15:09:19 +0000396@implementation DOMNode (DOMEventTarget)
397
thatcher697713a2006-09-22 23:34:07 +0000398- (void)addEventListener:(NSString *)type listener:(id <DOMEventListener>)listener useCapture:(BOOL)useCapture
darin80751b62006-07-15 15:09:19 +0000399{
400 if (![self _node]->isEventTargetNode())
weinigb5e08162006-10-09 23:49:21 +0000401 WebCore::raiseDOMException(DOM_NOT_SUPPORTED_ERR);
darin80751b62006-07-15 15:09:19 +0000402
weinigc0f8d232006-10-11 03:46:36 +0000403 WebCore::EventListener *wrapper = WebCore::ObjCEventListener::create(listener);
weinigb5e08162006-10-09 23:49:21 +0000404 WebCore::EventTargetNodeCast([self _node])->addEventListener(type, wrapper, useCapture);
darin80751b62006-07-15 15:09:19 +0000405 wrapper->deref();
406}
407
thatcher697713a2006-09-22 23:34:07 +0000408- (void)addEventListener:(NSString *)type :(id <DOMEventListener>)listener :(BOOL)useCapture
409{
410 // FIXME: this method can be removed once Mail changes to use the new method <rdar://problem/4746649>
411 [self addEventListener:type listener:listener useCapture:useCapture];
412}
413
414- (void)removeEventListener:(NSString *)type listener:(id <DOMEventListener>)listener useCapture:(BOOL)useCapture
darin80751b62006-07-15 15:09:19 +0000415{
416 if (![self _node]->isEventTargetNode())
weinigb5e08162006-10-09 23:49:21 +0000417 WebCore::raiseDOMException(DOM_NOT_SUPPORTED_ERR);
darin80751b62006-07-15 15:09:19 +0000418
weinigc0f8d232006-10-11 03:46:36 +0000419 if (WebCore::EventListener *wrapper = WebCore::ObjCEventListener::find(listener))
weinigb5e08162006-10-09 23:49:21 +0000420 WebCore::EventTargetNodeCast([self _node])->removeEventListener(type, wrapper, useCapture);
darin80751b62006-07-15 15:09:19 +0000421}
422
thatcher697713a2006-09-22 23:34:07 +0000423- (void)removeEventListener:(NSString *)type :(id <DOMEventListener>)listener :(BOOL)useCapture
424{
425 // FIXME: this method can be removed once Mail changes to use the new method <rdar://problem/4746649>
426 [self removeEventListener:type listener:listener useCapture:useCapture];
427}
428
darin80751b62006-07-15 15:09:19 +0000429- (BOOL)dispatchEvent:(DOMEvent *)event
430{
431 if (![self _node]->isEventTargetNode())
weinigb5e08162006-10-09 23:49:21 +0000432 WebCore::raiseDOMException(DOM_NOT_SUPPORTED_ERR);
darin80751b62006-07-15 15:09:19 +0000433
weinig6d74c0d2006-09-18 21:40:34 +0000434 WebCore::ExceptionCode ec = 0;
weinigb5e08162006-10-09 23:49:21 +0000435 BOOL result = WebCore::EventTargetNodeCast([self _node])->dispatchEvent([event _event], ec);
436 WebCore::raiseOnDOMError(ec);
darin80751b62006-07-15 15:09:19 +0000437 return result;
438}
439
440@end
441
kociendabb0f4522004-03-02 17:03:56 +0000442//------------------------------------------------------------------------------------------
kocienda117559f2004-03-01 17:04:26 +0000443// DOMElement
444
weinigb5e08162006-10-09 23:49:21 +0000445// FIXME: this should be auto-generated in DOMElement.mm
weiniga8192c02006-08-28 03:33:34 +0000446@implementation DOMElement (DOMElementAppKitExtensions)
adele99881522005-11-15 02:05:45 +0000447
weinig6d74c0d2006-09-18 21:40:34 +0000448// FIXME: this should be implemented in the implementation
thatcher3166fbf2006-03-01 17:49:47 +0000449- (NSImage*)image
450{
weinig6d74c0d2006-09-18 21:40:34 +0000451 WebCore::RenderObject* renderer = [self _element]->renderer();
thatcher3166fbf2006-03-01 17:49:47 +0000452 if (renderer && renderer->isImage()) {
weinig6d74c0d2006-09-18 21:40:34 +0000453 WebCore::RenderImage* img = static_cast<WebCore::RenderImage*>(renderer);
thatcher3166fbf2006-03-01 17:49:47 +0000454 if (img->cachedImage() && !img->cachedImage()->isErrorImage())
455 return img->cachedImage()->image()->getNSImage();
456 }
457 return nil;
458}
459
adele99881522005-11-15 02:05:45 +0000460@end
461
cblu4dc540a2004-12-06 23:39:15 +0000462@implementation DOMElement (WebPrivate)
463
weinig6d74c0d2006-09-18 21:40:34 +0000464// FIXME: this should be implemented in the implementation
cblu4dc540a2004-12-06 23:39:15 +0000465- (NSFont *)_font
466{
weinig6d74c0d2006-09-18 21:40:34 +0000467 WebCore::RenderObject* renderer = [self _element]->renderer();
darinbe6eb6b2006-09-06 16:23:32 +0000468 if (renderer)
469 return renderer->style()->font().primaryFont()->getNSFont();
cblu4dc540a2004-12-06 23:39:15 +0000470 return nil;
471}
472
weinig6d74c0d2006-09-18 21:40:34 +0000473// FIXME: this should be implemented in the implementation
weinigb5e08162006-10-09 23:49:21 +0000474- (NSData *)_imageTIFFRepresentation
hyatt3059a512006-02-02 08:40:45 +0000475{
weinig6d74c0d2006-09-18 21:40:34 +0000476 WebCore::RenderObject* renderer = [self _element]->renderer();
hyatt3059a512006-02-02 08:40:45 +0000477 if (renderer && renderer->isImage()) {
weinig6d74c0d2006-09-18 21:40:34 +0000478 WebCore::RenderImage* img = static_cast<WebCore::RenderImage*>(renderer);
hyatt3059a512006-02-02 08:40:45 +0000479 if (img->cachedImage() && !img->cachedImage()->isErrorImage())
hyatt058251e2006-02-07 10:17:52 +0000480 return (NSData*)(img->cachedImage()->image()->getTIFFRepresentation());
hyatt3059a512006-02-02 08:40:45 +0000481 }
482 return nil;
483}
484
weinig6d74c0d2006-09-18 21:40:34 +0000485// FIXME: this should be implemented in the implementation
sullivan111f1102005-02-17 00:14:30 +0000486- (NSURL *)_getURLAttribute:(NSString *)name
487{
488 ASSERT(name);
weinig6d74c0d2006-09-18 21:40:34 +0000489 WebCore::Element* element = [self _element];
490 ASSERT(element);
491 return WebCore::KURL(element->document()->completeURL(parseURL(element->getAttribute(name)).deprecatedString())).getNSURL();
sullivan111f1102005-02-17 00:14:30 +0000492}
cblu4dc540a2004-12-06 23:39:15 +0000493
weinig6d74c0d2006-09-18 21:40:34 +0000494// FIXME: this should be implemented in the implementation
thatcher3b931972006-07-12 00:45:06 +0000495- (void *)_NPObject
tomernicf5193622006-07-11 23:58:44 +0000496{
weinig6d74c0d2006-09-18 21:40:34 +0000497 WebCore::Element* element = [self _element];
weinigc0f8d232006-10-11 03:46:36 +0000498 if (element->hasTagName(WebCore::HTMLNames::appletTag) || element->hasTagName(WebCore::HTMLNames::embedTag) || element->hasTagName(WebCore::HTMLNames::objectTag))
tomernicf5193622006-07-11 23:58:44 +0000499 return static_cast<WebCore::HTMLPlugInElement*>(element)->getNPObject();
weinig6d74c0d2006-09-18 21:40:34 +0000500 return 0;
tomernicf5193622006-07-11 23:58:44 +0000501}
502
weinig6d74c0d2006-09-18 21:40:34 +0000503// FIXME: this should be implemented in the implementation
adele90285b72006-07-19 23:54:49 +0000504- (BOOL)isFocused
505{
weinig6d74c0d2006-09-18 21:40:34 +0000506 WebCore::Element* impl = [self _element];
adele90285b72006-07-19 23:54:49 +0000507 if (impl->document()->focusNode() == impl)
508 return YES;
509 return NO;
510}
511
sullivan111f1102005-02-17 00:14:30 +0000512@end
cblu4dc540a2004-12-06 23:39:15 +0000513
weiniga8192c02006-08-28 03:33:34 +0000514
kocienda117559f2004-03-01 17:04:26 +0000515//------------------------------------------------------------------------------------------
kociendabb0f4522004-03-02 17:03:56 +0000516// DOMRange
517
weinigc0880e72006-10-07 17:24:56 +0000518@implementation DOMRange (WebPrivate)
darin2de03ad2004-06-15 07:46:22 +0000519
darin9649a0f2004-09-15 05:55:43 +0000520- (NSString *)description
521{
522 if (!_internal)
darin02ad24b2005-01-20 18:05:19 +0000523 return @"<DOMRange: null>";
adele704e8bb2005-09-16 22:42:30 +0000524 return [NSString stringWithFormat:@"<DOMRange: %@ %d %@ %d>",
weinig6d74c0d2006-09-18 21:40:34 +0000525 [self startContainer], [self startOffset], [self endContainer], [self endOffset]];
darin9649a0f2004-09-15 05:55:43 +0000526}
527
weinigc0880e72006-10-07 17:24:56 +0000528// FIXME: this should be removed as soon as all internal Apple uses of it have been replaced with
529// calls to the public method - (NSString *)text.
darin36cb7c22004-08-03 18:09:44 +0000530- (NSString *)_text
531{
thatcher2a6da872006-07-10 03:02:04 +0000532 return [self text];
darin36cb7c22004-08-03 18:09:44 +0000533}
534
535@end
536
cblu1846a5a2004-04-29 02:05:28 +0000537
kociendaf6ea03e2004-05-04 22:38:00 +0000538//------------------------------------------------------------------------------------------
weiniga8192c02006-08-28 03:33:34 +0000539// DOMNodeFilter
cblu1846a5a2004-04-29 02:05:28 +0000540
weinigb5e08162006-10-09 23:49:21 +0000541// FIXME: This implementation should be in it's own file.
542
cblu1846a5a2004-04-29 02:05:28 +0000543@implementation DOMNodeFilter
544
weinig6d74c0d2006-09-18 21:40:34 +0000545- (id)_initWithNodeFilter:(WebCore::NodeFilter *)impl
cblu1846a5a2004-04-29 02:05:28 +0000546{
kociendaf6ea03e2004-05-04 22:38:00 +0000547 ASSERT(impl);
548
549 [super _init];
weinig4f67b132006-09-24 19:34:43 +0000550 _internal = reinterpret_cast<DOMObjectInternal*>(impl);
kociendaf6ea03e2004-05-04 22:38:00 +0000551 impl->ref();
weinigb5e08162006-10-09 23:49:21 +0000552 WebCore::addDOMWrapper(self, impl);
kociendaf6ea03e2004-05-04 22:38:00 +0000553 return self;
554}
555
weinig6d74c0d2006-09-18 21:40:34 +0000556+ (DOMNodeFilter *)_nodeFilterWith:(WebCore::NodeFilter *)impl
kociendaf6ea03e2004-05-04 22:38:00 +0000557{
558 if (!impl)
559 return nil;
560
561 id cachedInstance;
weinigb5e08162006-10-09 23:49:21 +0000562 cachedInstance = WebCore::getDOMWrapper(impl);
kociendaf6ea03e2004-05-04 22:38:00 +0000563 if (cachedInstance)
564 return [[cachedInstance retain] autorelease];
565
darinb9481ed2006-03-20 02:57:59 +0000566 return [[[self alloc] _initWithNodeFilter:impl] autorelease];
kociendaf6ea03e2004-05-04 22:38:00 +0000567}
568
weinig6d74c0d2006-09-18 21:40:34 +0000569- (WebCore::NodeFilter *)_nodeFilter
kociendaf6ea03e2004-05-04 22:38:00 +0000570{
weinig4f67b132006-09-24 19:34:43 +0000571 return reinterpret_cast<WebCore::NodeFilter*>(_internal);
kociendaf6ea03e2004-05-04 22:38:00 +0000572}
573
574- (void)dealloc
575{
576 if (_internal)
weinig4f67b132006-09-24 19:34:43 +0000577 reinterpret_cast<WebCore::NodeFilter*>(_internal)->deref();
kociendaf6ea03e2004-05-04 22:38:00 +0000578 [super dealloc];
579}
580
darin2de03ad2004-06-15 07:46:22 +0000581- (void)finalize
582{
583 if (_internal)
weinig4f67b132006-09-24 19:34:43 +0000584 reinterpret_cast<WebCore::NodeFilter*>(_internal)->deref();
darin2de03ad2004-06-15 07:46:22 +0000585 [super finalize];
586}
587
kociendaf6ea03e2004-05-04 22:38:00 +0000588- (short)acceptNode:(DOMNode *)node
589{
darinb9481ed2006-03-20 02:57:59 +0000590 return [self _nodeFilter]->acceptNode([node _node]);
cblu1846a5a2004-04-29 02:05:28 +0000591}
592
593@end
594
kociendaf6ea03e2004-05-04 22:38:00 +0000595
weiniga8192c02006-08-28 03:33:34 +0000596//------------------------------------------------------------------------------------------
weiniga8192c02006-08-28 03:33:34 +0000597// ObjCNodeFilterCondition
598
weinig6d74c0d2006-09-18 21:40:34 +0000599class ObjCNodeFilterCondition : public WebCore::NodeFilterCondition {
kociendaf6ea03e2004-05-04 22:38:00 +0000600public:
601 ObjCNodeFilterCondition(id <DOMNodeFilter>);
602 virtual ~ObjCNodeFilterCondition();
weinig6d74c0d2006-09-18 21:40:34 +0000603 virtual short acceptNode(WebCore::Node*) const;
darin8aa0b9c2004-06-15 05:33:44 +0000604
kociendaf6ea03e2004-05-04 22:38:00 +0000605private:
weinig6d74c0d2006-09-18 21:40:34 +0000606 ObjCNodeFilterCondition(const ObjCNodeFilterCondition&);
607 ObjCNodeFilterCondition &operator=(const ObjCNodeFilterCondition&);
darin8aa0b9c2004-06-15 05:33:44 +0000608
kociendaf6ea03e2004-05-04 22:38:00 +0000609 id <DOMNodeFilter> m_filter;
610};
611
612ObjCNodeFilterCondition::ObjCNodeFilterCondition(id <DOMNodeFilter> filter)
613 : m_filter(filter)
614{
615 ASSERT(m_filter);
darin8aa0b9c2004-06-15 05:33:44 +0000616 CFRetain(m_filter);
kociendaf6ea03e2004-05-04 22:38:00 +0000617}
618
619ObjCNodeFilterCondition::~ObjCNodeFilterCondition()
620{
darin8aa0b9c2004-06-15 05:33:44 +0000621 CFRelease(m_filter);
kociendaf6ea03e2004-05-04 22:38:00 +0000622}
623
weinig6d74c0d2006-09-18 21:40:34 +0000624short ObjCNodeFilterCondition::acceptNode(WebCore::Node* node) const
kociendaf6ea03e2004-05-04 22:38:00 +0000625{
darincfa71ee2005-05-18 21:10:26 +0000626 if (!node)
weinig6d74c0d2006-09-18 21:40:34 +0000627 return WebCore::NodeFilter::FILTER_REJECT;
darinb9481ed2006-03-20 02:57:59 +0000628 return [m_filter acceptNode:[DOMNode _nodeWith:node]];
kociendaf6ea03e2004-05-04 22:38:00 +0000629}
630
weiniga8192c02006-08-28 03:33:34 +0000631
632//------------------------------------------------------------------------------------------
633// DOMDocument (DOMDocumentTraversal)
634
weinigb5e08162006-10-09 23:49:21 +0000635// FIXME: this should be auto-generated in DOMDocument.mm
kociendaf6ea03e2004-05-04 22:38:00 +0000636@implementation DOMDocument (DOMDocumentTraversal)
637
thatcheraacdbc62006-09-25 19:04:09 +0000638- (DOMNodeIterator *)createNodeIterator:(DOMNode *)root whatToShow:(unsigned)whatToShow filter:(id <DOMNodeFilter>)filter expandEntityReferences:(BOOL)expandEntityReferences
kociendaf6ea03e2004-05-04 22:38:00 +0000639{
weinig6d74c0d2006-09-18 21:40:34 +0000640 RefPtr<WebCore::NodeFilter> cppFilter;
darin85c3a502006-02-17 01:08:41 +0000641 if (filter)
weinig6d74c0d2006-09-18 21:40:34 +0000642 cppFilter = new WebCore::NodeFilter(new ObjCNodeFilterCondition(filter));
643 WebCore::ExceptionCode ec = 0;
644 RefPtr<WebCore::NodeIterator> impl = [self _document]->createNodeIterator([root _node], whatToShow, cppFilter, expandEntityReferences, ec);
weinigb5e08162006-10-09 23:49:21 +0000645 WebCore::raiseOnDOMError(ec);
darinb9481ed2006-03-20 02:57:59 +0000646 return [DOMNodeIterator _nodeIteratorWith:impl.get() filter:filter];
kociendaf6ea03e2004-05-04 22:38:00 +0000647}
648
thatcheraacdbc62006-09-25 19:04:09 +0000649- (DOMTreeWalker *)createTreeWalker:(DOMNode *)root whatToShow:(unsigned)whatToShow filter:(id <DOMNodeFilter>)filter expandEntityReferences:(BOOL)expandEntityReferences
kociendaf6ea03e2004-05-04 22:38:00 +0000650{
weinig6d74c0d2006-09-18 21:40:34 +0000651 RefPtr<WebCore::NodeFilter> cppFilter;
darin85c3a502006-02-17 01:08:41 +0000652 if (filter)
weinig6d74c0d2006-09-18 21:40:34 +0000653 cppFilter = new WebCore::NodeFilter(new ObjCNodeFilterCondition(filter));
654 WebCore::ExceptionCode ec = 0;
655 RefPtr<WebCore::TreeWalker> impl = [self _document]->createTreeWalker([root _node], whatToShow, cppFilter, expandEntityReferences, ec);
weinigb5e08162006-10-09 23:49:21 +0000656 WebCore::raiseOnDOMError(ec);
darinb9481ed2006-03-20 02:57:59 +0000657 return [DOMTreeWalker _treeWalkerWith:impl.get() filter:filter];
cblu1846a5a2004-04-29 02:05:28 +0000658}
659
660@end
661
thatcheraacdbc62006-09-25 19:04:09 +0000662@implementation DOMDocument (DOMDocumentTraversalDeprecated)
663
664- (DOMNodeIterator *)createNodeIterator:(DOMNode *)root :(unsigned)whatToShow :(id <DOMNodeFilter>)filter :(BOOL)expandEntityReferences
665{
666 return [self createNodeIterator:root whatToShow:whatToShow filter:filter expandEntityReferences:expandEntityReferences];
667}
668
669- (DOMTreeWalker *)createTreeWalker:(DOMNode *)root :(unsigned)whatToShow :(id <DOMNodeFilter>)filter :(BOOL)expandEntityReferences
670{
671 return [self createTreeWalker:root whatToShow:whatToShow filter:filter expandEntityReferences:expandEntityReferences];
672}
673
674@end
weiniga8192c02006-08-28 03:33:34 +0000675
weinigc0f8d232006-10-11 03:46:36 +0000676
weiniga8192c02006-08-28 03:33:34 +0000677//------------------------------------------------------------------------------------------
678// ObjCEventListener
679
weinigc0f8d232006-10-11 03:46:36 +0000680namespace WebCore {
681
darin7f1d1702006-05-10 07:12:56 +0000682ObjCEventListener* ObjCEventListener::find(id <DOMEventListener> listener)
ggarena5ee9a42005-09-20 07:55:54 +0000683{
darin7f1d1702006-05-10 07:12:56 +0000684 if (ListenerMap* map = listenerMap)
ggarena5ee9a42005-09-20 07:55:54 +0000685 return map->get(listener);
weinig6d74c0d2006-09-18 21:40:34 +0000686 return 0;
ggarena5ee9a42005-09-20 07:55:54 +0000687}
688
689ObjCEventListener *ObjCEventListener::create(id <DOMEventListener> listener)
690{
weinig6d74c0d2006-09-18 21:40:34 +0000691 ObjCEventListener* wrapper = find(listener);
ggarena5ee9a42005-09-20 07:55:54 +0000692 if (!wrapper)
693 wrapper = new ObjCEventListener(listener);
694 wrapper->ref();
695 return wrapper;
696}
697
698ObjCEventListener::ObjCEventListener(id <DOMEventListener> listener)
699 : m_listener([listener retain])
700{
darin7f1d1702006-05-10 07:12:56 +0000701 ListenerMap* map = listenerMap;
ggarena5ee9a42005-09-20 07:55:54 +0000702 if (!map) {
703 map = new ListenerMap;
704 listenerMap = map;
705 }
mjsf0250682005-09-28 22:01:41 +0000706 map->set(listener, this);
ggarena5ee9a42005-09-20 07:55:54 +0000707}
708
709ObjCEventListener::~ObjCEventListener()
710{
711 listenerMap->remove(m_listener);
712 [m_listener release];
713}
714
weinigc0f8d232006-10-11 03:46:36 +0000715void ObjCEventListener::handleEvent(Event* event, bool)
ggarena5ee9a42005-09-20 07:55:54 +0000716{
darinb9481ed2006-03-20 02:57:59 +0000717 [m_listener handleEvent:[DOMEvent _eventWith:event]];
ggarena5ee9a42005-09-20 07:55:54 +0000718}
weinigc0f8d232006-10-11 03:46:36 +0000719
720} // namespace WebCore