[Web IDL] Operations should be on the instance for global objects or if [Unforgeable]
https://bugs.webkit.org/show_bug.cgi?id=154120
<rdar://problem/
24613231>
Reviewed by Gavin Barraclough.
LayoutTests/imported/w3c:
Rebaseline now that more checks are passing.
* web-platform-tests/html/dom/interfaces-expected.txt:
Source/JavaScriptCore:
Have putEntry() take a thisValue parameter in addition to the base,
instead of relying on PropertySlot::thisValue() because this did not
always do the right thing. In particular, when JSDOMWindow::put() was
called to set a function, it would end up setting the new value on the
JSDOMWindowShell instead of the actual JSDOMWindow.
JSDOMWindow::getOwnPropertySlot() would then not be able to find it.
Therefore the following would fail:
$ window.open = "test"
$ console.log(window.open) // prints the native function instead of "test"
* runtime/JSObject.cpp:
(JSC::JSObject::putInlineSlow):
* runtime/Lookup.h:
(JSC::putEntry):
(JSC::lookupPut):
Source/WebCore:
Operations should be on the instance for global objects or if
[Unforgeable] as per the Web IDL specification:
- http://heycam.github.io/webidl/#es-operations
- http://heycam.github.io/webidl/#dfn-unforgeable-on-an-interface
This patch implements this behavior in order to align
with the specification and other browsers.
No new tests, already covered by existing tests.
* bindings/js/JSDOMWindowCustom.cpp:
(WebCore::jsDOMWindowGetOwnPropertySlotRestrictedAccess):
Update function names now that they have "Instance" in their
name instead of "Prototype".
(WebCore::JSDOMWindow::getOwnPropertySlot):
- Update function names now that they have "Instance" in their
name instead of "Prototype".
- Move the functions hard-coding *before* the static table check
now that these functions are in the static table to maintain
the previous behavior.
* bindings/js/JSLocationCustom.cpp:
(WebCore::JSLocation::getOwnPropertySlotDelegate):
Update function names now that they have "Instance" in their
name instead of "Prototype".
* bindings/scripts/CodeGeneratorJS.pm:
- Move functions to the instance if their interface is a global
object or if they are marked as [Unforgeable]. Operations are
now treated more like attributes, as they can now be either on
the instance or the prototype. In a lot of places, I now use
the naming "properties" instead of "attributes" as "properties"
refer both "attributes" and "operations" / "functions".
* bindings/scripts/test/JS/JSTestInterface.cpp:
* bindings/scripts/test/JS/JSTestObj.cpp:
Rebaseline bindings tests.
LayoutTests:
* inspector/model/remote-object-get-properties-expected.txt:
Rebaseline test because the order of static properties has changed:
functions are now before constants instead of after.
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@196648
268f45cc-cd09-0410-ab3c-
d52691b4dbfc