Add 'colno' attribute to ErrorEvent interface
authorch.dumez@sisa.samsung.com <ch.dumez@sisa.samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 30 Jul 2013 21:44:51 +0000 (21:44 +0000)
committerch.dumez@sisa.samsung.com <ch.dumez@sisa.samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 30 Jul 2013 21:44:51 +0000 (21:44 +0000)
https://bugs.webkit.org/show_bug.cgi?id=119257

Reviewed by Darin Adler.

Source/WebCore:

Add 'colno' attribute to ErrorEvent interface to match the latest specification:
http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#errorevent

The 'colno' attribute is already supported by IE10 and Blink.

No new tests, covered by existing tests.

* dom/ErrorEvent.cpp:
(WebCore::ErrorEventInit::ErrorEventInit):
(WebCore::ErrorEvent::ErrorEvent):
* dom/ErrorEvent.h:
* dom/ErrorEvent.idl:

LayoutTests:

Update several test cases to check the new ErrorEvent.colno
attribute.

* fast/events/constructors/error-event-constructor-expected.txt:
* fast/events/constructors/error-event-constructor.html:
* fast/events/window-onerror9-expected.txt:
* fast/events/window-onerror9.html:
* fast/workers/worker-script-error-expected.txt:
* fast/workers/worker-script-error.html:
* http/tests/workers/worker-importScriptsOnError-expected.txt:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@153495 268f45cc-cd09-0410-ab3c-d52691b4dbfc

12 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/events/constructors/error-event-constructor-expected.txt
LayoutTests/fast/events/constructors/error-event-constructor.html
LayoutTests/fast/events/window-onerror9-expected.txt
LayoutTests/fast/events/window-onerror9.html
LayoutTests/fast/workers/worker-script-error-expected.txt
LayoutTests/fast/workers/worker-script-error.html
LayoutTests/http/tests/workers/worker-importScriptsOnError-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/dom/ErrorEvent.cpp
Source/WebCore/dom/ErrorEvent.h
Source/WebCore/dom/ErrorEvent.idl

index 6aa5a8a..d25c89d 100644 (file)
@@ -1,5 +1,23 @@
 2013-07-30  Christophe Dumez  <ch.dumez@sisa.samsung.com>
 
+        Add 'colno' attribute to ErrorEvent interface
+        https://bugs.webkit.org/show_bug.cgi?id=119257
+
+        Reviewed by Darin Adler.
+
+        Update several test cases to check the new ErrorEvent.colno
+        attribute.
+
+        * fast/events/constructors/error-event-constructor-expected.txt:
+        * fast/events/constructors/error-event-constructor.html:
+        * fast/events/window-onerror9-expected.txt:
+        * fast/events/window-onerror9.html:
+        * fast/workers/worker-script-error-expected.txt:
+        * fast/workers/worker-script-error.html:
+        * http/tests/workers/worker-importScriptsOnError-expected.txt:
+
+2013-07-30  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
         Pass column as 4th argument to WorkerGlobalScope.onerror and Window.onerror handlers
         https://bugs.webkit.org/show_bug.cgi?id=119251
 
index b14500c..3b73f95 100644 (file)
@@ -60,11 +60,34 @@ PASS new ErrorEvent('eventType', { lineno: [12345, 67890] }).lineno is 0
 PASS new ErrorEvent('eventType', { lineno: {} }).lineno is 0
 PASS new ErrorEvent('eventType', { lineno: {moemoe: 12345} }).lineno is 0
 PASS new ErrorEvent('eventType', { lineno: {valueOf: function () { return 12345; }} }).lineno is 12345
