/* * Copyright (C) 2007 Apple Inc. All rights reserved. * * 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. * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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. */ // This file is a temporary hack to implement the createInstance methods for // the COM DOM bindings. #include "config.h" #include "DOMCreateInstance.h" #include "GEN_DOMNode.h" #include "GEN_DOMElement.h" #include "GEN_DOMDocument.h" #include "GEN_DOMAttr.h" #include "GEN_DOMText.h" #include "GEN_DOMCDATASection.h" #include "GEN_DOMEntityReference.h" #include "GEN_DOMEntity.h" #include "GEN_DOMProcessingInstruction.h" #include "GEN_DOMComment.h" #include "GEN_DOMHTMLElement.h" #include "GEN_DOMHTMLDocument.h" #include "GEN_DOMHTMLCollection.h" #include "GEN_DOMDocumentType.h" #include "GEN_DOMDocumentFragment.h" #include "GEN_DOMNotation.h" #include "GEN_DOMCSSCharsetRule.h" #include "GEN_DOMCSSFontFaceRule.h" #include "GEN_DOMCSSImportRule.h" #include "GEN_DOMCSSMediaRule.h" #include "GEN_DOMCSSPageRule.h" #include "GEN_DOMCSSPrimitiveValue.h" #include "GEN_DOMCSSRule.h" #include "GEN_DOMCSSRuleList.h" #include "GEN_DOMCSSStyleDeclaration.h" #include "GEN_DOMCSSStyleRule.h" #include "GEN_DOMCSSStyleSheet.h" #include "GEN_DOMCSSValueList.h" #include "GEN_DOMStyleSheet.h" #include "GEN_DOMDOMImplementation.h" #include "GEN_DOMNamedNodeMap.h" #include "GEN_DOMNodeList.h" #include "GEN_DOMCounter.h" #include "GEN_DOMCSSRuleList.h" #include "GEN_DOMCSSStyleDeclaration.h" #include "GEN_DOMMediaList.h" #include "GEN_DOMRect.h" #include "GEN_DOMStyleSheet.h" #include "GEN_DOMStyleSheetList.h" #include "GEN_DOMEvent.h" #include "GEN_DOMEvent.h" #include #pragma warning(push, 0) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma warning(pop) typedef HashMap DOMWrapperCache; static DOMWrapperCache& domWrapperCache() { static DOMWrapperCache cache; return cache; } GEN_DOMObject* getDOMWrapper(void* objectHandle) { return domWrapperCache().get(objectHandle); } void setDOMWrapper(void* objectHandle, GEN_DOMObject* wrapper) { domWrapperCache().set(objectHandle, wrapper); } void removeDOMWrapper(void* objectHandle) { domWrapperCache().remove(objectHandle); } #define COM_DOM_PREFIX(Type) GEN_DOM##Type #define CREATE_ONLY_SELF(Type) \ COM_DOM_PREFIX(Type)* COM_DOM_PREFIX(Type)::createInstance(WebCore::Type* impl) \ { \ if (!impl) \ return 0; \ if (GEN_DOMObject* cachedInstance = getDOMWrapper(impl)) { \ cachedInstance->AddRef(); \ return static_cast(cachedInstance); \ } \ COMPtr comDOMObject = new COM_DOM_PREFIX(Type)(impl); \ setDOMWrapper(impl, comDOMObject.get()); \ return comDOMObject.releaseRef(); \ } \ // Core GEN_DOMNode* GEN_DOMNode::createInstance(WebCore::Node* node) { if (!node) return 0; if (GEN_DOMObject* cachedInstance = getDOMWrapper(node)) { cachedInstance->AddRef(); return static_cast(cachedInstance); } COMPtr domNode; switch (node->nodeType()) { case WebCore::Node::ELEMENT_NODE: // FIXME: add support for creating subclasses of HTMLElement. // FIXME: add support for creating SVGElements and its subclasses. if (node->isHTMLElement()) domNode = new GEN_DOMHTMLElement(static_cast(node)); else domNode = new GEN_DOMElement(static_cast(node)); break; case WebCore::Node::ATTRIBUTE_NODE: domNode = new GEN_DOMAttr(static_cast(node)); break; case WebCore::Node::TEXT_NODE: domNode = new GEN_DOMText(static_cast(node)); break; case WebCore::Node::CDATA_SECTION_NODE: domNode = new GEN_DOMCDATASection(static_cast(node)); break; case WebCore::Node::ENTITY_REFERENCE_NODE: domNode = new GEN_DOMEntityReference(static_cast(node)); break; case WebCore::Node::ENTITY_NODE: domNode = new GEN_DOMEntity(static_cast(node)); break; case WebCore::Node::PROCESSING_INSTRUCTION_NODE: domNode = new GEN_DOMProcessingInstruction(static_cast(node)); break; case WebCore::Node::COMMENT_NODE: domNode = new GEN_DOMComment(static_cast(node)); break; case WebCore::Node::DOCUMENT_NODE: // FIXME: add support for SVGDocument. if (static_cast(node)->isHTMLDocument()) domNode = new GEN_DOMHTMLDocument(static_cast(node)); else domNode = new GEN_DOMDocument(static_cast(node)); break; case WebCore::Node::DOCUMENT_TYPE_NODE: domNode = new GEN_DOMDocumentType(static_cast(node)); break; case WebCore::Node::DOCUMENT_FRAGMENT_NODE: domNode = new GEN_DOMDocumentFragment(static_cast(node)); break; case WebCore::Node::NOTATION_NODE: domNode = new GEN_DOMNotation(static_cast(node)); break; default: domNode = new GEN_DOMNode(node); break; } setDOMWrapper(node, domNode.get()); return domNode.releaseRef(); } GEN_DOMImplementation* GEN_DOMImplementation::createInstance(WebCore::DOMImplementation* impl) { if (!impl) return 0; if (GEN_DOMObject* cachedInstance = getDOMWrapper(impl)) { cachedInstance->AddRef(); return static_cast(cachedInstance); } COMPtr comDOMObject = new GEN_DOMImplementation(impl); setDOMWrapper(impl, comDOMObject.get()); return comDOMObject.releaseRef(); } CREATE_ONLY_SELF(NamedNodeMap) CREATE_ONLY_SELF(NodeList) // Events // FIXME: Add the subclasses for Event when they get generated. CREATE_ONLY_SELF(Event) // CSS GEN_DOMCSSRule* GEN_DOMCSSRule::createInstance(WebCore::CSSRule* rule) { if (!rule) return 0; if (GEN_DOMObject* cachedInstance = getDOMWrapper(rule)) { cachedInstance->AddRef(); return static_cast(cachedInstance); } COMPtr domRule; switch (rule->type()) { case WebCore::CSSRule::STYLE_RULE: domRule = new GEN_DOMCSSStyleRule(static_cast(rule)); break; case WebCore::CSSRule::CHARSET_RULE: domRule = new GEN_DOMCSSCharsetRule(static_cast(rule)); break; case WebCore::CSSRule::IMPORT_RULE: domRule = new GEN_DOMCSSImportRule(static_cast(rule)); break; case WebCore::CSSRule::MEDIA_RULE: domRule = new GEN_DOMCSSMediaRule(static_cast(rule)); break; case WebCore::CSSRule::FONT_FACE_RULE: domRule = new GEN_DOMCSSFontFaceRule(static_cast(rule)); break; case WebCore::CSSRule::PAGE_RULE: domRule = new GEN_DOMCSSPageRule(static_cast(rule)); break; case WebCore::CSSRule::UNKNOWN_RULE: default: domRule = new GEN_DOMCSSRule(rule); break; } setDOMWrapper(rule, domRule.get()); return domRule.releaseRef(); } GEN_DOMStyleSheet* GEN_DOMStyleSheet::createInstance(WebCore::StyleSheet* styleSheet) { if (!styleSheet) return 0; if (GEN_DOMObject* cachedInstance = getDOMWrapper(styleSheet)) { cachedInstance->AddRef(); return static_cast(cachedInstance); } COMPtr domStyleSheet; if (styleSheet->isCSSStyleSheet()) domStyleSheet = new GEN_DOMCSSStyleSheet(static_cast(styleSheet)); else domStyleSheet = new GEN_DOMStyleSheet(styleSheet); setDOMWrapper(styleSheet, domStyleSheet.get()); return domStyleSheet.releaseRef(); } GEN_DOMCSSValue* GEN_DOMCSSValue::createInstance(WebCore::CSSValue* value) { if (!value) return 0; if (GEN_DOMObject* cachedInstance = getDOMWrapper(value)) { cachedInstance->AddRef(); return static_cast(cachedInstance); } COMPtr domValue; switch (value->cssValueType()) { case WebCore::CSSValue::CSS_PRIMITIVE_VALUE: domValue = new GEN_DOMCSSPrimitiveValue(static_cast(value)); break; case WebCore::CSSValue::CSS_VALUE_LIST: domValue = new GEN_DOMCSSValueList(static_cast(value)); break; case WebCore::CSSValue::CSS_INHERIT: domValue = new GEN_DOMCSSValue(value); break; case WebCore::CSSValue::CSS_CUSTOM: // FIXME: add support for SVGPaint and SVGColor domValue = new GEN_DOMCSSValue(value); break; } setDOMWrapper(value, domValue.get()); return domValue.releaseRef(); } CREATE_ONLY_SELF(Counter) CREATE_ONLY_SELF(CSSRuleList) CREATE_ONLY_SELF(CSSStyleDeclaration) CREATE_ONLY_SELF(MediaList) CREATE_ONLY_SELF(Rect) CREATE_ONLY_SELF(StyleSheetList) // HTML CREATE_ONLY_SELF(HTMLCollection)