WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
bug-45271-20101007164900.patch (text/plain), 57.76 KB, created by
Peter Rybin
on 2010-10-07 05:49:03 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Peter Rybin
Created:
2010-10-07 05:49:03 PDT
Size:
57.76 KB
patch
obsolete
>diff --git a/JavaScriptCore/ChangeLog b/JavaScriptCore/ChangeLog >index b9c9f907c380956df4e4d471cef8b3180f12aa8d..abc03f98e6f0b76d7f576cb2c72853c74eea2857 100644 >--- a/JavaScriptCore/ChangeLog >+++ b/JavaScriptCore/ChangeLog >@@ -1,3 +1,36 @@ >+2010-10-07 Peter Rybin <peter.rybin@gmail.com> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ HTML parser should provide script column position within HTML document to JavaScript engine >+ https://bugs.webkit.org/show_bug.cgi?id=45271 >+ >+ Adds TextPosition* classes -- a structure that stores line/column/generation >+ level coordinates inside text document. Adds *BasedNumber classes -- typesafe int >+ wrappers that emphasize whether int number is used as zero-based or >+ one-based. >+ >+ * GNUmakefile.am: >+ * JavaScriptCore.gypi: >+ * wtf/CMakeLists.txt: >+ * wtf/text/TextPosition.cpp: Added. >+ * wtf/text/TextPosition.h: Added. >+ (WTF::TextPosition::TextPosition): >+ (WTF::TextPosition::minimumPosition): >+ (WTF::TextPosition::belowRangePosition): >+ (WTF::ZeroBasedNumber::fromZeroBasedInt): >+ (WTF::ZeroBasedNumber::ZeroBasedNumber): >+ (WTF::ZeroBasedNumber::zeroBasedInt): >+ (WTF::OneBasedNumber::fromOneBasedInt): >+ (WTF::OneBasedNumber::OneBasedNumber): >+ (WTF::OneBasedNumber::oneBasedInt): >+ (WTF::OneBasedNumber::convertAsZeroBasedInt): >+ (WTF::OneBasedNumber::convertToZeroBased): >+ (WTF::toZeroBasedTextPosition): >+ (WTF::toOneBasedTextPosition): >+ (WTF::ZeroBasedNumber::convertToOneBased): >+ * wtf/wtf.pri: >+ > 2010-10-06 Chris Evans <cevans@google.com> > > Reviewed by David Levin. >diff --git a/JavaScriptCore/GNUmakefile.am b/JavaScriptCore/GNUmakefile.am >index 88d17617b3a4b8884c04a26868c6f06d1731c750..02666456b215bc0322bc2d417e0d14df1701c84b 100644 >--- a/JavaScriptCore/GNUmakefile.am >+++ b/JavaScriptCore/GNUmakefile.am >@@ -511,6 +511,8 @@ javascriptcore_sources += \ > JavaScriptCore/wtf/text/StringImpl.cpp \ > JavaScriptCore/wtf/text/StringImpl.h \ > JavaScriptCore/wtf/text/StringStatics.cpp \ >+ JavaScriptCore/wtf/text/TextPosition.cpp \ >+ JavaScriptCore/wtf/text/TextPosition.h \ > JavaScriptCore/wtf/text/WTFString.cpp \ > JavaScriptCore/wtf/text/WTFString.h \ > JavaScriptCore/wtf/ThreadIdentifierDataPthreads.cpp \ >diff --git a/JavaScriptCore/JavaScriptCore.gypi b/JavaScriptCore/JavaScriptCore.gypi >index 462960d51dd6dbe402d5863d208c1328cbc15ace..01075984a90b0d17304d6d6b0d8cd6006518489c 100644 >--- a/JavaScriptCore/JavaScriptCore.gypi >+++ b/JavaScriptCore/JavaScriptCore.gypi >@@ -454,6 +454,8 @@ > 'wtf/text/StringImpl.cpp', > 'wtf/text/StringImpl.h', > 'wtf/text/StringStatics.cpp', >+ 'wtf/text/TextPosition.h', >+ 'wtf/text/TextPosition.cpp', > 'wtf/text/WTFString.cpp', > 'wtf/text/WTFString.h', > 'wtf/unicode/Collator.h', >diff --git a/JavaScriptCore/wtf/CMakeLists.txt b/JavaScriptCore/wtf/CMakeLists.txt >index 896794ef41e8f021840994ac35247872b2dae169..93faa9c10112cf62e8fab7288a18d9aa61f0c1a4 100644 >--- a/JavaScriptCore/wtf/CMakeLists.txt >+++ b/JavaScriptCore/wtf/CMakeLists.txt >@@ -18,6 +18,7 @@ SET(WTF_SOURCES > text/CString.cpp > text/StringImpl.cpp > text/StringStatics.cpp >+ text/TextPosition.cpp > text/WTFString.cpp > > unicode/UTF8.cpp >diff --git a/JavaScriptCore/wtf/text/TextPosition.cpp b/JavaScriptCore/wtf/text/TextPosition.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..9a17e030959d27a9d81d3e102089088a967971ae >--- /dev/null >+++ b/JavaScriptCore/wtf/text/TextPosition.cpp >@@ -0,0 +1,37 @@ >+/* >+ * Copyright (C) 2010, Google Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY >+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED >+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE >+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY >+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES >+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; >+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON >+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS >+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#include "config.h" >+#include "TextPosition.h" >+ >+namespace WTF { >+ >+const ZeroBasedNumber ZeroBasedNumber::s_base(0); >+const ZeroBasedNumber ZeroBasedNumber::s_belowBase(-1); >+ >+const OneBasedNumber OneBasedNumber::s_base(1); >+const OneBasedNumber OneBasedNumber::s_belowBase(0); >+ >+ >+} // namespace WTF >diff --git a/JavaScriptCore/wtf/text/TextPosition.h b/JavaScriptCore/wtf/text/TextPosition.h >new file mode 100644 >index 0000000000000000000000000000000000000000..871a1700ab3002ec654ca5a791466bd88b83eecf >--- /dev/null >+++ b/JavaScriptCore/wtf/text/TextPosition.h >@@ -0,0 +1,145 @@ >+/* >+ * Copyright (C) 2010, Google Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY >+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED >+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE >+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY >+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES >+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; >+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON >+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS >+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#ifndef TextPosition_h >+#define TextPosition_h >+ >+#include <wtf/Assertions.h> >+ >+namespace WTF { >+ >+ >+/* >+ * Text Position >+ * >+ * TextPosition structure specifies coordinates within an text resource. It is used mostly >+ * for saving script source position. >+ * >+ * Later TextPosition0 and TextPosition1 and both number types can be merged together quite easily. >+ * >+ * >+ * 0-based and 1-based >+ * >+ * Line and column numbers could be interpreted as zero-based or 1-based. Since >+ * both practices coexist in WebKit source base, 'int' type should be replaced with >+ * a dedicated wrapper types, so that compiler helped us with this ambiguity. >+ * >+ * Here we introduce 2 types of numbers: ZeroBasedNumber and OneBasedNumber and >+ * 2 corresponding types of TextPosition structure. While only one type ought to be enough, >+ * this is done to keep transition to the new types as transparent as possible: >+ * e.g. in areas where 0-based integers are used, TextPosition0 should be introduced. This >+ * way all changes will remain trackable. >+ * >+ * Later both number types can be merged in one type quite easily. >+ * >+ * For type safety and for the future type merge it is important that all operations in API >+ * that accept or return integer have a name explicitly defining base of integer. For this reason >+ * int-receiving constructors are hidden from API. >+ */ >+ >+template<typename NUMBER> >+class TextPosition { >+public: >+ TextPosition(NUMBER line, NUMBER column) >+ : m_line(line) >+ , m_column(column) >+ { >+ } >+ TextPosition() {} >+ >+ // A 'minimum' value of position, used as a default value. >+ static TextPosition<NUMBER> minimumPosition() { return TextPosition<NUMBER>(NUMBER::s_base, NUMBER::s_base); } >+ >+ // A value with line value less than a minimum; used as an impossible position. >+ static TextPosition<NUMBER> belowRangePosition() { return TextPosition<NUMBER>(NUMBER::s_belowBase, NUMBER::s_base); } >+ >+ NUMBER m_line; >+ NUMBER m_column; >+}; >+ >+ >+class OneBasedNumber; >+ >+// An int wrapper that always reminds you that the number should be 0-based >+class ZeroBasedNumber { >+public: >+ static ZeroBasedNumber fromZeroBasedInt(int zeroBasedInt) { return ZeroBasedNumber(zeroBasedInt); } >+ >+ ZeroBasedNumber() {} >+ >+ int zeroBasedInt() const { return m_value; } >+ >+ OneBasedNumber convertToOneBased() const; >+ >+ static const ZeroBasedNumber s_base; // 0 >+ static const ZeroBasedNumber s_belowBase; // -1 >+ >+private: >+ ZeroBasedNumber(int value) : m_value(value) {} >+ int m_value; >+}; >+ >+// An int wrapper that always reminds you that the number should be 1-based >+class OneBasedNumber { >+public: >+ static OneBasedNumber fromOneBasedInt(int oneBasedInt) { return OneBasedNumber(oneBasedInt); } >+ OneBasedNumber() {} >+ >+ int oneBasedInt() const { return m_value; } >+ int convertAsZeroBasedInt() const { return m_value - 1; } >+ ZeroBasedNumber convertToZeroBased() const { return ZeroBasedNumber::fromZeroBasedInt(m_value - 1); } >+ >+ static const OneBasedNumber s_base; // 1 >+ static const OneBasedNumber s_belowBase; // 0 >+ >+private: >+ OneBasedNumber(int value) : m_value(value) {} >+ int m_value; >+}; >+ >+typedef TextPosition<ZeroBasedNumber> TextPosition0; >+typedef TextPosition<OneBasedNumber> TextPosition1; >+ >+inline TextPosition0 toZeroBasedTextPosition(const TextPosition1& position) >+{ >+ return TextPosition0(position.m_line.convertToZeroBased(), position.m_column.convertToZeroBased()); >+} >+ >+inline TextPosition1 toOneBasedTextPosition(const TextPosition0& position) >+{ >+ return TextPosition1(position.m_line.convertToOneBased(), position.m_column.convertToOneBased()); >+} >+ >+inline OneBasedNumber ZeroBasedNumber::convertToOneBased() const >+{ >+ return OneBasedNumber::fromOneBasedInt(m_value + 1); >+} >+ >+} >+ >+ >+using WTF::TextPosition0; >+using WTF::TextPosition1; >+ >+#endif // TextPosition_h >diff --git a/JavaScriptCore/wtf/wtf.pri b/JavaScriptCore/wtf/wtf.pri >index 84ac20e3fc9fe4b5ca24f95392f7ba1e91801340..ed4da74915bad5582b092b28855df8ac67dc06d2 100644 >--- a/JavaScriptCore/wtf/wtf.pri >+++ b/JavaScriptCore/wtf/wtf.pri >@@ -24,6 +24,7 @@ SOURCES += \ > wtf/text/CString.cpp \ > wtf/text/StringImpl.cpp \ > wtf/text/StringStatics.cpp \ >+ wtf/text/TextPosition.cpp \ > wtf/text/WTFString.cpp \ > wtf/unicode/CollatorDefault.cpp \ > wtf/unicode/icu/CollatorICU.cpp \ >diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog >index 418950e9854e2ca393896826643b3973e7fa9e1e..ed68aba0186e315dc98af933272d0e55e60eddaa 100644 >--- a/WebCore/ChangeLog >+++ b/WebCore/ChangeLog >@@ -1,3 +1,79 @@ >+2010-10-07 Peter Rybin <peter.rybin@gmail.com> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ HTML parser should provide script column position within HTML document to JavaScript engine >+ https://bugs.webkit.org/show_bug.cgi?id=45271 >+ >+ Replaces line number with TextPosition struct so that script engine >+ gets script starting line/column. >+ >+ * bindings/js/ScriptSourceCode.h: >+ (WebCore::ScriptSourceCode::ScriptSourceCode): >+ * bindings/v8/ScheduledAction.cpp: >+ (WebCore::ScheduledAction::ScheduledAction): >+ * bindings/v8/ScriptController.cpp: >+ (WebCore::ScriptController::eventHandlerPosition): >+ * bindings/v8/ScriptController.h: >+ * bindings/v8/ScriptEventListener.cpp: >+ (WebCore::createAttributeEventListener): >+ * bindings/v8/ScriptSourceCode.h: >+ (WebCore::ScriptSourceCode::ScriptSourceCode): >+ (WebCore::ScriptSourceCode::startLine): >+ (WebCore::ScriptSourceCode::startPosition): >+ * bindings/v8/V8LazyEventListener.cpp: >+ (WebCore::V8LazyEventListener::V8LazyEventListener): >+ (WebCore::V8LazyEventListener::prepareListenerObject): >+ * bindings/v8/V8LazyEventListener.h: >+ (WebCore::V8LazyEventListener::create): >+ * bindings/v8/V8Proxy.cpp: >+ (WebCore::V8Proxy::compileScript): >+ (WebCore::V8Proxy::evaluate): >+ (WebCore::V8Proxy::runScript): >+ * bindings/v8/V8Proxy.h: >+ * bindings/v8/WorkerContextExecutionProxy.cpp: >+ (WebCore::WorkerContextExecutionProxy::evaluate): >+ (WebCore::WorkerContextExecutionProxy::runScript): >+ * bindings/v8/WorkerContextExecutionProxy.h: >+ * bindings/v8/WorkerScriptController.cpp: >+ (WebCore::WorkerScriptController::evaluate): >+ * dom/PendingScript.cpp: >+ (WebCore::PendingScript::releaseElementAndClear): >+ * dom/PendingScript.h: >+ (WebCore::PendingScript::PendingScript): >+ (WebCore::PendingScript::operator=): >+ (WebCore::PendingScript::startingPosition): >+ * dom/ScriptableDocumentParser.h: >+ * dom/XMLDocumentParser.h: >+ * dom/XMLDocumentParserLibxml2.cpp: >+ (WebCore::XMLDocumentParser::XMLDocumentParser): >+ (WebCore::XMLDocumentParser::startElementNs): >+ (WebCore::XMLDocumentParser::endElementNs): >+ (WebCore::XMLDocumentParser::lineNumber): >+ (WebCore::XMLDocumentParser::columnNumber): >+ (WebCore::XMLDocumentParser::textPosition): >+ (WebCore::XMLDocumentParser::textPositionOneBased): >+ * dom/XMLDocumentParserQt.cpp: >+ (WebCore::XMLDocumentParser::XMLDocumentParser): >+ (WebCore::XMLDocumentParser::textPosition): >+ (WebCore::XMLDocumentParser::parseStartElement): >+ (WebCore::XMLDocumentParser::parseEndElement): >+ * html/parser/HTMLDocumentParser.cpp: >+ (WebCore::HTMLDocumentParser::runScriptsForPausedTreeBuilder): >+ (WebCore::HTMLDocumentParser::textPosition): >+ * html/parser/HTMLDocumentParser.h: >+ * html/parser/HTMLScriptRunner.cpp: >+ (WebCore::HTMLScriptRunner::sourceFromPendingScript): >+ (WebCore::HTMLScriptRunner::execute): >+ (WebCore::HTMLScriptRunner::runScript): >+ * html/parser/HTMLScriptRunner.h: >+ * html/parser/HTMLTreeBuilder.cpp: >+ (WebCore::HTMLTreeBuilder::HTMLTreeBuilder): >+ (WebCore::HTMLTreeBuilder::takeScriptToProcess): >+ (WebCore::HTMLTreeBuilder::processEndTag): >+ (WebCore::HTMLTreeBuilder::processScriptStartTag): >+ * html/parser/HTMLTreeBuilder.h: >+ > 2010-10-07 Carlos Garcia Campos <cgarcia@igalia.com> > > Reviewed by Xan Lopez. >diff --git a/WebCore/bindings/js/ScriptSourceCode.h b/WebCore/bindings/js/ScriptSourceCode.h >index 32d6298cdbda772daa13e1033e3cf0aa40f594b2..092eeb8f08a329a391d98716dfedd999656088c0 100644 >--- a/WebCore/bindings/js/ScriptSourceCode.h >+++ b/WebCore/bindings/js/ScriptSourceCode.h >@@ -35,15 +35,16 @@ > #include "ScriptSourceProvider.h" > #include "StringSourceProvider.h" > #include "KURL.h" >+#include <wtf/text/TextPosition.h> > #include <wtf/RefPtr.h> > > namespace WebCore { > > class ScriptSourceCode { > public: >- ScriptSourceCode(const String& source, const KURL& url = KURL(), int startLine = 1) >+ ScriptSourceCode(const String& source, const KURL& url = KURL(), const TextPosition1& startPosition = TextPosition1::minimumPosition()) > : m_provider(StringSourceProvider::create(source, url.isNull() ? String() : url.string())) >- , m_code(m_provider, startLine) >+ , m_code(m_provider, startPosition.m_line.oneBasedInt()) > , m_url(url) > { > } >diff --git a/WebCore/bindings/v8/ScheduledAction.cpp b/WebCore/bindings/v8/ScheduledAction.cpp >index dcd0bb3377181318420c1073be251a9e584ba4b7..708fbe67fe94d772212c8bc3d27de18bd51012cc 100644 >--- a/WebCore/bindings/v8/ScheduledAction.cpp >+++ b/WebCore/bindings/v8/ScheduledAction.cpp >@@ -45,7 +45,7 @@ namespace WebCore { > > ScheduledAction::ScheduledAction(v8::Handle<v8::Context> context, v8::Handle<v8::Function> func, int argc, v8::Handle<v8::Value> argv[]) > : m_context(context) >- , m_code(String(), KURL(), 0) >+ , m_code(String(), KURL(), TextPosition1::belowRangePosition()) > { > m_function = v8::Persistent<v8::Function>::New(func); > >diff --git a/WebCore/bindings/v8/ScriptController.cpp b/WebCore/bindings/v8/ScriptController.cpp >index 9819679246b079467781dc9e242c682b936a99b1..a9c7c691280fbfac49df8d7e65fbf9918a69dc5a 100644 >--- a/WebCore/bindings/v8/ScriptController.cpp >+++ b/WebCore/bindings/v8/ScriptController.cpp >@@ -262,20 +262,12 @@ ScriptValue ScriptController::evaluate(const ScriptSourceCode& sourceCode, Shoul > return ScriptValue(object); > } > >-int ScriptController::eventHandlerLineNumber() const >+TextPosition0 ScriptController::eventHandlerPosition() const > { > ScriptableDocumentParser* parser = m_frame->document()->scriptableDocumentParser(); > if (parser) >- return parser->lineNumber(); >- return 0; >-} >- >-int ScriptController::eventHandlerColumnNumber() const >-{ >- ScriptableDocumentParser* parser = m_frame->document()->scriptableDocumentParser(); >- if (parser) >- return parser->columnNumber(); >- return 0; >+ return parser->textPosition(); >+ return TextPosition0::minimumPosition(); > } > > void ScriptController::finishedWithEvent(Event* event) >diff --git a/WebCore/bindings/v8/ScriptController.h b/WebCore/bindings/v8/ScriptController.h >index 8ac90647bbfea9ff5c52bb446cfb2d128af9fb7a..9013a9f4a1d2be3ce886f07de4a38122d1820120 100644 >--- a/WebCore/bindings/v8/ScriptController.h >+++ b/WebCore/bindings/v8/ScriptController.h >@@ -155,8 +155,7 @@ public: > > void finishedWithEvent(Event*); > >- int eventHandlerLineNumber() const; >- int eventHandlerColumnNumber() const; >+ TextPosition0 eventHandlerPosition() const; > > void setProcessingTimerCallback(bool processingTimerCallback) { m_processingTimerCallback = processingTimerCallback; } > // FIXME: Currently we don't use the parameter world at all. >diff --git a/WebCore/bindings/v8/ScriptEventListener.cpp b/WebCore/bindings/v8/ScriptEventListener.cpp >index 72df79ded3ed47cff1a27b5953a359963c77a630..448106cf52549ab3d64eac512fc37663bc7ed048 100644 >--- a/WebCore/bindings/v8/ScriptEventListener.cpp >+++ b/WebCore/bindings/v8/ScriptEventListener.cpp >@@ -50,8 +50,8 @@ PassRefPtr<V8LazyEventListener> createAttributeEventListener(Node* node, Attribu > if (attr->isNull()) > return 0; > >- int lineNumber = 1; >- int columnNumber = 0; >+ // FIXME: Very strange: we initialize zero-based number with '1'. >+ TextPosition0 position(WTF::ZeroBasedNumber::fromZeroBasedInt(1), WTF::ZeroBasedNumber::s_base); > String sourceURL; > > if (Frame* frame = node->document()->frame()) { >@@ -64,12 +64,11 @@ PassRefPtr<V8LazyEventListener> createAttributeEventListener(Node* node, Attribu > return 0; > } > >- lineNumber = scriptController->eventHandlerLineNumber(); >- columnNumber = scriptController->eventHandlerColumnNumber(); >+ position = scriptController->eventHandlerPosition(); > sourceURL = node->document()->url().string(); > } > >- return V8LazyEventListener::create(attr->localName().string(), node->isSVGElement(), attr->value(), sourceURL, lineNumber, columnNumber, WorldContextHandle(UseMainWorld)); >+ return V8LazyEventListener::create(attr->localName().string(), node->isSVGElement(), attr->value(), sourceURL, position, WorldContextHandle(UseMainWorld)); > } > > PassRefPtr<V8LazyEventListener> createAttributeEventListener(Frame* frame, Attribute* attr) >@@ -81,10 +80,6 @@ PassRefPtr<V8LazyEventListener> createAttributeEventListener(Frame* frame, Attri > if (attr->isNull()) > return 0; > >- int lineNumber = 1; >- int columnNumber = 0; >- String sourceURL; >- > ScriptController* scriptController = frame->script(); > if (!scriptController->canExecuteScripts(AboutToExecuteScript)) > return 0; >@@ -94,10 +89,9 @@ PassRefPtr<V8LazyEventListener> createAttributeEventListener(Frame* frame, Attri > return 0; > } > >- lineNumber = scriptController->eventHandlerLineNumber(); >- columnNumber = scriptController->eventHandlerColumnNumber(); >- sourceURL = frame->document()->url().string(); >- return V8LazyEventListener::create(attr->localName().string(), frame->document()->isSVGDocument(), attr->value(), sourceURL, lineNumber, columnNumber, WorldContextHandle(UseMainWorld)); >+ TextPosition0 position = scriptController->eventHandlerPosition(); >+ String sourceURL = frame->document()->url().string(); >+ return V8LazyEventListener::create(attr->localName().string(), frame->document()->isSVGDocument(), attr->value(), sourceURL, position, WorldContextHandle(UseMainWorld)); > } > > String eventListenerHandlerBody(Document* document, EventListener* listener) >diff --git a/WebCore/bindings/v8/ScriptSourceCode.h b/WebCore/bindings/v8/ScriptSourceCode.h >index dbc9d5e6fc6007fcfdd66024db07826c66263b5b..2478151e6f54fc75038f041dec980d7a756d2ade 100644 >--- a/WebCore/bindings/v8/ScriptSourceCode.h >+++ b/WebCore/bindings/v8/ScriptSourceCode.h >@@ -35,16 +35,17 @@ > #include "CachedScript.h" > #include "KURL.h" > #include "PlatformString.h" >+#include <wtf/text/TextPosition.h> > > namespace WebCore { > > class ScriptSourceCode { > public: >- ScriptSourceCode(const String& source, const KURL& url = KURL(), int startLine = 1) >+ ScriptSourceCode(const String& source, const KURL& url = KURL(), const TextPosition1& startPosition = TextPosition1::minimumPosition()) > : m_source(source) > , m_cachedScript(0) > , m_url(url) >- , m_startLine(startLine) >+ , m_startPosition(startPosition) > { > } > >@@ -54,7 +55,7 @@ public: > : m_source(cs->script()) > , m_cachedScript(cs) > , m_url(ParsedURLString, cs->url()) >- , m_startLine(1) >+ , m_startPosition(TextPosition1::minimumPosition()) > { > } > >@@ -63,13 +64,14 @@ public: > const String& source() const { return m_source; } > CachedScript* cachedScript() const { return m_cachedScript.get(); } > const KURL& url() const { return m_url; } >- int startLine() const { return m_startLine; } >+ int startLine() const { return m_startPosition.m_line.oneBasedInt(); } >+ const TextPosition1& startPosition() const { return m_startPosition; } > > private: > String m_source; > CachedResourceHandle<CachedScript> m_cachedScript; > KURL m_url; >- int m_startLine; >+ TextPosition1 m_startPosition; > }; > > } // namespace WebCore >diff --git a/WebCore/bindings/v8/V8LazyEventListener.cpp b/WebCore/bindings/v8/V8LazyEventListener.cpp >index 7f13c5a8fb27d33bbf1d3410a013ebc795d93d23..7f46333062d6feb7be9f1796356c6b05cb3cb8f8 100644 >--- a/WebCore/bindings/v8/V8LazyEventListener.cpp >+++ b/WebCore/bindings/v8/V8LazyEventListener.cpp >@@ -41,14 +41,13 @@ > > namespace WebCore { > >-V8LazyEventListener::V8LazyEventListener(const String& functionName, bool isSVGEvent, const String& code, const String sourceURL, int lineNumber, int columnNumber, const WorldContextHandle& worldContext) >+V8LazyEventListener::V8LazyEventListener(const String& functionName, bool isSVGEvent, const String& code, const String sourceURL, const TextPosition0& position, const WorldContextHandle& worldContext) > : V8AbstractEventListener(true, worldContext) > , m_functionName(functionName) > , m_isSVGEvent(isSVGEvent) > , m_code(code) > , m_sourceURL(sourceURL) >- , m_lineNumber(lineNumber) >- , m_columnNumber(columnNumber) >+ , m_position(position) > { > } > >@@ -114,7 +113,7 @@ void V8LazyEventListener::prepareListenerObject(ScriptExecutionContext* context) > // Insert '\n' otherwise //-style comments could break the handler. > code.append( "\n}).call(this, evt);}}}})"); > v8::Handle<v8::String> codeExternalString = v8ExternalString(code); >- v8::Handle<v8::Script> script = V8Proxy::compileScript(codeExternalString, m_sourceURL, m_lineNumber); >+ v8::Handle<v8::Script> script = V8Proxy::compileScript(codeExternalString, m_sourceURL, m_position); > if (!script.IsEmpty()) { > v8::Local<v8::Value> value = proxy->runScript(script, false); > if (!value.IsEmpty()) { >diff --git a/WebCore/bindings/v8/V8LazyEventListener.h b/WebCore/bindings/v8/V8LazyEventListener.h >index f174d23bf131b010ee4f59bc42527ee8674a0608..08467fe5f7ab97014d9453af26fa3f166cee63b1 100644 >--- a/WebCore/bindings/v8/V8LazyEventListener.h >+++ b/WebCore/bindings/v8/V8LazyEventListener.h >@@ -34,6 +34,7 @@ > #include "PlatformString.h" > #include "V8AbstractEventListener.h" > #include <v8.h> >+#include <wtf/text/TextPosition.h> > #include <wtf/PassRefPtr.h> > > namespace WebCore { >@@ -45,9 +46,9 @@ namespace WebCore { > // A V8LazyEventListener is always a HTML event handler. > class V8LazyEventListener : public V8AbstractEventListener { > public: >- static PassRefPtr<V8LazyEventListener> create(const String& functionName, bool isSVGEvent, const String& code, const String& sourceURL, int lineNumber, int columnNumber, const WorldContextHandle& worldContext) >+ static PassRefPtr<V8LazyEventListener> create(const String& functionName, bool isSVGEvent, const String& code, const String& sourceURL, const TextPosition0& position, const WorldContextHandle& worldContext) > { >- return adoptRef(new V8LazyEventListener(functionName, isSVGEvent, code, sourceURL, lineNumber, columnNumber, worldContext)); >+ return adoptRef(new V8LazyEventListener(functionName, isSVGEvent, code, sourceURL, position, worldContext)); > } > > virtual bool isLazy() const { return true; } >@@ -56,7 +57,7 @@ namespace WebCore { > virtual void prepareListenerObject(ScriptExecutionContext*); > > private: >- V8LazyEventListener(const String& functionName, bool isSVGEvent, const String& code, const String sourceURL, int lineNumber, int columnNumber, const WorldContextHandle& worldContext); >+ V8LazyEventListener(const String& functionName, bool isSVGEvent, const String& code, const String sourceURL, const TextPosition0& position, const WorldContextHandle& worldContext); > > virtual v8::Local<v8::Value> callListenerFunction(ScriptExecutionContext*, v8::Handle<v8::Value> jsEvent, Event*); > >@@ -70,8 +71,7 @@ namespace WebCore { > bool m_isSVGEvent; > String m_code; > String m_sourceURL; >- int m_lineNumber; >- int m_columnNumber; >+ TextPosition0 m_position; > }; > > } // namespace WebCore >diff --git a/WebCore/bindings/v8/V8Proxy.cpp b/WebCore/bindings/v8/V8Proxy.cpp >index ef72b77ad47395fc8454d3a0de6ac155211f9fad..46ea066a5d4344217746c3868483d3e746f2c2e6 100644 >--- a/WebCore/bindings/v8/V8Proxy.cpp >+++ b/WebCore/bindings/v8/V8Proxy.cpp >@@ -238,12 +238,13 @@ V8Proxy::~V8Proxy() > windowShell()->destroyGlobal(); > } > >-v8::Handle<v8::Script> V8Proxy::compileScript(v8::Handle<v8::String> code, const String& fileName, int baseLine, v8::ScriptData* scriptData) >+v8::Handle<v8::Script> V8Proxy::compileScript(v8::Handle<v8::String> code, const String& fileName, const TextPosition0& scriptStartPosition, v8::ScriptData* scriptData) > { > const uint16_t* fileNameString = fromWebCoreString(fileName); > v8::Handle<v8::String> name = v8::String::New(fileNameString, fileName.length()); >- v8::Handle<v8::Integer> line = v8::Integer::New(baseLine); >- v8::ScriptOrigin origin(name, line); >+ v8::Handle<v8::Integer> line = v8::Integer::New(scriptStartPosition.m_line.zeroBasedInt()); >+ v8::Handle<v8::Integer> column = v8::Integer::New(scriptStartPosition.m_column.zeroBasedInt()); >+ v8::ScriptOrigin origin(name, line, column); > v8::Handle<v8::Script> script = v8::Script::Compile(code, &origin, scriptData); > return script; > } >@@ -396,7 +397,7 @@ v8::Local<v8::Value> V8Proxy::evaluate(const ScriptSourceCode& source, Node* nod > > // NOTE: For compatibility with WebCore, ScriptSourceCode's line starts at > // 1, whereas v8 starts at 0. >- v8::Handle<v8::Script> script = compileScript(code, source.url(), source.startLine() - 1, scriptData.get()); >+ v8::Handle<v8::Script> script = compileScript(code, source.url(), WTF::toZeroBasedTextPosition(source.startPosition()), scriptData.get()); > #if PLATFORM(CHROMIUM) > PlatformBridge::traceEventEnd("v8.compile", node, ""); > >@@ -428,7 +429,7 @@ v8::Local<v8::Value> V8Proxy::runScript(v8::Handle<v8::Script> script, bool isIn > // FIXME: Ideally, we should be able to re-use the origin of the > // script passed to us as the argument instead of using an empty string > // and 0 baseLine. >- script = compileScript(code, "", 0); >+ script = compileScript(code, "", TextPosition0::minimumPosition()); > } > > if (handleOutOfMemory()) >diff --git a/WebCore/bindings/v8/V8Proxy.h b/WebCore/bindings/v8/V8Proxy.h >index 8a0da7295680d523cf740f386f3cef1e991105c3..80d4691b480548f3ad7ddf79de2b3797341798dc 100644 >--- a/WebCore/bindings/v8/V8Proxy.h >+++ b/WebCore/bindings/v8/V8Proxy.h >@@ -279,7 +279,7 @@ namespace WebCore { > > static v8::Handle<v8::Value> checkNewLegal(const v8::Arguments&); > >- static v8::Handle<v8::Script> compileScript(v8::Handle<v8::String> code, const String& fileName, int baseLine, v8::ScriptData* = 0); >+ static v8::Handle<v8::Script> compileScript(v8::Handle<v8::String> code, const String& fileName, const TextPosition0& scriptStartPosition, v8::ScriptData* = 0); > > // If the exception code is different from zero, a DOM exception is > // schedule to be thrown. >diff --git a/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp b/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp >index 16e0b4101efdc35ae7441817b0687db6b5a65a25..cefb2faa7390894b35d65ad53f21a8fbc7dda561 100644 >--- a/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp >+++ b/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp >@@ -184,7 +184,7 @@ bool WorkerContextExecutionProxy::forgetV8EventObject(Event* event) > return false; > } > >-ScriptValue WorkerContextExecutionProxy::evaluate(const String& script, const String& fileName, int baseLine, WorkerContextExecutionState* state) >+ScriptValue WorkerContextExecutionProxy::evaluate(const String& script, const String& fileName, const TextPosition0& scriptStartPosition, WorkerContextExecutionState* state) > { > v8::HandleScope hs; > >@@ -196,7 +196,7 @@ ScriptValue WorkerContextExecutionProxy::evaluate(const String& script, const St > v8::TryCatch exceptionCatcher; > > v8::Local<v8::String> scriptString = v8ExternalString(script); >- v8::Handle<v8::Script> compiledScript = V8Proxy::compileScript(scriptString, fileName, baseLine); >+ v8::Handle<v8::Script> compiledScript = V8Proxy::compileScript(scriptString, fileName, scriptStartPosition); > v8::Local<v8::Value> result = runScript(compiledScript); > > if (!exceptionCatcher.CanContinue()) >@@ -227,7 +227,7 @@ v8::Local<v8::Value> WorkerContextExecutionProxy::runScript(v8::Handle<v8::Scrip > // Compute the source string and prevent against infinite recursion. > if (m_recursion >= kMaxRecursionDepth) { > v8::Local<v8::String> code = v8ExternalString("throw RangeError('Recursion too deep')"); >- script = V8Proxy::compileScript(code, "", 0); >+ script = V8Proxy::compileScript(code, "", TextPosition0::minimumPosition()); > } > > if (V8Proxy::handleOutOfMemory()) >diff --git a/WebCore/bindings/v8/WorkerContextExecutionProxy.h b/WebCore/bindings/v8/WorkerContextExecutionProxy.h >index 58824b9eef6f4914084c777161e23f6e30abe283..e70c3d284abe52e35bac49805e73a4cf474e9c95 100644 >--- a/WebCore/bindings/v8/WorkerContextExecutionProxy.h >+++ b/WebCore/bindings/v8/WorkerContextExecutionProxy.h >@@ -36,6 +36,7 @@ > > #include "ScriptValue.h" > #include <v8.h> >+#include <wtf/text/TextPosition.h> > #include <wtf/OwnPtr.h> > #include <wtf/Vector.h> > >@@ -66,7 +67,7 @@ namespace WebCore { > void trackEvent(Event*); > > // Evaluate a script file in the current execution environment. >- ScriptValue evaluate(const String& script, const String& fileName, int baseLine, WorkerContextExecutionState*); >+ ScriptValue evaluate(const String& script, const String& fileName, const TextPosition0& scriptStartPosition, WorkerContextExecutionState*); > > // Returns a local handle of the context. > v8::Local<v8::Context> context() { return v8::Local<v8::Context>::New(m_context); } >diff --git a/WebCore/bindings/v8/WorkerScriptController.cpp b/WebCore/bindings/v8/WorkerScriptController.cpp >index 7db0d8d373709b2e973b67e7723e4fc311fbca59..b56d3836d7e6bb1ac5d2c8c5ed630f07c276ef22 100644 >--- a/WebCore/bindings/v8/WorkerScriptController.cpp >+++ b/WebCore/bindings/v8/WorkerScriptController.cpp >@@ -75,7 +75,7 @@ ScriptValue WorkerScriptController::evaluate(const ScriptSourceCode& sourceCode, > } > > WorkerContextExecutionState state; >- ScriptValue result = m_proxy->evaluate(sourceCode.source(), sourceCode.url().string(), sourceCode.startLine() - 1, &state); >+ ScriptValue result = m_proxy->evaluate(sourceCode.source(), sourceCode.url().string(), WTF::toZeroBasedTextPosition(sourceCode.startPosition()), &state); > if (state.hadException) { > if (exception) > *exception = state.exception; >diff --git a/WebCore/dom/PendingScript.cpp b/WebCore/dom/PendingScript.cpp >index 42e225a7f32a1b0cdc1bc3451b65497a46135689..18f60711a4cd302329bcaad4d98b8a20c7ce12fd 100644 >--- a/WebCore/dom/PendingScript.cpp >+++ b/WebCore/dom/PendingScript.cpp >@@ -40,7 +40,7 @@ PendingScript::~PendingScript() > PassRefPtr<Element> PendingScript::releaseElementAndClear() > { > setCachedScript(0); >- m_startingLineNumber = 0; >+ m_startingPosition = TextPosition1::belowRangePosition(); > m_watchingForLoad = false; > return m_element.release(); > } >diff --git a/WebCore/dom/PendingScript.h b/WebCore/dom/PendingScript.h >index 44e1e4928676d796022dd29054576015b7a26e44..083507a9b90916bcf28651df629e5b23bb9422c8 100644 >--- a/WebCore/dom/PendingScript.h >+++ b/WebCore/dom/PendingScript.h >@@ -28,6 +28,7 @@ > > #include "CachedResourceClient.h" > #include "CachedResourceHandle.h" >+#include <wtf/text/TextPosition.h> > #include <wtf/PassRefPtr.h> > > namespace WebCore { >@@ -43,14 +44,14 @@ class Element; > class PendingScript : public CachedResourceClient { > public: > PendingScript() >- : m_startingLineNumber(0) >+ : m_startingPosition(TextPosition1::belowRangePosition()) > , m_watchingForLoad(false) > { > } > > PendingScript(const PendingScript& other) > : CachedResourceClient(other) >- , m_startingLineNumber(other.m_startingLineNumber) >+ , m_startingPosition(other.m_startingPosition) > , m_watchingForLoad(other.m_watchingForLoad) > , m_element(other.m_element) > { >@@ -64,7 +65,7 @@ public: > if (this == &other) > return *this; > >- m_startingLineNumber = other.m_startingLineNumber; >+ m_startingPosition = other.m_startingPosition; > m_watchingForLoad = other.m_watchingForLoad; > m_element = other.m_element; > setCachedScript(other.cachedScript()); >@@ -74,7 +75,7 @@ public: > > // FIXME: No setter means this is never set to anything other than 0. > // This is either unnecessary or incorrect. >- int startingLineNumber() const { return m_startingLineNumber; } >+ TextPosition1 startingPosition() const { return m_startingPosition; } > > bool watchingForLoad() const { return m_watchingForLoad; } > void setWatchingForLoad(bool b) { m_watchingForLoad = b; } >@@ -89,7 +90,7 @@ public: > virtual void notifyFinished(CachedResource*); > > private: >- int m_startingLineNumber; // Only used for inline script tags. >+ TextPosition1 m_startingPosition; // Only used for inline script tags. > bool m_watchingForLoad; > RefPtr<Element> m_element; > CachedResourceHandle<CachedScript> m_cachedScript; >diff --git a/WebCore/dom/ScriptableDocumentParser.h b/WebCore/dom/ScriptableDocumentParser.h >index 8b1630412104e4e45a01323dd2255e6564e34045..d9bf85cabf45533c981be60fc5ba969775e4243c 100644 >--- a/WebCore/dom/ScriptableDocumentParser.h >+++ b/WebCore/dom/ScriptableDocumentParser.h >@@ -27,10 +27,10 @@ > #define ScriptableDocumentParser_h > > #include "DecodedDataDocumentParser.h" >+#include <wtf/text/TextPosition.h> > > namespace WebCore { > >-class SegmentedString; > class XSSAuditor; > > class ScriptableDocumentParser : public DecodedDataDocumentParser { >@@ -47,7 +47,7 @@ public: > > // These are used to expose the current line/column to the scripting system. > virtual int lineNumber() const = 0; >- virtual int columnNumber() const = 0; >+ virtual TextPosition0 textPosition() const = 0; > > XSSAuditor* xssAuditor() const { return m_xssAuditor; } > void setXSSAuditor(XSSAuditor* auditor) { m_xssAuditor = auditor; } >diff --git a/WebCore/dom/XMLDocumentParser.h b/WebCore/dom/XMLDocumentParser.h >index e0770badbaff7ba11020addc71249ef3dec820d4..40d5c05d3ab751ffc63b6b5eb627589752cfbe06 100644 >--- a/WebCore/dom/XMLDocumentParser.h >+++ b/WebCore/dom/XMLDocumentParser.h >@@ -102,7 +102,7 @@ namespace WebCore { > // WMLErrorHandling uses these functions. > virtual bool wellFormed() const { return !m_sawError; } > virtual int lineNumber() const; >- virtual int columnNumber() const; >+ TextPosition0 textPosition() const; > > static bool supportsXMLVersion(const String&); > >@@ -129,6 +129,11 @@ namespace WebCore { > > bool appendFragmentSource(const String&); > >+ int columnNumber() const; >+ // The method is used in XMLDocumentParserLibxml2.cpp only, >+ // It is neither used nor implemented in XMLDocumentParserQt.cpp. >+ TextPosition1 textPositionOneBased() const; >+ > #if USE(QXMLSTREAM) > private: > void parse(); >@@ -208,7 +213,7 @@ public: > > CachedResourceHandle<CachedScript> m_pendingScript; > RefPtr<Element> m_scriptElement; >- int m_scriptStartLine; >+ TextPosition1 m_scriptStartPosition; > > bool m_parsingFragment; > AtomicString m_defaultNamespaceURI; >diff --git a/WebCore/dom/XMLDocumentParserLibxml2.cpp b/WebCore/dom/XMLDocumentParserLibxml2.cpp >index c01a57eef45919d8e7f026e8b67c3c4e53009257..8ee976d082d3f9eb85074ce152af3ba03ced1538 100644 >--- a/WebCore/dom/XMLDocumentParserLibxml2.cpp >+++ b/WebCore/dom/XMLDocumentParserLibxml2.cpp >@@ -560,7 +560,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) > { >@@ -587,7 +587,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(scriptingPermission) > { >@@ -819,7 +819,7 @@ void XMLDocumentParser::startElementNs(const xmlChar* xmlLocalName, const xmlCha > > ScriptElement* scriptElement = toScriptElement(newElement.get()); > if (scriptElement) >- m_scriptStartLine = lineNumber(); >+ m_scriptStartPosition = textPositionOneBased(); > > m_currentNode->deprecatedParserAddChild(newElement.get()); > >@@ -910,7 +910,7 @@ void XMLDocumentParser::endElementNs() > } else > m_scriptElement = 0; > } else >- m_view->frame()->script()->executeScript(ScriptSourceCode(scriptElement->scriptContent(), document()->url(), m_scriptStartLine)); >+ m_view->frame()->script()->executeScript(ScriptSourceCode(scriptElement->scriptContent(), document()->url(), m_scriptStartPosition)); > > // JavaScript may have detached the parser > if (isDetached()) >@@ -1376,14 +1376,41 @@ void* xmlDocPtrForString(CachedResourceLoader* cachedResourceLoader, const Strin > > int XMLDocumentParser::lineNumber() const > { >+ // FIXME: The implementation probably returns 1-based int, but method should return 0-based. > return context() ? context()->input->line : 1; > } > > int XMLDocumentParser::columnNumber() const > { >+ // FIXME: The implementation probably returns 1-based int, but method should return 0-based. > return context() ? context()->input->col : 1; > } > >+TextPosition0 XMLDocumentParser::textPosition() const >+{ >+ xmlParserCtxtPtr context = this->context(); >+ if (context) { >+ // FIXME: The context probably contains 1-based numbers, but we treat them as 0-based, >+ // to be consistent with fixme's in lineNumber() and columnNumber >+ // methods. >+ return TextPosition0(WTF::ZeroBasedNumber::fromZeroBasedInt(context->input->line), >+ WTF::ZeroBasedNumber::fromZeroBasedInt(context->input->col)); >+ } >+ return TextPosition0::minimumPosition(); >+} >+ >+// This method has a correct implementation, in contrast to textPosition() method. >+// It should replace textPosition(). >+TextPosition1 XMLDocumentParser::textPositionOneBased() const >+{ >+ xmlParserCtxtPtr context = this->context(); >+ if (context) { >+ return TextPosition1(WTF::OneBasedNumber::fromOneBasedInt(context->input->line), >+ WTF::OneBasedNumber::fromOneBasedInt(context->input->col)); >+ } >+ return TextPosition1::minimumPosition(); >+} >+ > void XMLDocumentParser::stopParsing() > { > DocumentParser::stopParsing(); >diff --git a/WebCore/dom/XMLDocumentParserQt.cpp b/WebCore/dom/XMLDocumentParserQt.cpp >index 03b083ec1c925ccd51e6b1d21c9b52ea16bce9ce..901cbc18fafdfb74b45f33ab8c579c2316b71b6f 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) > { >@@ -234,6 +234,11 @@ int XMLDocumentParser::columnNumber() const > return m_stream.columnNumber(); > } > >+TextPosition0 XMLDocumentParser::textPosition() const >+{ >+ return TextPosition0(WTF::ZeroBasedNumber::fromZeroBasedInt(lineNumber()), WTF::ZeroBasedNumber::fromZeroBasedInt(columnNumber())); >+} >+ > void XMLDocumentParser::stopParsing() > { > ScriptableDocumentParser::stopParsing(); >@@ -518,7 +523,7 @@ void XMLDocumentParser::parseStartElement() > > ScriptElement* scriptElement = toScriptElement(newElement.get()); > if (scriptElement) >- m_scriptStartLine = lineNumber(); >+ m_scriptStartPosition = WTF::toOneBasedTextPosition(textPosition()); > > m_currentNode->deprecatedParserAddChild(newElement.get()); > >@@ -595,7 +600,7 @@ void XMLDocumentParser::parseEndElement() > } else > m_scriptElement = 0; > } else >- m_view->frame()->script()->executeScript(ScriptSourceCode(scriptElement->scriptContent(), document()->url(), m_scriptStartLine)); >+ m_view->frame()->script()->executeScript(ScriptSourceCode(scriptElement->scriptContent(), document()->url(), m_scriptStartPosition)); > } > m_requestingScript = false; > popCurrentNode(); >@@ -716,4 +721,3 @@ void XMLDocumentParser::parseDtd() > > } > } >- >diff --git a/WebCore/html/parser/HTMLDocumentParser.cpp b/WebCore/html/parser/HTMLDocumentParser.cpp >index d668d5ef88a7f7c0b8646a97e0aed937a5e6804a..13ff00d64719d17c63ed517b1c38b2b3f9a99060 100644 >--- a/WebCore/html/parser/HTMLDocumentParser.cpp >+++ b/WebCore/html/parser/HTMLDocumentParser.cpp >@@ -191,12 +191,12 @@ bool HTMLDocumentParser::runScriptsForPausedTreeBuilder() > { > ASSERT(m_treeBuilder->isPaused()); > >- int scriptStartLine = 0; >- RefPtr<Element> scriptElement = m_treeBuilder->takeScriptToProcess(scriptStartLine); >+ TextPosition1 scriptStartPosition = TextPosition1::belowRangePosition(); >+ RefPtr<Element> scriptElement = m_treeBuilder->takeScriptToProcess(scriptStartPosition); > // We will not have a scriptRunner when parsing a DocumentFragment. > if (!m_scriptRunner) > return true; >- return m_scriptRunner->execute(scriptElement.release(), scriptStartLine); >+ return m_scriptRunner->execute(scriptElement.release(), scriptStartPosition); > } > > void HTMLDocumentParser::pumpTokenizer(SynchronousMode mode) >@@ -396,9 +396,13 @@ int HTMLDocumentParser::lineNumber() const > return m_tokenizer->lineNumber(); > } > >-int HTMLDocumentParser::columnNumber() const >+TextPosition0 HTMLDocumentParser::textPosition() const > { >- return m_tokenizer->columnNumber(); >+ int lineZeroBased = m_tokenizer->lineNumber(); >+ int columnOneBased = m_tokenizer->columnNumber(); >+ >+ return TextPosition0(WTF::ZeroBasedNumber::fromZeroBasedInt(lineZeroBased), >+ WTF::OneBasedNumber::fromOneBasedInt(columnOneBased).convertToZeroBased()); > } > > bool HTMLDocumentParser::isWaitingForScripts() const >diff --git a/WebCore/html/parser/HTMLDocumentParser.h b/WebCore/html/parser/HTMLDocumentParser.h >index d9625f1218b674a46dae3e1b08d8bb7e3a54e735..05053df2f1cb457511ea74681f42c722b3d6c9a0 100644 >--- a/WebCore/html/parser/HTMLDocumentParser.h >+++ b/WebCore/html/parser/HTMLDocumentParser.h >@@ -92,7 +92,7 @@ private: > virtual bool isExecutingScript() const; > virtual void executeScriptsWaitingForStylesheets(); > virtual int lineNumber() const; >- virtual int columnNumber() const; >+ virtual TextPosition0 textPosition() const; > > // HTMLScriptRunnerHost > virtual void watchForLoad(CachedResource*); >diff --git a/WebCore/html/parser/HTMLScriptRunner.cpp b/WebCore/html/parser/HTMLScriptRunner.cpp >index 4f54f4292870acd53854fc4710870dd9df14f2d1..964e58a9e0f2fb892ab6e8392ae9ea57bd4df3f7 100644 >--- a/WebCore/html/parser/HTMLScriptRunner.cpp >+++ b/WebCore/html/parser/HTMLScriptRunner.cpp >@@ -98,7 +98,7 @@ ScriptSourceCode HTMLScriptRunner::sourceFromPendingScript(const PendingScript& > return ScriptSourceCode(script.cachedScript()); > } > errorOccurred = false; >- return ScriptSourceCode(script.element()->textContent(), documentURLForScriptExecution(m_document), script.startingLineNumber()); >+ return ScriptSourceCode(script.element()->textContent(), documentURLForScriptExecution(m_document), script.startingPosition()); > } > > bool HTMLScriptRunner::isPendingScriptReady(const PendingScript& script) >@@ -170,13 +170,13 @@ void HTMLScriptRunner::stopWatchingForLoad(PendingScript& pendingScript) > > // This function should match 10.2.5.11 "An end tag whose tag name is 'script'" > // Script handling lives outside the tree builder to keep the each class simple. >-bool HTMLScriptRunner::execute(PassRefPtr<Element> scriptElement, int startLine) >+bool HTMLScriptRunner::execute(PassRefPtr<Element> scriptElement, const TextPosition1& scriptStartPosition) > { > ASSERT(scriptElement); > // FIXME: If scripting is disabled, always just return true; > > // Try to execute the script given to us. >- runScript(scriptElement.get(), startLine); >+ runScript(scriptElement.get(), scriptStartPosition); > > if (haveParsingBlockingScript()) { > if (m_scriptNestingLevel) >@@ -288,7 +288,7 @@ bool HTMLScriptRunner::requestPendingScript(PendingScript& pendingScript, Elemen > > // This method is meant to match the HTML5 definition of "running a script" > // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#running-a-script >-void HTMLScriptRunner::runScript(Element* script, int startingLineNumber) >+void HTMLScriptRunner::runScript(Element* script, const TextPosition1& scriptStartPosition) > { > ASSERT(m_document); > ASSERT(!haveParsingBlockingScript()); >@@ -315,7 +315,7 @@ void HTMLScriptRunner::runScript(Element* script, int startingLineNumber) > // See https://bugs.webkit.org/show_bug.cgi?id=40047 > // ASSERT(document()->haveStylesheetsLoaded()); > ASSERT(isExecutingScript()); >- ScriptSourceCode sourceCode(script->textContent(), documentURLForScriptExecution(m_document), startingLineNumber); >+ ScriptSourceCode sourceCode(script->textContent(), documentURLForScriptExecution(m_document), scriptStartPosition); > executeScript(sourceCode); > } > } >diff --git a/WebCore/html/parser/HTMLScriptRunner.h b/WebCore/html/parser/HTMLScriptRunner.h >index be21dd2421b1d4427b0847b0b911c1fe97c6f765..2df295f9c13594decb6ef1f100e3cd95d379942c 100644 >--- a/WebCore/html/parser/HTMLScriptRunner.h >+++ b/WebCore/html/parser/HTMLScriptRunner.h >@@ -28,6 +28,7 @@ > > #include "PendingScript.h" > #include <wtf/Deque.h> >+#include <wtf/text/TextPosition.h> > #include <wtf/Noncopyable.h> > #include <wtf/PassRefPtr.h> > >@@ -52,7 +53,7 @@ public: > void detach(); > > // Processes the passed in script and any pending scripts if possible. >- bool execute(PassRefPtr<Element> scriptToProcess, int scriptStartLine); >+ bool execute(PassRefPtr<Element> scriptToProcess, const TextPosition1& scriptStartPosition); > > bool executeScriptsWaitingForLoad(CachedResource*); > bool hasScriptsWaitingForStylesheets() const { return m_hasScriptsWaitingForStylesheets; } >@@ -76,7 +77,7 @@ private: > void requestDeferredScript(Element*); > bool requestPendingScript(PendingScript&, Element*) const; > >- void runScript(Element*, int startingLineNumber); >+ void runScript(Element*, const TextPosition1& scriptStartPosition); > > // Helpers for dealing with HTMLScriptRunnerHost > void watchForLoad(PendingScript&); >diff --git a/WebCore/html/parser/HTMLTreeBuilder.cpp b/WebCore/html/parser/HTMLTreeBuilder.cpp >index a2236d544e213bfcd604ff1cc9a56c5f48a45f61..3679c717538184528400f7064a21a2c70cf18a9b 100644 >--- a/WebCore/html/parser/HTMLTreeBuilder.cpp >+++ b/WebCore/html/parser/HTMLTreeBuilder.cpp >@@ -55,6 +55,8 @@ namespace WebCore { > using namespace HTMLNames; > > static const int uninitializedLineNumberValue = -1; >+static const TextPosition0 uninitializedPositionValue0 = TextPosition0::belowRangePosition(); >+static const TextPosition1 uninitializedPositionValue1(WTF::OneBasedNumber::fromOneBasedInt(-1), WTF::OneBasedNumber::s_base); > > namespace { > >@@ -333,8 +335,8 @@ HTMLTreeBuilder::HTMLTreeBuilder(HTMLTokenizer* tokenizer, HTMLDocument* documen > , m_originalInsertionMode(InitialMode) > , m_secondaryInsertionMode(InitialMode) > , m_tokenizer(tokenizer) >- , m_scriptToProcessStartLine(uninitializedLineNumberValue) >- , m_lastScriptElementStartLine(uninitializedLineNumberValue) >+ , m_scriptToProcessStartPosition(uninitializedPositionValue1) >+ , m_lastScriptElementStartPosition(uninitializedPositionValue0) > , m_usePreHTML5ParserQuirks(usePreHTML5ParserQuirks) > { > } >@@ -352,8 +354,8 @@ HTMLTreeBuilder::HTMLTreeBuilder(HTMLTokenizer* tokenizer, DocumentFragment* fra > , m_originalInsertionMode(InitialMode) > , m_secondaryInsertionMode(InitialMode) > , m_tokenizer(tokenizer) >- , m_scriptToProcessStartLine(uninitializedLineNumberValue) >- , m_lastScriptElementStartLine(uninitializedLineNumberValue) >+ , m_scriptToProcessStartPosition(uninitializedPositionValue1) >+ , m_lastScriptElementStartPosition(uninitializedPositionValue0) > , m_usePreHTML5ParserQuirks(usePreHTML5ParserQuirks) > { > if (contextElement) { >@@ -415,15 +417,15 @@ HTMLTreeBuilder::FragmentParsingContext::~FragmentParsingContext() > { > } > >-PassRefPtr<Element> HTMLTreeBuilder::takeScriptToProcess(int& scriptStartLine) >+PassRefPtr<Element> HTMLTreeBuilder::takeScriptToProcess(TextPosition1& scriptStartPosition) > { > // Unpause ourselves, callers may pause us again when processing the script. > // The HTML5 spec is written as though scripts are executed inside the tree > // builder. We pause the parser to exit the tree builder, and then resume > // before running scripts. > m_isPaused = false; >- scriptStartLine = m_scriptToProcessStartLine; >- m_scriptToProcessStartLine = uninitializedLineNumberValue; >+ scriptStartPosition = m_scriptToProcessStartPosition; >+ m_scriptToProcessStartPosition = uninitializedPositionValue1; > return m_scriptToProcess.release(); > } > >@@ -2201,7 +2203,7 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token) > m_isPaused = true; > ASSERT(m_tree.currentElement()->hasTagName(scriptTag)); > m_scriptToProcess = m_tree.currentElement(); >- m_scriptToProcessStartLine = m_lastScriptElementStartLine + 1; >+ m_scriptToProcessStartPosition = WTF::toOneBasedTextPosition(m_lastScriptElementStartPosition); > m_tree.openElements()->pop(); > if (isParsingFragment() && m_fragmentContext.scriptingPermission() == FragmentScriptingNotAllowed) > m_scriptToProcess->removeAllChildren(); >@@ -2750,7 +2752,10 @@ void HTMLTreeBuilder::processScriptStartTag(AtomicHTMLToken& token) > m_tree.insertScriptElement(token); > m_tokenizer->setState(HTMLTokenizer::ScriptDataState); > m_originalInsertionMode = m_insertionMode; >- m_lastScriptElementStartLine = m_tokenizer->lineNumber(); >+ >+ TextPosition0 position = TextPosition0(WTF::ZeroBasedNumber::fromZeroBasedInt(m_tokenizer->lineNumber()), WTF::ZeroBasedNumber::s_base); >+ m_lastScriptElementStartPosition = position; >+ > setInsertionMode(TextMode); > } > >diff --git a/WebCore/html/parser/HTMLTreeBuilder.h b/WebCore/html/parser/HTMLTreeBuilder.h >index e61fe73466da178d3311d27620e46b8281c1e455..bb3596dfee7fcce92e71f2e1fa0e5f15e948b189 100644 >--- a/WebCore/html/parser/HTMLTreeBuilder.h >+++ b/WebCore/html/parser/HTMLTreeBuilder.h >@@ -32,6 +32,7 @@ > #include "HTMLElementStack.h" > #include "HTMLFormattingElementList.h" > #include "HTMLTokenizer.h" >+#include <wtf/text/TextPosition.h> > #include <wtf/Noncopyable.h> > #include <wtf/OwnPtr.h> > #include <wtf/PassOwnPtr.h> >@@ -71,7 +72,7 @@ public: > void constructTreeFromAtomicToken(AtomicHTMLToken&); > > // Must be called when parser is paused before calling the parser again. >- PassRefPtr<Element> takeScriptToProcess(int& scriptStartLine); >+ PassRefPtr<Element> takeScriptToProcess(TextPosition1& scriptStartPosition); > > // Done, close any open tags, etc. > void finished(); >@@ -246,13 +247,12 @@ private: > HTMLTokenizer* m_tokenizer; > > RefPtr<Element> m_scriptToProcess; // <script> tag which needs processing before resuming the parser. >- int m_scriptToProcessStartLine; // Starting line number of the script tag needing processing. >+ TextPosition1 m_scriptToProcessStartPosition; // Starting line number of the script tag needing processing. > > // FIXME: We probably want to remove this member. Originally, it was > // created to service the legacy tree builder, but it seems to be used for > // some other things now. >- int m_lastScriptElementStartLine; >- >+ TextPosition0 m_lastScriptElementStartPosition; > bool m_usePreHTML5ParserQuirks; > }; > >diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog >index 701a8fe58a1396ccc6750b3283c96eeb86e9faf0..a0345635b168d68bc727f6fd58042efe5d1e523e 100644 >--- a/WebKit/chromium/ChangeLog >+++ b/WebKit/chromium/ChangeLog >@@ -1,3 +1,17 @@ >+2010-10-07 Peter Rybin <peter.rybin@gmail.com> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ HTML parser should provide script column position within HTML document to JavaScript engine >+ https://bugs.webkit.org/show_bug.cgi?id=45271 >+ >+ Replaces script line number with TextPosition structure. >+ >+ * src/WebFrameImpl.cpp: >+ (WebKit::WebFrameImpl::executeScript): >+ (WebKit::WebFrameImpl::executeScriptInIsolatedWorld): >+ (WebKit::WebFrameImpl::executeScriptAndReturnValue): >+ > 2010-10-06 Chris Guillory <chris.guillory@google.com> > > Reviewed by Chris Fleizach. >diff --git a/WebKit/chromium/src/WebFrameImpl.cpp b/WebKit/chromium/src/WebFrameImpl.cpp >index 9daf26f1ff7867901b006e5313ebe814af5f37a1..331250db32d38cf92b20852e2313f91e618a0205 100644 >--- a/WebKit/chromium/src/WebFrameImpl.cpp >+++ b/WebKit/chromium/src/WebFrameImpl.cpp >@@ -753,8 +753,9 @@ void WebFrameImpl::bindToWindowObject(const WebString& name, NPObject* object) > > void WebFrameImpl::executeScript(const WebScriptSource& source) > { >+ TextPosition1 position(WTF::OneBasedNumber::fromOneBasedInt(source.startLine), WTF::OneBasedNumber::s_base); > m_frame->script()->executeScript( >- ScriptSourceCode(source.code, source.url, source.startLine)); >+ ScriptSourceCode(source.code, source.url, position)); > } > > void WebFrameImpl::executeScriptInIsolatedWorld( >@@ -764,8 +765,9 @@ void WebFrameImpl::executeScriptInIsolatedWorld( > Vector<ScriptSourceCode> sources; > > for (unsigned i = 0; i < numSources; ++i) { >+ TextPosition1 position(WTF::OneBasedNumber::fromOneBasedInt(sourcesIn[i].startLine), WTF::OneBasedNumber::s_base); > sources.append(ScriptSourceCode( >- sourcesIn[i].code, sourcesIn[i].url, sourcesIn[i].startLine)); >+ sourcesIn[i].code, sourcesIn[i].url, position)); > } > > m_frame->script()->evaluateInIsolatedWorld(worldId, sources, extensionGroup); >@@ -817,8 +819,9 @@ void WebFrameImpl::collectGarbage() > v8::Handle<v8::Value> WebFrameImpl::executeScriptAndReturnValue( > const WebScriptSource& source) > { >+ TextPosition1 position(WTF::OneBasedNumber::fromOneBasedInt(source.startLine), WTF::OneBasedNumber::s_base); > return m_frame->script()->executeScript( >- ScriptSourceCode(source.code, source.url, source.startLine)).v8Value(); >+ ScriptSourceCode(source.code, source.url, position)).v8Value(); > } > > // Returns the V8 context for this frame, or an empty handle if there is none.
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 45271
:
66657
|
66663
|
66664
|
68076
|
68392
|
68589
|
68715
|
68746
|
70071
|
70250
|
71204
|
71294
|
71655
|
73489