-PASS new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345 }).bubbles is true
-PASS new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345 }).cancelable is true
-PASS new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345 }).message is "sakuranbo"
-PASS new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345 }).filename is "amaenbo"
-PASS new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345 }).lineno is 12345
+PASS new ErrorEvent('eventType', { colno: 0 }).colno is 0
+PASS new ErrorEvent('eventType', { colno: 1 }).colno is 1
+PASS new ErrorEvent('eventType', { colno: 4294967294 }).colno is 4294967294
+PASS new ErrorEvent('eventType', { colno: 4294967295 }).colno is 4294967295
+PASS new ErrorEvent('eventType', { colno: 9007199254740991 }).colno is 4294967295
+PASS new ErrorEvent('eventType', { colno: 18446744073709551615 }).colno is 0
+PASS new ErrorEvent('eventType', { colno: 12345678901234567890 }).colno is 3944679424
+PASS new ErrorEvent('eventType', { colno: -1 }).colno is 4294967295
+PASS new ErrorEvent('eventType', { colno: 123.45 }).colno is 123
+PASS new ErrorEvent('eventType', { colno: NaN }).colno is 0
+PASS new ErrorEvent('eventType', { colno: undefined }).colno is 0
+PASS new ErrorEvent('eventType', { colno: null }).colno is 0
+PASS new ErrorEvent('eventType', { colno: '' }).colno is 0
+PASS new ErrorEvent('eventType', { colno: '12345' }).colno is 12345
+PASS new ErrorEvent('eventType', { colno: '12345a' }).colno is 0
+PASS new ErrorEvent('eventType', { colno: 'abc' }).colno is 0
+PASS new ErrorEvent('eventType', { colno: [] }).colno is 0
+PASS new ErrorEvent('eventType', { colno: [12345] }).colno is 12345
+PASS new ErrorEvent('eventType', { colno: [12345, 67890] }).colno is 0
+PASS new ErrorEvent('eventType', { colno: {} }).colno is 0
+PASS new ErrorEvent('eventType', { colno: {moemoe: 12345} }).colno is 0
+PASS new ErrorEvent('eventType', { colno: {valueOf: function () { return 12345; }} }).colno is 12345
+PASS new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345, colno: 23456 }).bubbles is true
+PASS new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345, colno: 23456 }).cancelable is true
+PASS new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345, colno: 23456 }).message is "sakuranbo"
+PASS new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345, colno: 23456 }).filename is "amaenbo"
+PASS new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345, colno: 23456 }).lineno is 12345
+PASS new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345, colno: 23456 }).colno is 23456
 PASS successfullyParsed is true
 
 TEST COMPLETE
index ba85f78..a5313b2 100644 (file)
@@ -74,12 +74,44 @@ shouldBe("new ErrorEvent('eventType', { lineno: {} }).lineno", "0");
 shouldBe("new ErrorEvent('eventType', { lineno: {moemoe: 12345} }).lineno", "0");
 shouldBe("new ErrorEvent('eventType', { lineno: {valueOf: function () { return 12345; }} }).lineno", "12345");
 
+// colno is passed.
+// numbers within the unsigned long range.
+shouldBe("new ErrorEvent('eventType', { colno: 0 }).colno", "0");
+shouldBe("new ErrorEvent('eventType', { colno: 1 }).colno", "1");
+shouldBe("new ErrorEvent('eventType', { colno: 4294967294 }).colno", "4294967294");
+shouldBe("new ErrorEvent('eventType', { colno: 4294967295 }).colno", "4294967295");
+
+// numbers out of the unsigned long range.
+// 2^{53}-1, the largest number that can be exactly represented by double.
+shouldBe("new ErrorEvent('eventType', { colno: 9007199254740991 }).colno", "4294967295");
+// 2^{64}-1
+shouldBe("new ErrorEvent('eventType', { colno: 18446744073709551615 }).colno", "0");
+shouldBe("new ErrorEvent('eventType', { colno: 12345678901234567890 }).colno", "3944679424");
+shouldBe("new ErrorEvent('eventType', { colno: -1 }).colno", "4294967295");
+shouldBe("new ErrorEvent('eventType', { colno: 123.45 }).colno", "123");
+shouldBe("new ErrorEvent('eventType', { colno: NaN }).colno", "0");
+
+// Non-numeric values.
+shouldBe("new ErrorEvent('eventType', { colno: undefined }).colno", "0");
+shouldBe("new ErrorEvent('eventType', { colno: null }).colno", "0");
+shouldBe("new ErrorEvent('eventType', { colno: '' }).colno", "0");
+shouldBe("new ErrorEvent('eventType', { colno: '12345' }).colno", "12345");
+shouldBe("new ErrorEvent('eventType', { colno: '12345a' }).colno", "0");
+shouldBe("new ErrorEvent('eventType', { colno: 'abc' }).colno", "0");
+shouldBe("new ErrorEvent('eventType', { colno: [] }).colno", "0");
+shouldBe("new ErrorEvent('eventType', { colno: [12345] }).colno", "12345");
+shouldBe("new ErrorEvent('eventType', { colno: [12345, 67890] }).colno", "0");
+shouldBe("new ErrorEvent('eventType', { colno: {} }).colno", "0");
+shouldBe("new ErrorEvent('eventType', { colno: {moemoe: 12345} }).colno", "0");
+shouldBe("new ErrorEvent('eventType', { colno: {valueOf: function () { return 12345; }} }).colno", "12345");
+
 // All initializers are passed.
