diff options
Diffstat (limited to 'WebCore/dom/XMLDocumentParserQt.cpp')
-rw-r--r-- | WebCore/dom/XMLDocumentParserQt.cpp | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/WebCore/dom/XMLDocumentParserQt.cpp b/WebCore/dom/XMLDocumentParserQt.cpp index 03b083e..e905e31 100644 --- a/WebCore/dom/XMLDocumentParserQt.cpp +++ b/WebCore/dom/XMLDocumentParserQt.cpp @@ -105,7 +105,7 @@ XMLDocumentParser::XMLDocumentParser(Document* document, FrameView* frameView) , m_lastErrorLine(0) , m_lastErrorColumn(0) , m_pendingScript(0) - , m_scriptStartLine(0) + , m_scriptStartPosition(TextPosition1::belowRangePosition()) , m_parsingFragment(false) , m_scriptingPermission(FragmentScriptingAllowed) { @@ -132,7 +132,7 @@ XMLDocumentParser::XMLDocumentParser(DocumentFragment* fragment, Element* parent , m_lastErrorLine(0) , m_lastErrorColumn(0) , m_pendingScript(0) - , m_scriptStartLine(0) + , m_scriptStartPosition(TextPosition1::belowRangePosition()) , m_parsingFragment(true) , m_scriptingPermission(permission) { @@ -192,6 +192,10 @@ void XMLDocumentParser::doWrite(const String& parseString) QString data(parseString); if (!data.isEmpty()) { + // JavaScript may cause the parser to detach, + // keep this alive until this function is done. + RefPtr<XMLDocumentParser> protect(this); + m_stream.addData(data); parse(); } @@ -234,6 +238,18 @@ int XMLDocumentParser::columnNumber() const return m_stream.columnNumber(); } +TextPosition0 XMLDocumentParser::textPosition() const +{ + return TextPosition0(WTF::ZeroBasedNumber::fromZeroBasedInt(lineNumber()), WTF::ZeroBasedNumber::fromZeroBasedInt(columnNumber())); +} + +// This method incorrectly reinterprets zero-base lineNumber method as one-based number. +// FIXME: This error is kept for compatibility. We should fix it eventually. +TextPosition1 XMLDocumentParser::textPositionOneBased() const +{ + return TextPosition1(WTF::OneBasedNumber::fromOneBasedInt(lineNumber()), WTF::OneBasedNumber::fromOneBasedInt(columnNumber())); +} + void XMLDocumentParser::stopParsing() { ScriptableDocumentParser::stopParsing(); @@ -518,7 +534,7 @@ void XMLDocumentParser::parseStartElement() ScriptElement* scriptElement = toScriptElement(newElement.get()); if (scriptElement) - m_scriptStartLine = lineNumber(); + m_scriptStartPosition = textPositionOneBased(); m_currentNode->deprecatedParserAddChild(newElement.get()); @@ -595,7 +611,7 @@ void XMLDocumentParser::parseEndElement() } else m_scriptElement = 0; } else - m_view->frame()->script()->executeScript(ScriptSourceCode(scriptElement->scriptContent(), document()->url(), m_scriptStartLine)); + scriptElement->executeScript(ScriptSourceCode(scriptElement->scriptContent(), document()->url(), m_scriptStartPosition)); } m_requestingScript = false; popCurrentNode(); @@ -716,4 +732,3 @@ void XMLDocumentParser::parseDtd() } } - |