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-20100924221123.patch (text/plain), 57.86 KB, created by
Peter Rybin
on 2010-09-24 11:11:25 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Peter Rybin
Created:
2010-09-24 11:11:25 PDT
Size:
57.86 KB
patch
obsolete
>diff --git a/JavaScriptCore/ChangeLog b/JavaScriptCore/ChangeLog >index 64f6f97169dfa740269a98914fb3e5e0664b85a7..c6d1df8eec5ecc0dab17350830958eeb91521ae6 100644 >--- a/JavaScriptCore/ChangeLog >+++ b/JavaScriptCore/ChangeLog >@@ -1,3 +1,36 @@ >+2010-09-23 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/TextPosition.cpp: Added. >+ * wtf/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-09-22 Oliver Hunt <oliver@apple.com> > > Reviewed by Geoff Garen. >diff --git a/JavaScriptCore/GNUmakefile.am b/JavaScriptCore/GNUmakefile.am >index 88d17617b3a4b8884c04a26868c6f06d1731c750..2c6cad49a371a22ff2f3176c1a504d9a5bf150ee 100644 >--- a/JavaScriptCore/GNUmakefile.am >+++ b/JavaScriptCore/GNUmakefile.am >@@ -513,6 +513,8 @@ javascriptcore_sources += \ > JavaScriptCore/wtf/text/StringStatics.cpp \ > JavaScriptCore/wtf/text/WTFString.cpp \ > JavaScriptCore/wtf/text/WTFString.h \ >+ JavaScriptCore/wtf/TextPosition.cpp \ >+ JavaScriptCore/wtf/TextPosition.h \ > JavaScriptCore/wtf/ThreadIdentifierDataPthreads.cpp \ > JavaScriptCore/wtf/ThreadIdentifierDataPthreads.h \ > JavaScriptCore/wtf/Threading.cpp \ >diff --git a/JavaScriptCore/JavaScriptCore.gypi b/JavaScriptCore/JavaScriptCore.gypi >index 462960d51dd6dbe402d5863d208c1328cbc15ace..512bc5265dc4ca0ff1e48b66a958186f04218294 100644 >--- a/JavaScriptCore/JavaScriptCore.gypi >+++ b/JavaScriptCore/JavaScriptCore.gypi >@@ -424,6 +424,8 @@ > 'wtf/StringExtras.h', > 'wtf/StringHashFunctions.h', > 'wtf/TCPackedCache.h', >+ 'wtf/TextPosition.h', >+ 'wtf/TextPosition.cpp', > 'wtf/qt/MainThreadQt.cpp', > 'wtf/qt/StringQt.cpp', > 'wtf/qt/ThreadingQt.cpp', >diff --git a/JavaScriptCore/wtf/CMakeLists.txt b/JavaScriptCore/wtf/CMakeLists.txt >index 896794ef41e8f021840994ac35247872b2dae169..e1787ca03ad58492e6e18c8617065b629e28d1c7 100644 >--- a/JavaScriptCore/wtf/CMakeLists.txt >+++ b/JavaScriptCore/wtf/CMakeLists.txt >@@ -9,6 +9,7 @@ SET(WTF_SOURCES > RandomNumber.cpp > RefCountedLeakCounter.cpp > StringExtras.cpp >+ TextPosition.cpp > Threading.cpp > TypeTraits.cpp > WTFThreadData.cpp >diff --git a/JavaScriptCore/wtf/TextPosition.cpp b/JavaScriptCore/wtf/TextPosition.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..9a17e030959d27a9d81d3e102089088a967971ae >--- /dev/null >+++ b/JavaScriptCore/wtf/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/TextPosition.h b/JavaScriptCore/wtf/TextPosition.h >new file mode 100644 >index 0000000000000000000000000000000000000000..14c2c0690bcad40444ff7b7b1ebb5cc18ccbbf92 >--- /dev/null >+++ b/JavaScriptCore/wtf/TextPosition.h >@@ -0,0 +1,153 @@ >+/* >+ * 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. The third field 'generation' reflects the fact >+ * that in HTML document its any part can be generated on the fly, by a 'document.write' >+ * call. While elements of the generated part may still have coordinates (probably), >+ * we need to distinguish them from coordinates in the original text. >+ * So generation == 0 means that coordinates apply to original text, >+ * generation == 1 applies to a elements generated by a script in original text, >+ * generation == 2 to elements generated from a script in a generated part and so on. >+ * >+ * 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, int generation) >+ : m_line(line) >+ , m_column(column) >+ , m_generation(generation) >+ { >+ } >+ TextPosition() {} >+ >+ // A 'minimum' value of position, used as a default value. >+ static TextPosition<NUMBER> minimumPosition() { return TextPosition<NUMBER>(NUMBER::s_base, NUMBER::s_base, 0); } >+ >+ // 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, 0); } >+ >+ NUMBER m_line; >+ NUMBER m_column; >+ int m_generation; >+}; >+ >+ >+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(), position.m_generation); >+} >+ >+inline TextPosition1 toOneBasedTextPosition(const TextPosition0& position) >+{ >+ return TextPosition1(position.m_line.convertToOneBased(), position.m_column.convertToOneBased(), position.m_generation); >+} >+ >+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..94b7269555c144c577b1bd597f8cd9698f774c2f 100644 >--- a/JavaScriptCore/wtf/wtf.pri >+++ b/JavaScriptCore/wtf/wtf.pri >@@ -16,6 +16,7 @@ SOURCES += \ > wtf/PageAllocation.cpp \ > wtf/RandomNumber.cpp \ > wtf/RefCountedLeakCounter.cpp \ >+ wtf/TextPosition.cpp \ > wtf/ThreadingNone.cpp \ > wtf/Threading.cpp \ > wtf/TypeTraits.cpp \ >diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog >index 3866165772dae34cba13c4bdd25785e5725b1a35..c5ecf34e42383fcd52fd70a95c6f3a1c79d22ee3 100644 >--- a/WebCore/ChangeLog >+++ b/WebCore/ChangeLog >@@ -1,3 +1,78 @@ >+2010-09-23 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): >+ * 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-09-23 Patrick Gansterer <paroga@webkit.org> > > Reviewed by Adam Roben. >diff --git a/WebCore/bindings/js/ScriptSourceCode.h b/WebCore/bindings/js/ScriptSourceCode.h >index 32d6298cdbda772daa13e1033e3cf0aa40f594b2..f048e9c8a5384cc00e225be70bdf7d2bcee7e103 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/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 556b5c6ea91b7a0212c4e9b2bb2b9edde2bfa546..b44784e0eb35a5265dc476f495c1c1efbd8138db 100644 >--- a/WebCore/bindings/v8/ScriptController.cpp >+++ b/WebCore/bindings/v8/ScriptController.cpp >@@ -260,20 +260,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 3bc42efb03f9a8c80c1654a52ec3e1c772c48f23..c1d333165a7b3928f0f6dfe7c607fee6ca0f3af4 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..044def05276ba84ffc9ce36c51349f6fca814f3c 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, 0); > 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..37041bef7acadb57e8ca1a932d4c838cb59aca8b 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/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..c4aae03e2a843ba9464638bf21e2aa546be4ec73 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/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 0a620794c9b01fc8b71bd6437e0604bee26d57a1..62f65bf83c5c7b1fbbcb60b770d825f541e8acbe 100644 >--- a/WebCore/bindings/v8/V8Proxy.cpp >+++ b/WebCore/bindings/v8/V8Proxy.cpp >@@ -238,12 +238,15 @@ 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::String> name; >+ if (!scriptStartPosition.m_generation) >+ name = v8::String::New(fileNameString, fileName.length()); >+ 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; > } >@@ -399,7 +402,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, ""); > >@@ -434,7 +437,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 7f10a26ef763f750728b5a0e27898b95c0f52b66..9800d909d701aa819cb4e044f6746d7edd613975 100644 >--- a/WebCore/bindings/v8/V8Proxy.h >+++ b/WebCore/bindings/v8/V8Proxy.h >@@ -289,7 +289,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..aa1cde63a7faa35e247adba47cc5d942f009a257 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/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..657f94edd82eb447f084360e7bd3ef5dab57f632 100644 >--- a/WebCore/dom/PendingScript.h >+++ b/WebCore/dom/PendingScript.h >@@ -28,6 +28,7 @@ > > #include "CachedResourceClient.h" > #include "CachedResourceHandle.h" >+#include <wtf/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..b633f35351f6083263b4218baea884b0bed2a88f 100644 >--- a/WebCore/dom/ScriptableDocumentParser.h >+++ b/WebCore/dom/ScriptableDocumentParser.h >@@ -27,10 +27,10 @@ > #define ScriptableDocumentParser_h > > #include "DecodedDataDocumentParser.h" >+#include <wtf/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..e8862e1971a67da5635dc375a35fd602d326b165 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,8 @@ namespace WebCore { > > bool appendFragmentSource(const String&); > >+ int columnNumber() const; >+ > #if USE(QXMLSTREAM) > private: > void parse(); >@@ -208,7 +210,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 5539072ee58cba015f3b6ce5d44ccb71db3f15fb..e05ddf3f82cfb64d62c702ae0414f94030e6d4fe 100644 >--- a/WebCore/dom/XMLDocumentParserLibxml2.cpp >+++ b/WebCore/dom/XMLDocumentParserLibxml2.cpp >@@ -558,7 +558,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) > { >@@ -585,7 +585,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) > { >@@ -817,7 +817,7 @@ void XMLDocumentParser::startElementNs(const xmlChar* xmlLocalName, const xmlCha > > ScriptElement* scriptElement = toScriptElement(newElement.get()); > if (scriptElement) >- m_scriptStartLine = lineNumber(); >+ m_scriptStartPosition = toOneBasedTextPosition(textPosition()); > > m_currentNode->deprecatedParserAddChild(newElement.get()); > >@@ -903,7 +903,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()) >@@ -1369,12 +1369,26 @@ void* xmlDocPtrForString(CachedResourceLoader* cachedResourceLoader, const Strin > > int XMLDocumentParser::lineNumber() const > { >- return context() ? context()->input->line : 1; >+ // FIXME: the implementation probably returns 1-based int, but method should return 0-based. >+ // New "- 1" fixes this. Is it correct? >+ return (context() ? context()->input->line : 1) - 1; > } > > int XMLDocumentParser::columnNumber() const > { >- return context() ? context()->input->col : 1; >+ // FIXME: the implementation probably returns 1-based int, but method should return 0-based. >+ // New "- 1" fixes this. Is it correct? >+ return (context() ? context()->input->col : 1) - 1; >+} >+ >+TextPosition0 XMLDocumentParser::textPosition() const >+{ >+ xmlParserCtxtPtr context = this->context(); >+ if (context) { >+ return TextPosition0(WTF::OneBasedNumber::fromOneBasedInt(context->input->line).convertToZeroBased(), >+ WTF::OneBasedNumber::fromOneBasedInt(context->input->col).convertToZeroBased(), 0); >+ } >+ return TextPosition0::minimumPosition(); > } > > void XMLDocumentParser::stopParsing() >diff --git a/WebCore/dom/XMLDocumentParserQt.cpp b/WebCore/dom/XMLDocumentParserQt.cpp >index 75a20be3541cf527ee54984d2148281ad0824f64..615a2631d9f96d357378d7aac71d44e946404f7c 100644 >--- a/WebCore/dom/XMLDocumentParserQt.cpp >+++ b/WebCore/dom/XMLDocumentParserQt.cpp >@@ -103,7 +103,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) > { >@@ -130,7 +130,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) > { >@@ -232,6 +232,11 @@ int XMLDocumentParser::columnNumber() const > return m_stream.columnNumber(); > } > >+TextPosition0 XMLDocumentParser::textPosition() const >+{ >+ return TextPosition0(WTF::ZeroBasedNumber(lineNumber()), WTF::ZeroBasedNumber(columnNumber()), 0); >+} >+ > void XMLDocumentParser::stopParsing() > { > ScriptableDocumentParser::stopParsing(); >@@ -516,7 +521,7 @@ void XMLDocumentParser::parseStartElement() > > ScriptElement* scriptElement = toScriptElement(newElement.get()); > if (scriptElement) >- m_scriptStartLine = lineNumber(); >+ m_scriptStartPosition = WTF::toOneBasedTextPosition(textPosition()); > > m_currentNode->deprecatedParserAddChild(newElement.get()); > >@@ -588,7 +593,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(); >@@ -709,4 +714,3 @@ void XMLDocumentParser::parseDtd() > > } > } >- >diff --git a/WebCore/html/parser/HTMLDocumentParser.cpp b/WebCore/html/parser/HTMLDocumentParser.cpp >index 630b6aa6e1b0d66508cfd1294a702c3dd3ed2cf0..198b9f40d92cb1a84e97c84f6a335d5e59eb964b 100644 >--- a/WebCore/html/parser/HTMLDocumentParser.cpp >+++ b/WebCore/html/parser/HTMLDocumentParser.cpp >@@ -194,12 +194,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) >@@ -415,9 +415,14 @@ 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(); >+ int generation = m_writeNestingLevel; >+ >+ return TextPosition0(WTF::ZeroBasedNumber::fromZeroBasedInt(lineZeroBased), >+ WTF::OneBasedNumber::fromOneBasedInt(columnOneBased).convertToZeroBased(), generation); > } > > bool HTMLDocumentParser::isWaitingForScripts() const >diff --git a/WebCore/html/parser/HTMLDocumentParser.h b/WebCore/html/parser/HTMLDocumentParser.h >index e65a582a75e0e03cf48fdbb4bc8e8c07c2526000..5d26a56596b8a031d07a6507a69554bd2799f2d2 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..524fe5d453c98d7dea54a4c5bff3f6c7877ca560 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/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 355dc8d532f5c7c4090ccd1fffa5c2aa76382da8..93d34dff7148bee98ff35a4ddd8064cb99db18a6 100644 >--- a/WebCore/html/parser/HTMLTreeBuilder.cpp >+++ b/WebCore/html/parser/HTMLTreeBuilder.cpp >@@ -49,12 +49,15 @@ > #include "XLinkNames.h" > #include "XMLNSNames.h" > #include "XMLNames.h" >+#include <wtf/Assertions.h> > > 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, -1); > > namespace { > >@@ -333,8 +336,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 +355,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 +418,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 +2204,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 +2753,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, 0); >+ m_lastScriptElementStartPosition = position; >+ > setInsertionMode(TextMode); > } > >diff --git a/WebCore/html/parser/HTMLTreeBuilder.h b/WebCore/html/parser/HTMLTreeBuilder.h >index e61fe73466da178d3311d27620e46b8281c1e455..2e37e4f589fc586f1d2e90bb76b9e1f22885f333 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/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 f381d15f884b93ce94b5fd619939e9a2458dc4c9..9eb51b2f77b484bdd85b84d435f9ece7dd5439ef 100644 >--- a/WebKit/chromium/ChangeLog >+++ b/WebKit/chromium/ChangeLog >@@ -1,3 +1,17 @@ >+2010-09-23 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-09-23 Tony Chang <tony@chromium.org> > > Reviewed by David Levin. >diff --git a/WebKit/chromium/src/WebFrameImpl.cpp b/WebKit/chromium/src/WebFrameImpl.cpp >index f048cb984de08a7348f0da88fef7fffe18d88f4f..d924e38e040506b5f41f10c0e8331878aefb5207 100644 >--- a/WebKit/chromium/src/WebFrameImpl.cpp >+++ b/WebKit/chromium/src/WebFrameImpl.cpp >@@ -741,8 +741,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, 0); > m_frame->script()->executeScript( >- ScriptSourceCode(source.code, source.url, source.startLine)); >+ ScriptSourceCode(source.code, source.url, position)); > } > > void WebFrameImpl::executeScriptInIsolatedWorld( >@@ -752,8 +753,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, 0); > 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); >@@ -805,8 +807,9 @@ void WebFrameImpl::collectGarbage() > v8::Handle<v8::Value> WebFrameImpl::executeScriptAndReturnValue( > const WebScriptSource& source) > { >+ TextPosition1 position(WTF::OneBasedNumber::fromOneBasedInt(source.startLine), WTF::OneBasedNumber::s_base, 0); > 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