blob: 44bd653c6f4eddfee0cd51a6d442a6529a007530 [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 "DOMElementInternal.h"
darin45471112007-03-13 00:49:02 +000033#import "DOMHTMLCanvasElement.h"
darin@apple.com3a3edd42009-08-19 00:17:59 +000034#import "DOMNodeInternal.h"
antti@apple.com1129eec2009-10-06 19:13:55 +000035#import "DOMPrivate.h"
darin@apple.com3a3edd42009-08-19 00:17:59 +000036#import "DOMRangeInternal.h"
mrowe@apple.comfc8aa692009-03-09 03:44:38 +000037#import "Frame.h"
darin@apple.comea40f5a2009-04-17 19:16:19 +000038#import "HTMLElement.h"
darin@apple.com3a3edd42009-08-19 00:17:59 +000039#import "HTMLNames.h"
darin@apple.com7b7981b2010-10-01 00:04:02 +000040#import "HTMLParserIdioms.h"
mrowe@apple.comd48fd2e2010-03-08 01:52:22 +000041#import "Image.h"
darin@apple.comea40f5a2009-04-17 19:16:19 +000042#import "NodeFilter.h"
darin@apple.com3a3edd42009-08-19 00:17:59 +000043#import "RenderImage.h"
darin@apple.comea40f5a2009-04-17 19:16:19 +000044#import "WebScriptObjectPrivate.h"
weinigac936282006-09-29 20:29:16 +000045#import <wtf/HashMap.h>
kocienda03a86c72004-02-26 19:16:09 +000046
ddkilzer@apple.com28c34e32009-04-09 16:33:15 +000047#if ENABLE(SVG_DOM_OBJC_BINDINGS)
eseidelbaf9f6b2007-10-23 03:49:17 +000048#import "DOMSVG.h"
darin@apple.comea40f5a2009-04-17 19:16:19 +000049#import "SVGElementInstance.h"
darin@apple.comcf9dd0f2009-08-23 06:55:57 +000050#import "SVGNames.h"
weinigc0f8d232006-10-11 03:46:36 +000051#endif
darin8d1badc2006-03-06 16:50:13 +000052
cwzwarich@webkit.org3f782f62008-09-08 01:28:33 +000053using namespace JSC;
darin@apple.come4f9a662008-02-08 10:35:20 +000054using namespace WebCore;
55
darin@apple.comea40f5a2009-04-17 19:16:19 +000056// FIXME: Would be nice to break this up into separate files to match how other WebKit
57// code is organized.
58
kocienda03a86c72004-02-26 19:16:09 +000059//------------------------------------------------------------------------------------------
kociendaf9c26e62004-03-03 00:42:49 +000060// DOMNode
61
weinigc0f8d232006-10-11 03:46:36 +000062namespace WebCore {
63
sullivan70d47642006-10-11 23:15:18 +000064typedef HashMap<const QualifiedName::QualifiedNameImpl*, Class> ObjCClassMap;
weinigc0f8d232006-10-11 03:46:36 +000065static ObjCClassMap* elementClassMap;
66
67static void addElementClass(const QualifiedName& tag, Class objCClass)
darin7f1d1702006-05-10 07:12:56 +000068{
sullivan70d47642006-10-11 23:15:18 +000069 elementClassMap->set(tag.impl(), objCClass);
darin7f1d1702006-05-10 07:12:56 +000070}
71
weinigc0f8d232006-10-11 03:46:36 +000072static void createElementClassMap()
darin7f1d1702006-05-10 07:12:56 +000073{
74 // Create the table.
75 elementClassMap = new ObjCClassMap;
darin7f1d1702006-05-10 07:12:56 +000076
77 // FIXME: Reflect marquee once the API has been determined.
weinigc0f8d232006-10-11 03:46:36 +000078
79 // Populate it with HTML and SVG element classes.
80 addElementClass(HTMLNames::aTag, [DOMHTMLAnchorElement class]);
81 addElementClass(HTMLNames::appletTag, [DOMHTMLAppletElement class]);
82 addElementClass(HTMLNames::areaTag, [DOMHTMLAreaElement class]);
83 addElementClass(HTMLNames::baseTag, [DOMHTMLBaseElement class]);
84 addElementClass(HTMLNames::basefontTag, [DOMHTMLBaseFontElement class]);
85 addElementClass(HTMLNames::bodyTag, [DOMHTMLBodyElement class]);
86 addElementClass(HTMLNames::brTag, [DOMHTMLBRElement class]);
87 addElementClass(HTMLNames::buttonTag, [DOMHTMLButtonElement class]);
darin45471112007-03-13 00:49:02 +000088 addElementClass(HTMLNames::canvasTag, [DOMHTMLCanvasElement class]);
weinigc0f8d232006-10-11 03:46:36 +000089 addElementClass(HTMLNames::captionTag, [DOMHTMLTableCaptionElement class]);
90 addElementClass(HTMLNames::colTag, [DOMHTMLTableColElement class]);
91 addElementClass(HTMLNames::colgroupTag, [DOMHTMLTableColElement class]);
darin45471112007-03-13 00:49:02 +000092 addElementClass(HTMLNames::delTag, [DOMHTMLModElement class]);
weinigc0f8d232006-10-11 03:46:36 +000093 addElementClass(HTMLNames::dirTag, [DOMHTMLDirectoryElement class]);
94 addElementClass(HTMLNames::divTag, [DOMHTMLDivElement class]);
95 addElementClass(HTMLNames::dlTag, [DOMHTMLDListElement class]);
darin45471112007-03-13 00:49:02 +000096 addElementClass(HTMLNames::embedTag, [DOMHTMLEmbedElement class]);
weinigc0f8d232006-10-11 03:46:36 +000097 addElementClass(HTMLNames::fieldsetTag, [DOMHTMLFieldSetElement class]);
98 addElementClass(HTMLNames::fontTag, [DOMHTMLFontElement class]);
99 addElementClass(HTMLNames::formTag, [DOMHTMLFormElement class]);
100 addElementClass(HTMLNames::frameTag, [DOMHTMLFrameElement class]);
101 addElementClass(HTMLNames::framesetTag, [DOMHTMLFrameSetElement class]);
102 addElementClass(HTMLNames::h1Tag, [DOMHTMLHeadingElement class]);
103 addElementClass(HTMLNames::h2Tag, [DOMHTMLHeadingElement class]);
104 addElementClass(HTMLNames::h3Tag, [DOMHTMLHeadingElement class]);
105 addElementClass(HTMLNames::h4Tag, [DOMHTMLHeadingElement class]);
106 addElementClass(HTMLNames::h5Tag, [DOMHTMLHeadingElement class]);
107 addElementClass(HTMLNames::h6Tag, [DOMHTMLHeadingElement class]);
108 addElementClass(HTMLNames::headTag, [DOMHTMLHeadElement class]);
109 addElementClass(HTMLNames::hrTag, [DOMHTMLHRElement class]);
110 addElementClass(HTMLNames::htmlTag, [DOMHTMLHtmlElement class]);
111 addElementClass(HTMLNames::iframeTag, [DOMHTMLIFrameElement class]);
112 addElementClass(HTMLNames::imgTag, [DOMHTMLImageElement class]);
113 addElementClass(HTMLNames::inputTag, [DOMHTMLInputElement class]);
darin45471112007-03-13 00:49:02 +0000114 addElementClass(HTMLNames::insTag, [DOMHTMLModElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000115 addElementClass(HTMLNames::isindexTag, [DOMHTMLIsIndexElement class]);
116 addElementClass(HTMLNames::labelTag, [DOMHTMLLabelElement class]);
117 addElementClass(HTMLNames::legendTag, [DOMHTMLLegendElement class]);
118 addElementClass(HTMLNames::liTag, [DOMHTMLLIElement class]);
119 addElementClass(HTMLNames::linkTag, [DOMHTMLLinkElement class]);
120 addElementClass(HTMLNames::listingTag, [DOMHTMLPreElement class]);
121 addElementClass(HTMLNames::mapTag, [DOMHTMLMapElement class]);
weinig40d22ab2007-05-23 01:26:00 +0000122 addElementClass(HTMLNames::marqueeTag, [DOMHTMLMarqueeElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000123 addElementClass(HTMLNames::menuTag, [DOMHTMLMenuElement class]);
124 addElementClass(HTMLNames::metaTag, [DOMHTMLMetaElement class]);
125 addElementClass(HTMLNames::objectTag, [DOMHTMLObjectElement class]);
126 addElementClass(HTMLNames::olTag, [DOMHTMLOListElement class]);
127 addElementClass(HTMLNames::optgroupTag, [DOMHTMLOptGroupElement class]);
128 addElementClass(HTMLNames::optionTag, [DOMHTMLOptionElement class]);
129 addElementClass(HTMLNames::pTag, [DOMHTMLParagraphElement class]);
130 addElementClass(HTMLNames::paramTag, [DOMHTMLParamElement class]);
131 addElementClass(HTMLNames::preTag, [DOMHTMLPreElement class]);
132 addElementClass(HTMLNames::qTag, [DOMHTMLQuoteElement class]);
133 addElementClass(HTMLNames::scriptTag, [DOMHTMLScriptElement class]);
kdeckerb42fb662007-03-06 22:38:17 +0000134 addElementClass(HTMLNames::keygenTag, [DOMHTMLSelectElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000135 addElementClass(HTMLNames::selectTag, [DOMHTMLSelectElement class]);
136 addElementClass(HTMLNames::styleTag, [DOMHTMLStyleElement class]);
137 addElementClass(HTMLNames::tableTag, [DOMHTMLTableElement class]);
138 addElementClass(HTMLNames::tbodyTag, [DOMHTMLTableSectionElement class]);
139 addElementClass(HTMLNames::tdTag, [DOMHTMLTableCellElement class]);
140 addElementClass(HTMLNames::textareaTag, [DOMHTMLTextAreaElement class]);
141 addElementClass(HTMLNames::tfootTag, [DOMHTMLTableSectionElement class]);
darin45471112007-03-13 00:49:02 +0000142 addElementClass(HTMLNames::thTag, [DOMHTMLTableCellElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000143 addElementClass(HTMLNames::theadTag, [DOMHTMLTableSectionElement class]);
144 addElementClass(HTMLNames::titleTag, [DOMHTMLTitleElement class]);
145 addElementClass(HTMLNames::trTag, [DOMHTMLTableRowElement class]);
146 addElementClass(HTMLNames::ulTag, [DOMHTMLUListElement class]);
darin45471112007-03-13 00:49:02 +0000147 addElementClass(HTMLNames::xmpTag, [DOMHTMLPreElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000148
ddkilzer@apple.com28c34e32009-04-09 16:33:15 +0000149#if ENABLE(SVG_DOM_OBJC_BINDINGS)
weinigc0f8d232006-10-11 03:46:36 +0000150 addElementClass(SVGNames::aTag, [DOMSVGAElement class]);
mjs@apple.com283503e2008-03-24 05:36:30 +0000151 addElementClass(SVGNames::altGlyphTag, [DOMSVGAltGlyphElement class]);
oliver@apple.com22b1ad92007-12-09 00:27:57 +0000152#if ENABLE(SVG_ANIMATION)
weinigc0f8d232006-10-11 03:46:36 +0000153 addElementClass(SVGNames::animateTag, [DOMSVGAnimateElement class]);
154 addElementClass(SVGNames::animateColorTag, [DOMSVGAnimateColorElement class]);
155 addElementClass(SVGNames::animateTransformTag, [DOMSVGAnimateTransformElement class]);
antti@apple.com39ef7d12008-04-11 20:33:29 +0000156 addElementClass(SVGNames::setTag, [DOMSVGSetElement class]);
mjsd2948ef2007-02-26 19:29:04 +0000157#endif
weinigc0f8d232006-10-11 03:46:36 +0000158 addElementClass(SVGNames::circleTag, [DOMSVGCircleElement class]);
159 addElementClass(SVGNames::clipPathTag, [DOMSVGClipPathElement class]);
160 addElementClass(SVGNames::cursorTag, [DOMSVGCursorElement class]);
zimmermann@webkit.orgfe31d2d2007-12-23 12:30:24 +0000161 addElementClass(SVGNames::defsTag, [DOMSVGDefsElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000162 addElementClass(SVGNames::descTag, [DOMSVGDescElement class]);
163 addElementClass(SVGNames::ellipseTag, [DOMSVGEllipseElement class]);
krit@webkit.orgbfb80bf2009-05-28 22:10:29 +0000164#if ENABLE(FILTERS)
weinigc0f8d232006-10-11 03:46:36 +0000165 addElementClass(SVGNames::feBlendTag, [DOMSVGFEBlendElement class]);
166 addElementClass(SVGNames::feColorMatrixTag, [DOMSVGFEColorMatrixElement class]);
167 addElementClass(SVGNames::feComponentTransferTag, [DOMSVGFEComponentTransferElement class]);
168 addElementClass(SVGNames::feCompositeTag, [DOMSVGFECompositeElement class]);
zherczeg@webkit.orge4b0f762010-06-29 07:05:58 +0000169 addElementClass(SVGNames::feConvolveMatrixTag, [DOMSVGFEConvolveMatrixElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000170 addElementClass(SVGNames::feDiffuseLightingTag, [DOMSVGFEDiffuseLightingElement class]);
171 addElementClass(SVGNames::feDisplacementMapTag, [DOMSVGFEDisplacementMapElement class]);
172 addElementClass(SVGNames::feDistantLightTag, [DOMSVGFEDistantLightElement class]);
173 addElementClass(SVGNames::feFloodTag, [DOMSVGFEFloodElement class]);
174 addElementClass(SVGNames::feFuncATag, [DOMSVGFEFuncAElement class]);
175 addElementClass(SVGNames::feFuncBTag, [DOMSVGFEFuncBElement class]);
176 addElementClass(SVGNames::feFuncGTag, [DOMSVGFEFuncGElement class]);
177 addElementClass(SVGNames::feFuncRTag, [DOMSVGFEFuncRElement class]);
178 addElementClass(SVGNames::feGaussianBlurTag, [DOMSVGFEGaussianBlurElement class]);
179 addElementClass(SVGNames::feImageTag, [DOMSVGFEImageElement class]);
180 addElementClass(SVGNames::feMergeTag, [DOMSVGFEMergeElement class]);
181 addElementClass(SVGNames::feMergeNodeTag, [DOMSVGFEMergeNodeElement class]);
krit@webkit.org5a9a31f2009-10-09 19:13:55 +0000182 addElementClass(SVGNames::feMorphologyTag, [DOMSVGFEMorphologyElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000183 addElementClass(SVGNames::feOffsetTag, [DOMSVGFEOffsetElement class]);
184 addElementClass(SVGNames::fePointLightTag, [DOMSVGFEPointLightElement class]);
185 addElementClass(SVGNames::feSpecularLightingTag, [DOMSVGFESpecularLightingElement class]);
186 addElementClass(SVGNames::feSpotLightTag, [DOMSVGFESpotLightElement class]);
187 addElementClass(SVGNames::feTileTag, [DOMSVGFETileElement class]);
188 addElementClass(SVGNames::feTurbulenceTag, [DOMSVGFETurbulenceElement class]);
189 addElementClass(SVGNames::filterTag, [DOMSVGFilterElement class]);
mjsd2948ef2007-02-26 19:29:04 +0000190#endif
oliver@apple.com22b1ad92007-12-09 00:27:57 +0000191#if ENABLE(SVG_FONTS)
zimmermann@webkit.orgce57f042007-12-29 02:41:53 +0000192 addElementClass(SVGNames::fontTag, [DOMSVGFontElement class]);
eseidelbaf9f6b2007-10-23 03:49:17 +0000193 addElementClass(SVGNames::font_faceTag, [DOMSVGFontFaceElement class]);
194 addElementClass(SVGNames::font_face_formatTag, [DOMSVGFontFaceFormatElement class]);
195 addElementClass(SVGNames::font_face_nameTag, [DOMSVGFontFaceNameElement class]);
196 addElementClass(SVGNames::font_face_srcTag, [DOMSVGFontFaceSrcElement class]);
197 addElementClass(SVGNames::font_face_uriTag, [DOMSVGFontFaceUriElement class]);
zimmermann@webkit.orgce57f042007-12-29 02:41:53 +0000198 addElementClass(SVGNames::glyphTag, [DOMSVGGlyphElement class]);
oliver@apple.com22b1ad92007-12-09 00:27:57 +0000199#endif
weinigc0f8d232006-10-11 03:46:36 +0000200 addElementClass(SVGNames::gTag, [DOMSVGGElement class]);
201 addElementClass(SVGNames::imageTag, [DOMSVGImageElement class]);
202 addElementClass(SVGNames::lineTag, [DOMSVGLineElement class]);
203 addElementClass(SVGNames::linearGradientTag, [DOMSVGLinearGradientElement class]);
204 addElementClass(SVGNames::markerTag, [DOMSVGMarkerElement class]);
205 addElementClass(SVGNames::maskTag, [DOMSVGMaskElement class]);
206 addElementClass(SVGNames::metadataTag, [DOMSVGMetadataElement class]);
zimmermann@webkit.orgce57f042007-12-29 02:41:53 +0000207#if ENABLE(SVG_FONTS)
208 addElementClass(SVGNames::missing_glyphTag, [DOMSVGMissingGlyphElement class]);
209#endif
weinigc0f8d232006-10-11 03:46:36 +0000210 addElementClass(SVGNames::pathTag, [DOMSVGPathElement class]);
211 addElementClass(SVGNames::patternTag, [DOMSVGPatternElement class]);
212 addElementClass(SVGNames::polygonTag, [DOMSVGPolygonElement class]);
213 addElementClass(SVGNames::polylineTag, [DOMSVGPolylineElement class]);
214 addElementClass(SVGNames::radialGradientTag, [DOMSVGRadialGradientElement class]);
215 addElementClass(SVGNames::rectTag, [DOMSVGRectElement class]);
216 addElementClass(SVGNames::scriptTag, [DOMSVGScriptElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000217 addElementClass(SVGNames::stopTag, [DOMSVGStopElement class]);
218 addElementClass(SVGNames::styleTag, [DOMSVGStyleElement class]);
219 addElementClass(SVGNames::svgTag, [DOMSVGSVGElement class]);
220 addElementClass(SVGNames::switchTag, [DOMSVGSwitchElement class]);
221 addElementClass(SVGNames::symbolTag, [DOMSVGSymbolElement class]);
222 addElementClass(SVGNames::textTag, [DOMSVGTextElement class]);
223 addElementClass(SVGNames::titleTag, [DOMSVGTitleElement class]);
224 addElementClass(SVGNames::trefTag, [DOMSVGTRefElement class]);
225 addElementClass(SVGNames::tspanTag, [DOMSVGTSpanElement class]);
oliver25a9ee82007-10-12 13:18:43 +0000226 addElementClass(SVGNames::textPathTag, [DOMSVGTextPathElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000227 addElementClass(SVGNames::useTag, [DOMSVGUseElement class]);
228 addElementClass(SVGNames::viewTag, [DOMSVGViewElement class]);
229#endif
darin7f1d1702006-05-10 07:12:56 +0000230}
231
olivere36c4062007-10-12 14:07:59 +0000232static Class lookupElementClass(const QualifiedName& tag)
233{
234 // Do a special lookup to ignore element prefixes
235 if (tag.hasPrefix())
236 return elementClassMap->get(QualifiedName(nullAtom, tag.localName(), tag.namespaceURI()).impl());
237
238 return elementClassMap->get(tag.impl());
239}
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();
olivere36c4062007-10-12 14:07:59 +0000245 Class objcClass = lookupElementClass(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
thatcherb7557c22006-11-08 22:24:26 +0000251static NSArray *kit(const Vector<IntRect>& rects)
252{
253 size_t size = rects.size();
254 NSMutableArray *array = [NSMutableArray arrayWithCapacity:size];
255 for (size_t i = 0; i < size; ++i)
256 [array addObject:[NSValue valueWithRect:rects[i]]];
257 return array;
258}
259
weinigc0f8d232006-10-11 03:46:36 +0000260} // namespace WebCore
261
kociendaf9c26e62004-03-03 00:42:49 +0000262@implementation DOMNode (WebCoreInternal)
kocienda03a86c72004-02-26 19:16:09 +0000263
weiniga8192c02006-08-28 03:33:34 +0000264- (NSString *)description
265{
weinigc6bbaeb2006-09-15 22:23:50 +0000266 if (!_internal)
267 return [NSString stringWithFormat:@"<%@: null>", [[self class] description], self];
weinigc0f8d232006-10-11 03:46:36 +0000268
weiniga8192c02006-08-28 03:33:34 +0000269 NSString *value = [self nodeValue];
weinigc6bbaeb2006-09-15 22:23:50 +0000270 if (value)
weiniga8192c02006-08-28 03:33:34 +0000271 return [NSString stringWithFormat:@"<%@ [%@]: %p '%@'>",
272 [[self class] description], [self nodeName], _internal, value];
weinigc6bbaeb2006-09-15 22:23:50 +0000273
274 return [NSString stringWithFormat:@"<%@ [%@]: %p>", [[self class] description], [self nodeName], _internal];
weiniga8192c02006-08-28 03:33:34 +0000275}
276
darin@apple.comea40f5a2009-04-17 19:16:19 +0000277- (JSC::Bindings::RootObject*)_rootObject
kocienda117559f2004-03-01 17:04:26 +0000278{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000279 WebCore::Frame* frame = core(self)->document()->frame();
280 if (!frame)
281 return 0;
282 return frame->script()->bindingRootObject();
kocienda117559f2004-03-01 17:04:26 +0000283}
284
darin@apple.comea40f5a2009-04-17 19:16:19 +0000285@end
286
287Class kitClass(WebCore::Node* impl)
kocienda117559f2004-03-01 17:04:26 +0000288{
kociendaf9c26e62004-03-03 00:42:49 +0000289 switch (impl->nodeType()) {
weinig6d74c0d2006-09-18 21:40:34 +0000290 case WebCore::Node::ELEMENT_NODE:
darin7f1d1702006-05-10 07:12:56 +0000291 if (impl->isHTMLElement())
darin@apple.comea40f5a2009-04-17 19:16:19 +0000292 return WebCore::elementClass(static_cast<WebCore::HTMLElement*>(impl)->tagQName(), [DOMHTMLElement class]);
ddkilzer@apple.com28c34e32009-04-09 16:33:15 +0000293#if ENABLE(SVG_DOM_OBJC_BINDINGS)
darin@apple.comea40f5a2009-04-17 19:16:19 +0000294 if (impl->isSVGElement())
295 return WebCore::elementClass(static_cast<WebCore::SVGElement*>(impl)->tagQName(), [DOMSVGElement class]);
weinigc0f8d232006-10-11 03:46:36 +0000296#endif
darin@apple.comea40f5a2009-04-17 19:16:19 +0000297 return [DOMElement class];
weinig6d74c0d2006-09-18 21:40:34 +0000298 case WebCore::Node::ATTRIBUTE_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000299 return [DOMAttr class];
weinig6d74c0d2006-09-18 21:40:34 +0000300 case WebCore::Node::TEXT_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000301 return [DOMText class];
weinig6d74c0d2006-09-18 21:40:34 +0000302 case WebCore::Node::CDATA_SECTION_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000303 return [DOMCDATASection class];
weinig6d74c0d2006-09-18 21:40:34 +0000304 case WebCore::Node::ENTITY_REFERENCE_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000305 return [DOMEntityReference class];
weinig6d74c0d2006-09-18 21:40:34 +0000306 case WebCore::Node::ENTITY_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000307 return [DOMEntity class];
weinig6d74c0d2006-09-18 21:40:34 +0000308 case WebCore::Node::PROCESSING_INSTRUCTION_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000309 return [DOMProcessingInstruction class];
weinig6d74c0d2006-09-18 21:40:34 +0000310 case WebCore::Node::COMMENT_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000311 return [DOMComment class];
weinig6d74c0d2006-09-18 21:40:34 +0000312 case WebCore::Node::DOCUMENT_NODE:
313 if (static_cast<WebCore::Document*>(impl)->isHTMLDocument())
darin@apple.comea40f5a2009-04-17 19:16:19 +0000314 return [DOMHTMLDocument class];
ddkilzer@apple.com28c34e32009-04-09 16:33:15 +0000315#if ENABLE(SVG_DOM_OBJC_BINDINGS)
darin@apple.comea40f5a2009-04-17 19:16:19 +0000316 if (static_cast<WebCore::Document*>(impl)->isSVGDocument())
317 return [DOMSVGDocument class];
weinigc0f8d232006-10-11 03:46:36 +0000318#endif
darin@apple.comea40f5a2009-04-17 19:16:19 +0000319 return [DOMDocument class];
weinig6d74c0d2006-09-18 21:40:34 +0000320 case WebCore::Node::DOCUMENT_TYPE_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000321 return [DOMDocumentType class];
weinig6d74c0d2006-09-18 21:40:34 +0000322 case WebCore::Node::DOCUMENT_FRAGMENT_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000323 return [DOMDocumentFragment class];
weinig6d74c0d2006-09-18 21:40:34 +0000324 case WebCore::Node::NOTATION_NODE:
darin@apple.comea40f5a2009-04-17 19:16:19 +0000325 return [DOMNotation class];
weinig6d74c0d2006-09-18 21:40:34 +0000326 case WebCore::Node::XPATH_NAMESPACE_NODE:
andersca75fd42c2006-05-08 21:27:25 +0000327 // FIXME: Create an XPath objective C wrapper
darinc370e7e2006-11-08 05:52:27 +0000328 // See http://bugs.webkit.org/show_bug.cgi?id=8755
andersca75fd42c2006-05-08 21:27:25 +0000329 return nil;
kociendabb0f4522004-03-02 17:03:56 +0000330 }
darin@apple.comea40f5a2009-04-17 19:16:19 +0000331 ASSERT_NOT_REACHED();
weinig6b675332006-09-16 03:30:49 +0000332 return nil;
333}
334
darin@apple.comea40f5a2009-04-17 19:16:19 +0000335id <DOMEventTarget> kit(WebCore::EventTarget* eventTarget)
zimmermann@webkit.org29d22032008-09-23 23:44:20 +0000336{
337 if (!eventTarget)
338 return nil;
339
darin@apple.comea40f5a2009-04-17 19:16:19 +0000340 if (WebCore::Node* node = eventTarget->toNode())
341 return kit(node);
342
343#if ENABLE(SVG_DOM_OBJC_BINDINGS)
344 if (WebCore::SVGElementInstance* svgElementInstance = eventTarget->toSVGElementInstance())
345 return kit(svgElementInstance);
346#endif
347
348 // We don't have an ObjC binding for XMLHttpRequest.
349
350 return nil;
zimmermann@webkit.org29d22032008-09-23 23:44:20 +0000351}
352
darin@apple.comea40f5a2009-04-17 19:16:19 +0000353@implementation DOMNode (DOMNodeExtensions)
354
355- (NSRect)boundingBox
zimmermann@webkit.org29d22032008-09-23 23:44:20 +0000356{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000357 // FIXME: Could we move this function to WebCore::Node and autogenerate?
358 core(self)->document()->updateLayoutIgnorePendingStylesheets();
359 WebCore::RenderObject* renderer = core(self)->renderer();
360 if (!renderer)
361 return NSZeroRect;
362 return renderer->absoluteBoundingBoxRect();
363}
364
timothy@apple.comdf6a4052009-04-29 00:17:07 +0000365- (NSArray *)lineBoxRects
366{
367 return [self textRects];
368}
369
zimmermann@webkit.org29d22032008-09-23 23:44:20 +0000370@end
zimmermann@webkit.org29d22032008-09-23 23:44:20 +0000371
timothy@apple.com43203432008-09-12 04:44:40 +0000372@implementation DOMNode (DOMNodeExtensionsPendingPublic)
373
374- (NSImage *)renderedImage
375{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000376 // FIXME: Could we move this function to WebCore::Node and autogenerate?
377 WebCore::Node* node = core(self);
378 WebCore::Frame* frame = node->document()->frame();
379 if (!frame)
380 return nil;
commit-queue@webkit.org14df3182010-08-24 16:06:36 +0000381 return frame->nodeImage(node).get();
timothy@apple.com43203432008-09-12 04:44:40 +0000382}
383
antti@apple.com1129eec2009-10-06 19:13:55 +0000384- (NSArray *)textRects
385{
386 // FIXME: Could we move this function to WebCore::Node and autogenerate?
387 core(self)->document()->updateLayoutIgnorePendingStylesheets();
388 if (!core(self)->renderer())
389 return nil;
390 RefPtr<Range> range = Range::create(core(self)->document());
391 WebCore::ExceptionCode ec = 0;
392 range->selectNodeContents(core(self), ec);
393 Vector<WebCore::IntRect> rects;
394 range->textRects(rects);
395 return kit(rects);
396}
timothy@apple.com43203432008-09-12 04:44:40 +0000397@end
398
thatcherb7557c22006-11-08 22:24:26 +0000399@implementation DOMRange (DOMRangeExtensions)
400
401- (NSRect)boundingBox
402{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000403 // FIXME: The call to updateLayoutIgnorePendingStylesheets should be moved into WebCore::Range.
404 core(self)->ownerDocument()->updateLayoutIgnorePendingStylesheets();
405 return core(self)->boundingBox();
thatcherb7557c22006-11-08 22:24:26 +0000406}
407
timothy@apple.comdf6a4052009-04-29 00:17:07 +0000408- (NSArray *)textRects
thatcherb7557c22006-11-08 22:24:26 +0000409{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000410 // FIXME: The call to updateLayoutIgnorePendingStylesheets should be moved into WebCore::Range.
thatcherb7557c22006-11-08 22:24:26 +0000411 Vector<WebCore::IntRect> rects;
darin@apple.comea40f5a2009-04-17 19:16:19 +0000412 core(self)->ownerDocument()->updateLayoutIgnorePendingStylesheets();
timothy@apple.comdf6a4052009-04-29 00:17:07 +0000413 core(self)->textRects(rects);
thatcherb7557c22006-11-08 22:24:26 +0000414 return kit(rects);
415}
416
timothy@apple.comdf6a4052009-04-29 00:17:07 +0000417- (NSArray *)lineBoxRects
418{
419 // FIXME: Remove this once all clients stop using it and we drop Leopard support.
420 return [self textRects];
421}
422
thatcherb7557c22006-11-08 22:24:26 +0000423@end
424
kociendabb0f4522004-03-02 17:03:56 +0000425//------------------------------------------------------------------------------------------
kocienda117559f2004-03-01 17:04:26 +0000426// DOMElement
427
weiniga8192c02006-08-28 03:33:34 +0000428@implementation DOMElement (DOMElementAppKitExtensions)
adele99881522005-11-15 02:05:45 +0000429
thatcher3166fbf2006-03-01 17:49:47 +0000430- (NSImage*)image
431{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000432 // FIXME: Could we move this function to WebCore::Node and autogenerate?
433 WebCore::RenderObject* renderer = core(self)->renderer();
434 if (!renderer || !renderer->isImage())
435 return nil;
436 WebCore::CachedImage* cachedImage = static_cast<WebCore::RenderImage*>(renderer)->cachedImage();
437 if (!cachedImage || cachedImage->errorOccurred())
438 return nil;
439 return cachedImage->image()->getNSImage();
thatcher3166fbf2006-03-01 17:49:47 +0000440}
441
adele99881522005-11-15 02:05:45 +0000442@end
443
cblu4dc540a2004-12-06 23:39:15 +0000444@implementation DOMElement (WebPrivate)
445
446- (NSFont *)_font
447{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000448 // FIXME: Could we move this function to WebCore::Element and autogenerate?
449 WebCore::RenderObject* renderer = core(self)->renderer();
450 if (!renderer)
451 return nil;
452 return renderer->style()->font().primaryFont()->getNSFont();
cblu4dc540a2004-12-06 23:39:15 +0000453}
454
weinigb5e08162006-10-09 23:49:21 +0000455- (NSData *)_imageTIFFRepresentation
hyatt3059a512006-02-02 08:40:45 +0000456{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000457 // FIXME: Could we move this function to WebCore::Element and autogenerate?
458 WebCore::RenderObject* renderer = core(self)->renderer();
459 if (!renderer || !renderer->isImage())
460 return nil;
461 WebCore::CachedImage* cachedImage = static_cast<WebCore::RenderImage*>(renderer)->cachedImage();
462 if (!cachedImage || cachedImage->errorOccurred())
463 return nil;
464 return (NSData *)cachedImage->image()->getTIFFRepresentation();
hyatt3059a512006-02-02 08:40:45 +0000465}
466
sullivan111f1102005-02-17 00:14:30 +0000467- (NSURL *)_getURLAttribute:(NSString *)name
468{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000469 // FIXME: Could we move this function to WebCore::Element and autogenerate?
sullivan111f1102005-02-17 00:14:30 +0000470 ASSERT(name);
darin@apple.comea40f5a2009-04-17 19:16:19 +0000471 WebCore::Element* element = core(self);
weinig6d74c0d2006-09-18 21:40:34 +0000472 ASSERT(element);
darin@apple.com7b7981b2010-10-01 00:04:02 +0000473 return element->document()->completeURL(stripLeadingAndTrailingHTMLSpaces(element->getAttribute(name)));
sullivan111f1102005-02-17 00:14:30 +0000474}
cblu4dc540a2004-12-06 23:39:15 +0000475
adele90285b72006-07-19 23:54:49 +0000476- (BOOL)isFocused
477{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000478 // FIXME: Could we move this function to WebCore::Element and autogenerate?
479 WebCore::Element* element = core(self);
480 return element->document()->focusedNode() == element;
adele90285b72006-07-19 23:54:49 +0000481}
482
sullivan111f1102005-02-17 00:14:30 +0000483@end
cblu4dc540a2004-12-06 23:39:15 +0000484
kocienda117559f2004-03-01 17:04:26 +0000485//------------------------------------------------------------------------------------------
kociendabb0f4522004-03-02 17:03:56 +0000486// DOMRange
487
weinigc0880e72006-10-07 17:24:56 +0000488@implementation DOMRange (WebPrivate)
darin2de03ad2004-06-15 07:46:22 +0000489
darin9649a0f2004-09-15 05:55:43 +0000490- (NSString *)description
491{
492 if (!_internal)
darin02ad24b2005-01-20 18:05:19 +0000493 return @"<DOMRange: null>";
adele704e8bb2005-09-16 22:42:30 +0000494 return [NSString stringWithFormat:@"<DOMRange: %@ %d %@ %d>",
weinig6d74c0d2006-09-18 21:40:34 +0000495 [self startContainer], [self startOffset], [self endContainer], [self endOffset]];
darin9649a0f2004-09-15 05:55:43 +0000496}
497
darin@apple.comea40f5a2009-04-17 19:16:19 +0000498// FIXME: This should be removed as soon as all internal Apple uses of it have been replaced with
weinigc0880e72006-10-07 17:24:56 +0000499// calls to the public method - (NSString *)text.
darin36cb7c22004-08-03 18:09:44 +0000500- (NSString *)_text
501{
thatcher2a6da872006-07-10 03:02:04 +0000502 return [self text];
darin36cb7c22004-08-03 18:09:44 +0000503}
504
505@end
506
kociendaf6ea03e2004-05-04 22:38:00 +0000507//------------------------------------------------------------------------------------------
weinig@apple.com5b942cb2009-07-22 04:27:22 +0000508// DOMRGBColor
509
510@implementation DOMRGBColor (WebPrivate)
511
512// FIXME: This should be removed as soon as all internal Apple uses of it have been replaced with
513// calls to the public method - (NSColor *)color.
514- (NSColor *)_color
515{
516 return [self color];
517}
518
519@end
520
521
522//------------------------------------------------------------------------------------------
weiniga8192c02006-08-28 03:33:34 +0000523// DOMNodeFilter
cblu1846a5a2004-04-29 02:05:28 +0000524
darin@apple.comea40f5a2009-04-17 19:16:19 +0000525DOMNodeFilter *kit(WebCore::NodeFilter* impl)
kociendaf6ea03e2004-05-04 22:38:00 +0000526{
527 if (!impl)
528 return nil;
darin@apple.comea40f5a2009-04-17 19:16:19 +0000529
530 if (DOMNodeFilter *wrapper = getDOMWrapper(impl))
531 return [[wrapper retain] autorelease];
532
533 DOMNodeFilter *wrapper = [[DOMNodeFilter alloc] _init];
534 wrapper->_internal = reinterpret_cast<DOMObjectInternal*>(impl);
535 impl->ref();
536 addDOMWrapper(wrapper, impl);
537 return [wrapper autorelease];
kociendaf6ea03e2004-05-04 22:38:00 +0000538}
539
darin@apple.comea40f5a2009-04-17 19:16:19 +0000540WebCore::NodeFilter* core(DOMNodeFilter *wrapper)
kociendaf6ea03e2004-05-04 22:38:00 +0000541{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000542 return wrapper ? reinterpret_cast<WebCore::NodeFilter*>(wrapper->_internal) : 0;
kociendaf6ea03e2004-05-04 22:38:00 +0000543}
544
darin@apple.comea40f5a2009-04-17 19:16:19 +0000545@implementation DOMNodeFilter
546
kociendaf6ea03e2004-05-04 22:38:00 +0000547- (void)dealloc
548{
549 if (_internal)
weinig4f67b132006-09-24 19:34:43 +0000550 reinterpret_cast<WebCore::NodeFilter*>(_internal)->deref();
kociendaf6ea03e2004-05-04 22:38:00 +0000551 [super dealloc];
552}
553
darin2de03ad2004-06-15 07:46:22 +0000554- (void)finalize
555{
556 if (_internal)
weinig4f67b132006-09-24 19:34:43 +0000557 reinterpret_cast<WebCore::NodeFilter*>(_internal)->deref();
darin2de03ad2004-06-15 07:46:22 +0000558 [super finalize];
559}
560
kociendaf6ea03e2004-05-04 22:38:00 +0000561- (short)acceptNode:(DOMNode *)node
562{
darin@apple.comea40f5a2009-04-17 19:16:19 +0000563 return core(self)->acceptNode(core(node));
cblu1846a5a2004-04-29 02:05:28 +0000564}
565
566@end