⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dom.mm

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 MM
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. * Copyright (C) 2006 James G. Speth (speth@end.com) * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */#import "config.h"#import "DOM.h"#import "DOMHTMLCanvasElement.h"#import "DOMInternal.h"#import "ExceptionHandlers.h"#import "Frame.h"#import "HTMLNames.h"#import "HTMLPlugInElement.h"#import "NodeIterator.h"#import "Range.h"#import "RenderImage.h"#import "RenderView.h"#import "ScriptController.h"#import "SimpleFontData.h"#import "TreeWalker.h"#import <wtf/HashMap.h>#if ENABLE(SVG)#import "SVGElement.h"#import "SVGElementInstance.h"#import "SVGNames.h"#import "DOMSVG.h"#endifusing namespace JSC;using namespace WebCore;//------------------------------------------------------------------------------------------// DOMNodenamespace WebCore {typedef HashMap<const QualifiedName::QualifiedNameImpl*, Class> ObjCClassMap;static ObjCClassMap* elementClassMap;static void addElementClass(const QualifiedName& tag, Class objCClass){    elementClassMap->set(tag.impl(), objCClass);}static void createElementClassMap(){    // Create the table.    elementClassMap = new ObjCClassMap;    // FIXME: Reflect marquee once the API has been determined.    // Populate it with HTML and SVG element classes.    addElementClass(HTMLNames::aTag, [DOMHTMLAnchorElement class]);    addElementClass(HTMLNames::appletTag, [DOMHTMLAppletElement class]);    addElementClass(HTMLNames::areaTag, [DOMHTMLAreaElement class]);    addElementClass(HTMLNames::baseTag, [DOMHTMLBaseElement class]);    addElementClass(HTMLNames::basefontTag, [DOMHTMLBaseFontElement class]);    addElementClass(HTMLNames::bodyTag, [DOMHTMLBodyElement class]);    addElementClass(HTMLNames::brTag, [DOMHTMLBRElement class]);    addElementClass(HTMLNames::buttonTag, [DOMHTMLButtonElement class]);    addElementClass(HTMLNames::canvasTag, [DOMHTMLCanvasElement class]);    addElementClass(HTMLNames::captionTag, [DOMHTMLTableCaptionElement class]);    addElementClass(HTMLNames::colTag, [DOMHTMLTableColElement class]);    addElementClass(HTMLNames::colgroupTag, [DOMHTMLTableColElement class]);    addElementClass(HTMLNames::delTag, [DOMHTMLModElement class]);    addElementClass(HTMLNames::dirTag, [DOMHTMLDirectoryElement class]);    addElementClass(HTMLNames::divTag, [DOMHTMLDivElement class]);    addElementClass(HTMLNames::dlTag, [DOMHTMLDListElement class]);    addElementClass(HTMLNames::embedTag, [DOMHTMLEmbedElement class]);    addElementClass(HTMLNames::fieldsetTag, [DOMHTMLFieldSetElement class]);    addElementClass(HTMLNames::fontTag, [DOMHTMLFontElement class]);    addElementClass(HTMLNames::formTag, [DOMHTMLFormElement class]);    addElementClass(HTMLNames::frameTag, [DOMHTMLFrameElement class]);    addElementClass(HTMLNames::framesetTag, [DOMHTMLFrameSetElement class]);    addElementClass(HTMLNames::h1Tag, [DOMHTMLHeadingElement class]);    addElementClass(HTMLNames::h2Tag, [DOMHTMLHeadingElement class]);    addElementClass(HTMLNames::h3Tag, [DOMHTMLHeadingElement class]);    addElementClass(HTMLNames::h4Tag, [DOMHTMLHeadingElement class]);    addElementClass(HTMLNames::h5Tag, [DOMHTMLHeadingElement class]);    addElementClass(HTMLNames::h6Tag, [DOMHTMLHeadingElement class]);    addElementClass(HTMLNames::headTag, [DOMHTMLHeadElement class]);    addElementClass(HTMLNames::hrTag, [DOMHTMLHRElement class]);    addElementClass(HTMLNames::htmlTag, [DOMHTMLHtmlElement class]);    addElementClass(HTMLNames::iframeTag, [DOMHTMLIFrameElement class]);    addElementClass(HTMLNames::imgTag, [DOMHTMLImageElement class]);    addElementClass(HTMLNames::inputTag, [DOMHTMLInputElement class]);    addElementClass(HTMLNames::insTag, [DOMHTMLModElement class]);    addElementClass(HTMLNames::isindexTag, [DOMHTMLIsIndexElement class]);    addElementClass(HTMLNames::labelTag, [DOMHTMLLabelElement class]);    addElementClass(HTMLNames::legendTag, [DOMHTMLLegendElement class]);    addElementClass(HTMLNames::liTag, [DOMHTMLLIElement class]);    addElementClass(HTMLNames::linkTag, [DOMHTMLLinkElement class]);    addElementClass(HTMLNames::listingTag, [DOMHTMLPreElement class]);    addElementClass(HTMLNames::mapTag, [DOMHTMLMapElement class]);    addElementClass(HTMLNames::marqueeTag, [DOMHTMLMarqueeElement class]);    addElementClass(HTMLNames::menuTag, [DOMHTMLMenuElement class]);    addElementClass(HTMLNames::metaTag, [DOMHTMLMetaElement class]);    addElementClass(HTMLNames::objectTag, [DOMHTMLObjectElement class]);    addElementClass(HTMLNames::olTag, [DOMHTMLOListElement class]);    addElementClass(HTMLNames::optgroupTag, [DOMHTMLOptGroupElement class]);    addElementClass(HTMLNames::optionTag, [DOMHTMLOptionElement class]);    addElementClass(HTMLNames::pTag, [DOMHTMLParagraphElement class]);    addElementClass(HTMLNames::paramTag, [DOMHTMLParamElement class]);    addElementClass(HTMLNames::preTag, [DOMHTMLPreElement class]);    addElementClass(HTMLNames::qTag, [DOMHTMLQuoteElement class]);    addElementClass(HTMLNames::scriptTag, [DOMHTMLScriptElement class]);    addElementClass(HTMLNames::keygenTag, [DOMHTMLSelectElement class]);    addElementClass(HTMLNames::selectTag, [DOMHTMLSelectElement class]);    addElementClass(HTMLNames::styleTag, [DOMHTMLStyleElement class]);    addElementClass(HTMLNames::tableTag, [DOMHTMLTableElement class]);    addElementClass(HTMLNames::tbodyTag, [DOMHTMLTableSectionElement class]);    addElementClass(HTMLNames::tdTag, [DOMHTMLTableCellElement class]);    addElementClass(HTMLNames::textareaTag, [DOMHTMLTextAreaElement class]);    addElementClass(HTMLNames::tfootTag, [DOMHTMLTableSectionElement class]);    addElementClass(HTMLNames::thTag, [DOMHTMLTableCellElement class]);    addElementClass(HTMLNames::theadTag, [DOMHTMLTableSectionElement class]);    addElementClass(HTMLNames::titleTag, [DOMHTMLTitleElement class]);    addElementClass(HTMLNames::trTag, [DOMHTMLTableRowElement class]);    addElementClass(HTMLNames::ulTag, [DOMHTMLUListElement class]);    addElementClass(HTMLNames::xmpTag, [DOMHTMLPreElement class]);#if ENABLE(SVG)    addElementClass(SVGNames::aTag, [DOMSVGAElement class]);    addElementClass(SVGNames::altGlyphTag, [DOMSVGAltGlyphElement class]);#if ENABLE(SVG_ANIMATION)    addElementClass(SVGNames::animateTag, [DOMSVGAnimateElement class]);    addElementClass(SVGNames::animateColorTag, [DOMSVGAnimateColorElement class]);    addElementClass(SVGNames::animateTransformTag, [DOMSVGAnimateTransformElement class]);    addElementClass(SVGNames::setTag, [DOMSVGSetElement class]);#endif    addElementClass(SVGNames::circleTag, [DOMSVGCircleElement class]);    addElementClass(SVGNames::clipPathTag, [DOMSVGClipPathElement class]);    addElementClass(SVGNames::cursorTag, [DOMSVGCursorElement class]);#if ENABLE(SVG_FONTS)    addElementClass(SVGNames::definition_srcTag, [DOMSVGDefinitionSrcElement class]);#endif    addElementClass(SVGNames::defsTag, [DOMSVGDefsElement class]);    addElementClass(SVGNames::descTag, [DOMSVGDescElement class]);    addElementClass(SVGNames::ellipseTag, [DOMSVGEllipseElement class]);#if ENABLE(SVG_FILTERS)    addElementClass(SVGNames::feBlendTag, [DOMSVGFEBlendElement class]);    addElementClass(SVGNames::feColorMatrixTag, [DOMSVGFEColorMatrixElement class]);    addElementClass(SVGNames::feComponentTransferTag, [DOMSVGFEComponentTransferElement class]);    addElementClass(SVGNames::feCompositeTag, [DOMSVGFECompositeElement class]);    addElementClass(SVGNames::feDiffuseLightingTag, [DOMSVGFEDiffuseLightingElement class]);    addElementClass(SVGNames::feDisplacementMapTag, [DOMSVGFEDisplacementMapElement class]);    addElementClass(SVGNames::feDistantLightTag, [DOMSVGFEDistantLightElement class]);    addElementClass(SVGNames::feFloodTag, [DOMSVGFEFloodElement class]);    addElementClass(SVGNames::feFuncATag, [DOMSVGFEFuncAElement class]);    addElementClass(SVGNames::feFuncBTag, [DOMSVGFEFuncBElement class]);    addElementClass(SVGNames::feFuncGTag, [DOMSVGFEFuncGElement class]);    addElementClass(SVGNames::feFuncRTag, [DOMSVGFEFuncRElement class]);    addElementClass(SVGNames::feGaussianBlurTag, [DOMSVGFEGaussianBlurElement class]);    addElementClass(SVGNames::feImageTag, [DOMSVGFEImageElement class]);    addElementClass(SVGNames::feMergeTag, [DOMSVGFEMergeElement class]);    addElementClass(SVGNames::feMergeNodeTag, [DOMSVGFEMergeNodeElement class]);    addElementClass(SVGNames::feOffsetTag, [DOMSVGFEOffsetElement class]);    addElementClass(SVGNames::fePointLightTag, [DOMSVGFEPointLightElement class]);    addElementClass(SVGNames::feSpecularLightingTag, [DOMSVGFESpecularLightingElement class]);    addElementClass(SVGNames::feSpotLightTag, [DOMSVGFESpotLightElement class]);    addElementClass(SVGNames::feTileTag, [DOMSVGFETileElement class]);    addElementClass(SVGNames::feTurbulenceTag, [DOMSVGFETurbulenceElement class]);    addElementClass(SVGNames::filterTag, [DOMSVGFilterElement class]);#endif#if ENABLE(SVG_FONTS)    addElementClass(SVGNames::fontTag, [DOMSVGFontElement class]);    addElementClass(SVGNames::font_faceTag, [DOMSVGFontFaceElement class]);    addElementClass(SVGNames::font_face_formatTag, [DOMSVGFontFaceFormatElement class]);    addElementClass(SVGNames::font_face_nameTag, [DOMSVGFontFaceNameElement class]);    addElementClass(SVGNames::font_face_srcTag, [DOMSVGFontFaceSrcElement class]);    addElementClass(SVGNames::font_face_uriTag, [DOMSVGFontFaceUriElement class]);    addElementClass(SVGNames::glyphTag, [DOMSVGGlyphElement class]);#endif    addElementClass(SVGNames::gTag, [DOMSVGGElement class]);    addElementClass(SVGNames::imageTag, [DOMSVGImageElement class]);    addElementClass(SVGNames::lineTag, [DOMSVGLineElement class]);    addElementClass(SVGNames::linearGradientTag, [DOMSVGLinearGradientElement class]);    addElementClass(SVGNames::markerTag, [DOMSVGMarkerElement class]);    addElementClass(SVGNames::maskTag, [DOMSVGMaskElement class]);    addElementClass(SVGNames::metadataTag, [DOMSVGMetadataElement class]);#if ENABLE(SVG_FONTS)    addElementClass(SVGNames::missing_glyphTag, [DOMSVGMissingGlyphElement class]);#endif    addElementClass(SVGNames::pathTag, [DOMSVGPathElement class]);    addElementClass(SVGNames::patternTag, [DOMSVGPatternElement class]);    addElementClass(SVGNames::polygonTag, [DOMSVGPolygonElement class]);    addElementClass(SVGNames::polylineTag, [DOMSVGPolylineElement class]);    addElementClass(SVGNames::radialGradientTag, [DOMSVGRadialGradientElement class]);    addElementClass(SVGNames::rectTag, [DOMSVGRectElement class]);    addElementClass(SVGNames::scriptTag, [DOMSVGScriptElement class]);    addElementClass(SVGNames::stopTag, [DOMSVGStopElement class]);    addElementClass(SVGNames::styleTag, [DOMSVGStyleElement class]);    addElementClass(SVGNames::svgTag, [DOMSVGSVGElement class]);    addElementClass(SVGNames::switchTag, [DOMSVGSwitchElement class]);    addElementClass(SVGNames::symbolTag, [DOMSVGSymbolElement class]);    addElementClass(SVGNames::textTag, [DOMSVGTextElement class]);    addElementClass(SVGNames::titleTag, [DOMSVGTitleElement class]);    addElementClass(SVGNames::trefTag, [DOMSVGTRefElement class]);    addElementClass(SVGNames::tspanTag, [DOMSVGTSpanElement class]);    addElementClass(SVGNames::textPathTag, [DOMSVGTextPathElement class]);    addElementClass(SVGNames::useTag, [DOMSVGUseElement class]);    addElementClass(SVGNames::viewTag, [DOMSVGViewElement class]);#endif}static Class lookupElementClass(const QualifiedName& tag){    // Do a special lookup to ignore element prefixes    if (tag.hasPrefix())        return elementClassMap->get(QualifiedName(nullAtom, tag.localName(), tag.namespaceURI()).impl());        return elementClassMap->get(tag.impl());}static Class elementClass(const QualifiedName& tag, Class defaultClass){    if (!elementClassMap)        createElementClassMap();    Class objcClass = lookupElementClass(tag);    if (!objcClass)        objcClass = defaultClass;    return objcClass;}static NSArray *kit(const Vector<IntRect>& rects){    size_t size = rects.size();    NSMutableArray *array = [NSMutableArray arrayWithCapacity:size];    for (size_t i = 0; i < size; ++i)        [array addObject:[NSValue valueWithRect:rects[i]]];    return array;}} // namespace WebCore@implementation DOMNode (WebCoreInternal)// FIXME: should this go in the main implementation?- (NSString *)description{    if (!_internal)        return [NSString stringWithFormat:@"<%@: null>", [[self class] description], self];    NSString *value = [self nodeValue];    if (value)        return [NSString stringWithFormat:@"<%@ [%@]: %p '%@'>",            [[self class] description], [self nodeName], _internal, value];    return [NSString stringWithFormat:@"<%@ [%@]: %p>", [[self class] description], [self nodeName], _internal];}- (id)_initWithNode:(WebCore::Node *)impl{    ASSERT(impl);    [super _init];    _internal = reinterpret_cast<DOMObjectInternal*>(impl);    impl->ref();    WebCore::addDOMWrapper(self, impl);    return self;}+ (DOMNode *)_wrapNode:(WebCore::Node *)impl{    if (!impl)        return nil;    id cachedInstance;    cachedInstance = WebCore::getDOMWrapper(impl);    if (cachedInstance)        return [[cachedInstance retain] autorelease];    Class wrapperClass = nil;    switch (impl->nodeType()) {        case WebCore::Node::ELEMENT_NODE:            if (impl->isHTMLElement())                wrapperClass = WebCore::elementClass(static_cast<WebCore::HTMLElement*>(impl)->tagQName(), [DOMHTMLElement class]);#if ENABLE(SVG)            else if (impl->isSVGElement())                wrapperClass = WebCore::elementClass(static_cast<WebCore::SVGElement*>(impl)->tagQName(), [DOMSVGElement class]);#endif            else                wrapperClass = [DOMElement class];            break;        case WebCore::Node::ATTRIBUTE_NODE:            wrapperClass = [DOMAttr class];            break;        case WebCore::Node::TEXT_NODE:            wrapperClass = [DOMText class];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -