| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2000 Peter Kelly (pmk@post.com) | 2 * Copyright (C) 2000 Peter Kelly (pmk@post.com) |
| 3 * Copyright (C) 2005, 2006, 2008 Apple Inc. All rights reserved. | 3 * Copyright (C) 2005, 2006, 2008 Apple Inc. All rights reserved. |
| 4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
| 5 * Copyright (C) 2007 Samuel Weinig (sam@webkit.org) | 5 * Copyright (C) 2007 Samuel Weinig (sam@webkit.org) |
| 6 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 6 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
| 7 * Copyright (C) 2008 Holger Hans Peter Freyther | 7 * Copyright (C) 2008 Holger Hans Peter Freyther |
| 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
| 9 * | 9 * |
| 10 * This library is free software; you can redistribute it and/or | 10 * This library is free software; you can redistribute it and/or |
| (...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 653 // JavaScript may cause the parser to detach during xmlParseChunk | 653 // JavaScript may cause the parser to detach during xmlParseChunk |
| 654 // keep this alive until this function is done. | 654 // keep this alive until this function is done. |
| 655 RefPtr<XMLDocumentParser> protect(this); | 655 RefPtr<XMLDocumentParser> protect(this); |
| 656 | 656 |
| 657 switchToUTF16(context->context()); | 657 switchToUTF16(context->context()); |
| 658 XMLDocumentParserScope scope(document()->docLoader()); | 658 XMLDocumentParserScope scope(document()->docLoader()); |
| 659 xmlParseChunk(context->context(), reinterpret_cast<const char*>(parseStr
ing.characters()), sizeof(UChar) * parseString.length(), 0); | 659 xmlParseChunk(context->context(), reinterpret_cast<const char*>(parseStr
ing.characters()), sizeof(UChar) * parseString.length(), 0); |
| 660 | 660 |
| 661 // JavaScript (which may be run under the xmlParseChunk callstack) may | 661 // JavaScript (which may be run under the xmlParseChunk callstack) may |
| 662 // cause the parser to be stopped or detached. | 662 // cause the parser to be stopped or detached. |
| 663 if (isStopped()) | 663 if (isDetached() || m_parserStopped) |
| 664 return; | 664 return; |
| 665 } | 665 } |
| 666 | 666 |
| 667 // FIXME: Why is this here? And why is it after we process the passed sourc
e? | 667 // FIXME: Why is this here? And why is it after we process the passed sourc
e? |
| 668 if (document()->decoder() && document()->decoder()->sawError()) { | 668 if (document()->decoder() && document()->decoder()->sawError()) { |
| 669 // If the decoder saw an error, report it as fatal (stops parsing) | 669 // If the decoder saw an error, report it as fatal (stops parsing) |
| 670 handleError(fatal, "Encoding error", context->context()->input->line, co
ntext->context()->input->col); | 670 handleError(fatal, "Encoding error", context->context()->input->line, co
ntext->context()->input->col); |
| 671 } | 671 } |
| 672 } | 672 } |
| 673 | 673 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 726 | 726 |
| 727 newElement->setAttributeNS(attrURI, attrQName, attrValue, ec, scriptingP
ermission); | 727 newElement->setAttributeNS(attrURI, attrQName, attrValue, ec, scriptingP
ermission); |
| 728 if (ec) // exception setting attributes | 728 if (ec) // exception setting attributes |
| 729 return; | 729 return; |
| 730 } | 730 } |
| 731 } | 731 } |
| 732 | 732 |
| 733 void XMLDocumentParser::startElementNs(const xmlChar* xmlLocalName, const xmlCha
r* xmlPrefix, const xmlChar* xmlURI, int nb_namespaces, | 733 void XMLDocumentParser::startElementNs(const xmlChar* xmlLocalName, const xmlCha
r* xmlPrefix, const xmlChar* xmlURI, int nb_namespaces, |
| 734 const xmlChar** libxmlNamespaces, int nb_attri
butes, int nb_defaulted, const xmlChar** libxmlAttributes) | 734 const xmlChar** libxmlNamespaces, int nb_attri
butes, int nb_defaulted, const xmlChar** libxmlAttributes) |
| 735 { | 735 { |
| 736 if (isStopped()) | 736 if (m_parserStopped) |
| 737 return; | 737 return; |
| 738 | 738 |
| 739 if (m_parserPaused) { | 739 if (m_parserPaused) { |
| 740 m_pendingCallbacks->appendStartElementNSCallback(xmlLocalName, xmlPrefix
, xmlURI, nb_namespaces, libxmlNamespaces, | 740 m_pendingCallbacks->appendStartElementNSCallback(xmlLocalName, xmlPrefix
, xmlURI, nb_namespaces, libxmlNamespaces, |
| 741 nb_attributes, nb_defau
lted, libxmlAttributes); | 741 nb_attributes, nb_defau
lted, libxmlAttributes); |
| 742 return; | 742 return; |
| 743 } | 743 } |
| 744 | 744 |
| 745 #if ENABLE(XHTMLMP) | 745 #if ENABLE(XHTMLMP) |
| 746 // check if the DOCTYPE Declaration of XHTMLMP document exists | 746 // check if the DOCTYPE Declaration of XHTMLMP document exists |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 815 pushCurrentNode(newElement.get()); | 815 pushCurrentNode(newElement.get()); |
| 816 if (m_view && !newElement->attached()) | 816 if (m_view && !newElement->attached()) |
| 817 newElement->attach(); | 817 newElement->attach(); |
| 818 | 818 |
| 819 if (!m_parsingFragment && isFirstElement && document()->frame()) | 819 if (!m_parsingFragment && isFirstElement && document()->frame()) |
| 820 document()->frame()->loader()->dispatchDocumentElementAvailable(); | 820 document()->frame()->loader()->dispatchDocumentElementAvailable(); |
| 821 } | 821 } |
| 822 | 822 |
| 823 void XMLDocumentParser::endElementNs() | 823 void XMLDocumentParser::endElementNs() |
| 824 { | 824 { |
| 825 if (isStopped()) | 825 if (m_parserStopped) |
| 826 return; | 826 return; |
| 827 | 827 |
| 828 if (m_parserPaused) { | 828 if (m_parserPaused) { |
| 829 m_pendingCallbacks->appendEndElementNSCallback(); | 829 m_pendingCallbacks->appendEndElementNSCallback(); |
| 830 return; | 830 return; |
| 831 } | 831 } |
| 832 | 832 |
| 833 exitText(); | 833 exitText(); |
| 834 | 834 |
| 835 Node* n = m_currentNode; | 835 Node* n = m_currentNode; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 899 // JavaScript may have detached the parser | 899 // JavaScript may have detached the parser |
| 900 if (isDetached()) | 900 if (isDetached()) |
| 901 return; | 901 return; |
| 902 } | 902 } |
| 903 m_requestingScript = false; | 903 m_requestingScript = false; |
| 904 popCurrentNode(); | 904 popCurrentNode(); |
| 905 } | 905 } |
| 906 | 906 |
| 907 void XMLDocumentParser::characters(const xmlChar* s, int len) | 907 void XMLDocumentParser::characters(const xmlChar* s, int len) |
| 908 { | 908 { |
| 909 if (isStopped()) | 909 if (m_parserStopped) |
| 910 return; | 910 return; |
| 911 | 911 |
| 912 if (m_parserPaused) { | 912 if (m_parserPaused) { |
| 913 m_pendingCallbacks->appendCharactersCallback(s, len); | 913 m_pendingCallbacks->appendCharactersCallback(s, len); |
| 914 return; | 914 return; |
| 915 } | 915 } |
| 916 | 916 |
| 917 if (!m_currentNode->isTextNode()) | 917 if (!m_currentNode->isTextNode()) |
| 918 enterText(); | 918 enterText(); |
| 919 m_bufferedText.append(s, len); | 919 m_bufferedText.append(s, len); |
| 920 } | 920 } |
| 921 | 921 |
| 922 void XMLDocumentParser::error(ErrorType type, const char* message, va_list args) | 922 void XMLDocumentParser::error(ErrorType type, const char* message, va_list args) |
| 923 { | 923 { |
| 924 if (isStopped()) | 924 if (m_parserStopped) |
| 925 return; | 925 return; |
| 926 | 926 |
| 927 #if COMPILER(MSVC) || COMPILER(RVCT) | 927 #if COMPILER(MSVC) || COMPILER(RVCT) |
| 928 char m[1024]; | 928 char m[1024]; |
| 929 vsnprintf(m, sizeof(m) - 1, message, args); | 929 vsnprintf(m, sizeof(m) - 1, message, args); |
| 930 #else | 930 #else |
| 931 char* m; | 931 char* m; |
| 932 if (vasprintf(&m, message, args) == -1) | 932 if (vasprintf(&m, message, args) == -1) |
| 933 return; | 933 return; |
| 934 #endif | 934 #endif |
| 935 | 935 |
| 936 if (m_parserPaused) | 936 if (m_parserPaused) |
| 937 m_pendingCallbacks->appendErrorCallback(type, reinterpret_cast<const xml
Char*>(m), lineNumber(), columnNumber()); | 937 m_pendingCallbacks->appendErrorCallback(type, reinterpret_cast<const xml
Char*>(m), lineNumber(), columnNumber()); |
| 938 else | 938 else |
| 939 handleError(type, m, lineNumber(), columnNumber()); | 939 handleError(type, m, lineNumber(), columnNumber()); |
| 940 | 940 |
| 941 #if !COMPILER(MSVC) && !COMPILER(RVCT) | 941 #if !COMPILER(MSVC) && !COMPILER(RVCT) |
| 942 free(m); | 942 free(m); |
| 943 #endif | 943 #endif |
| 944 } | 944 } |
| 945 | 945 |
| 946 void XMLDocumentParser::processingInstruction(const xmlChar* target, const xmlCh
ar* data) | 946 void XMLDocumentParser::processingInstruction(const xmlChar* target, const xmlCh
ar* data) |
| 947 { | 947 { |
| 948 if (isStopped()) | 948 if (m_parserStopped) |
| 949 return; | 949 return; |
| 950 | 950 |
| 951 if (m_parserPaused) { | 951 if (m_parserPaused) { |
| 952 m_pendingCallbacks->appendProcessingInstructionCallback(target, data); | 952 m_pendingCallbacks->appendProcessingInstructionCallback(target, data); |
| 953 return; | 953 return; |
| 954 } | 954 } |
| 955 | 955 |
| 956 exitText(); | 956 exitText(); |
| 957 | 957 |
| 958 // ### handle exceptions | 958 // ### handle exceptions |
| (...skipping 13 matching lines...) Expand all Loading... |
| 972 | 972 |
| 973 #if ENABLE(XSLT) | 973 #if ENABLE(XSLT) |
| 974 m_sawXSLTransform = !m_sawFirstElement && pi->isXSL(); | 974 m_sawXSLTransform = !m_sawFirstElement && pi->isXSL(); |
| 975 if (m_sawXSLTransform && !document()->transformSourceDocument()) | 975 if (m_sawXSLTransform && !document()->transformSourceDocument()) |
| 976 stopParsing(); | 976 stopParsing(); |
| 977 #endif | 977 #endif |
| 978 } | 978 } |
| 979 | 979 |
| 980 void XMLDocumentParser::cdataBlock(const xmlChar* s, int len) | 980 void XMLDocumentParser::cdataBlock(const xmlChar* s, int len) |
| 981 { | 981 { |
| 982 if (isStopped()) | 982 if (m_parserStopped) |
| 983 return; | 983 return; |
| 984 | 984 |
| 985 if (m_parserPaused) { | 985 if (m_parserPaused) { |
| 986 m_pendingCallbacks->appendCDATABlockCallback(s, len); | 986 m_pendingCallbacks->appendCDATABlockCallback(s, len); |
| 987 return; | 987 return; |
| 988 } | 988 } |
| 989 | 989 |
| 990 exitText(); | 990 exitText(); |
| 991 | 991 |
| 992 RefPtr<Node> newNode = CDATASection::create(document(), toString(s, len)); | 992 RefPtr<Node> newNode = CDATASection::create(document(), toString(s, len)); |
| 993 m_currentNode->deprecatedParserAddChild(newNode.get()); | 993 m_currentNode->deprecatedParserAddChild(newNode.get()); |
| 994 if (m_view && !newNode->attached()) | 994 if (m_view && !newNode->attached()) |
| 995 newNode->attach(); | 995 newNode->attach(); |
| 996 } | 996 } |
| 997 | 997 |
| 998 void XMLDocumentParser::comment(const xmlChar* s) | 998 void XMLDocumentParser::comment(const xmlChar* s) |
| 999 { | 999 { |
| 1000 if (isStopped()) | 1000 if (m_parserStopped) |
| 1001 return; | 1001 return; |
| 1002 | 1002 |
| 1003 if (m_parserPaused) { | 1003 if (m_parserPaused) { |
| 1004 m_pendingCallbacks->appendCommentCallback(s); | 1004 m_pendingCallbacks->appendCommentCallback(s); |
| 1005 return; | 1005 return; |
| 1006 } | 1006 } |
| 1007 | 1007 |
| 1008 exitText(); | 1008 exitText(); |
| 1009 | 1009 |
| 1010 RefPtr<Node> newNode = Comment::create(document(), toString(s)); | 1010 RefPtr<Node> newNode = Comment::create(document(), toString(s)); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1027 void XMLDocumentParser::endDocument() | 1027 void XMLDocumentParser::endDocument() |
| 1028 { | 1028 { |
| 1029 exitText(); | 1029 exitText(); |
| 1030 #if ENABLE(XHTMLMP) | 1030 #if ENABLE(XHTMLMP) |
| 1031 m_hasDocTypeDeclaration = false; | 1031 m_hasDocTypeDeclaration = false; |
| 1032 #endif | 1032 #endif |
| 1033 } | 1033 } |
| 1034 | 1034 |
| 1035 void XMLDocumentParser::internalSubset(const xmlChar* name, const xmlChar* exter
nalID, const xmlChar* systemID) | 1035 void XMLDocumentParser::internalSubset(const xmlChar* name, const xmlChar* exter
nalID, const xmlChar* systemID) |
| 1036 { | 1036 { |
| 1037 if (isStopped()) | 1037 if (m_parserStopped) |
| 1038 return; | 1038 return; |
| 1039 | 1039 |
| 1040 if (m_parserPaused) { | 1040 if (m_parserPaused) { |
| 1041 m_pendingCallbacks->appendInternalSubsetCallback(name, externalID, syste
mID); | 1041 m_pendingCallbacks->appendInternalSubsetCallback(name, externalID, syste
mID); |
| 1042 return; | 1042 return; |
| 1043 } | 1043 } |
| 1044 | 1044 |
| 1045 if (document()) { | 1045 if (document()) { |
| 1046 #if ENABLE(WML) || ENABLE(XHTMLMP) | 1046 #if ENABLE(WML) || ENABLE(XHTMLMP) |
| 1047 String extId = toString(externalID); | 1047 String extId = toString(externalID); |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1287 sax.startElementNs = startElementNsHandler; | 1287 sax.startElementNs = startElementNsHandler; |
| 1288 sax.endElementNs = endElementNsHandler; | 1288 sax.endElementNs = endElementNsHandler; |
| 1289 sax.getEntity = getEntityHandler; | 1289 sax.getEntity = getEntityHandler; |
| 1290 sax.startDocument = startDocumentHandler; | 1290 sax.startDocument = startDocumentHandler; |
| 1291 sax.endDocument = endDocumentHandler; | 1291 sax.endDocument = endDocumentHandler; |
| 1292 sax.internalSubset = internalSubsetHandler; | 1292 sax.internalSubset = internalSubsetHandler; |
| 1293 sax.externalSubset = externalSubsetHandler; | 1293 sax.externalSubset = externalSubsetHandler; |
| 1294 sax.ignorableWhitespace = ignorableWhitespaceHandler; | 1294 sax.ignorableWhitespace = ignorableWhitespaceHandler; |
| 1295 sax.entityDecl = xmlSAX2EntityDecl; | 1295 sax.entityDecl = xmlSAX2EntityDecl; |
| 1296 sax.initialized = XML_SAX2_MAGIC; | 1296 sax.initialized = XML_SAX2_MAGIC; |
| 1297 DocumentParser::startParsing(); | 1297 m_parserStopped = false; |
| 1298 m_sawError = false; | 1298 m_sawError = false; |
| 1299 m_sawXSLTransform = false; | 1299 m_sawXSLTransform = false; |
| 1300 m_sawFirstElement = false; | 1300 m_sawFirstElement = false; |
| 1301 | 1301 |
| 1302 XMLDocumentParserScope scope(document()->docLoader()); | 1302 XMLDocumentParserScope scope(document()->docLoader()); |
| 1303 if (m_parsingFragment) | 1303 if (m_parsingFragment) |
| 1304 m_context = XMLParserContext::createMemoryParser(&sax, this, chunk); | 1304 m_context = XMLParserContext::createMemoryParser(&sax, this, chunk); |
| 1305 else { | 1305 else { |
| 1306 ASSERT(!chunk); | 1306 ASSERT(!chunk); |
| 1307 m_context = XMLParserContext::createStringParser(&sax, this); | 1307 m_context = XMLParserContext::createStringParser(&sax, this); |
| 1308 } | 1308 } |
| 1309 } | 1309 } |
| 1310 | 1310 |
| 1311 void XMLDocumentParser::doEnd() | 1311 void XMLDocumentParser::doEnd() |
| 1312 { | 1312 { |
| 1313 #if ENABLE(XSLT) | 1313 #if ENABLE(XSLT) |
| 1314 if (m_sawXSLTransform) { | 1314 if (m_sawXSLTransform) { |
| 1315 void* doc = xmlDocPtrForString(document()->docLoader(), m_originalSource
ForTransform, document()->url().string()); | 1315 void* doc = xmlDocPtrForString(document()->docLoader(), m_originalSource
ForTransform, document()->url().string()); |
| 1316 document()->setTransformSource(new TransformSource(doc)); | 1316 document()->setTransformSource(new TransformSource(doc)); |
| 1317 | 1317 |
| 1318 document()->setParsing(false); // Make the doc think it's done, so it wi
ll apply xsl sheets. | 1318 document()->setParsing(false); // Make the doc think it's done, so it wi
ll apply xsl sheets. |
| 1319 document()->styleSelectorChanged(RecalcStyleImmediately); | 1319 document()->styleSelectorChanged(RecalcStyleImmediately); |
| 1320 document()->setParsing(true); | 1320 document()->setParsing(true); |
| 1321 DocumentParser::stopParsing(); | 1321 m_parserStopped = true; |
| 1322 } | 1322 } |
| 1323 #endif | 1323 #endif |
| 1324 | 1324 |
| 1325 if (isStopped()) | 1325 if (m_parserStopped) |
| 1326 return; | 1326 return; |
| 1327 | 1327 |
| 1328 if (m_context) { | 1328 if (m_context) { |
| 1329 // Tell libxml we're done. | 1329 // Tell libxml we're done. |
| 1330 { | 1330 { |
| 1331 XMLDocumentParserScope scope(document()->docLoader()); | 1331 XMLDocumentParserScope scope(document()->docLoader()); |
| 1332 xmlParseChunk(context(), 0, 0, 1); | 1332 xmlParseChunk(context(), 0, 0, 1); |
| 1333 } | 1333 } |
| 1334 | 1334 |
| 1335 m_context = 0; | 1335 m_context = 0; |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1468 sax.startElementNs = attributesStartElementNsHandler; | 1468 sax.startElementNs = attributesStartElementNsHandler; |
| 1469 sax.initialized = XML_SAX2_MAGIC; | 1469 sax.initialized = XML_SAX2_MAGIC; |
| 1470 RefPtr<XMLParserContext> parser = XMLParserContext::createStringParser(&sax,
&state); | 1470 RefPtr<XMLParserContext> parser = XMLParserContext::createStringParser(&sax,
&state); |
| 1471 String parseString = "<?xml version=\"1.0\"?><attrs " + string + " />"; | 1471 String parseString = "<?xml version=\"1.0\"?><attrs " + string + " />"; |
| 1472 xmlParseChunk(parser->context(), reinterpret_cast<const char*>(parseString.c
haracters()), parseString.length() * sizeof(UChar), 1); | 1472 xmlParseChunk(parser->context(), reinterpret_cast<const char*>(parseString.c
haracters()), parseString.length() * sizeof(UChar), 1); |
| 1473 attrsOK = state.gotAttributes; | 1473 attrsOK = state.gotAttributes; |
| 1474 return state.attributes; | 1474 return state.attributes; |
| 1475 } | 1475 } |
| 1476 | 1476 |
| 1477 } | 1477 } |
| OLD | NEW |