-shouldBe("new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345 }).bubbles", "true");
-shouldBe("new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345 }).cancelable", "true");
-shouldBeEqualToString("new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345 }).message", "sakuranbo");
-shouldBeEqualToString("new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345 }).filename", "amaenbo");
-shouldBe("new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345 }).lineno", "12345");
+shouldBe("new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345, colno: 23456 }).bubbles", "true");
+shouldBe("new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345, colno: 23456 }).cancelable", "true");
+shouldBeEqualToString("new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345, colno: 23456 }).message", "sakuranbo");
+shouldBeEqualToString("new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345, colno: 23456 }).filename", "amaenbo");
+shouldBe("new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345, colno: 23456 }).lineno", "12345");
+shouldBe("new ErrorEvent('eventType', { bubbles: true, cancelable: true, message: 'sakuranbo', filename: 'amaenbo', lineno: 12345, colno: 23456 }).colno", "23456");
 </script>
 <script src="../../js/resources/js-test-post.js"></script>
 </body>
index dfcea84..06887a3 100644 (file)
@@ -1,8 +1,9 @@
 Test that when window.onerror handler is called, window.event is the corresponding ErrorEvent object. Bug 8519.
 
-Main frame window.onerror: Error: 2010 at window-onerror9.html, line: 31, column: 22
+Main frame window.onerror: Error: 2010 at window-onerror9.html, line: 32, column: 22
 window.event.type = error
 window.event.message = Error: 2010
 window.event.filename = window-onerror9.html
-window.event.lineno = 31
+window.event.lineno = 32
+window.event.colno = 22
 
index 0c81981..5d5b6e4 100644 (file)
@@ -23,6 +23,7 @@ window.onerror = function(msg, url, line, column)
     log("window.event.message = " + window.event.message);
     log("window.event.filename = " + lastPathComponent(window.event.filename));
     log("window.event.lineno = " + window.event.lineno);
+    log("window.event.colno = " + window.event.colno);
     if (window.testRunner)
         testRunner.notifyDone();
     return true;
index 5b788d5..ad8b0eb 100644 (file)
@@ -2,13 +2,13 @@ CONSOLE MESSAGE: line 10: ReferenceError: Can't find variable: foo
 Test Worker script error handling functionality. Should print a series of PASS messages, followed with DONE.
 
 PASS: onerror invoked for a script that has invalid syntax.
-PASS: onerror invoked for a script that has script error 'ReferenceError: Can't find variable: foo' at line 1.
-PASS: event listener invoked for a script that has script error 'ReferenceError: Can't find variable: foo' at line 1.
-PASS: onerror invoked for a script that has script error 'ReferenceError: Can't find variable: foo' at line 7.
-PASS: onerror invoked for a script that has script error 'ReferenceError: Can't find variable: bar' at line 3.
+PASS: onerror invoked for a script that has script error 'ReferenceError: Can't find variable: foo' at line 1 and column 4.
+PASS: event listener invoked for a script that has script error 'ReferenceError: Can't find variable: foo' at line 1 and column 4.
+PASS: onerror invoked for a script that has script error 'ReferenceError: Can't find variable: foo' at line 7 and column 4.
+PASS: onerror invoked for a script that has script error 'ReferenceError: Can't find variable: bar' at line 3 and column 8.
 message from worker: "PASS: onerror in worker context invoked for a script that has script error 'ReferenceError: Can't find variable: foo' at line 10 in worker-script-error-bubbled.js".
-PASS: onerror invoked for a script that has script error 'ReferenceError: Can't find variable: foo' at line 10.
-PASS: onerror invoked for a script that has script error 'ReferenceError: Can't find variable: foo' at line 10.
+PASS: onerror invoked for a script that has script error 'ReferenceError: Can't find variable: foo' at line 10 and column 4.
+PASS: onerror invoked for a script that has script error 'ReferenceError: Can't find variable: foo' at line 10 and column 4.
 PASS: message received from WorkerGlobalScope.onerror: onerror invoked for a script that has script error 'ReferenceError: Can't find variable: foo' at line 7 and column 14.
 PASS: onerror invoked for an exception in setTimeout callback.
 DONE
