WebCore/bindings/objc/DOM.mm
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     1 /*
       
     2  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
       
     3  * Copyright (C) 2006 James G. Speth (speth@end.com)
       
     4  * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
       
     5  *
       
     6  * Redistribution and use in source and binary forms, with or without
       
     7  * modification, are permitted provided that the following conditions
       
     8  * are met:
       
     9  * 1. Redistributions of source code must retain the above copyright
       
    10  *    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 
       
    28 #import "config.h"
       
    29 #import "DOMInternal.h" // import first to make the private/public trick work
       
    30 #import "DOM.h"
       
    31 
       
    32 #import "DOMElementInternal.h"
       
    33 #import "DOMHTMLCanvasElement.h"
       
    34 #import "DOMNodeInternal.h"
       
    35 #import "DOMPrivate.h"
       
    36 #import "DOMRangeInternal.h"
       
    37 #import "Frame.h"
       
    38 #import "HTMLElement.h"
       
    39 #import "HTMLNames.h"
       
    40 #import "Image.h"
       
    41 #import "NodeFilter.h"
       
    42 #import "RenderImage.h"
       
    43 #import "WebScriptObjectPrivate.h"
       
    44 #import <wtf/HashMap.h>
       
    45 
       
    46 #if ENABLE(SVG_DOM_OBJC_BINDINGS)
       
    47 #import "DOMSVG.h"
       
    48 #import "SVGElementInstance.h"
       
    49 #import "SVGNames.h"
       
    50 #endif
       
    51 
       
    52 using namespace JSC;
       
    53 using namespace WebCore;
       
    54 
       
    55 // FIXME: Would be nice to break this up into separate files to match how other WebKit
       
    56 // code is organized.
       
    57 
       
    58 //------------------------------------------------------------------------------------------
       
    59 // DOMNode
       
    60 
       
    61 namespace WebCore {
       
    62 
       
    63 typedef HashMap<const QualifiedName::QualifiedNameImpl*, Class> ObjCClassMap;
       
    64 static ObjCClassMap* elementClassMap;
       
    65 
       
    66 static void addElementClass(const QualifiedName& tag, Class objCClass)
       
    67 {
       
    68     elementClassMap->set(tag.impl(), objCClass);
       
    69 }
       
    70 
       
    71 static void createElementClassMap()
       
    72 {
       
    73     // Create the table.
       
    74     elementClassMap = new ObjCClassMap;
       
    75 
       
    76     // FIXME: Reflect marquee once the API has been determined.
       
    77 
       
    78     // Populate it with HTML and SVG element classes.
       
    79     addElementClass(HTMLNames::aTag, [DOMHTMLAnchorElement class]);
       
    80     addElementClass(HTMLNames::appletTag, [DOMHTMLAppletElement class]);
       
    81     addElementClass(HTMLNames::areaTag, [DOMHTMLAreaElement class]);
       
    82     addElementClass(HTMLNames::baseTag, [DOMHTMLBaseElement class]);
       
    83     addElementClass(HTMLNames::basefontTag, [DOMHTMLBaseFontElement class]);
       
    84     addElementClass(HTMLNames::bodyTag, [DOMHTMLBodyElement class]);
       
    85     addElementClass(HTMLNames::brTag, [DOMHTMLBRElement class]);
       
    86     addElementClass(HTMLNames::buttonTag, [DOMHTMLButtonElement class]);
       
    87     addElementClass(HTMLNames::canvasTag, [DOMHTMLCanvasElement class]);
       
    88     addElementClass(HTMLNames::captionTag, [DOMHTMLTableCaptionElement class]);
       
    89     addElementClass(HTMLNames::colTag, [DOMHTMLTableColElement class]);
       
    90     addElementClass(HTMLNames::colgroupTag, [DOMHTMLTableColElement class]);
       
    91     addElementClass(HTMLNames::delTag, [DOMHTMLModElement class]);
       
    92     addElementClass(HTMLNames::dirTag, [DOMHTMLDirectoryElement class]);
       
    93     addElementClass(HTMLNames::divTag, [DOMHTMLDivElement class]);
       
    94     addElementClass(HTMLNames::dlTag, [DOMHTMLDListElement class]);
       
    95     addElementClass(HTMLNames::embedTag, [DOMHTMLEmbedElement class]);
       
    96     addElementClass(HTMLNames::fieldsetTag, [DOMHTMLFieldSetElement class]);
       
    97     addElementClass(HTMLNames::fontTag, [DOMHTMLFontElement class]);
       
    98     addElementClass(HTMLNames::formTag, [DOMHTMLFormElement class]);
       
    99     addElementClass(HTMLNames::frameTag, [DOMHTMLFrameElement class]);
       
   100     addElementClass(HTMLNames::framesetTag, [DOMHTMLFrameSetElement class]);
       
   101     addElementClass(HTMLNames::h1Tag, [DOMHTMLHeadingElement class]);
       
   102     addElementClass(HTMLNames::h2Tag, [DOMHTMLHeadingElement class]);
       
   103     addElementClass(HTMLNames::h3Tag, [DOMHTMLHeadingElement class]);
       
   104     addElementClass(HTMLNames::h4Tag, [DOMHTMLHeadingElement class]);
       
   105     addElementClass(HTMLNames::h5Tag, [DOMHTMLHeadingElement class]);
       
   106     addElementClass(HTMLNames::h6Tag, [DOMHTMLHeadingElement class]);
       
   107     addElementClass(HTMLNames::headTag, [DOMHTMLHeadElement class]);
       
   108     addElementClass(HTMLNames::hrTag, [DOMHTMLHRElement class]);
       
   109     addElementClass(HTMLNames::htmlTag, [DOMHTMLHtmlElement class]);
       
   110     addElementClass(HTMLNames::iframeTag, [DOMHTMLIFrameElement class]);
       
   111     addElementClass(HTMLNames::imgTag, [DOMHTMLImageElement class]);
       
   112     addElementClass(HTMLNames::inputTag, [DOMHTMLInputElement class]);
       
   113     addElementClass(HTMLNames::insTag, [DOMHTMLModElement class]);
       
   114     addElementClass(HTMLNames::isindexTag, [DOMHTMLIsIndexElement class]);
       
   115     addElementClass(HTMLNames::labelTag, [DOMHTMLLabelElement class]);
       
   116     addElementClass(HTMLNames::legendTag, [DOMHTMLLegendElement class]);
       
   117     addElementClass(HTMLNames::liTag, [DOMHTMLLIElement class]);
       
   118     addElementClass(HTMLNames::linkTag, [DOMHTMLLinkElement class]);
       
   119     addElementClass(HTMLNames::listingTag, [DOMHTMLPreElement class]);
       
   120     addElementClass(HTMLNames::mapTag, [DOMHTMLMapElement class]);
       
   121     addElementClass(HTMLNames::marqueeTag, [DOMHTMLMarqueeElement class]);
       
   122     addElementClass(HTMLNames::menuTag, [DOMHTMLMenuElement class]);
       
   123     addElementClass(HTMLNames::metaTag, [DOMHTMLMetaElement class]);
       
   124     addElementClass(HTMLNames::objectTag, [DOMHTMLObjectElement class]);
       
   125     addElementClass(HTMLNames::olTag, [DOMHTMLOListElement class]);
       
   126     addElementClass(HTMLNames::optgroupTag, [DOMHTMLOptGroupElement class]);
       
   127     addElementClass(HTMLNames::optionTag, [DOMHTMLOptionElement class]);
       
   128     addElementClass(HTMLNames::pTag, [DOMHTMLParagraphElement class]);
       
   129     addElementClass(HTMLNames::paramTag, [DOMHTMLParamElement class]);
       
   130     addElementClass(HTMLNames::preTag, [DOMHTMLPreElement class]);
       
   131     addElementClass(HTMLNames::qTag, [DOMHTMLQuoteElement class]);
       
   132     addElementClass(HTMLNames::scriptTag, [DOMHTMLScriptElement class]);
       
   133     addElementClass(HTMLNames::keygenTag, [DOMHTMLSelectElement class]);
       
   134     addElementClass(HTMLNames::selectTag, [DOMHTMLSelectElement class]);
       
   135     addElementClass(HTMLNames::styleTag, [DOMHTMLStyleElement class]);
       
   136     addElementClass(HTMLNames::tableTag, [DOMHTMLTableElement class]);
       
   137     addElementClass(HTMLNames::tbodyTag, [DOMHTMLTableSectionElement class]);
       
   138     addElementClass(HTMLNames::tdTag, [DOMHTMLTableCellElement class]);
       
   139     addElementClass(HTMLNames::textareaTag, [DOMHTMLTextAreaElement class]);
       
   140     addElementClass(HTMLNames::tfootTag, [DOMHTMLTableSectionElement class]);
       
   141     addElementClass(HTMLNames::thTag, [DOMHTMLTableCellElement class]);
       
   142     addElementClass(HTMLNames::theadTag, [DOMHTMLTableSectionElement class]);
       
   143     addElementClass(HTMLNames::titleTag, [DOMHTMLTitleElement class]);
       
   144     addElementClass(HTMLNames::trTag, [DOMHTMLTableRowElement class]);
       
   145     addElementClass(HTMLNames::ulTag, [DOMHTMLUListElement class]);
       
   146     addElementClass(HTMLNames::xmpTag, [DOMHTMLPreElement class]);
       
   147 
       
   148 #if ENABLE(SVG_DOM_OBJC_BINDINGS)
       
   149     addElementClass(SVGNames::aTag, [DOMSVGAElement class]);
       
   150     addElementClass(SVGNames::altGlyphTag, [DOMSVGAltGlyphElement class]);
       
   151 #if ENABLE(SVG_ANIMATION)
       
   152     addElementClass(SVGNames::animateTag, [DOMSVGAnimateElement class]);
       
   153     addElementClass(SVGNames::animateColorTag, [DOMSVGAnimateColorElement class]);
       
   154     addElementClass(SVGNames::animateTransformTag, [DOMSVGAnimateTransformElement class]);
       
   155     addElementClass(SVGNames::setTag, [DOMSVGSetElement class]);
       
   156 #endif
       
   157     addElementClass(SVGNames::circleTag, [DOMSVGCircleElement class]);
       
   158     addElementClass(SVGNames::clipPathTag, [DOMSVGClipPathElement class]);
       
   159     addElementClass(SVGNames::cursorTag, [DOMSVGCursorElement class]);
       
   160     addElementClass(SVGNames::defsTag, [DOMSVGDefsElement class]);
       
   161     addElementClass(SVGNames::descTag, [DOMSVGDescElement class]);
       
   162     addElementClass(SVGNames::ellipseTag, [DOMSVGEllipseElement class]);
       
   163 #if ENABLE(FILTERS)
       
   164     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::feConvolveMatrixTag, [DOMSVGFEConvolveMatrixElement class]);
       
   169     addElementClass(SVGNames::feDiffuseLightingTag, [DOMSVGFEDiffuseLightingElement class]);
       
   170     addElementClass(SVGNames::feDisplacementMapTag, [DOMSVGFEDisplacementMapElement class]);
       
   171     addElementClass(SVGNames::feDistantLightTag, [DOMSVGFEDistantLightElement class]);
       
   172     addElementClass(SVGNames::feFloodTag, [DOMSVGFEFloodElement class]);
       
   173     addElementClass(SVGNames::feFuncATag, [DOMSVGFEFuncAElement class]);
       
   174     addElementClass(SVGNames::feFuncBTag, [DOMSVGFEFuncBElement class]);
       
   175     addElementClass(SVGNames::feFuncGTag, [DOMSVGFEFuncGElement class]);
       
   176     addElementClass(SVGNames::feFuncRTag, [DOMSVGFEFuncRElement class]);
       
   177     addElementClass(SVGNames::feGaussianBlurTag, [DOMSVGFEGaussianBlurElement class]);
       
   178     addElementClass(SVGNames::feImageTag, [DOMSVGFEImageElement class]);
       
   179     addElementClass(SVGNames::feMergeTag, [DOMSVGFEMergeElement class]);
       
   180     addElementClass(SVGNames::feMergeNodeTag, [DOMSVGFEMergeNodeElement class]);
       
   181     addElementClass(SVGNames::feMorphologyTag, [DOMSVGFEMorphologyElement class]);
       
   182     addElementClass(SVGNames::feOffsetTag, [DOMSVGFEOffsetElement class]);
       
   183     addElementClass(SVGNames::fePointLightTag, [DOMSVGFEPointLightElement class]);
       
   184     addElementClass(SVGNames::feSpecularLightingTag, [DOMSVGFESpecularLightingElement class]);
       
   185     addElementClass(SVGNames::feSpotLightTag, [DOMSVGFESpotLightElement class]);
       
   186     addElementClass(SVGNames::feTileTag, [DOMSVGFETileElement class]);
       
   187     addElementClass(SVGNames::feTurbulenceTag, [DOMSVGFETurbulenceElement class]);
       
   188     addElementClass(SVGNames::filterTag, [DOMSVGFilterElement class]);
       
   189 #endif
       
   190 #if ENABLE(SVG_FONTS)
       
   191     addElementClass(SVGNames::fontTag, [DOMSVGFontElement class]);
       
   192     addElementClass(SVGNames::font_faceTag, [DOMSVGFontFaceElement class]);
       
   193     addElementClass(SVGNames::font_face_formatTag, [DOMSVGFontFaceFormatElement class]);
       
   194     addElementClass(SVGNames::font_face_nameTag, [DOMSVGFontFaceNameElement class]);
       
   195     addElementClass(SVGNames::font_face_srcTag, [DOMSVGFontFaceSrcElement class]);
       
   196     addElementClass(SVGNames::font_face_uriTag, [DOMSVGFontFaceUriElement class]);
       
   197     addElementClass(SVGNames::glyphTag, [DOMSVGGlyphElement class]);
       
   198 #endif
       
   199     addElementClass(SVGNames::gTag, [DOMSVGGElement class]);
       
   200     addElementClass(SVGNames::imageTag, [DOMSVGImageElement class]);
       
   201     addElementClass(SVGNames::lineTag, [DOMSVGLineElement class]);
       
   202     addElementClass(SVGNames::linearGradientTag, [DOMSVGLinearGradientElement class]);
       
   203     addElementClass(SVGNames::markerTag, [DOMSVGMarkerElement class]);
       
   204     addElementClass(SVGNames::maskTag, [DOMSVGMaskElement class]);
       
   205     addElementClass(SVGNames::metadataTag, [DOMSVGMetadataElement class]);
       
   206 #if ENABLE(SVG_FONTS)
       
   207     addElementClass(SVGNames::missing_glyphTag, [DOMSVGMissingGlyphElement class]);
       
   208 #endif
       
   209     addElementClass(SVGNames::pathTag, [DOMSVGPathElement class]);
       
   210     addElementClass(SVGNames::patternTag, [DOMSVGPatternElement class]);
       
   211     addElementClass(SVGNames::polygonTag, [DOMSVGPolygonElement class]);
       
   212     addElementClass(SVGNames::polylineTag, [DOMSVGPolylineElement class]);
       
   213     addElementClass(SVGNames::radialGradientTag, [DOMSVGRadialGradientElement class]);
       
   214     addElementClass(SVGNames::rectTag, [DOMSVGRectElement class]);
       
   215     addElementClass(SVGNames::scriptTag, [DOMSVGScriptElement class]);
       
   216     addElementClass(SVGNames::stopTag, [DOMSVGStopElement class]);
       
   217     addElementClass(SVGNames::styleTag, [DOMSVGStyleElement class]);
       
   218     addElementClass(SVGNames::svgTag, [DOMSVGSVGElement class]);
       
   219     addElementClass(SVGNames::switchTag, [DOMSVGSwitchElement class]);
       
   220     addElementClass(SVGNames::symbolTag, [DOMSVGSymbolElement class]);
       
   221     addElementClass(SVGNames::textTag, [DOMSVGTextElement class]);
       
   222     addElementClass(SVGNames::titleTag, [DOMSVGTitleElement class]);
       
   223     addElementClass(SVGNames::trefTag, [DOMSVGTRefElement class]);
       
   224     addElementClass(SVGNames::tspanTag, [DOMSVGTSpanElement class]);
       
   225     addElementClass(SVGNames::textPathTag, [DOMSVGTextPathElement class]);
       
   226     addElementClass(SVGNames::useTag, [DOMSVGUseElement class]);
       
   227     addElementClass(SVGNames::viewTag, [DOMSVGViewElement class]);
       
   228 #endif
       
   229 }
       
   230 
       
   231 static Class lookupElementClass(const QualifiedName& tag)
       
   232 {
       
   233     // Do a special lookup to ignore element prefixes
       
   234     if (tag.hasPrefix())
       
   235         return elementClassMap->get(QualifiedName(nullAtom, tag.localName(), tag.namespaceURI()).impl());
       
   236     
       
   237     return elementClassMap->get(tag.impl());
       
   238 }
       
   239 
       
   240 static Class elementClass(const QualifiedName& tag, Class defaultClass)
       
   241 {
       
   242     if (!elementClassMap)
       
   243         createElementClassMap();
       
   244     Class objcClass = lookupElementClass(tag);
       
   245     if (!objcClass)
       
   246         objcClass = defaultClass;
       
   247     return objcClass;
       
   248 }
       
   249 
       
   250 static NSArray *kit(const Vector<IntRect>& rects)
       
   251 {
       
   252     size_t size = rects.size();
       
   253     NSMutableArray *array = [NSMutableArray arrayWithCapacity:size];
       
   254     for (size_t i = 0; i < size; ++i)
       
   255         [array addObject:[NSValue valueWithRect:rects[i]]];
       
   256     return array;
       
   257 }
       
   258 
       
   259 } // namespace WebCore
       
   260 
       
   261 @implementation DOMNode (WebCoreInternal)
       
   262 
       
   263 - (NSString *)description
       
   264 {
       
   265     if (!_internal)
       
   266         return [NSString stringWithFormat:@"<%@: null>", [[self class] description], self];
       
   267 
       
   268     NSString *value = [self nodeValue];
       
   269     if (value)
       
   270         return [NSString stringWithFormat:@"<%@ [%@]: %p '%@'>",
       
   271             [[self class] description], [self nodeName], _internal, value];
       
   272 
       
   273     return [NSString stringWithFormat:@"<%@ [%@]: %p>", [[self class] description], [self nodeName], _internal];
       
   274 }
       
   275 
       
   276 - (JSC::Bindings::RootObject*)_rootObject
       
   277 {
       
   278     WebCore::Frame* frame = core(self)->document()->frame();
       
   279     if (!frame)
       
   280         return 0;
       
   281     return frame->script()->bindingRootObject();
       
   282 }
       
   283 
       
   284 @end
       
   285 
       
   286 Class kitClass(WebCore::Node* impl)
       
   287 {
       
   288     switch (impl->nodeType()) {
       
   289         case WebCore::Node::ELEMENT_NODE:
       
   290             if (impl->isHTMLElement())
       
   291                 return WebCore::elementClass(static_cast<WebCore::HTMLElement*>(impl)->tagQName(), [DOMHTMLElement class]);
       
   292 #if ENABLE(SVG_DOM_OBJC_BINDINGS)
       
   293             if (impl->isSVGElement())
       
   294                 return WebCore::elementClass(static_cast<WebCore::SVGElement*>(impl)->tagQName(), [DOMSVGElement class]);
       
   295 #endif
       
   296             return [DOMElement class];
       
   297         case WebCore::Node::ATTRIBUTE_NODE:
       
   298             return [DOMAttr class];
       
   299         case WebCore::Node::TEXT_NODE:
       
   300             return [DOMText class];
       
   301         case WebCore::Node::CDATA_SECTION_NODE:
       
   302             return [DOMCDATASection class];
       
   303         case WebCore::Node::ENTITY_REFERENCE_NODE:
       
   304             return [DOMEntityReference class];
       
   305         case WebCore::Node::ENTITY_NODE:
       
   306             return [DOMEntity class];
       
   307         case WebCore::Node::PROCESSING_INSTRUCTION_NODE:
       
   308             return [DOMProcessingInstruction class];
       
   309         case WebCore::Node::COMMENT_NODE:
       
   310             return [DOMComment class];
       
   311         case WebCore::Node::DOCUMENT_NODE:
       
   312             if (static_cast<WebCore::Document*>(impl)->isHTMLDocument())
       
   313                 return [DOMHTMLDocument class];
       
   314 #if ENABLE(SVG_DOM_OBJC_BINDINGS)
       
   315             if (static_cast<WebCore::Document*>(impl)->isSVGDocument())
       
   316                 return [DOMSVGDocument class];
       
   317 #endif
       
   318             return [DOMDocument class];
       
   319         case WebCore::Node::DOCUMENT_TYPE_NODE:
       
   320             return [DOMDocumentType class];
       
   321         case WebCore::Node::DOCUMENT_FRAGMENT_NODE:
       
   322             return [DOMDocumentFragment class];
       
   323         case WebCore::Node::NOTATION_NODE:
       
   324             return [DOMNotation class];
       
   325         case WebCore::Node::XPATH_NAMESPACE_NODE:
       
   326             // FIXME: Create an XPath objective C wrapper
       
   327             // See http://bugs.webkit.org/show_bug.cgi?id=8755
       
   328             return nil;
       
   329     }
       
   330     ASSERT_NOT_REACHED();
       
   331     return nil;
       
   332 }
       
   333 
       
   334 id <DOMEventTarget> kit(WebCore::EventTarget* eventTarget)
       
   335 {
       
   336     if (!eventTarget)
       
   337         return nil;
       
   338 
       
   339     if (WebCore::Node* node = eventTarget->toNode())
       
   340         return kit(node);
       
   341 
       
   342 #if ENABLE(SVG_DOM_OBJC_BINDINGS)
       
   343     if (WebCore::SVGElementInstance* svgElementInstance = eventTarget->toSVGElementInstance())
       
   344         return kit(svgElementInstance);
       
   345 #endif
       
   346 
       
   347     // We don't have an ObjC binding for XMLHttpRequest.
       
   348 
       
   349     return nil;
       
   350 }
       
   351 
       
   352 @implementation DOMNode (DOMNodeExtensions)
       
   353 
       
   354 - (NSRect)boundingBox
       
   355 {
       
   356     // FIXME: Could we move this function to WebCore::Node and autogenerate?
       
   357     core(self)->document()->updateLayoutIgnorePendingStylesheets();
       
   358     WebCore::RenderObject* renderer = core(self)->renderer();
       
   359     if (!renderer)
       
   360         return NSZeroRect;
       
   361     return renderer->absoluteBoundingBoxRect();
       
   362 }
       
   363 
       
   364 - (NSArray *)lineBoxRects
       
   365 {
       
   366     return [self textRects];
       
   367 }
       
   368 
       
   369 @end
       
   370 
       
   371 @implementation DOMNode (DOMNodeExtensionsPendingPublic)
       
   372 
       
   373 - (NSImage *)renderedImage
       
   374 {
       
   375     // FIXME: Could we move this function to WebCore::Node and autogenerate?
       
   376     WebCore::Node* node = core(self);
       
   377     WebCore::Frame* frame = node->document()->frame();
       
   378     if (!frame)
       
   379         return nil;
       
   380     return frame->nodeImage(node);
       
   381 }
       
   382 
       
   383 - (NSArray *)textRects
       
   384 {
       
   385     // FIXME: Could we move this function to WebCore::Node and autogenerate?
       
   386     core(self)->document()->updateLayoutIgnorePendingStylesheets();
       
   387     if (!core(self)->renderer())
       
   388         return nil;
       
   389     RefPtr<Range> range = Range::create(core(self)->document());
       
   390     WebCore::ExceptionCode ec = 0;
       
   391     range->selectNodeContents(core(self), ec);
       
   392     Vector<WebCore::IntRect> rects;
       
   393     range->textRects(rects);
       
   394     return kit(rects);
       
   395 }
       
   396 @end
       
   397 
       
   398 @implementation DOMRange (DOMRangeExtensions)
       
   399 
       
   400 - (NSRect)boundingBox
       
   401 {
       
   402     // FIXME: The call to updateLayoutIgnorePendingStylesheets should be moved into WebCore::Range.
       
   403     core(self)->ownerDocument()->updateLayoutIgnorePendingStylesheets();
       
   404     return core(self)->boundingBox();
       
   405 }
       
   406 
       
   407 - (NSArray *)textRects
       
   408 {
       
   409     // FIXME: The call to updateLayoutIgnorePendingStylesheets should be moved into WebCore::Range.
       
   410     Vector<WebCore::IntRect> rects;
       
   411     core(self)->ownerDocument()->updateLayoutIgnorePendingStylesheets();
       
   412     core(self)->textRects(rects);
       
   413     return kit(rects);
       
   414 }
       
   415 
       
   416 - (NSArray *)lineBoxRects
       
   417 {
       
   418     // FIXME: Remove this once all clients stop using it and we drop Leopard support.
       
   419     return [self textRects];
       
   420 }
       
   421 
       
   422 @end
       
   423 
       
   424 //------------------------------------------------------------------------------------------
       
   425 // DOMElement
       
   426 
       
   427 @implementation DOMElement (DOMElementAppKitExtensions)
       
   428 
       
   429 - (NSImage*)image
       
   430 {
       
   431     // FIXME: Could we move this function to WebCore::Node and autogenerate?
       
   432     WebCore::RenderObject* renderer = core(self)->renderer();
       
   433     if (!renderer || !renderer->isImage())
       
   434         return nil;
       
   435     WebCore::CachedImage* cachedImage = static_cast<WebCore::RenderImage*>(renderer)->cachedImage();
       
   436     if (!cachedImage || cachedImage->errorOccurred())
       
   437         return nil;
       
   438     return cachedImage->image()->getNSImage();
       
   439 }
       
   440 
       
   441 @end
       
   442 
       
   443 @implementation DOMElement (WebPrivate)
       
   444 
       
   445 - (NSFont *)_font
       
   446 {
       
   447     // FIXME: Could we move this function to WebCore::Element and autogenerate?
       
   448     WebCore::RenderObject* renderer = core(self)->renderer();
       
   449     if (!renderer)
       
   450         return nil;
       
   451     return renderer->style()->font().primaryFont()->getNSFont();
       
   452 }
       
   453 
       
   454 - (NSData *)_imageTIFFRepresentation
       
   455 {
       
   456     // FIXME: Could we move this function to WebCore::Element and autogenerate?
       
   457     WebCore::RenderObject* renderer = core(self)->renderer();
       
   458     if (!renderer || !renderer->isImage())
       
   459         return nil;
       
   460     WebCore::CachedImage* cachedImage = static_cast<WebCore::RenderImage*>(renderer)->cachedImage();
       
   461     if (!cachedImage || cachedImage->errorOccurred())
       
   462         return nil;
       
   463     return (NSData *)cachedImage->image()->getTIFFRepresentation();
       
   464 }
       
   465 
       
   466 - (NSURL *)_getURLAttribute:(NSString *)name
       
   467 {
       
   468     // FIXME: Could we move this function to WebCore::Element and autogenerate?
       
   469     ASSERT(name);
       
   470     WebCore::Element* element = core(self);
       
   471     ASSERT(element);
       
   472     return element->document()->completeURL(deprecatedParseURL(element->getAttribute(name)));
       
   473 }
       
   474 
       
   475 - (BOOL)isFocused
       
   476 {
       
   477     // FIXME: Could we move this function to WebCore::Element and autogenerate?
       
   478     WebCore::Element* element = core(self);
       
   479     return element->document()->focusedNode() == element;
       
   480 }
       
   481 
       
   482 @end
       
   483 
       
   484 //------------------------------------------------------------------------------------------
       
   485 // DOMRange
       
   486 
       
   487 @implementation DOMRange (WebPrivate)
       
   488 
       
   489 - (NSString *)description
       
   490 {
       
   491     if (!_internal)
       
   492         return @"<DOMRange: null>";
       
   493     return [NSString stringWithFormat:@"<DOMRange: %@ %d %@ %d>",
       
   494                [self startContainer], [self startOffset], [self endContainer], [self endOffset]];
       
   495 }
       
   496 
       
   497 // FIXME: This should be removed as soon as all internal Apple uses of it have been replaced with
       
   498 // calls to the public method - (NSString *)text.
       
   499 - (NSString *)_text
       
   500 {
       
   501     return [self text];
       
   502 }
       
   503 
       
   504 @end
       
   505 
       
   506 //------------------------------------------------------------------------------------------
       
   507 // DOMRGBColor
       
   508 
       
   509 @implementation DOMRGBColor (WebPrivate)
       
   510 
       
   511 // FIXME: This should be removed as soon as all internal Apple uses of it have been replaced with
       
   512 // calls to the public method - (NSColor *)color.
       
   513 - (NSColor *)_color
       
   514 {
       
   515     return [self color];
       
   516 }
       
   517 
       
   518 @end
       
   519 
       
   520 
       
   521 //------------------------------------------------------------------------------------------
       
   522 // DOMNodeFilter
       
   523 
       
   524 DOMNodeFilter *kit(WebCore::NodeFilter* impl)
       
   525 {
       
   526     if (!impl)
       
   527         return nil;
       
   528     
       
   529     if (DOMNodeFilter *wrapper = getDOMWrapper(impl))
       
   530         return [[wrapper retain] autorelease];
       
   531     
       
   532     DOMNodeFilter *wrapper = [[DOMNodeFilter alloc] _init];
       
   533     wrapper->_internal = reinterpret_cast<DOMObjectInternal*>(impl);
       
   534     impl->ref();
       
   535     addDOMWrapper(wrapper, impl);
       
   536     return [wrapper autorelease];
       
   537 }
       
   538 
       
   539 WebCore::NodeFilter* core(DOMNodeFilter *wrapper)
       
   540 {
       
   541     return wrapper ? reinterpret_cast<WebCore::NodeFilter*>(wrapper->_internal) : 0;
       
   542 }
       
   543 
       
   544 @implementation DOMNodeFilter
       
   545 
       
   546 - (void)dealloc
       
   547 {
       
   548     if (_internal)
       
   549         reinterpret_cast<WebCore::NodeFilter*>(_internal)->deref();
       
   550     [super dealloc];
       
   551 }
       
   552 
       
   553 - (void)finalize
       
   554 {
       
   555     if (_internal)
       
   556         reinterpret_cast<WebCore::NodeFilter*>(_internal)->deref();
       
   557     [super finalize];
       
   558 }
       
   559 
       
   560 - (short)acceptNode:(DOMNode *)node
       
   561 {
       
   562     return core(self)->acceptNode(core(node));
       
   563 }
       
   564 
       
   565 @end