void XMLTreeBuilder::processStartTag(const AtomicXMLToken& token) { exitText(); bool isFirstElement = !m_sawFirstElement; m_sawFirstElement = true; NodeStackItem top = m_currentNodeStack.last(); processNamespaces(token, top); QualifiedName qName(token.prefix(), token.name(), top.namespaceForPrefix(token.prefix(), top.namespaceURI())); RefPtr<Element> newElement = m_document->createElement(qName, true); processAttributes(token, top, newElement); newElement->beginParsingChildren(); m_currentNodeStack.last().node()->parserAddChild(newElement.get()); top.setNode(newElement); pushCurrentNode(top); if (!newElement->attached()) newElement->attach(); if (isFirstElement && m_document->frame()) m_document->frame()->loader()->dispatchDocumentElementAvailable(); if (token.selfClosing()) closeElement(newElement); }
void XMLDocumentParser::parseProcessingInstruction() { exitText(); // ### handle exceptions int exception = 0; RefPtr<ProcessingInstruction> pi = document()->createProcessingInstruction( m_stream.processingInstructionTarget(), m_stream.processingInstructionData(), exception); if (exception) return; pi->setCreatedByParser(true); m_currentNode->deprecatedParserAddChild(pi.get()); if (m_view && !pi->attached()) pi->attach(); pi->finishParsingChildren(); if (pi->isCSS()) m_sawCSS = true; #if ENABLE(XSLT) m_sawXSLTransform = !m_sawFirstElement && pi->isXSL(); if (m_sawXSLTransform && !document()->transformSourceDocument()) stopParsing(); #endif }
void XMLDocumentParser::parseComment() { exitText(); RefPtr<Comment> newNode = Comment::create(document(), m_stream.text()); m_currentNode->parserAppendChild(newNode.get()); }
void XMLDocumentParser::parseStartElement() { if (!m_sawFirstElement && m_parsingFragment) { // skip dummy element for fragments m_sawFirstElement = true; return; } exitText(); String localName = m_stream.name(); String uri = m_stream.namespaceUri(); String prefix = prefixFromQName(m_stream.qualifiedName().toString()); if (m_parsingFragment && uri.isNull()) { Q_ASSERT(prefix.isNull()); uri = m_defaultNamespaceURI; } QualifiedName qName(prefix, localName, uri); RefPtr<Element> newElement = document()->createElement(qName, true); if (!newElement) { stopParsing(); return; } bool isFirstElement = !m_sawFirstElement; m_sawFirstElement = true; ExceptionCode ec = 0; handleElementNamespaces(newElement.get(), m_stream.namespaceDeclarations(), ec, m_scriptingPermission); if (ec) { stopParsing(); return; } handleElementAttributes(newElement.get(), m_stream.attributes(), ec, m_scriptingPermission); if (ec) { stopParsing(); return; } ScriptElement* scriptElement = toScriptElement(newElement.get()); if (scriptElement) m_scriptStartPosition = textPosition(); m_currentNode->parserAddChild(newElement.get()); pushCurrentNode(newElement.get()); if (m_view && !newElement->attached()) newElement->attach(); if (newElement->hasTagName(HTMLNames::htmlTag)) static_cast<HTMLHtmlElement*>(newElement.get())->insertedByParser(); if (isFirstElement && document()->frame()) document()->frame()->loader()->dispatchDocumentElementAvailable(); }
void XMLDocumentParser::parseEndElement() { exitText(); RefPtr<ContainerNode> n = m_currentNode; n->finishParsingChildren(); if (!scriptingContentIsAllowed(m_scriptingPermission) && n->isElementNode() && toScriptElement(static_cast<Element*>(n.get()))) { popCurrentNode(); ExceptionCode ec; n->remove(ec); return; } if (!n->isElementNode() || !m_view) { if (!m_currentNodeStack.isEmpty()) popCurrentNode(); return; } Element* element = static_cast<Element*>(n.get()); // The element's parent may have already been removed from document. // Parsing continues in this case, but scripts aren't executed. if (!element->inDocument()) { popCurrentNode(); return; } ScriptElement* scriptElement = toScriptElement(element); if (!scriptElement) { popCurrentNode(); return; } // don't load external scripts for standalone documents (for now) ASSERT(!m_pendingScript); m_requestingScript = true; if (scriptElement->prepareScript(m_scriptStartPosition, ScriptElement::AllowLegacyTypeInTypeAttribute)) { if (scriptElement->readyToBeParserExecuted()) scriptElement->executeScript(ScriptSourceCode(scriptElement->scriptContent(), document()->url(), m_scriptStartPosition)); else if (scriptElement->willBeParserExecuted()) { m_pendingScript = scriptElement->cachedScript(); m_scriptElement = element; m_pendingScript->addClient(this); // m_pendingScript will be 0 if script was already loaded and addClient() executed it. if (m_pendingScript) pauseParsing(); } else m_scriptElement = 0; } m_requestingScript = false; popCurrentNode(); }
void XMLDocumentParser::parseComment() { exitText(); RefPtr<Node> newNode = Comment::create(document(), m_stream.text()); m_currentNode->deprecatedParserAddChild(newNode.get()); if (m_view && !newNode->attached()) newNode->attach(); }
void XMLDocumentParser::parseCdata() { exitText(); RefPtr<CDATASection> newNode = CDATASection::create(document(), m_stream.text()); m_currentNode->parserAppendChild(newNode.get()); if (m_view && !newNode->attached()) newNode->attach(); }
void XMLTreeBuilder::processEndTag(const AtomicXMLToken& token) { exitText(); RefPtr<ContainerNode> node = m_currentNodeStack.last().node(); if (!node->hasTagName(QualifiedName(token.prefix(), token.name(), m_currentNodeStack.last().namespaceForPrefix(token.prefix(), m_currentNodeStack.last().namespaceURI())))) m_parser->stopParsing(); closeElement(toElement(node.get())); }
void XMLTokenizer::end() { doEnd(); if (m_sawError) insertErrorMessageBlock(); else { exitText(); m_doc->updateStyleSelector(); } setCurrentNode(0); if (!m_parsingFragment) m_doc->finishedParsing(); }
void XMLDocumentParser::parseProcessingInstruction() { exitText(); // ### handle exceptions int exception = 0; RefPtr<ProcessingInstruction> pi = document()->createProcessingInstruction( m_stream.processingInstructionTarget(), m_stream.processingInstructionData(), exception); if (exception) return; pi->setCreatedByParser(true); m_currentNode->parserAppendChild(pi.get()); pi->finishParsingChildren(); if (pi->isCSS()) m_sawCSS = true; }
void XMLTreeBuilder::processToken(const AtomicXMLToken& token) { switch (token.type()) { case XMLTokenTypes::Uninitialized: ASSERT_NOT_REACHED(); break; case XMLTokenTypes::ProcessingInstruction: processProcessingInstruction(token); break; case XMLTokenTypes::XMLDeclaration: processXMLDeclaration(token); break; case XMLTokenTypes::DOCTYPE: processDOCTYPE(token); break; case XMLTokenTypes::StartTag: processStartTag(token); break; case XMLTokenTypes::EndTag: processEndTag(token); break; case XMLTokenTypes::CDATA: processCDATA(token); break; case XMLTokenTypes::Character: processCharacter(token); break; case XMLTokenTypes::Comment: processComment(token); break; case XMLTokenTypes::Entity: processEntity(token); break; case XMLTokenTypes::EndOfFile: exitText(); return; } }
void XMLDocumentParser::parseStartElement() { if (!m_sawFirstElement && m_parsingFragment) { // skip dummy element for fragments m_sawFirstElement = true; return; } exitText(); String localName = m_stream.name(); String uri = m_stream.namespaceUri(); String prefix = prefixFromQName(m_stream.qualifiedName().toString()); if (m_parsingFragment && uri.isNull()) { Q_ASSERT(prefix.isNull()); uri = m_defaultNamespaceURI; } QualifiedName qName(prefix, localName, uri); RefPtr<Element> newElement = document()->createElement(qName, true); if (!newElement) { stopParsing(); return; } #if ENABLE(XHTMLMP) if (!m_sawFirstElement && isXHTMLMPDocument()) { // As per 7.1 section of OMA-WAP-XHTMLMP-V1_1-20061020-A.pdf, // we should make sure that the root element MUST be 'html' and // ensure the name of the default namespace on the root elment 'html' // MUST be 'http://www.w3.org/1999/xhtml' if (localName != HTMLNames::htmlTag.localName()) { handleError(fatal, "XHTMLMP document expects 'html' as root element.", lineNumber(), columnNumber()); return; } if (uri.isNull()) { m_defaultNamespaceURI = HTMLNames::xhtmlNamespaceURI; uri = m_defaultNamespaceURI; m_stream.addExtraNamespaceDeclaration(QXmlStreamNamespaceDeclaration(prefix, HTMLNames::xhtmlNamespaceURI)); } } #endif bool isFirstElement = !m_sawFirstElement; m_sawFirstElement = true; ExceptionCode ec = 0; handleElementNamespaces(newElement.get(), m_stream.namespaceDeclarations(), ec, m_scriptingPermission); if (ec) { stopParsing(); return; } handleElementAttributes(newElement.get(), m_stream.attributes(), ec, m_scriptingPermission); if (ec) { stopParsing(); return; } ScriptElement* scriptElement = toScriptElement(newElement.get()); if (scriptElement) m_scriptStartPosition = textPositionOneBased(); m_currentNode->deprecatedParserAddChild(newElement.get()); pushCurrentNode(newElement.get()); if (m_view && !newElement->attached()) newElement->attach(); #if ENABLE(OFFLINE_WEB_APPLICATIONS) if (newElement->hasTagName(HTMLNames::htmlTag)) static_cast<HTMLHtmlElement*>(newElement.get())->insertedByParser(); #endif if (isFirstElement && document()->frame()) document()->frame()->loader()->dispatchDocumentElementAvailable(); }
void XMLTreeBuilder::processComment(const AtomicXMLToken& token) { exitText(); add(Comment::create(m_document, token.comment())); }
void XMLTreeBuilder::processCDATA(const AtomicXMLToken& token) { exitText(); add(CDATASection::create(m_document, token.data())); }
void XMLTreeBuilder::finish() { exitText(); }