index 64813c7..6d777a9 100644 (file)
@@ -51,7 +51,7 @@ function testScriptErrorUnhandled()
     try {
         var worker = new Worker("resources/worker-script-error-unhandled.js");
         worker.onerror = function(evt) {
-            log("PASS: onerror invoked for a script that has script error '" + evt.message + "' at line " + evt.lineno + ".");
+            log("PASS: onerror invoked for a script that has script error '" + evt.message + "' at line " + evt.lineno + " and column " + evt.colno + ".");
             runNextTest();
             return false;
         }
@@ -67,7 +67,7 @@ function testScriptErrorAddEventListener()
         var worker = new Worker("resources/worker-script-error-unhandled.js");
         worker.addEventListener("error",
             function(evt) {
-                log("PASS: event listener invoked for a script that has script error '" + evt.message + "' at line " + evt.lineno + ".");
+                log("PASS: event listener invoked for a script that has script error '" + evt.message + "' at line " + evt.lineno + " and column " + evt.colno + ".");
                 runNextTest();
                 evt.preventDefault();
             }, false);
@@ -83,7 +83,7 @@ function testErrorInHandlingScriptError()
         var worker = new Worker("resources/worker-error-in-handling-script-error.js");
         var errorCount = 0;
         worker.onerror = function(evt) {
-            log("PASS: onerror invoked for a script that has script error '" + evt.message + "' at line " + evt.lineno + ".");
+            log("PASS: onerror invoked for a script that has script error '" + evt.message + "' at line " + evt.lineno + " and column " + evt.colno + ".");
             ++errorCount;
             // Second error happens in the onerror handler. Run next test only when it's reported.
             if (errorCount == 2)
@@ -104,7 +104,7 @@ function testScriptErrorBubbledAndHandledInWorker()
             log("message from worker: \"" + evt.data + "\".");
         }
         worker.onerror = function(evt) {
-            log("PASS: onerror invoked for a script that has script error '" + evt.message + "' at line " + evt.lineno + ".");
+            log("PASS: onerror invoked for a script that has script error '" + evt.message + "' at line " + evt.lineno + " and column " + evt.colno + ".");
             runNextTest();
             return false;
         }
@@ -119,7 +119,7 @@ function testScriptErrorBubbledAndReportedToUser()
     try {
         var worker = new Worker("resources/worker-script-error-bubbled.js");
         worker.onerror = function(evt) {
-            log("PASS: onerror invoked for a script that has script error '" + evt.message + "' at line " + evt.lineno + ".");
+            log("PASS: onerror invoked for a script that has script error '" + evt.message + "' at line " + evt.lineno + " and column " + evt.colno + ".");
             runNextTest();
             return true;
         }
@@ -134,7 +134,7 @@ function testScriptErrorHandled()
     try {
         var worker = new Worker("resources/worker-script-error-handled.js");
         worker.onerror = function(evt) {
-            log("FAIL: onerror invoked for a script that has script error '" + evt.message + "' at line " + evt.lineno + ".");
+            log("FAIL: onerror invoked for a script that has script error '" + evt.message + "' at line " + evt.lineno + " and column " + evt.colno + ".");
             runNextTest();
             return false;
         }
index 72c5aee..e0c969c 100644 (file)
@@ -26,6 +26,7 @@ bubbles: false,
 cancelBubble: false,
 cancelable: true,
 clipboardData: undefined,
+colno: 0,
 currentTarget: [object Worker],
 defaultPrevented: false,
 eventPhase: 2,
index ffde962..157b081 100644 (file)
@@ -1,3 +1,23 @@
+2013-07-30  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
+        Add 'colno' attribute to ErrorEvent interface
+        https://bugs.webkit.org/show_bug.cgi?id=119257
+
+        Reviewed by Darin Adler.
+
+        Add 'colno' attribute to ErrorEvent interface to match the latest specification:
+        http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#errorevent
+
+        The 'colno' attribute is already supported by IE10 and Blink.
+
+        No new tests, covered by existing tests.
+
+        * dom/ErrorEvent.cpp:
+        (WebCore::ErrorEventInit::ErrorEventInit):
+        (WebCore::ErrorEvent::ErrorEvent):
+        * dom/ErrorEvent.h:
+        * dom/ErrorEvent.idl:
+
 2013-07-30  Andreas Kling  <akling@apple.com>
 
         Inactive style sheets should not trigger style recalc when loaded.
index ed401e8..c459242 100644 (file)
@@ -39,6 +39,7 @@ ErrorEventInit::ErrorEventInit()
     : message()
     , filename()
     , lineno(0)
+    , colno(0)
 {
 }
 
@@ -51,7 +52,7 @@ ErrorEvent::ErrorEvent(const AtomicString& type, const ErrorEventInit& initializ
     , m_message(initializer.message)
     , m_fileName(initializer.filename)
     , m_lineNumber(initializer.lineno)
-    , m_columnNumber(0)
+    , m_columnNumber(initializer.colno)
 {
 }
 
index b31efad..8c76dd3 100644 (file)
@@ -42,6 +42,7 @@ struct ErrorEventInit : public EventInit {
     String message;
     String filename;
     unsigned lineno;
+    unsigned colno;
 };
 
 class ErrorEvent : public Event {
index 433e8d9..1c7bb79 100644 (file)
@@ -35,5 +35,6 @@
     [InitializedByEventConstructor] readonly attribute DOMString message;
     [InitializedByEventConstructor] readonly attribute DOMString filename;
     [InitializedByEventConstructor] readonly attribute unsigned long lineno;
+    [InitializedByEventConstructor] readonly attribute unsigned long colno;
 };