summaryrefslogtreecommitdiffstats
path: root/WebCore/dom/XMLDocumentParserQt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/dom/XMLDocumentParserQt.cpp')
-rw-r--r--WebCore/dom/XMLDocumentParserQt.cpp25
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()
}
}
-