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 * Copyright (C) 2010 Patrick Gansterer <paroga@paroga.com> | 9 * Copyright (C) 2010 Patrick Gansterer <paroga@paroga.com> |
10 * | 10 * |
(...skipping 829 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
840 void XMLDocumentParser::endElementNs() | 840 void XMLDocumentParser::endElementNs() |
841 { | 841 { |
842 if (isStopped()) | 842 if (isStopped()) |
843 return; | 843 return; |
844 | 844 |
845 if (m_parserPaused) { | 845 if (m_parserPaused) { |
846 m_pendingCallbacks->appendEndElementNSCallback(); | 846 m_pendingCallbacks->appendEndElementNSCallback(); |
847 return; | 847 return; |
848 } | 848 } |
849 | 849 |
| 850 // JavaScript can detach the parser. Make sure this is not released |
| 851 // before the end of this method. |
| 852 RefPtr<XMLDocumentParser> protect(this); |
| 853 |
850 exitText(); | 854 exitText(); |
851 | 855 |
852 Node* n = m_currentNode; | 856 RefPtr<ContainerNode> n = m_currentNode; |
853 n->finishParsingChildren(); | 857 n->finishParsingChildren(); |
854 | 858 |
855 if (m_scriptingPermission == FragmentScriptingNotAllowed && n->isElementNode
() && toScriptElement(static_cast<Element*>(n))) { | 859 if (m_scriptingPermission == FragmentScriptingNotAllowed && n->isElementNode
() && toScriptElement(static_cast<Element*>(n.get()))) { |
856 popCurrentNode(); | 860 popCurrentNode(); |
857 ExceptionCode ec; | 861 ExceptionCode ec; |
858 n->remove(ec); | 862 n->remove(ec); |
859 return; | 863 return; |
860 } | 864 } |
861 | 865 |
862 if (!n->isElementNode() || !m_view) { | 866 if (!n->isElementNode() || !m_view) { |
863 popCurrentNode(); | 867 popCurrentNode(); |
864 return; | 868 return; |
865 } | 869 } |
866 | 870 |
867 Element* element = static_cast<Element*>(n); | 871 Element* element = static_cast<Element*>(n.get()); |
868 | 872 |
869 // The element's parent may have already been removed from document. | 873 // The element's parent may have already been removed from document. |
870 // Parsing continues in this case, but scripts aren't executed. | 874 // Parsing continues in this case, but scripts aren't executed. |
871 if (!element->inDocument()) { | 875 if (!element->inDocument()) { |
872 popCurrentNode(); | 876 popCurrentNode(); |
873 return; | 877 return; |
874 } | 878 } |
875 | 879 |
876 ScriptElement* scriptElement = toScriptElement(element); | 880 ScriptElement* scriptElement = toScriptElement(element); |
877 if (!scriptElement) { | 881 if (!scriptElement) { |
878 popCurrentNode(); | 882 popCurrentNode(); |
879 return; | 883 return; |
880 } | 884 } |
881 | 885 |
882 // Don't load external scripts for standalone documents (for now). | 886 // Don't load external scripts for standalone documents (for now). |
883 ASSERT(!m_pendingScript); | 887 ASSERT(!m_pendingScript); |
884 m_requestingScript = true; | 888 m_requestingScript = true; |
885 | 889 |
886 bool successfullyPrepared = scriptElement->prepareScript(m_scriptStartPositi
on, ScriptElement::AllowLegacyTypeInTypeAttribute); | 890 bool successfullyPrepared = scriptElement->prepareScript(m_scriptStartPositi
on, ScriptElement::AllowLegacyTypeInTypeAttribute); |
887 if (!successfullyPrepared) { | 891 if (!successfullyPrepared) { |
888 #if ENABLE(XHTMLMP) | 892 #if ENABLE(XHTMLMP) |
889 if (!scriptElement->isScriptTypeSupported(ScriptElement::AllowLegacyType
InTypeAttribute)) | 893 if (!scriptElement->isScriptTypeSupported(ScriptElement::AllowLegacyType
InTypeAttribute)) |
890 document()->setShouldProcessNoscriptElement(true); | 894 document()->setShouldProcessNoscriptElement(true); |
891 #endif | 895 #endif |
892 } else { | 896 } else { |
893 // FIXME: Script execution should be shared between | 897 // FIXME: Script execution should be shared between |
894 // the libxml2 and Qt XMLDocumentParser implementations. | 898 // the libxml2 and Qt XMLDocumentParser implementations. |
895 | 899 |
896 // JavaScript can detach the parser. Make sure this is not released | |
897 // before the end of this method. | |
898 RefPtr<XMLDocumentParser> protect(this); | |
899 | |
900 if (scriptElement->readyToBeParserExecuted()) | 900 if (scriptElement->readyToBeParserExecuted()) |
901 scriptElement->executeScript(ScriptSourceCode(scriptElement->scriptC
ontent(), document()->url(), m_scriptStartPosition)); | 901 scriptElement->executeScript(ScriptSourceCode(scriptElement->scriptC
ontent(), document()->url(), m_scriptStartPosition)); |
902 else if (scriptElement->willBeParserExecuted()) { | 902 else if (scriptElement->willBeParserExecuted()) { |
903 m_pendingScript = scriptElement->cachedScript(); | 903 m_pendingScript = scriptElement->cachedScript(); |
904 m_scriptElement = element; | 904 m_scriptElement = element; |
905 m_pendingScript->addClient(this); | 905 m_pendingScript->addClient(this); |
906 | 906 |
907 // m_pendingScript will be 0 if script was already loaded and addCli
ent() executed it. | 907 // m_pendingScript will be 0 if script was already loaded and addCli
ent() executed it. |
908 if (m_pendingScript) | 908 if (m_pendingScript) |
909 pauseParsing(); | 909 pauseParsing(); |
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1515 sax.startElementNs = attributesStartElementNsHandler; | 1515 sax.startElementNs = attributesStartElementNsHandler; |
1516 sax.initialized = XML_SAX2_MAGIC; | 1516 sax.initialized = XML_SAX2_MAGIC; |
1517 RefPtr<XMLParserContext> parser = XMLParserContext::createStringParser(&sax,
&state); | 1517 RefPtr<XMLParserContext> parser = XMLParserContext::createStringParser(&sax,
&state); |
1518 String parseString = "<?xml version=\"1.0\"?><attrs " + string + " />"; | 1518 String parseString = "<?xml version=\"1.0\"?><attrs " + string + " />"; |
1519 xmlParseChunk(parser->context(), reinterpret_cast<const char*>(parseString.c
haracters()), parseString.length() * sizeof(UChar), 1); | 1519 xmlParseChunk(parser->context(), reinterpret_cast<const char*>(parseString.c
haracters()), parseString.length() * sizeof(UChar), 1); |
1520 attrsOK = state.gotAttributes; | 1520 attrsOK = state.gotAttributes; |
1521 return state.attributes; | 1521 return state.attributes; |
1522 } | 1522 } |
1523 | 1523 |
1524 } | 1524 } |
OLD | NEW |