15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 1999 Antti Koivisto (koivisto@kde.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2001 Dirk Mueller (mueller@kde.org)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006 Samuel Weinig (sam@webkit.org)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DOMImplementation.h"
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
28197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h"
305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/SVGNames.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSStyleSheet.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/MediaList.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StyleSheetContents.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ContextFeatures.h"
3502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "core/dom/DocumentInit.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentType.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Element.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h"
39197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/dom/Text.h"
4009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/dom/XMLDocument.h"
411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/custom/CustomElementRegistrationContext.h"
42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/UseCounter.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLDocument.h"
45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/html/HTMLHeadElement.h"
465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/html/HTMLMediaElement.h"
47197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/html/HTMLTitleElement.h"
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLViewSourceDocument.h"
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/ImageDocument.h"
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/MediaDocument.h"
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/PluginDocument.h"
5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/TextDocument.h"
5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoader.h"
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h"
551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/ContentType.h"
5651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/MIMETypeRegistry.h"
57a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/Image.h"
5851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/graphics/media/MediaPlayer.h"
5951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/plugins/PluginData.h"
6051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SecurityOrigin.h"
6193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/StdLibExtras.h"
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
63c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef HashSet<String, CaseFoldingHash> FeatureSet;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void addString(FeatureSet& set, const char* string)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    set.add(string);
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
72fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochstatic bool isSupportedSVG10Feature(const String& feature, const String& version)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!version.isEmpty() && version != "1.0")
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static bool initialized = false;
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(FeatureSet, svgFeatures, ());
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!initialized) {
8053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if ENABLE(SVG_FONTS)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "svg");
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "svg.static");
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//      addString(svgFeatures, "svg.animation");
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//      addString(svgFeatures, "svg.dynamic");
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//      addString(svgFeatures, "svg.dom.animation");
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//      addString(svgFeatures, "svg.dom.dynamic");
8853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if ENABLE(SVG_FONTS)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "dom");
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "dom.svg");
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "dom.svg.static");
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//      addString(svgFeatures, "svg.all");
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//      addString(svgFeatures, "dom.svg.all");
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        initialized = true;
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return feature.startsWith("org.w3c.", false)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && svgFeatures.contains(feature.right(feature.length() - 8));
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
101fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochstatic bool isSupportedSVG11Feature(const String& feature, const String& version)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!version.isEmpty() && version != "1.1")
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static bool initialized = false;
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(FeatureSet, svgFeatures, ());
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!initialized) {
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Sadly, we cannot claim to implement any of the SVG 1.1 generic feature sets
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // lack of Font and Filter support.
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // http://bugs.webkit.org/show_bug.cgi?id=15480
11253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if ENABLE(SVG_FONTS)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "SVG");
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "SVGDOM");
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "SVG-static");
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "SVGDOM-static");
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "SVG-animation");
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "SVGDOM-animation");
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//      addString(svgFeatures, "SVG-dynamic);
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//      addString(svgFeatures, "SVGDOM-dynamic);
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "CoreAttribute");
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "Structure");
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "BasicStructure");
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "ContainerAttribute");
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "ConditionalProcessing");
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "Image");
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "Style");
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "ViewportAttribute");
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "Shape");
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "Text");
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "BasicText");
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "PaintAttribute");
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "BasicPaintAttribute");
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "OpacityAttribute");
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "GraphicsAttribute");
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "BaseGraphicsAttribute");
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "Marker");
13910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch//      addString(svgFeatures, "ColorProfile");
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "Gradient");
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "Pattern");
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "Clip");
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "BasicClip");
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "Mask");
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "Filter");
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "BasicFilter");
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "DocumentEventsAttribute");
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "GraphicalEventsAttribute");
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//      addString(svgFeatures, "AnimationEventsAttribute");
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "Cursor");
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "Hyperlinking");
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "XlinkAttribute");
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "View");
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "Script");
15502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        addString(svgFeatures, "Animation");
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(SVG_FONTS)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "Font");
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "BasicFont");
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addString(svgFeatures, "Extensibility");
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        initialized = true;
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return feature.startsWith("http://www.w3.org/tr/svg11/feature#", false)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && svgFeatures.contains(feature.right(feature.length() - 35));
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)DOMImplementation::DOMImplementation(Document& document)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_document(document)
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool DOMImplementation::hasFeature(const String& feature, const String& version)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
174fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    if (feature.startsWith("http://www.w3.org/TR/SVG", false)
175fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    || feature.startsWith("org.w3c.dom.svg", false)
176fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    || feature.startsWith("org.w3c.svg", false)) {
177fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        // FIXME: SVG 2.0 support?
178fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        return isSupportedSVG10Feature(feature, version) || isSupportedSVG11Feature(feature, version);
179fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    }
180fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    return true;
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool DOMImplementation::hasFeatureForBindings(const String& feature, const String& version)
18409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
18509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!hasFeature(feature, version)) {
18609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        UseCounter::count(m_document, UseCounter::DOMImplementationHasFeatureReturnFalse);
18709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return false;
18809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
18909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return true;
19009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
19109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
192d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<DocumentType> DOMImplementation::createDocumentType(const AtomicString& qualifiedName,
19351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    const String& publicId, const String& systemId, ExceptionState& exceptionState)
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
195a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    AtomicString prefix, localName;
19651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!Document::parseQualifiedName(qualifiedName, prefix, localName, exceptionState))
197d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
199323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    return DocumentType::create(m_document, qualifiedName, publicId, systemId);
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
202d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<XMLDocument> DOMImplementation::createDocument(const AtomicString& namespaceURI,
203a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    const AtomicString& qualifiedName, DocumentType* doctype, ExceptionState& exceptionState)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
205d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<XMLDocument> doc = nullptr;
206323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    DocumentInit init = DocumentInit::fromContext(document().contextDocument());
2078abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (namespaceURI == SVGNames::svgNamespaceURI) {
208323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        doc = XMLDocument::createSVG(init);
2098abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    } else if (namespaceURI == HTMLNames::xhtmlNamespaceURI) {
210323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        doc = XMLDocument::createXHTML(init.withRegistrationContext(document().registrationContext()));
2118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    } else {
21209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        doc = XMLDocument::create(init);
2138abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    }
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
215323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    doc->setSecurityOrigin(document().securityOrigin()->isolatedCopy());
216323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    doc->setContextFeatures(document().contextFeatures());
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
218d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Node> documentElement = nullptr;
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!qualifiedName.isEmpty()) {
22051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        documentElement = doc->createElementNS(namespaceURI, qualifiedName, exceptionState);
22151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (exceptionState.hadException())
222d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return nullptr;
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (doctype)
226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        doc->appendChild(doctype);
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (documentElement)
228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        doc->appendChild(documentElement.release());
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return doc.release();
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool DOMImplementation::isXMLMIMEType(const String& mimeType)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (equalIgnoringCase(mimeType, "text/xml")
23609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        || equalIgnoringCase(mimeType, "application/xml")
23709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        || equalIgnoringCase(mimeType, "text/xsl"))
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
23953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
24009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Per RFCs 3023 and 2045, an XML MIME type is of the form:
24153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // ^[0-9a-zA-Z_\\-+~!$\\^{}|.%'`#&*]+/[0-9a-zA-Z_\\-+~!$\\^{}|.%'`#&*]+\+xml$
24253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
24353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    int length = mimeType.length();
24453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (length < 7)
24553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
24653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
24709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (mimeType[0] == '/' || mimeType[length - 5] == '/' || !mimeType.endsWith("+xml", false))
24853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
24953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
25053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool hasSlash = false;
25153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    for (int i = 0; i < length - 4; ++i) {
25253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        UChar ch = mimeType[i];
25353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (ch >= '0' && ch <= '9')
25453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            continue;
25553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (ch >= 'a' && ch <= 'z')
25653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            continue;
25753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (ch >= 'A' && ch <= 'Z')
25853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            continue;
25953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        switch (ch) {
26053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '_':
26153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '-':
26253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '+':
26353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '~':
26453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '!':
26553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '$':
26653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '^':
26753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '{':
26853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '}':
26953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '|':
27053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '.':
27153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '%':
27253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '\'':
27353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '`':
27453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '#':
27553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '&':
27653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '*':
27753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            continue;
27853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        case '/':
27953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            if (hasSlash)
28053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                return false;
28153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            hasSlash = true;
28253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            continue;
28353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        default:
28453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return false;
28553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
28653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
28753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
28853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool DOMImplementation::isJSONMIMEType(const String& mimeType)
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (mimeType.startsWith("application/json", false))
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
29509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (mimeType.startsWith("application/", false)) {
29609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        size_t subtype = mimeType.find("+json", 12, false);
29709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (subtype != kNotFound) {
29809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            // Just check that a parameter wasn't matched.
29909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            size_t parameterMarker = mimeType.find(";");
30009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (parameterMarker == kNotFound) {
30109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                unsigned endSubtype = static_cast<unsigned>(subtype) + 5;
30209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                return endSubtype == mimeType.length() || isASCIISpace(mimeType[endSubtype]);
30309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            }
30409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return parameterMarker > subtype;
30509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
30609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static bool isTextPlainType(const String& mimeType)
31109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
31209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return mimeType.startsWith("text/", false)
31309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        && !(equalIgnoringCase(mimeType, "text/html")
31409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            || equalIgnoringCase(mimeType, "text/xml")
31509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            || equalIgnoringCase(mimeType, "text/xsl"));
31609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
31709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
31809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool DOMImplementation::isTextMIMEType(const String& mimeType)
31909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
32009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return MIMETypeRegistry::isSupportedJavaScriptMIMEType(mimeType) || isJSONMIMEType(mimeType) || isTextPlainType(mimeType);
32109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
32209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
323d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<HTMLDocument> DOMImplementation::createHTMLDocument(const String& title)
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
325323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    DocumentInit init = DocumentInit::fromContext(document().contextDocument())
326323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        .withRegistrationContext(document().registrationContext());
327d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLDocument> d = HTMLDocument::create(init);
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    d->open();
329197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    d->write("<!doctype html><html><head></head><body></body></html>");
330197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!title.isNull()) {
331197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        HTMLHeadElement* headElement = d->head();
332197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        ASSERT(headElement);
333197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        RefPtrWillBeRawPtr<HTMLTitleElement> titleElement = HTMLTitleElement::create(*d);
334197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        headElement->appendChild(titleElement);
335197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        titleElement->appendChild(d->createTextNode(title), ASSERT_NO_EXCEPTION);
336197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
337323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    d->setSecurityOrigin(document().securityOrigin()->isolatedCopy());
338323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    d->setContextFeatures(document().contextFeatures());
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return d.release();
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
342d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<Document> DOMImplementation::createDocument(const String& type, LocalFrame* frame, const KURL& url, bool inViewSourceMode)
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
344f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return createDocument(type, DocumentInit(url, frame), inViewSourceMode);
345f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
346f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
347d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<Document> DOMImplementation::createDocument(const String& type, const DocumentInit& init, bool inViewSourceMode)
348f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (inViewSourceMode)
350f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return HTMLViewSourceDocument::create(init, type);
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Plugins cannot take HTML and XHTML from us, and we don't even need to initialize the plugin database for those.
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (type == "text/html")
354f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return HTMLDocument::create(init);
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (type == "application/xhtml+xml")
35609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return XMLDocument::createXHTML(init);
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PluginData* pluginData = 0;
359f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (init.frame() && init.frame()->page() && init.frame()->loader().allowPlugins(NotAboutToInstantiatePlugin))
360f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        pluginData = init.frame()->page()->pluginData();
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // PDF is one image type for which a plugin can override built-in support.
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We do not want QuickTime to take over all image types, obviously.
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ((type == "application/pdf" || type == "text/pdf") && pluginData && pluginData->supportsMimeType(type))
365f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return PluginDocument::create(init);
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Image::supportsType(type))
367f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return ImageDocument::create(init);
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // Check to see if the type can be played by our MediaPlayer, if so create a MediaDocument
3705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (HTMLMediaElement::supportsType(ContentType(type)))
371f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return MediaDocument::create(init);
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Everything else except text/plain can be overridden by plugins. In particular, Adobe SVG Viewer should be used for SVG, if installed.
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Disallowing plug-ins to use text/plain prevents plug-ins from hijacking a fundamental type that the browser is expected to handle,
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // and also serves as an optimization to prevent loading the plug-in database in the common case.
37602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    if (type != "text/plain" && pluginData && pluginData->supportsMimeType(type))
377f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return PluginDocument::create(init);
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isTextMIMEType(type))
379f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return TextDocument::create(init);
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (type == "image/svg+xml")
381323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        return XMLDocument::createSVG(init);
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isXMLMIMEType(type))
38309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return XMLDocument::create(init);
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
385f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return HTMLDocument::create(init);
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
388323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void DOMImplementation::trace(Visitor* visitor)
389323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
390323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    visitor->trace(m_document);
391323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
392323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
394