Location.toString() should be enumerable
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 25 Aug 2016 03:06:50 +0000 (03:06 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 25 Aug 2016 03:06:50 +0000 (03:06 +0000)
https://bugs.webkit.org/show_bug.cgi?id=161179

Reviewed by Geoffrey Garen.

Source/WebCore:

Location.toString() should be enumerable as per:
- https://html.spec.whatwg.org/#location
- http://heycam.github.io/webidl/#es-stringifier

This patch stops hard-coding the toString() operation on the Location
interface and makes the 'href' attribute a stringifier attribute instead,
as per the specification. The generated toString() has the same behavior
as it used to but it is now enumerable, as it should.

No new tests, updated existing test.

* bindings/js/JSLocationCustom.cpp:
(WebCore::JSLocation::toStringFunction): Deleted.
* page/Location.idl:

LayoutTests:

Update existing tests and add layout test coverage.

* fast/dom/Window/window-appendages-cleared-expected.txt:
* fast/dom/toString_attributes-expected.txt:
* fast/dom/toString_attributes.html:
* js/dom/toString-dontEnum-expected.txt:
* js/dom/toString-dontEnum.html:

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

LayoutTests/ChangeLog
LayoutTests/fast/dom/Window/window-appendages-cleared-expected.txt
LayoutTests/fast/dom/toString_attributes-expected.txt
LayoutTests/fast/dom/toString_attributes.html
LayoutTests/js/dom/toString-dontEnum-expected.txt
LayoutTests/js/dom/toString-dontEnum.html
Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSLocationCustom.cpp
Source/WebCore/page/Location.idl

index d0ef49a..b34904d 100644 (file)
@@ -1,3 +1,18 @@
+2016-08-24  Chris Dumez  <cdumez@apple.com>
+
+        Location.toString() should be enumerable
+        https://bugs.webkit.org/show_bug.cgi?id=161179
+
+        Reviewed by Geoffrey Garen.
+
+        Update existing tests and add layout test coverage.
+
+        * fast/dom/Window/window-appendages-cleared-expected.txt:
+        * fast/dom/toString_attributes-expected.txt:
+        * fast/dom/toString_attributes.html:
+        * js/dom/toString-dontEnum-expected.txt:
+        * js/dom/toString-dontEnum.html:
+
 2016-08-24  Joseph Pecoraro  <pecoraro@apple.com>
 
         Implement `CSS.escape` as per CSSOM
index 09ba9d7..58dbf63 100644 (file)
@@ -18,6 +18,7 @@ PASS location.protocol == "LEFTOVER" is false
 PASS location.reload == "LEFTOVER" is false
 PASS location.replace == "LEFTOVER" is false
 PASS location.search == "LEFTOVER" is false
+PASS location.toString == "LEFTOVER" is false
 PASS locationbar.visible == "LEFTOVER" is false
 PASS menubar.visible == "LEFTOVER" is false
 PASS personalbar.visible == "LEFTOVER" is false
index a98868b..ff38e16 100644 (file)
@@ -5,15 +5,21 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 * HTMLAnchorElement
 PASS descriptor.value is an instance of Function
-PASS descriptor.writable is true
+PASS descriptor.writable is !unforgeable
 PASS descriptor.enumerable is true
-PASS descriptor.configurable is true
+PASS descriptor.configurable is !unforgeable
 
 * HTMLAreaElement
 PASS descriptor.value is an instance of Function
-PASS descriptor.writable is true
+PASS descriptor.writable is !unforgeable
 PASS descriptor.enumerable is true
-PASS descriptor.configurable is true
+PASS descriptor.configurable is !unforgeable
+
+* Location
+PASS descriptor.value is an instance of Function
+PASS descriptor.writable is !unforgeable
+PASS descriptor.enumerable is true
+PASS descriptor.configurable is !unforgeable
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 5dfe91b..f89fdc5 100644 (file)
@@ -5,23 +5,28 @@
 <script>
 description("Test that the toString() stringifier has the right attributes");
 
-function testStringifier(object)
+function testStringifier(object, isUnforgeable)
 {
-    descriptor = Object.getOwnPropertyDescriptor(object.__proto__, "toString");
+    unforgeable = isUnforgeable;
+    descriptor = Object.getOwnPropertyDescriptor(unforgeable ? object : object.__proto__, "toString");
     shouldBeType("descriptor.value", "Function");
-    shouldBeTrue("descriptor.writable");
+    shouldBe("descriptor.writable", "!unforgeable");
     shouldBeTrue("descriptor.enumerable");
-    shouldBeTrue("descriptor.configurable");
+    shouldBe("descriptor.configurable", "!unforgeable");
 }
 
 debug("* HTMLAnchorElement");
 var anchor = document.createElement("a");
-testStringifier(anchor);
+testStringifier(anchor, false);
 
 debug("");
 debug("* HTMLAreaElement");
 var area = document.createElement("area");
-testStringifier(area);
+testStringifier(area, false);
+
+debug("");
+debug("* Location");
+testStringifier(window.location, true);
 </script>
 <script src="../../resources/js-test-post.js"></script>
 </body>
index 1c52f9c..440889a 100644 (file)
@@ -1,6 +1,5 @@
 This tests that the toString() function does not enumerate.
 
-PASS: the toString function is not enumerable for Location.
 PASS: the toString function is not enumerable for Selection.
 PASS: the toString function is not enumerable for HTMLDivElement.
 PASS: the toString function is not enumerable for HTMLDocument.
index 05493ca..4a5c3d0 100644 (file)
@@ -25,7 +25,6 @@
                 testRunner.dumpAsText();
 
             // DOM objects with custom toString() functions
-            test(window.location, "Location");
             test(window.getSelection(), "Selection");
 
             // Other DOM objects
index 62baffc..07c6cc9 100644 (file)
@@ -1,3 +1,25 @@
+2016-08-24  Chris Dumez  <cdumez@apple.com>
+
+        Location.toString() should be enumerable
+        https://bugs.webkit.org/show_bug.cgi?id=161179
+
+        Reviewed by Geoffrey Garen.
+
+        Location.toString() should be enumerable as per:
+        - https://html.spec.whatwg.org/#location
+        - http://heycam.github.io/webidl/#es-stringifier
+
+        This patch stops hard-coding the toString() operation on the Location
+        interface and makes the 'href' attribute a stringifier attribute instead,
+        as per the specification. The generated toString() has the same behavior
+        as it used to but it is now enumerable, as it should.
+
+        No new tests, updated existing test.
+
+        * bindings/js/JSLocationCustom.cpp:
+        (WebCore::JSLocation::toStringFunction): Deleted.
+        * page/Location.idl:
+
 2016-08-24  Joseph Pecoraro  <pecoraro@apple.com>
 
         Implement `CSS.escape` as per CSSOM
index ee7076a..ae4ac88 100644 (file)
@@ -113,15 +113,6 @@ bool JSLocation::defineOwnProperty(JSObject* object, ExecState* exec, PropertyNa
     return Base::defineOwnProperty(object, exec, propertyName, descriptor, throwException);
 }
 
-JSValue JSLocation::toStringFunction(ExecState& state)
-{
-    Frame* frame = wrapped().frame();
-    if (!frame || !shouldAllowAccessToFrame(&state, frame))
-        return jsUndefined();
-
-    return jsStringWithCache(&state, wrapped().toString());
-}
-
 bool JSLocationPrototype::putDelegate(ExecState* exec, PropertyName propertyName, JSValue, PutPropertySlot&, bool& putResult)
 {
     putResult = false;
index 978869d..da55fa9 100644 (file)
@@ -38,7 +38,7 @@
     JSCustomNamedGetterOnPrototype,
     Unforgeable,
 ] interface Location {
-    [SetterCallWith=ActiveWindow&FirstWindow] attribute USVString href;
+    [SetterCallWith=ActiveWindow&FirstWindow] stringifier attribute USVString href;
 
     [CallWith=ActiveWindow&FirstWindow, ForwardDeclareInHeader] void assign(USVString url);
     [DoNotCheckSecurity, CallWith=ActiveWindow&FirstWindow, ForwardDeclareInHeader] void replace(USVString url);
@@ -57,8 +57,4 @@
 
     // FIXME: Add support for SameObject
     [Unforgeable, CachedAttribute] readonly attribute FrozenArray<USVString> ancestorOrigins;
-
-#if !(defined(LANGUAGE_GOBJECT) && LANGUAGE_GOBJECT)
-    [NotEnumerable, Custom, ImplementedAs=toStringFunction] DOMString toString();
-#endif
 };