From 82a000d6a2fa47013eeca31c9ed87fb47955eb22 Mon Sep 17 00:00:00 2001 From: "timothy@apple.com" Date: Sat, 31 May 2008 06:05:28 +0000 Subject: [PATCH] Made the starting line number of scripts be 1-based throughout the engine. JavaScriptCore: 2008-05-30 Timothy Hatcher Made the starting line number of scripts be 1-based throughout the engine. This cleans up script line numbers so they are all consistent now and fixes some cases where script execution was shown as off by one line in the debugger. No change in SunSpider. Reviewed by Oliver Hunt. * API/minidom.c: (main): Pass a line number of 1 instead of 0 to parser().parse(). * API/testapi.c: (main): Ditto. And removes a FIXME and changed an assertEqualsAsNumber to use 1 instead of 2 for the line number. * VM/Machine.cpp: (KJS::callEval): Pass a line number of 1 instead of 0. (KJS::Machine::debug): Use firstLine for WillExecuteProgram instead of lastLine. Use lastLine for DidExecuteProgram instead of firstLine. * kjs/DebuggerCallFrame.cpp: (KJS::DebuggerCallFrame::evaluate): Pass a line number of 1 instead of 0 to parser().parse(). * kjs/Parser.cpp: (KJS::Parser::parse): ASSERT startingLineNumber is greatter than 0. Change the startingLineNumber to be 1 if it was less than or equal to 0. This is needed for release builds to maintain compatibility with the JavaScriptCore API. * kjs/function.cpp: (KJS::globalFuncEval): Pass a line number of 1 instead of 0 to parser().parse(). * kjs/function_object.cpp: (FunctionObjectImp::construct): Pass a line number of 1 instead of 0 to construct(). * kjs/lexer.cpp: (Lexer::setCode): Made yylineno = startingLineNumber instead of adding 1. * kjs/testkjs.cpp: (functionRun): Pass a line number of 1 instead of 0 to Interpreter::evaluate(). (functionLoad): Ditto. (prettyPrintScript): Ditto. (runWithScripts): Ditto. * profiler/Profiler.cpp: (WebCore::createCallIdentifier): Removed a plus 1 of startingLineNumber. WebCore: 2008-05-30 Timothy Hatcher Made the starting line number of scripts be 1-based throughout the engine. This cleans up script line numbers so they are all consistent now and fixes some cases where script execution was shown as off by one line in the debugger. Doing this also exposed a bug where JSLazyEventListener created in XHML or SVG documents would always have a line number of 0. So this change fixed that bug to pass all the SVG and XHTML tests. All layout tests pass. Reviewed by Oliver Hunt. * bindings/js/kjs_events.cpp: (WebCore::JSLazyEventListener::JSLazyEventListener): Set the line number to 1 if it was passed in as 0. This can happen when listeners are created with a setAttribute call from JavaScript. (WebCore::JSLazyEventListener::parseCode): Add a FIXME about the URL being incorrect when listeners are created with a setAttribute call from JavaScript. * bindings/js/kjs_events.h: Remove the default value for lineNumber, since no callers need it. * bindings/objc/WebScriptObject.mm: (-[WebScriptObject evaluateWebScript:]): Pass a line number of 1 instead of 0 to Interpreter::evaluate(). * bridge/NP_jsobject.cpp: (_NPN_Evaluate): Ditto. * bridge/jni/jni_jsobject.mm: (JavaJSObject::eval): Ditto. * dom/XMLTokenizer.cpp: (WebCore::XMLTokenizer::startElementNs): Call KJSProxy::setEventHandlerLineno() around the call to handleElementAttributes, so any JSLazyEventListener created from those attributes have line numbers. (WebCore::XMLTokenizer::endElementNs): Remove a minus 1 of the line number. (WebCore::XMLTokenizer::notifyFinished): Pass a line number of 1 instead of 0. (WebCore::XMLTokenizer::parseEndElement): Remove a minus 1 of the line number. * html/HTMLScriptElement.cpp: (WebCore::HTMLScriptElement::evaluateScript): Add a FIXME about the starting line number being incorrect in some cases when this function is called. * html/HTMLTokenizer.cpp: (WebCore::HTMLTokenizer::parseSpecial): Add a plus 1 to the line number when setting scriptStartLineno so it is 1-based. Same for calling setEventHandlerLineno(). (WebCore::HTMLTokenizer::processToken): Ditto. * html/HTMLTokenizer.h: Change the default line number on scriptExecution() to 1 from 0. * loader/FrameLoader.cpp: (FrameLoader::executeIfJavaScriptURL): Pass a line number of 1 instead of 0 to executeScript(). WebKitTools: 2008-05-30 Timothy Hatcher Made the starting line number of scripts be 1-based throughout the engine. This cleans up script line numbers so they are all consistent now. Reviewed by Oliver Hunt. * DumpRenderTree/mac/ObjCController.m: (runJavaScriptThread): Pass a line number of 1 instead of 0 to JSEvaluateScript. * DumpRenderTree/pthreads/JavaScriptThreadingPthreads.cpp: (runJavaScriptThread): Ditto. * DumpRenderTree/win/DumpRenderTree.cpp: (runJavaScriptThread): Ditto. git-svn-id: http://svn.webkit.org/repository/webkit/trunk@34273 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- JavaScriptCore/API/minidom.c | 2 +- JavaScriptCore/API/testapi.c | 10 ++-- JavaScriptCore/ChangeLog | 40 ++++++++++++++++ .../JavaScriptCore.xcodeproj/project.pbxproj | 2 +- JavaScriptCore/VM/Machine.cpp | 6 +-- JavaScriptCore/kjs/DebuggerCallFrame.cpp | 2 +- JavaScriptCore/kjs/Parser.cpp | 4 ++ JavaScriptCore/kjs/function.cpp | 2 +- JavaScriptCore/kjs/function_object.cpp | 2 +- JavaScriptCore/kjs/lexer.cpp | 2 +- JavaScriptCore/kjs/testkjs.cpp | 8 ++-- JavaScriptCore/profiler/Profiler.cpp | 2 +- WebCore/ChangeLog | 47 +++++++++++++++++++ WebCore/bindings/js/kjs_events.cpp | 8 ++++ WebCore/bindings/js/kjs_events.h | 2 +- WebCore/bindings/objc/WebScriptObject.mm | 2 +- WebCore/bridge/NP_jsobject.cpp | 2 +- WebCore/bridge/jni/jni_jsobject.mm | 2 +- WebCore/dom/XMLTokenizer.cpp | 16 +++++-- WebCore/html/HTMLScriptElement.cpp | 4 +- WebCore/html/HTMLTokenizer.cpp | 6 +-- WebCore/html/HTMLTokenizer.h | 2 +- WebCore/loader/FrameLoader.cpp | 2 +- WebKitTools/ChangeLog | 14 ++++++ .../DumpRenderTree/mac/ObjCController.m | 2 +- .../pthreads/JavaScriptThreadingPthreads.cpp | 2 +- .../DumpRenderTree/win/DumpRenderTree.cpp | 2 +- 27 files changed, 159 insertions(+), 36 deletions(-) diff --git a/JavaScriptCore/API/minidom.c b/JavaScriptCore/API/minidom.c index 1537925b3ed..4a4de3a65da 100644 --- a/JavaScriptCore/API/minidom.c +++ b/JavaScriptCore/API/minidom.c @@ -58,7 +58,7 @@ int main(int argc, char* argv[]) char* scriptUTF8 = createStringWithContentsOfFile(scriptPath); JSStringRef script = JSStringCreateWithUTF8CString(scriptUTF8); JSValueRef exception; - JSValueRef result = JSEvaluateScript(context, script, NULL, NULL, 0, &exception); + JSValueRef result = JSEvaluateScript(context, script, NULL, NULL, 1, &exception); if (result) printf("PASS: Test script executed successfully.\n"); else { diff --git a/JavaScriptCore/API/testapi.c b/JavaScriptCore/API/testapi.c index 0590a565756..73f14b61aae 100644 --- a/JavaScriptCore/API/testapi.c +++ b/JavaScriptCore/API/testapi.c @@ -806,7 +806,7 @@ int main(int argc, char* argv[]) ASSERT(!JSObjectMakeFunction(context, NULL, 0, NULL, functionBody, NULL, 1, &exception)); ASSERT(JSValueIsObject(context, exception)); v = JSObjectGetProperty(context, JSValueToObject(context, exception, NULL), line, NULL); - assertEqualsAsNumber(v, 2); // FIXME: Lexer::setCode bumps startingLineNumber by 1 -- we need to change internal callers so that it doesn't have to (saying '0' to mean '1' in the API would be really confusing -- it's really confusing internally, in fact) + assertEqualsAsNumber(v, 1); JSStringRelease(functionBody); JSStringRelease(line); @@ -901,16 +901,16 @@ int main(int argc, char* argv[]) ASSERT(JSValueIsEqual(context, v, o, NULL)); JSStringRef script = JSStringCreateWithUTF8CString("this;"); - v = JSEvaluateScript(context, script, NULL, NULL, 0, NULL); + v = JSEvaluateScript(context, script, NULL, NULL, 1, NULL); ASSERT(JSValueIsEqual(context, v, globalObject, NULL)); - v = JSEvaluateScript(context, script, o, NULL, 0, NULL); + v = JSEvaluateScript(context, script, o, NULL, 1, NULL); ASSERT(JSValueIsEqual(context, v, o, NULL)); JSStringRelease(script); script = JSStringCreateWithUTF8CString("eval(this);"); - v = JSEvaluateScript(context, script, NULL, NULL, 0, NULL); + v = JSEvaluateScript(context, script, NULL, NULL, 1, NULL); ASSERT(JSValueIsEqual(context, v, globalObject, NULL)); - v = JSEvaluateScript(context, script, o, NULL, 0, NULL); + v = JSEvaluateScript(context, script, o, NULL, 1, NULL); ASSERT(JSValueIsEqual(context, v, o, NULL)); JSStringRelease(script); diff --git a/JavaScriptCore/ChangeLog b/JavaScriptCore/ChangeLog index 631b0d31d20..56545975da5 100644 --- a/JavaScriptCore/ChangeLog +++ b/JavaScriptCore/ChangeLog @@ -1,3 +1,43 @@ +2008-05-30 Timothy Hatcher + + Made the starting line number of scripts be 1-based throughout the engine. + This cleans up script line numbers so they are all consistent now and fixes + some cases where script execution was shown as off by one line in the debugger. + + No change in SunSpider. + + Reviewed by Oliver Hunt. + + * API/minidom.c: + (main): Pass a line number of 1 instead of 0 to parser().parse(). + * API/testapi.c: + (main): Ditto. And removes a FIXME and changed an assertEqualsAsNumber + to use 1 instead of 2 for the line number. + * VM/Machine.cpp: + (KJS::callEval): Pass a line number of 1 instead of 0. + (KJS::Machine::debug): Use firstLine for WillExecuteProgram instead of + lastLine. Use lastLine for DidExecuteProgram instead of firstLine. + * kjs/DebuggerCallFrame.cpp: + (KJS::DebuggerCallFrame::evaluate): Pass a line number of 1 instead of + 0 to parser().parse(). + * kjs/Parser.cpp: + (KJS::Parser::parse): ASSERT startingLineNumber is greatter than 0. Change + the startingLineNumber to be 1 if it was less than or equal to 0. This is needed + for release builds to maintain compatibility with the JavaScriptCore API. + * kjs/function.cpp: + (KJS::globalFuncEval): Pass a line number of 1 instead of 0 to parser().parse(). + * kjs/function_object.cpp: + (FunctionObjectImp::construct): Pass a line number of 1 instead of 0 to construct(). + * kjs/lexer.cpp: + (Lexer::setCode): Made yylineno = startingLineNumber instead of adding 1. + * kjs/testkjs.cpp: + (functionRun): Pass a line number of 1 instead of 0 to Interpreter::evaluate(). + (functionLoad): Ditto. + (prettyPrintScript): Ditto. + (runWithScripts): Ditto. + * profiler/Profiler.cpp: + (WebCore::createCallIdentifier): Removed a plus 1 of startingLineNumber. + 2008-05-30 Alexey Proskuryakov Reviewed by Darin. diff --git a/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj b/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj index 9b3a65caa24..1115f53c791 100644 --- a/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj +++ b/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj @@ -533,7 +533,7 @@ 931C6CEF038EE8DE008635CE /* list.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = list.h; sourceTree = ""; tabWidth = 8; }; 931C6CF0038EE8DE008635CE /* list.cpp */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = list.cpp; sourceTree = ""; tabWidth = 8; }; 9322A00306C341D3009067BB /* libicucore.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libicucore.dylib; path = /usr/lib/libicucore.dylib; sourceTree = ""; }; - 932F5BD80822A1C700736975 /* Info.plist */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = text.xml; path = Info.plist; sourceTree = ""; tabWidth = 8; usesTabs = 1; }; + 932F5BD80822A1C700736975 /* Info.plist */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; tabWidth = 8; usesTabs = 1; }; 932F5BD90822A1C700736975 /* JavaScriptCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = JavaScriptCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 932F5BE10822A1C700736975 /* testkjs */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testkjs; sourceTree = BUILT_PRODUCTS_DIR; }; 933A3499038AE7C6008635CE /* grammar.y */ = {isa = PBXFileReference; explicitFileType = sourcecode.yacc; fileEncoding = 4; indentWidth = 4; path = grammar.y; sourceTree = ""; tabWidth = 8; }; diff --git a/JavaScriptCore/VM/Machine.cpp b/JavaScriptCore/VM/Machine.cpp index ec71a9a0b30..60ad07ddaec 100644 --- a/JavaScriptCore/VM/Machine.cpp +++ b/JavaScriptCore/VM/Machine.cpp @@ -453,7 +453,7 @@ static NEVER_INLINE JSValue* callEval(ExecState* exec, JSObject* thisObj, ScopeC int sourceId; int errLine; UString errMsg; - RefPtr evalNode = parser().parse(exec, UString(), 0, UStringSourceProvider::create(static_cast(program)->value()), &sourceId, &errLine, &errMsg); + RefPtr evalNode = parser().parse(exec, UString(), 1, UStringSourceProvider::create(static_cast(program)->value()), &sourceId, &errLine, &errMsg); if (!evalNode) { exceptionValue = Error::create(exec, SyntaxError, errMsg, errLine, sourceId, NULL); @@ -852,11 +852,11 @@ NEVER_INLINE void Machine::debug(ExecState* exec, const Instruction* vPC, const return; } case WillExecuteProgram: { - debugger->willExecuteProgram(debuggerCallFrame, codeBlock->ownerNode->sourceId(), lastLine); + debugger->willExecuteProgram(debuggerCallFrame, codeBlock->ownerNode->sourceId(), firstLine); return; } case DidExecuteProgram: { - debugger->didExecuteProgram(debuggerCallFrame, codeBlock->ownerNode->sourceId(), firstLine); + debugger->didExecuteProgram(debuggerCallFrame, codeBlock->ownerNode->sourceId(), lastLine); return; } } diff --git a/JavaScriptCore/kjs/DebuggerCallFrame.cpp b/JavaScriptCore/kjs/DebuggerCallFrame.cpp index 81bc1938c30..ff1c2d3eee3 100644 --- a/JavaScriptCore/kjs/DebuggerCallFrame.cpp +++ b/JavaScriptCore/kjs/DebuggerCallFrame.cpp @@ -73,7 +73,7 @@ JSValue* DebuggerCallFrame::evaluate(const UString& script, JSValue*& exception) int errLine; UString errMsg; - RefPtr evalNode = parser().parse(&newExec, UString(), 0, UStringSourceProvider::create(script), &sourceId, &errLine, &errMsg); + RefPtr evalNode = parser().parse(&newExec, UString(), 1, UStringSourceProvider::create(script), &sourceId, &errLine, &errMsg); if (!evalNode) return Error::create(&newExec, SyntaxError, errMsg, errLine, sourceId, 0); diff --git a/JavaScriptCore/kjs/Parser.cpp b/JavaScriptCore/kjs/Parser.cpp index e2b2563733c..5328f6a7767 100644 --- a/JavaScriptCore/kjs/Parser.cpp +++ b/JavaScriptCore/kjs/Parser.cpp @@ -67,6 +67,10 @@ void Parser::parse(ExecState* exec, const UString& sourceURL, int startingLineNu Lexer& lexer = KJS::lexer(); + ASSERT(startingLineNumber > 0); + if (startingLineNumber <= 0) + startingLineNumber = 1; + lexer.setCode(startingLineNumber, source); *sourceId = ++m_sourceId; diff --git a/JavaScriptCore/kjs/function.cpp b/JavaScriptCore/kjs/function.cpp index 68d1108a474..e28336dc99f 100644 --- a/JavaScriptCore/kjs/function.cpp +++ b/JavaScriptCore/kjs/function.cpp @@ -574,7 +574,7 @@ JSValue* globalFuncEval(ExecState* exec, PrototypeReflexiveFunction* function, J int errLine; UString errMsg; - RefPtr evalNode = parser().parse(exec, UString(), 0, UStringSourceProvider::create(s), &sourceId, &errLine, &errMsg); + RefPtr evalNode = parser().parse(exec, UString(), 1, UStringSourceProvider::create(s), &sourceId, &errLine, &errMsg); if (!evalNode) return throwError(exec, SyntaxError, errMsg, errLine, sourceId, NULL); diff --git a/JavaScriptCore/kjs/function_object.cpp b/JavaScriptCore/kjs/function_object.cpp index c02e0bf5132..0830d74993c 100644 --- a/JavaScriptCore/kjs/function_object.cpp +++ b/JavaScriptCore/kjs/function_object.cpp @@ -217,7 +217,7 @@ JSObject* FunctionObjectImp::construct(ExecState* exec, const List& args, const // ECMA 15.3.2 The Function Constructor JSObject* FunctionObjectImp::construct(ExecState* exec, const List& args) { - return construct(exec, args, "anonymous", UString(), 0); + return construct(exec, args, "anonymous", UString(), 1); } // ECMA 15.3.1 The Function Constructor Called as a Function diff --git a/JavaScriptCore/kjs/lexer.cpp b/JavaScriptCore/kjs/lexer.cpp index 05f25f21d98..e79d18e5893 100644 --- a/JavaScriptCore/kjs/lexer.cpp +++ b/JavaScriptCore/kjs/lexer.cpp @@ -103,7 +103,7 @@ Lexer::~Lexer() void Lexer::setCode(int startingLineNumber, PassRefPtr source) { - yylineno = 1 + startingLineNumber; + yylineno = startingLineNumber; restrKeyword = false; delimited = false; eatNextIdentifier = false; diff --git a/JavaScriptCore/kjs/testkjs.cpp b/JavaScriptCore/kjs/testkjs.cpp index cb05ff0afb5..f09c8579638 100644 --- a/JavaScriptCore/kjs/testkjs.cpp +++ b/JavaScriptCore/kjs/testkjs.cpp @@ -195,7 +195,7 @@ JSValue* functionRun(ExecState* exec, JSObject*, const List& args) JSGlobalObject* globalObject = exec->dynamicGlobalObject(); stopWatch.start(); - Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), fileName, 0, script.data()); + Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), fileName, 1, script.data()); stopWatch.stop(); return jsNumber(stopWatch.getElapsedMS()); @@ -209,7 +209,7 @@ JSValue* functionLoad(ExecState* exec, JSObject*, const List& args) return throwError(exec, GeneralError, "Could not open file."); JSGlobalObject* globalObject = exec->dynamicGlobalObject(); - Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), fileName, 0, script.data()); + Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), fileName, 1, script.data()); return jsUndefined(); } @@ -275,7 +275,7 @@ static bool prettyPrintScript(ExecState* exec, const UString& fileName, const Ve int errLine = 0; UString errMsg; UString scriptUString(script.data()); - RefPtr programNode = parser().parse(exec, fileName, 0, UStringSourceProvider::create(scriptUString), 0, &errLine, &errMsg); + RefPtr programNode = parser().parse(exec, fileName, 1, UStringSourceProvider::create(scriptUString), 0, &errLine, &errMsg); if (!programNode) { fprintf(stderr, "%s:%d: %s.\n", fileName.UTF8String().c_str(), errLine, errMsg.UTF8String().c_str()); return false; @@ -304,7 +304,7 @@ static bool runWithScripts(const Vector& fileNames, Vector& ar if (prettyPrint) prettyPrintScript(globalObject->globalExec(), fileName, script); else { - Completion completion = Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), fileName, 0, script.data()); + Completion completion = Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), fileName, 1, script.data()); success = success && completion.complType() != Throw; if (dump) { if (success) diff --git a/JavaScriptCore/profiler/Profiler.cpp b/JavaScriptCore/profiler/Profiler.cpp index c3b5e9eba39..5ae89727125 100644 --- a/JavaScriptCore/profiler/Profiler.cpp +++ b/JavaScriptCore/profiler/Profiler.cpp @@ -148,7 +148,7 @@ CallIdentifier createCallIdentifier(JSObject* calledFunction) CallIdentifier createCallIdentifier(const UString& sourceURL, int startingLineNumber) { - return CallIdentifier(GlobalCodeExecution, sourceURL, (startingLineNumber + 1)); + return CallIdentifier(GlobalCodeExecution, sourceURL, startingLineNumber); } CallIdentifier createCallIdentifierFromFunctionImp(FunctionImp* functionImp) diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog index ae62abe34b3..a3768898912 100644 --- a/WebCore/ChangeLog +++ b/WebCore/ChangeLog @@ -1,3 +1,50 @@ +2008-05-30 Timothy Hatcher + + Made the starting line number of scripts be 1-based throughout the engine. + This cleans up script line numbers so they are all consistent now and fixes + some cases where script execution was shown as off by one line in the debugger. + + Doing this also exposed a bug where JSLazyEventListener created in XHML or SVG + documents would always have a line number of 0. So this change fixed that bug + to pass all the SVG and XHTML tests. + + All layout tests pass. + + Reviewed by Oliver Hunt. + + * bindings/js/kjs_events.cpp: + (WebCore::JSLazyEventListener::JSLazyEventListener): Set the line number to 1 + if it was passed in as 0. This can happen when listeners are created with + a setAttribute call from JavaScript. + (WebCore::JSLazyEventListener::parseCode): Add a FIXME about the URL being + incorrect when listeners are created with a setAttribute call from JavaScript. + * bindings/js/kjs_events.h: Remove the default value for lineNumber, since no + callers need it. + * bindings/objc/WebScriptObject.mm: + (-[WebScriptObject evaluateWebScript:]): Pass a line number of 1 instead of 0 + to Interpreter::evaluate(). + * bridge/NP_jsobject.cpp: + (_NPN_Evaluate): Ditto. + * bridge/jni/jni_jsobject.mm: + (JavaJSObject::eval): Ditto. + * dom/XMLTokenizer.cpp: + (WebCore::XMLTokenizer::startElementNs): Call KJSProxy::setEventHandlerLineno() + around the call to handleElementAttributes, so any JSLazyEventListener created + from those attributes have line numbers. + (WebCore::XMLTokenizer::endElementNs): Remove a minus 1 of the line number. + (WebCore::XMLTokenizer::notifyFinished): Pass a line number of 1 instead of 0. + (WebCore::XMLTokenizer::parseEndElement): Remove a minus 1 of the line number. + * html/HTMLScriptElement.cpp: + (WebCore::HTMLScriptElement::evaluateScript): Add a FIXME about the starting + line number being incorrect in some cases when this function is called. + * html/HTMLTokenizer.cpp: + (WebCore::HTMLTokenizer::parseSpecial): Add a plus 1 to the line number when + setting scriptStartLineno so it is 1-based. Same for calling setEventHandlerLineno(). + (WebCore::HTMLTokenizer::processToken): Ditto. + * html/HTMLTokenizer.h: Change the default line number on scriptExecution() to 1 from 0. + * loader/FrameLoader.cpp: + (FrameLoader::executeIfJavaScriptURL): Pass a line number of 1 instead of 0 to executeScript(). + 2008-05-30 Maciej Stachowiak Reviewed by Oliver (earlier version reviewed by Alexey). diff --git a/WebCore/bindings/js/kjs_events.cpp b/WebCore/bindings/js/kjs_events.cpp index f79fcbc6ab6..eccb85cb771 100644 --- a/WebCore/bindings/js/kjs_events.cpp +++ b/WebCore/bindings/js/kjs_events.cpp @@ -251,6 +251,11 @@ JSLazyEventListener::JSLazyEventListener(const String& functionName, const Strin // and we need to avoid a reference cycle. If JS transfers // this handler to another node, parseCode will be called and // then originalNode is no longer needed. + + // A JSLazyEventListener can be created with a line number of zero when it is created with + // a setAttribute call from JavaScript, so make the line number 1 in that case. + if (m_lineNumber == 0) + m_lineNumber = 1; } JSObject* JSLazyEventListener::listenerObj() const @@ -282,6 +287,9 @@ void JSLazyEventListener::parseCode() const UString sourceURL(frame->loader()->url().string()); args.append(eventParameterName()); args.append(jsString(m_code)); + + // FIXME: Passing the document's URL to construct is not always correct, since this event listener might + // have been added with setAttribute from a script, and we should pass String() in that case. m_listener = constr->construct(exec, args, m_functionName, sourceURL, m_lineNumber); // FIXME: is globalExec ok ? FunctionImp* listenerAsFunction = static_cast(m_listener.get()); diff --git a/WebCore/bindings/js/kjs_events.h b/WebCore/bindings/js/kjs_events.h index 74e195eeddf..bb712254303 100644 --- a/WebCore/bindings/js/kjs_events.h +++ b/WebCore/bindings/js/kjs_events.h @@ -76,7 +76,7 @@ namespace WebCore { class JSLazyEventListener : public JSEventListener { public: - JSLazyEventListener(const String& functionName, const String& code, JSDOMWindow*, Node*, int lineNumber = 0); + JSLazyEventListener(const String& functionName, const String& code, JSDOMWindow*, Node*, int lineNumber); virtual KJS::JSObject* listenerObj() const; private: diff --git a/WebCore/bindings/objc/WebScriptObject.mm b/WebCore/bindings/objc/WebScriptObject.mm index f2a4b0d32ae..d7d77cd5f41 100644 --- a/WebCore/bindings/objc/WebScriptObject.mm +++ b/WebCore/bindings/objc/WebScriptObject.mm @@ -333,7 +333,7 @@ static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* root JSLock lock; [self _rootObject]->globalObject()->startTimeoutCheck(); - Completion completion = Interpreter::evaluate([self _rootObject]->globalObject()->globalExec(), [self _rootObject]->globalObject()->globalScopeChain(), UString(), 0, String(script)); + Completion completion = Interpreter::evaluate([self _rootObject]->globalObject()->globalExec(), [self _rootObject]->globalObject()->globalScopeChain(), UString(), 1, String(script)); [self _rootObject]->globalObject()->stopTimeoutCheck(); ComplType type = completion.complType(); diff --git a/WebCore/bridge/NP_jsobject.cpp b/WebCore/bridge/NP_jsobject.cpp index 5b1086a64e8..fc69f8349ee 100644 --- a/WebCore/bridge/NP_jsobject.cpp +++ b/WebCore/bridge/NP_jsobject.cpp @@ -196,7 +196,7 @@ bool _NPN_Evaluate(NPP, NPObject* o, NPString* s, NPVariant* variant) JSLock lock; String scriptString = convertNPStringToUTF16(s); rootObject->globalObject()->startTimeoutCheck(); - Completion completion = Interpreter::evaluate(rootObject->globalObject()->globalExec(), rootObject->globalObject()->globalScopeChain(), UString(), 0, scriptString); + Completion completion = Interpreter::evaluate(rootObject->globalObject()->globalExec(), rootObject->globalObject()->globalScopeChain(), UString(), 1, scriptString); rootObject->globalObject()->stopTimeoutCheck(); ComplType type = completion.complType(); diff --git a/WebCore/bridge/jni/jni_jsobject.mm b/WebCore/bridge/jni/jni_jsobject.mm index f4451cbe8e7..ed20aa688d6 100644 --- a/WebCore/bridge/jni/jni_jsobject.mm +++ b/WebCore/bridge/jni/jni_jsobject.mm @@ -319,7 +319,7 @@ jobject JavaJSObject::eval(jstring script) const return 0; rootObject->globalObject()->startTimeoutCheck(); - Completion completion = Interpreter::evaluate(rootObject->globalObject()->globalExec(), rootObject->globalObject()->globalScopeChain(), UString(), 0, JavaString(script).ustring()); + Completion completion = Interpreter::evaluate(rootObject->globalObject()->globalExec(), rootObject->globalObject()->globalScopeChain(), UString(), 1, JavaString(script).ustring()); rootObject->globalObject()->stopTimeoutCheck(); ComplType type = completion.complType(); diff --git a/WebCore/dom/XMLTokenizer.cpp b/WebCore/dom/XMLTokenizer.cpp index 0c27eaef6ca..4458168f1ca 100644 --- a/WebCore/dom/XMLTokenizer.cpp +++ b/WebCore/dom/XMLTokenizer.cpp @@ -41,6 +41,7 @@ #include "HTMLScriptElement.h" #include "HTMLStyleElement.h" #include "HTMLTokenizer.h" +#include "kjs_proxy.h" #include "ProcessingInstruction.h" #include "ResourceError.h" #include "ResourceHandle.h" @@ -819,13 +820,20 @@ void XMLTokenizer::startElementNs(const xmlChar* xmlLocalName, const xmlChar* xm stopParsing(); return; } - + + KJSProxy* jsProxy = m_doc->frame() ? m_doc->frame()->scriptProxy() : 0; + if (jsProxy && m_doc->frame()->scriptProxy()->isEnabled()) + jsProxy->setEventHandlerLineno(lineNumber()); + handleElementAttributes(newElement.get(), libxmlAttributes, nb_attributes, ec); if (ec) { stopParsing(); return; } + if (jsProxy) + jsProxy->setEventHandlerLineno(0); + newElement->beginParsingChildren(); if (newElement->hasTagName(scriptTag)) @@ -911,7 +919,7 @@ void XMLTokenizer::endElementNs() if (child->isTextNode() || child->nodeType() == Node::CDATA_SECTION_NODE) scriptCode += static_cast(child)->data(); } - m_view->frame()->loader()->executeScript(m_doc->url().string(), m_scriptStartLine - 1, scriptCode); + m_view->frame()->loader()->executeScript(m_doc->url().string(), m_scriptStartLine, scriptCode); } m_requestingScript = false; @@ -1478,7 +1486,7 @@ void XMLTokenizer::notifyFinished(CachedResource* finishedObj) if (errorOccurred) EventTargetNodeCast(e.get())->dispatchHTMLEvent(errorEvent, true, false); else { - m_view->frame()->loader()->executeScript(cachedScriptUrl, 0, scriptSource); + m_view->frame()->loader()->executeScript(cachedScriptUrl, 1, scriptSource); EventTargetNodeCast(e.get())->dispatchHTMLEvent(loadEvent, false, false); } @@ -1948,7 +1956,7 @@ void XMLTokenizer::parseEndElement() if (child->isTextNode() || child->nodeType() == Node::CDATA_SECTION_NODE) scriptCode += static_cast(child)->data(); } - m_view->frame()->loader()->executeScript(m_doc->url().string(), m_scriptStartLine - 1, scriptCode); + m_view->frame()->loader()->executeScript(m_doc->url().string(), m_scriptStartLine, scriptCode); } m_requestingScript = false; } diff --git a/WebCore/html/HTMLScriptElement.cpp b/WebCore/html/HTMLScriptElement.cpp index 5004b3a71b9..f36c72d1261 100644 --- a/WebCore/html/HTMLScriptElement.cpp +++ b/WebCore/html/HTMLScriptElement.cpp @@ -230,7 +230,9 @@ void HTMLScriptElement::evaluateScript(const String& url, const String& script) if (frame) { if (frame->scriptProxy()->isEnabled()) { m_evaluated = true; - frame->scriptProxy()->evaluate(url, 0, script); + // FIXME: This starting line number will be incorrect for evaluation triggered + // from insertedIntoDocument or childrenChanged. + frame->scriptProxy()->evaluate(url, 1, script); Document::updateDocumentsRendering(); } } diff --git a/WebCore/html/HTMLTokenizer.cpp b/WebCore/html/HTMLTokenizer.cpp index e61e0febee6..c798512f614 100644 --- a/WebCore/html/HTMLTokenizer.cpp +++ b/WebCore/html/HTMLTokenizer.cpp @@ -307,7 +307,7 @@ HTMLTokenizer::State HTMLTokenizer::parseSpecial(SegmentedString &src, State sta ASSERT(!state.hasTagState()); ASSERT(state.inXmp() + state.inTextArea() + state.inTitle() + state.inStyle() + state.inScript() + state.inIFrame() == 1 ); if (state.inScript()) - scriptStartLineno = m_lineNumber; + scriptStartLineno = m_lineNumber + 1; // Script line numbers are 1 based. if (state.inComment()) state = parseComment(src, state); @@ -1873,7 +1873,7 @@ PassRefPtr HTMLTokenizer::processToken() { KJSProxy* jsProxy = (!m_fragment && m_doc->frame()) ? m_doc->frame()->scriptProxy() : 0; if (jsProxy && m_doc->frame()->scriptProxy()->isEnabled()) - jsProxy->setEventHandlerLineno(tagStartLineno); + jsProxy->setEventHandlerLineno(tagStartLineno + 1); // Script line numbers are 1 based. if (dest > buffer) { currToken.text = StringImpl::createStrippingNullCharacters(buffer, dest - buffer); if (currToken.tagName != commentAtom) @@ -1881,7 +1881,7 @@ PassRefPtr HTMLTokenizer::processToken() } else if (currToken.tagName == nullAtom) { currToken.reset(); if (jsProxy) - jsProxy->setEventHandlerLineno(m_lineNumber); + jsProxy->setEventHandlerLineno(m_lineNumber + 1); // Script line numbers are 1 based. return 0; } diff --git a/WebCore/html/HTMLTokenizer.h b/WebCore/html/HTMLTokenizer.h index e32ac044aaf..a9dc5fe8df9 100644 --- a/WebCore/html/HTMLTokenizer.h +++ b/WebCore/html/HTMLTokenizer.h @@ -171,7 +171,7 @@ private: State parseEntity(SegmentedString&, UChar*& dest, State, unsigned& _cBufferPos, bool start, bool parsingTag); State parseProcessingInstruction(SegmentedString&, State); State scriptHandler(State); - State scriptExecution(const String& script, State, const String& scriptURL, int baseLine = 0); + State scriptExecution(const String& script, State, const String& scriptURL, int baseLine = 1); void setSrc(const SegmentedString&); // check if we have enough space in the buffer. diff --git a/WebCore/loader/FrameLoader.cpp b/WebCore/loader/FrameLoader.cpp index b6dd6d1c325..68f17755bd5 100644 --- a/WebCore/loader/FrameLoader.cpp +++ b/WebCore/loader/FrameLoader.cpp @@ -769,7 +769,7 @@ bool FrameLoader::executeIfJavaScriptURL(const KURL& url, bool userGesture, bool JSValue* FrameLoader::executeScript(const String& script, bool forceUserGesture) { - return executeScript(forceUserGesture ? String() : m_URL.string(), 0, script); + return executeScript(forceUserGesture ? String() : m_URL.string(), 1, script); } JSValue* FrameLoader::executeScript(const String& url, int baseLine, const String& script) diff --git a/WebKitTools/ChangeLog b/WebKitTools/ChangeLog index 9e525491293..eaa8d179b32 100644 --- a/WebKitTools/ChangeLog +++ b/WebKitTools/ChangeLog @@ -1,3 +1,17 @@ +2008-05-30 Timothy Hatcher + + Made the starting line number of scripts be 1-based throughout the engine. + This cleans up script line numbers so they are all consistent now. + + Reviewed by Oliver Hunt. + + * DumpRenderTree/mac/ObjCController.m: + (runJavaScriptThread): Pass a line number of 1 instead of 0 to JSEvaluateScript. + * DumpRenderTree/pthreads/JavaScriptThreadingPthreads.cpp: + (runJavaScriptThread): Ditto. + * DumpRenderTree/win/DumpRenderTree.cpp: + (runJavaScriptThread): Ditto. + 2008-05-29 Geoffrey Garen Reviewed by Adam Roben. diff --git a/WebKitTools/DumpRenderTree/mac/ObjCController.m b/WebKitTools/DumpRenderTree/mac/ObjCController.m index 9ca9299de2a..70241b1a7d6 100644 --- a/WebKitTools/DumpRenderTree/mac/ObjCController.m +++ b/WebKitTools/DumpRenderTree/mac/ObjCController.m @@ -41,7 +41,7 @@ JSStringRef scriptRef = JSStringCreateWithUTF8CString("'Hello World!'"); JSValueRef exception = 0; - JSEvaluateScript(ctx, scriptRef, 0, 0, 0, &exception); + JSEvaluateScript(ctx, scriptRef, 0, 0, 1, &exception); ASSERT(!exception); JSGlobalContextRelease(ctx); diff --git a/WebKitTools/DumpRenderTree/pthreads/JavaScriptThreadingPthreads.cpp b/WebKitTools/DumpRenderTree/pthreads/JavaScriptThreadingPthreads.cpp index 11be1b989f0..5b5709e3628 100644 --- a/WebKitTools/DumpRenderTree/pthreads/JavaScriptThreadingPthreads.cpp +++ b/WebKitTools/DumpRenderTree/pthreads/JavaScriptThreadingPthreads.cpp @@ -65,7 +65,7 @@ void* runJavaScriptThread(void* arg) JSStringRef scriptRef = JSStringCreateWithUTF8CString(script); JSValueRef exception = 0; - JSEvaluateScript(ctx, scriptRef, 0, 0, 0, &exception); + JSEvaluateScript(ctx, scriptRef, 0, 0, 1, &exception); ASSERT(!exception); JSGlobalContextRelease(ctx); diff --git a/WebKitTools/DumpRenderTree/win/DumpRenderTree.cpp b/WebKitTools/DumpRenderTree/win/DumpRenderTree.cpp index 4b19ce6755a..50eb6829aa2 100644 --- a/WebKitTools/DumpRenderTree/win/DumpRenderTree.cpp +++ b/WebKitTools/DumpRenderTree/win/DumpRenderTree.cpp @@ -832,7 +832,7 @@ void* runJavaScriptThread(void* arg) JSStringRef scriptRef = JSStringCreateWithUTF8CString(script); JSValueRef exception = 0; - JSEvaluateScript(ctx, scriptRef, 0, 0, 0, &exception); + JSEvaluateScript(ctx, scriptRef, 0, 0, 1, &exception); assert(!exception); JSGlobalContextRelease(ctx); -- GitLab