PassRefPtrWillBeRawPtr<Document> DOMImplementation::createDocument(const String& type, const DocumentInit& init, bool inViewSourceMode) { if (inViewSourceMode) return HTMLViewSourceDocument::create(init, type); // Plugins cannot take HTML and XHTML from us, and we don't even need to initialize the plugin database for those. if (type == "text/html") return HTMLDocument::create(init); if (type == "application/xhtml+xml" || type == "application/vnd.wap.xhtml+xml") return XMLDocument::createXHTML(init); if (type == "text/vnd.wap.wml") return XMLDocument::createWML(init); PluginData* pluginData = 0; if (init.frame() && init.frame()->page() && init.frame()->loader().allowPlugins(NotAboutToInstantiatePlugin)) pluginData = init.frame()->page()->pluginData(); // PDF is one image type for which a plugin can override built-in support. // We do not want QuickTime to take over all image types, obviously. if ((type == "application/pdf" || type == "text/pdf") && pluginData && pluginData->supportsMimeType(type)) return PluginDocument::create(init); if (Image::supportsType(type)) return ImageDocument::create(init); // Check to see if the type can be played by our media player, if so create a MediaDocument if (HTMLMediaElement::supportsType(ContentType(type))) return MediaDocument::create(init); // Everything else except text/plain can be overridden by plugins. In particular, Adobe SVG Viewer should be used for SVG, if installed. // Disallowing plugins to use text/plain prevents plugins from hijacking a fundamental type that the browser is expected to handle, // and also serves as an optimization to prevent loading the plugin database in the common case. if (type != "text/plain" && pluginData && pluginData->supportsMimeType(type)) return PluginDocument::create(init); if (isTextMIMEType(type)) return TextDocument::create(init); if (type == "image/svg+xml") return XMLDocument::createSVG(init); if (isXMLMIMEType(type)) return XMLDocument::create(init); return HTMLDocument::create(init); }
Document::Document(const DocumentInit& initializer) : ContainerNode(0, CreateDocument) , TreeScope(*this) , m_active(false) , m_visualUpdatePending(true) , m_inStyleRecalc(false) , m_stopped(false) , m_module(nullptr) , m_evaluateMediaQueriesOnStyleRecalc(false) , m_frame(initializer.frame()) , m_domWindow(m_frame ? m_frame->domWindow() : 0) , m_activeParserCount(0) , m_listenerTypes(0) , m_mutationObserverTypes(0) , m_readyState(Complete) , m_isParsing(false) , m_containsValidityStyleRules(false) , m_markers(adoptPtr(new DocumentMarkerController)) , m_loadEventProgress(LoadEventNotRun) , m_startTime(currentTime()) , m_renderView(0) #if !ENABLE(OILPAN) , m_weakFactory(this) #endif , m_didSetReferrerPolicy(false) , m_referrerPolicy(ReferrerPolicyDefault) , m_elementRegistry(initializer.elementRegistry()) , m_templateDocumentHost(nullptr) , m_hasViewportUnits(false) , m_styleRecalcElementCounter(0) , m_frameView(nullptr) { if (!m_elementRegistry) m_elementRegistry = CustomElementRegistry::Create(); // We depend on the url getting immediately set in subframes, but we // also depend on the url NOT getting immediately set in opened windows. // See fast/dom/early-frame-url.html // and fast/dom/location-new-window-no-crash.html, respectively. // FIXME: Can/should we unify this behavior? if (initializer.shouldSetURL()) setURL(initializer.url()); InspectorCounters::incrementCounter(InspectorCounters::DocumentCounter); #ifndef NDEBUG liveDocumentSet().add(this); #endif }
PassRefPtrWillBeRawPtr<DocumentWriter> DocumentLoader::createWriterFor(const Document* ownerDocument, const DocumentInit& init, const AtomicString& mimeType, const AtomicString& encoding, bool dispatch, ParserSynchronizationPolicy parsingPolicy) { LocalFrame* frame = init.frame(); if (frame->document()) frame->document()->prepareForDestruction(); if (!init.shouldReuseDefaultView()) frame->setDOMWindow(LocalDOMWindow::create(*frame)); RefPtrWillBeRawPtr<Document> document = frame->localDOMWindow()->installNewDocument(mimeType, init); if (ownerDocument) { document->setCookieURL(ownerDocument->cookieURL()); document->setSecurityOrigin(ownerDocument->securityOrigin()); if (ownerDocument->isTransitionDocument()) document->setIsTransitionDocument(true); } frame->loader().didBeginDocument(dispatch); return DocumentWriter::create(document.get(), parsingPolicy, mimeType, encoding); }