blob: 3fd28d1b92dc66ec38de4ccd77c93e1df3d340d6 [file] [log] [blame]
kocienda03a86c72004-02-26 19:16:09 +00001/*
darin@apple.comea40f5a2009-04-17 19:16:19 +00002 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
ddkilzera7bfea32006-06-24 20:51:21 +00003 * 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"
darin@apple.comea40f5a2009-04-17 19:16:19 +000029#import "DOMInternal.h" // import first to make the private/public trick work
kocienda49ed5392004-03-11 23:37:58 +000030#import "DOM.h"
kocienda03a86c72004-02-26 19:16:09 +000031
darin@apple.comea40f5a2009-04-17 19:16:19 +000032#import "DOMRangeInternal.h"
33#import "DOMElementInternal.h"
34#import "DOMNodeInternal.h"
darin45471112007-03-13 00:49:02 +000035#import "DOMHTMLCanvasElement.h"
mrowe@apple.comfc8aa692009-03-09 03:44:38 +000036#import "Frame.h"
darinb4483822006-06-02 06:30:49 +000037#import "HTMLNames.h"
darin@apple.comea40f5a2009-04-17 19:16:19 +000038#import "HTMLElement.h"
darinb9481ed2006-03-20 02:57:59 +000039#import "RenderImage.h"
darin@apple.comea40f5a2009-04-17 19:16:19 +000040#import "NodeFilter.h"
41#import "WebScriptObjectPrivate.h"
weinigac936282006-09-29 20:29:16 +000042#import <wtf/HashMap.h>
kocienda03a86c72004-02-26 19:16:09 +000043
ddkilzer@apple.com28c34e32009-04-09 16:33:15 +000044#if ENABLE(SVG_DOM_OBJC_BINDINGS)
eseidelbaf9f6b2007-10-23 03:49:17 +000045#import "DOMSVG.h"
darin@apple.comea40f5a2009-04-17 19:16:19 +000046#import "SVGElementInstance.h"
weinigc0f8d232006-10-11 03:46:36 +000047#endif
darin8d1badc2006-03-06 16:50:13 +000048
cwzwarich@webkit.org3f782f62008-09-08 01:28:33 +000049using namespace JSC;
darin@apple.come4f9a662008-02-08 10:35:20 +000050using namespace WebCore;
51
darin@apple.comea40f5a2009-04-17 19:16:19 +000052// FIXME: Would be nice to break this up into separate files to match how other WebKit
53// code is organized.
54
kocienda03a86c72004-02-26 19:16:09 +000055//------------------------------------------------------------------------------------------
kociendaf9c26e62004-03-03 00:42:49 +000056// DOMNode
57
weinigc0f8d232006-10-11 03:46:36 +000058namespace WebCore {
59
sullivan70d47642006-10-11 23:15:18 +000060typedef HashMap<const QualifiedName::QualifiedNameImpl*, Class> ObjCClassMap;
weinigc0f8d232006-10-11 03:46:36 +000061static ObjCClassMap* elementClassMap;
62
63static void addElementClass(const QualifiedName& tag, Class objCClass)
darin7f1d1702006-05-10 07:12:56 +000064{
sullivan70d47642006-10-11 23:15:18 +000065 elementClassMap->set(tag.impl(), objCClass);
darin7f1d1702006-05-10 07:12:56 +000066}
67
weinigc0f8d232006-10-11 03:46:36 +000068static void createElementClassMap()
darin7f1d1702006-05-10 07:12:56 +000069{
70 // Create the table.
71 elementClassMap = new ObjCClassMap;
darin7f1d1702006-05-10 07:12:56 +000072
73 // FIXME: Reflect marquee once the API has been determined.
weinigc0f8d232006-10-11 03:46:36 +000074
75 // Populate it with HTML and SVG element classes.
76 addElementClass(HTMLNames::aTag, [DOMHTMLAnchorElement class]);
77 addElementClass(HTMLNames::appletTag, [DOMHTMLAppletElement class]);
78 addElementClass(HTMLNames::areaTag, [DOMHTMLAreaElement class]);
79 addElementClass(HTMLNames::baseTag, [DOMHTMLBaseElement class]);
80 addElementClass(HTMLNames::basefontTag, [DOMHTMLBaseFontElement class]);
81 addElementClass(HTMLNames::bodyTag, [DOMHTMLBodyElement class]);
82 addElementClass(HTMLNames::brTag, [DOMHTMLBRElement class]);
83 addElementClass(HTMLNames::buttonTag, [DOMHTMLButtonElement class]);
darin45471112007-03-13 00:49:02 +000084 addElementClass(HTMLNames::canvasTag, [DOMHTMLCanvasElement class]);
weinigc0f8d232006-10-11 03:46:36 +000085 addElementClass(HTMLNames::captionTag, [DOMHTMLTableCaptionElement class]);
86 addElementClass(HTMLNames::colTag, [DOMHTMLTableColElement class]);
87 addElementClass(HTMLNames::colgroupTag, [DOMHTMLTableColElement class]);
darin45471112007-03-13 00:49:02 +000088 addElementClass(HTMLNames::delTag, [DOMHTMLModElement class]);
weinigc0f8d232006-10-11 03:46:36 +000089 addElementClass(HTMLNames::dirTag, [DOMHTMLDirectoryElement class]);
90 addElementClass(HTMLNames::divTag, [DOMHTMLDivElement class]);
91 addElementClass(HTMLNames::dlTag, [DOMHTMLDListElement class]);
darin45471112007-03-13 00:49:02 +000092 addElementClass(HTMLNames::embedTag, [DOMHTMLEmbedElement class]);
weinigc0f8d232006-10-11 03:46:36 +000093 addElementClass(HTMLNames::fieldsetTag, [DOMHTMLFieldSetElement class]);
94 addElementClass(HTMLNames::fontTag, [DOMHTMLFontElement class]);
95 addElementClass(HTMLNames::formTag, [DOMHTMLFormElement class]);
96 addElementClass(HTMLNames::frameTag, [DOMHTMLFrameElement class]);
97 addElementClass(HTMLNames::framesetTag, [DOMHTMLFrameSetElement class]);
98 addElementClass(HTMLNames::h1Tag, [DOMHTMLHeadingElement class]);
99 addElementClass(HTMLNames::h2Tag, [DOMHTMLHeadingElement class]);
100 addElementClass(HTMLNames::h3Tag, [DOMHTMLHeadingElement class]);
101 addElementClass(HTMLNames::h4Tag, [DOMHTMLHeadingElement class]);
102 addElementClass(HTMLNames::h5Tag, [DOMHTMLHeadingElement class]);
103 addElementClass(HTMLNames::h6Tag, [DOMHTMLHeadingElement class]);
104 addElementClass(HTMLNames::headTag, [DOMHTMLHeadElement class]);
105 addElementClass(HTMLNames::hrTag, [DOMHTMLHRElement class]);
106 addElementClass(HTMLNames::htmlTag, [DOMHTMLHtmlElement class]);
107 addElementClass(HTMLNames::iframeTag, [DOMHTMLIFrameElement class]);
108 addElementClass(HTMLNames::imgTag, [DOMHTMLImageElement class]);
109 addElementClass(HTMLNames::inputTag, [DOMHTMLInputElement class]);
darin45471112007-03-13 00:49:02 +0000110 addElementClass(HTMLNames::insTag, [DOMHTMLModElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000111 addElementClass(HTMLNames::isindexTag, [DOMHTMLIsIndexElement class]);
112 addElementClass(HTMLNames::labelTag, [DOMHTMLLabelElement class]);
113 addElementClass(HTMLNames::legendTag, [DOMHTMLLegendElement class]);
114 addElementClass(HTMLNames::liTag, [DOMHTMLLIElement class]);
115 addElementClass(HTMLNames::linkTag, [DOMHTMLLinkElement class]);
116 addElementClass(HTMLNames::listingTag, [DOMHTMLPreElement class]);
117 addElementClass(HTMLNames::mapTag, [DOMHTMLMapElement class]);
weinig40d22ab2007-05-23 01:26:00 +0000118 addElementClass(HTMLNames::marqueeTag, [DOMHTMLMarqueeElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000119 addElementClass(HTMLNames::menuTag, [DOMHTMLMenuElement class]);
120 addElementClass(HTMLNames::metaTag, [DOMHTMLMetaElement class]);
121 addElementClass(HTMLNames::objectTag, [DOMHTMLObjectElement class]);
122 addElementClass(HTMLNames::olTag, [DOMHTMLOListElement class]);
123 addElementClass(HTMLNames::optgroupTag, [DOMHTMLOptGroupElement class]);
124 addElementClass(HTMLNames::optionTag, [DOMHTMLOptionElement class]);
125 addElementClass(HTMLNames::pTag, [DOMHTMLParagraphElement class]);
126 addElementClass(HTMLNames::paramTag, [DOMHTMLParamElement class]);
127 addElementClass(HTMLNames::preTag, [DOMHTMLPreElement class]);
128 addElementClass(HTMLNames::qTag, [DOMHTMLQuoteElement class]);
129 addElementClass(HTMLNames::scriptTag, [DOMHTMLScriptElement class]);
kdeckerb42fb662007-03-06 22:38:17 +0000130 addElementClass(HTMLNames::keygenTag, [DOMHTMLSelectElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000131 addElementClass(HTMLNames::selectTag, [DOMHTMLSelectElement class]);
132 addElementClass(HTMLNames::styleTag, [DOMHTMLStyleElement class]);
133 addElementClass(HTMLNames::tableTag, [DOMHTMLTableElement class]);
134 addElementClass(HTMLNames::tbodyTag, [DOMHTMLTableSectionElement class]);
135 addElementClass(HTMLNames::tdTag, [DOMHTMLTableCellElement class]);
136 addElementClass(HTMLNames::textareaTag, [DOMHTMLTextAreaElement class]);
137 addElementClass(HTMLNames::tfootTag, [DOMHTMLTableSectionElement class]);
darin45471112007-03-13 00:49:02 +0000138 addElementClass(HTMLNames::thTag, [DOMHTMLTableCellElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000139 addElementClass(HTMLNames::theadTag, [DOMHTMLTableSectionElement class]);
140 addElementClass(HTMLNames::titleTag, [DOMHTMLTitleElement class]);
141 addElementClass(HTMLNames::trTag, [DOMHTMLTableRowElement class]);
142 addElementClass(HTMLNames::ulTag, [DOMHTMLUListElement class]);
darin45471112007-03-13 00:49:02 +0000143 addElementClass(HTMLNames::xmpTag, [DOMHTMLPreElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000144
ddkilzer@apple.com28c34e32009-04-09 16:33:15 +0000145#if ENABLE(SVG_DOM_OBJC_BINDINGS)
weinigc0f8d232006-10-11 03:46:36 +0000146 addElementClass(SVGNames::aTag, [DOMSVGAElement class]);
mjs@apple.com283503e2008-03-24 05:36:30 +0000147 addElementClass(SVGNames::altGlyphTag, [DOMSVGAltGlyphElement class]);
oliver@apple.com22b1ad92007-12-09 00:27:57 +0000148#if ENABLE(SVG_ANIMATION)
weinigc0f8d232006-10-11 03:46:36 +0000149 addElementClass(SVGNames::animateTag, [DOMSVGAnimateElement class]);
150 addElementClass(SVGNames::animateColorTag, [DOMSVGAnimateColorElement class]);
151 addElementClass(SVGNames::animateTransformTag, [DOMSVGAnimateTransformElement class]);
antti@apple.com39ef7d12008-04-11 20:33:29 +0000152 addElementClass(SVGNames::setTag, [DOMSVGSetElement class]);
mjsd2948ef2007-02-26 19:29:04 +0000153#endif
weinigc0f8d232006-10-11 03:46:36 +0000154 addElementClass(SVGNames::circleTag, [DOMSVGCircleElement class]);
155 addElementClass(SVGNames::clipPathTag, [DOMSVGClipPathElement class]);
156 addElementClass(SVGNames::cursorTag, [DOMSVGCursorElement class]);
oliver@apple.com22b1ad92007-12-09 00:27:57 +0000157#if ENABLE(SVG_FONTS)
zimmermann@webkit.orgfe31d2d2007-12-23 12:30:24 +0000158 addElementClass(SVGNames::definition_srcTag, [DOMSVGDefinitionSrcElement class]);
oliver@apple.com22b1ad92007-12-09 00:27:57 +0000159#endif
zimmermann@webkit.orgfe31d2d2007-12-23 12:30:24 +0000160 addElementClass(SVGNames::defsTag, [DOMSVGDefsElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000161 addElementClass(SVGNames::descTag, [DOMSVGDescElement class]);
162 addElementClass(SVGNames::ellipseTag, [DOMSVGEllipseElement class]);
krit@webkit.orgbfb80bf2009-05-28 22:10:29 +0000163#if ENABLE(FILTERS)
weinigc0f8d232006-10-11 03:46:36 +0000164 addElementClass(SVGNames::feBlendTag, [DOMSVGFEBlendElement class]);
165 addElementClass(SVGNames::feColorMatrixTag, [DOMSVGFEColorMatrixElement class]);
166 addElementClass(SVGNames::feComponentTransferTag, [DOMSVGFEComponentTransferElement class]);
167 addElementClass(SVGNames::feCompositeTag, [DOMSVGFECompositeElement class]);
168 addElementClass(SVGNames::feDiffuseLightingTag, [DOMSVGFEDiffuseLightingElement class]);
169 addElementClass(SVGNames::feDisplacementMapTag, [DOMSVGFEDisplacementMapElement class]);
170 addElementClass(SVGNames::feDistantLightTag, [DOMSVGFEDistantLightElement class]);
171 addElementClass(SVGNames::feFloodTag, [DOMSVGFEFloodElement class]);
172 addElementClass(SVGNames::feFuncATag, [DOMSVGFEFuncAElement class]);
173 addElementClass(SVGNames::feFuncBTag, [DOMSVGFEFuncBElement class]);
174 addElementClass(SVGNames::feFuncGTag, [DOMSVGFEFuncGElement class]);
175 addElementClass(SVGNames::feFuncRTag, [DOMSVGFEFuncRElement class]);
176 addElementClass(SVGNames::feGaussianBlurTag, [DOMSVGFEGaussianBlurElement class]);
177 addElementClass(SVGNames::feImageTag, [DOMSVGFEImageElement class]);
178 addElementClass(SVGNames::feMergeTag, [DOMSVGFEMergeElement class]);
179 addElementClass(SVGNames::feMergeNodeTag, [DOMSVGFEMergeNodeElement class]);
180 addElementClass(SVGNames::feOffsetTag, [DOMSVGFEOffsetElement class]);
181 addElementClass(SVGNames::fePointLightTag, [DOMSVGFEPointLightElement class]);
182 addElementClass(SVGNames::feSpecularLightingTag, [DOMSVGFESpecularLightingElement class]);
183 addElementClass(SVGNames::feSpotLightTag, [DOMSVGFESpotLightElement class]);
184 addElementClass(SVGNames::feTileTag, [DOMSVGFETileElement class]);
185 addElementClass(SVGNames::feTurbulenceTag, [DOMSVGFETurbulenceElement class]);
186 addElementClass(SVGNames::filterTag, [DOMSVGFilterElement class]);
mjsd2948ef2007-02-26 19:29:04 +0000187#endif
oliver@apple.com22b1ad92007-12-09 00:27:57 +0000188#if ENABLE(SVG_FONTS)
zimmermann@webkit.orgce57f042007-12-29 02:41:53 +0000189 addElementClass(SVGNames::fontTag, [DOMSVGFontElement class]);
eseidelbaf9f6b2007-10-23 03:49:17 +0000190 addElementClass(SVGNames::font_faceTag, [DOMSVGFontFaceElement class]);
191 addElementClass(SVGNames::font_face_formatTag, [DOMSVGFontFaceFormatElement class]);
192 addElementClass(SVGNames::font_face_nameTag, [DOMSVGFontFaceNameElement class]);
193 addElementClass(SVGNames::font_face_srcTag, [DOMSVGFontFaceSrcElement class]);
194 addElementClass(SVGNames::font_face_uriTag, [DOMSVGFontFaceUriElement class]);
zimmermann@webkit.orgce57f042007-12-29 02:41:53 +0000195 addElementClass(SVGNames::glyphTag, [DOMSVGGlyphElement class]);
oliver@apple.com22b1ad92007-12-09 00:27:57 +0000196#endif
weinigc0f8d232006-10-11 03:46:36 +0000197 addElementClass(SVGNames::gTag, [DOMSVGGElement class]);
198 addElementClass(SVGNames::imageTag, [DOMSVGImageElement class]);
199 addElementClass(SVGNames::lineTag, [DOMSVGLineElement class]);
200 addElementClass(SVGNames::linearGradientTag, [DOMSVGLinearGradientElement class]);
201 addElementClass(SVGNames::markerTag, [DOMSVGMarkerElement class]);
202 addElementClass(SVGNames::maskTag, [DOMSVGMaskElement class]);
203 addElementClass(SVGNames::metadataTag, [DOMSVGMetadataElement class]);
zimmermann@webkit.orgce57f042007-12-29 02:41:53 +0000204#if ENABLE(SVG_FONTS)
205 addElementClass(SVGNames::missing_glyphTag, [DOMSVGMissingGlyphElement class]);
206#endif
weinigc0f8d232006-10-11 03:46:36 +0000207 addElementClass(SVGNames::pathTag, [DOMSVGPathElement class]);
208 addElementClass(SVGNames::patternTag, [DOMSVGPatternElement class]);
209 addElementClass(SVGNames::polygonTag, [DOMSVGPolygonElement class]);
210 addElementClass(SVGNames::polylineTag, [DOMSVGPolylineElement class]);
211 addElementClass(SVGNames::radialGradientTag, [DOMSVGRadialGradientElement class]);
212 addElementClass(SVGNames::rectTag, [DOMSVGRectElement class]);
213 addElementClass(SVGNames::scriptTag, [DOMSVGScriptElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000214 addElementClass(SVGNames::stopTag, [DOMSVGStopElement class]);
215 addElementClass(SVGNames::styleTag, [DOMSVGStyleElement class]);
216 addElementClass(SVGNames::svgTag, [DOMSVGSVGElement class]);
217 addElementClass(SVGNames::switchTag, [DOMSVGSwitchElement class]);
218 addElementClass(SVGNames::symbolTag, [DOMSVGSymbolElement class]);
219 addElementClass(SVGNames::textTag, [DOMSVGTextElement class]);
220 addElementClass(SVGNames::titleTag, [DOMSVGTitleElement class]);
221 addElementClass(SVGNames::trefTag, [DOMSVGTRefElement class]);
222 addElementClass(SVGNames::tspanTag, [DOMSVGTSpanElement class]);
oliver25a9ee82007-10-12 13:18:43 +0000223 addElementClass(SVGNames::textPathTag, [DOMSVGTextPathElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000224 addElementClass(SVGNames::useTag, [DOMSVGUseElement class]);
225 addElementClass(SVGNames::viewTag, [DOMSVGViewElement class]);
226#endif
darin7f1d1702006-05-10 07:12:56 +0000227}
228
olivere36c4062007-10-12 14:07:59 +0000229static Class lookupElementClass(const QualifiedName& tag)
230{
231 // Do a special lookup to ignore element prefixes
232 if (tag.hasPrefix())
233 return elementClassMap->get(QualifiedName(nullAtom, tag.localName(), tag.namespaceURI()).impl());
234
235 return elementClassMap->get(tag.impl());
236}
237
weinigc0f8d232006-10-11 03:46:36 +0000238static Class elementClass(const QualifiedName& tag, Class defaultClass)
darin7f1d1702006-05-10 07:12:56 +0000239{
240 if (!elementClassMap)
weinigc0f8d232006-10-11 03:46:36 +0000241 createElementClassMap();
olivere36c4062007-10-12 14:07:59 +0000242 Class objcClass = lookupElementClass(tag);
darin7f1d1702006-05-10 07:12:56 +0000243 if (!objcClass)
weinigc0f8d232006-10-11 03:46:36 +0000244 objcClass = defaultClass;
darin7f1d1702006-05-10 07:12:56 +0000245 return objcClass;
246}
247
thatcherb7557c22006-11-08 22:24:26 +0000248static NSArray *kit(const Vector<IntRect>& rects)
249{
250 size_t size = rects.size();
251 NSMutableArray *array = [NSMutableArray arrayWithCapacity:size];
252 for (size_t i = 0; i < size; ++i)
253 [array addObject:[NSValue valueWithRect:rects[i]]];
254 return array;
255}
256
weinigc0f8d232006-10-11 03:46:36 +0000257} // namespace WebCore
258
kociendaf9c26e62004-03-03 00:42:49 +0000259@implementation DOMNode (WebCoreInternal)
kocienda03a86c72004-02-26 19:16:09 +0000260
weiniga8192c02006-08-28 03:33:34 +0000261- (NSString *)description
262{
weinigc6bbaeb2006-09-15 22:23:50 +0000263 if (!_internal)
264 return [NSString stringWithFormat:@"<%@: null>", [[self class] description], self];
weinigc0f8d232006-10-11 03:46:36 +0000265
weiniga8192c02006-08-28 03:33:34 +0000266 NSString *value = [self nodeValue];
weinigc6bbaeb2006-09-15 22:23:50 +0000267 if (value)
weiniga8192c02006-08-28 03:33:34 +0000268 return [NSString stringWithFormat:@"<%@ [%@]: %p '%@'>",
269 [[self class] description], [self nodeName], _internal, value];
weinigc6bbaeb2006-09-15 22:23:50 +0000270
271 return [NSString stringWithFormat:@"<%@ [%@]: %p>", [[self class] description], [self nodeName], _internal];
weiniga8192c02006-08-28 03:33:34 +0000272}
273
darin@apple.comea40f5a2009-04-17 19:16:19 +0000274- (JSC::Bindings::RootObject*)_rootObject
kocienda117559f2004-03-01 17:04:26 +0000275{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000276 WebCore::Frame* frame = core(self)->document()->frame();
277 if (!frame)
278 return 0;
279 return frame->script()->bindingRootObject();
kocienda117559f2004-03-01 17:04:26 +0000280}
281
darin@apple.comea40f5a2009-04-17 19:16:19 +0000282@end
283
284Class kitClass(WebCore::Node* impl)
kocienda117559f2004-03-01 17:04:26 +0000285{
kociendaf9c26e62004-03-03 00:42:49 +0000286 switch (impl->nodeType()) {
weinig6d74c0d2006-09-18 21:40:34 +0000287 case WebCore::Node::ELEMENT_NODE:
darin7f1d1702006-05-10 07:12:56 +0000288 if (impl->isHTMLElement())
darin@apple.comea40f5a2009-04-17 19:16:19 +0000289 return WebCore::elementClass(static_cast<WebCore::HTMLElement*>(impl)->tagQName(), [DOMHTMLElement class]);
ddkilzer@apple.com28c34e32009-04-09 16:33:15 +0000290#if ENABLE(SVG_DOM_OBJC_BINDINGS)
darin@apple.comea40f5a2009-04-17 19:16:19 +0000291 if (impl->isSVGElement())
292 return WebCore::elementClass(static_cast<WebCore::SVGElement*>(impl)->tagQName(), [DOMSVGElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000293#endif
darin@apple.comea40f5a2009-04-17 19:16:19 +0000294 return [DOMElement class];
weinig6d74c0d2006-09-18 21:40:34 +0000295 case WebCore::Node::ATTRIBUTE_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000296 return [DOMAttr class];
weinig6d74c0d2006-09-18 21:40:34 +0000297 case WebCore::Node::TEXT_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000298 return [DOMText class];
weinig6d74c0d2006-09-18 21:40:34 +0000299 case WebCore::Node::CDATA_SECTION_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000300 return [DOMCDATASection class];
weinig6d74c0d2006-09-18 21:40:34 +0000301 case WebCore::Node::ENTITY_REFERENCE_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000302 return [DOMEntityReference class];
weinig6d74c0d2006-09-18 21:40:34 +0000303 case WebCore::Node::ENTITY_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000304 return [DOMEntity class];
weinig6d74c0d2006-09-18 21:40:34 +0000305 case WebCore::Node::PROCESSING_INSTRUCTION_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000306 return [DOMProcessingInstruction class];
weinig6d74c0d2006-09-18 21:40:34 +0000307 case WebCore::Node::COMMENT_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000308 return [DOMComment class];
weinig6d74c0d2006-09-18 21:40:34 +0000309 case WebCore::Node::DOCUMENT_NODE:
310 if (static_cast<WebCore::Document*>(impl)->isHTMLDocument())
darin@apple.comea40f5a2009-04-17 19:16:19 +0000311 return [DOMHTMLDocument class];
ddkilzer@apple.com28c34e32009-04-09 16:33:15 +0000312#if ENABLE(SVG_DOM_OBJC_BINDINGS)
darin@apple.comea40f5a2009-04-17 19:16:19 +0000313 if (static_cast<WebCore::Document*>(impl)->isSVGDocument())
314 return [DOMSVGDocument class];
weinigc0f8d232006-10-11 03:46:36 +0000315#endif
darin@apple.comea40f5a2009-04-17 19:16:19 +0000316 return [DOMDocument class];
weinig6d74c0d2006-09-18 21:40:34 +0000317 case WebCore::Node::DOCUMENT_TYPE_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000318 return [DOMDocumentType class];
weinig6d74c0d2006-09-18 21:40:34 +0000319 case WebCore::Node::DOCUMENT_FRAGMENT_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000320 return [DOMDocumentFragment class];
weinig6d74c0d2006-09-18 21:40:34 +0000321 case WebCore::Node::NOTATION_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000322 return [DOMNotation class];
weinig6d74c0d2006-09-18 21:40:34 +0000323 case WebCore::Node::XPATH_NAMESPACE_NODE:
andersca75fd42c2006-05-08 21:27:25 +0000324 // FIXME: Create an XPath objective C wrapper
darinc370e7e2006-11-08 05:52:27 +0000325 // See http://bugs.webkit.org/show_bug.cgi?id=8755
andersca75fd42c2006-05-08 21:27:25 +0000326 return nil;
kociendabb0f4522004-03-02 17:03:56 +0000327 }
darin@apple.comea40f5a2009-04-17 19:16:19 +0000328 ASSERT_NOT_REACHED();
weinig6b675332006-09-16 03:30:49 +0000329 return nil;
330}
331
darin@apple.comea40f5a2009-04-17 19:16:19 +0000332id <DOMEventTarget> kit(WebCore::EventTarget* eventTarget)
zimmermann@webkit.org29d22032008-09-23 23:44:20 +0000333{
334 if (!eventTarget)
335 return nil;
336
darin@apple.comea40f5a2009-04-17 19:16:19 +0000337 if (WebCore::Node* node = eventTarget->toNode())
338 return kit(node);
339
340#if ENABLE(SVG_DOM_OBJC_BINDINGS)
341 if (WebCore::SVGElementInstance* svgElementInstance = eventTarget->toSVGElementInstance())
342 return kit(svgElementInstance);
343#endif
344
345 // We don't have an ObjC binding for XMLHttpRequest.
346
347 return nil;
zimmermann@webkit.org29d22032008-09-23 23:44:20 +0000348}
349
darin@apple.comea40f5a2009-04-17 19:16:19 +0000350@implementation DOMNode (DOMNodeExtensions)
351
352- (NSRect)boundingBox
zimmermann@webkit.org29d22032008-09-23 23:44:20 +0000353{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000354 // FIXME: Could we move this function to WebCore::Node and autogenerate?
355 core(self)->document()->updateLayoutIgnorePendingStylesheets();
356 WebCore::RenderObject* renderer = core(self)->renderer();
357 if (!renderer)
358 return NSZeroRect;
359 return renderer->absoluteBoundingBoxRect();
360}
361
timothy@apple.comdf6a4052009-04-29 00:17:07 +0000362- (NSArray *)textRects
darin@apple.comea40f5a2009-04-17 19:16:19 +0000363{
364 // FIXME: Could we move this function to WebCore::Node and autogenerate?
365 core(self)->document()->updateLayoutIgnorePendingStylesheets();
timothy@apple.comdf6a4052009-04-29 00:17:07 +0000366 if (!core(self)->renderer())
darin@apple.comea40f5a2009-04-17 19:16:19 +0000367 return nil;
timothy@apple.comdf6a4052009-04-29 00:17:07 +0000368 RefPtr<Range> range = Range::create(core(self)->document());
369 WebCore::ExceptionCode ec = 0;
370 range->selectNodeContents(core(self), ec);
darin@apple.comea40f5a2009-04-17 19:16:19 +0000371 Vector<WebCore::IntRect> rects;
timothy@apple.comdf6a4052009-04-29 00:17:07 +0000372 range->textRects(rects);
darin@apple.comea40f5a2009-04-17 19:16:19 +0000373 return kit(rects);
zimmermann@webkit.org29d22032008-09-23 23:44:20 +0000374}
375
timothy@apple.comdf6a4052009-04-29 00:17:07 +0000376- (NSArray *)lineBoxRects
377{
378 return [self textRects];
379}
380
zimmermann@webkit.org29d22032008-09-23 23:44:20 +0000381@end
zimmermann@webkit.org29d22032008-09-23 23:44:20 +0000382
timothy@apple.com43203432008-09-12 04:44:40 +0000383@implementation DOMNode (DOMNodeExtensionsPendingPublic)
384
385- (NSImage *)renderedImage
386{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000387 // FIXME: Could we move this function to WebCore::Node and autogenerate?
388 WebCore::Node* node = core(self);
389 WebCore::Frame* frame = node->document()->frame();
390 if (!frame)
391 return nil;
392 return frame->nodeImage(node);
timothy@apple.com43203432008-09-12 04:44:40 +0000393}
394
395@end
396
thatcherb7557c22006-11-08 22:24:26 +0000397@implementation DOMRange (DOMRangeExtensions)
398
399- (NSRect)boundingBox
400{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000401 // FIXME: The call to updateLayoutIgnorePendingStylesheets should be moved into WebCore::Range.
402 core(self)->ownerDocument()->updateLayoutIgnorePendingStylesheets();
403 return core(self)->boundingBox();
thatcherb7557c22006-11-08 22:24:26 +0000404}
405
timothy@apple.comdf6a4052009-04-29 00:17:07 +0000406- (NSArray *)textRects
thatcherb7557c22006-11-08 22:24:26 +0000407{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000408 // FIXME: The call to updateLayoutIgnorePendingStylesheets should be moved into WebCore::Range.
thatcherb7557c22006-11-08 22:24:26 +0000409 Vector<WebCore::IntRect> rects;
darin@apple.comea40f5a2009-04-17 19:16:19 +0000410 core(self)->ownerDocument()->updateLayoutIgnorePendingStylesheets();
timothy@apple.comdf6a4052009-04-29 00:17:07 +0000411 core(self)->textRects(rects);
thatcherb7557c22006-11-08 22:24:26 +0000412 return kit(rects);
413}
414
timothy@apple.comdf6a4052009-04-29 00:17:07 +0000415- (NSArray *)lineBoxRects
416{
417 // FIXME: Remove this once all clients stop using it and we drop Leopard support.
418 return [self textRects];
419}
420
thatcherb7557c22006-11-08 22:24:26 +0000421@end
422
kociendabb0f4522004-03-02 17:03:56 +0000423//------------------------------------------------------------------------------------------
kocienda117559f2004-03-01 17:04:26 +0000424// DOMElement
425
weiniga8192c02006-08-28 03:33:34 +0000426@implementation DOMElement (DOMElementAppKitExtensions)
adele99881522005-11-15 02:05:45 +0000427
thatcher3166fbf2006-03-01 17:49:47 +0000428- (NSImage*)image
429{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000430 // FIXME: Could we move this function to WebCore::Node and autogenerate?
431 WebCore::RenderObject* renderer = core(self)->renderer();
432 if (!renderer || !renderer->isImage())
433 return nil;
434 WebCore::CachedImage* cachedImage = static_cast<WebCore::RenderImage*>(renderer)->cachedImage();
435 if (!cachedImage || cachedImage->errorOccurred())
436 return nil;
437 return cachedImage->image()->getNSImage();
thatcher3166fbf2006-03-01 17:49:47 +0000438}
439
adele99881522005-11-15 02:05:45 +0000440@end
441
cblu4dc540a2004-12-06 23:39:15 +0000442@implementation DOMElement (WebPrivate)
443
444- (NSFont *)_font
445{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000446 // FIXME: Could we move this function to WebCore::Element and autogenerate?
447 WebCore::RenderObject* renderer = core(self)->renderer();
448 if (!renderer)
449 return nil;
450 return renderer->style()->font().primaryFont()->getNSFont();
cblu4dc540a2004-12-06 23:39:15 +0000451}
452
weinigb5e08162006-10-09 23:49:21 +0000453- (NSData *)_imageTIFFRepresentation
hyatt3059a512006-02-02 08:40:45 +0000454{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000455 // FIXME: Could we move this function to WebCore::Element and autogenerate?
456 WebCore::RenderObject* renderer = core(self)->renderer();
457 if (!renderer || !renderer->isImage())
458 return nil;
459 WebCore::CachedImage* cachedImage = static_cast<WebCore::RenderImage*>(renderer)->cachedImage();
460 if (!cachedImage || cachedImage->errorOccurred())
461 return nil;
462 return (NSData *)cachedImage->image()->getTIFFRepresentation();
hyatt3059a512006-02-02 08:40:45 +0000463}
464
sullivan111f1102005-02-17 00:14:30 +0000465- (NSURL *)_getURLAttribute:(NSString *)name
466{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000467 // FIXME: Could we move this function to WebCore::Element and autogenerate?
sullivan111f1102005-02-17 00:14:30 +0000468 ASSERT(name);
darin@apple.comea40f5a2009-04-17 19:16:19 +0000469 WebCore::Element* element = core(self);
weinig6d74c0d2006-09-18 21:40:34 +0000470 ASSERT(element);
darin@apple.com640fa302008-02-15 05:03:55 +0000471 return element->document()->completeURL(parseURL(element->getAttribute(name)));
sullivan111f1102005-02-17 00:14:30 +0000472}
cblu4dc540a2004-12-06 23:39:15 +0000473
adele90285b72006-07-19 23:54:49 +0000474- (BOOL)isFocused
475{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000476 // FIXME: Could we move this function to WebCore::Element and autogenerate?
477 WebCore::Element* element = core(self);
478 return element->document()->focusedNode() == element;
adele90285b72006-07-19 23:54:49 +0000479}
480
sullivan111f1102005-02-17 00:14:30 +0000481@end
cblu4dc540a2004-12-06 23:39:15 +0000482
kocienda117559f2004-03-01 17:04:26 +0000483//------------------------------------------------------------------------------------------
kociendabb0f4522004-03-02 17:03:56 +0000484// DOMRange
485
weinigc0880e72006-10-07 17:24:56 +0000486@implementation DOMRange (WebPrivate)
darin2de03ad2004-06-15 07:46:22 +0000487
darin9649a0f2004-09-15 05:55:43 +0000488- (NSString *)description
489{
490 if (!_internal)
darin02ad24b2005-01-20 18:05:19 +0000491 return @"<DOMRange: null>";
adele704e8bb2005-09-16 22:42:30 +0000492 return [NSString stringWithFormat:@"<DOMRange: %@ %d %@ %d>",
weinig6d74c0d2006-09-18 21:40:34 +0000493 [self startContainer], [self startOffset], [self endContainer], [self endOffset]];
darin9649a0f2004-09-15 05:55:43 +0000494}
495
darin@apple.comea40f5a2009-04-17 19:16:19 +0000496// FIXME: This should be removed as soon as all internal Apple uses of it have been replaced with
weinigc0880e72006-10-07 17:24:56 +0000497// calls to the public method - (NSString *)text.
darin36cb7c22004-08-03 18:09:44 +0000498- (NSString *)_text
499{
thatcher2a6da872006-07-10 03:02:04 +0000500 return [self text];
darin36cb7c22004-08-03 18:09:44 +0000501}
502
503@end
504
kociendaf6ea03e2004-05-04 22:38:00 +0000505//------------------------------------------------------------------------------------------
weiniga8192c02006-08-28 03:33:34 +0000506// DOMNodeFilter
cblu1846a5a2004-04-29 02:05:28 +0000507
darin@apple.comea40f5a2009-04-17 19:16:19 +0000508DOMNodeFilter *kit(WebCore::NodeFilter* impl)
kociendaf6ea03e2004-05-04 22:38:00 +0000509{
510 if (!impl)
511 return nil;
darin@apple.comea40f5a2009-04-17 19:16:19 +0000512
513 if (DOMNodeFilter *wrapper = getDOMWrapper(impl))
514 return [[wrapper retain] autorelease];
515
516 DOMNodeFilter *wrapper = [[DOMNodeFilter alloc] _init];
517 wrapper->_internal = reinterpret_cast<DOMObjectInternal*>(impl);
518 impl->ref();
519 addDOMWrapper(wrapper, impl);
520 return [wrapper autorelease];
kociendaf6ea03e2004-05-04 22:38:00 +0000521}
522
darin@apple.comea40f5a2009-04-17 19:16:19 +0000523WebCore::NodeFilter* core(DOMNodeFilter *wrapper)
kociendaf6ea03e2004-05-04 22:38:00 +0000524{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000525 return wrapper ? reinterpret_cast<WebCore::NodeFilter*>(wrapper->_internal) : 0;
kociendaf6ea03e2004-05-04 22:38:00 +0000526}
527
darin@apple.comea40f5a2009-04-17 19:16:19 +0000528@implementation DOMNodeFilter
529
kociendaf6ea03e2004-05-04 22:38:00 +0000530- (void)dealloc
531{
532 if (_internal)
weinig4f67b132006-09-24 19:34:43 +0000533 reinterpret_cast<WebCore::NodeFilter*>(_internal)->deref();
kociendaf6ea03e2004-05-04 22:38:00 +0000534 [super dealloc];
535}
536
darin2de03ad2004-06-15 07:46:22 +0000537- (void)finalize
538{
539 if (_internal)
weinig4f67b132006-09-24 19:34:43 +0000540 reinterpret_cast<WebCore::NodeFilter*>(_internal)->deref();
darin2de03ad2004-06-15 07:46:22 +0000541 [super finalize];
542}
543
kociendaf6ea03e2004-05-04 22:38:00 +0000544- (short)acceptNode:(DOMNode *)node
545{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000546 return core(self)->acceptNode(core(node));
cblu1846a5a2004-04-29 02:05:28 +0000547}
548
549@end