| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>getOwnPropertyDescriptor() is correct for Proxy with host object target</title> |
| <script src="../resources/testharness.js"></script> |
| <script src="../resources/testharnessreport.js"></script> |
| </head> |
| <body> |
| <script> |
| 'use strict'; |
| |
| test(() => { |
| let windowProxy = new Proxy(window, {}); |
| name = 'old_name'; |
| let descriptor = Object.getOwnPropertyDescriptor(windowProxy, 'name'); |
| |
| assert_equals(descriptor.get.call(window), 'old_name'); |
| descriptor.set.call(window, 'new_name'); |
| assert_equals(name, 'new_name'); |
| assert_true(descriptor.enumerable); |
| assert_true(descriptor.configurable); |
| }, 'Window target, no trap, "name" attribute'); |
| |
| test(() => { |
| let windowProxy = new Proxy(window, {}); |
| |
| assert_object_equals( |
| Object.getOwnPropertyDescriptor(windowProxy, 'document'), |
| Object.getOwnPropertyDescriptor(window, 'document') |
| ); |
| }, 'Window target, forwarding trap, [Unforgeable] "document" attribute'); |
| |
| test(() => { |
| let trapResult = {get() {}, set(_val) {}, enumerable: false, configurable: true}; |
| let windowProxy = new Proxy(new Proxy(window, {}), { |
| getOwnPropertyDescriptor: () => trapResult, |
| }); |
| |
| assert_object_equals( |
| Object.getOwnPropertyDescriptor(windowProxy, 'onclick'), |
| trapResult |
| ); |
| }, 'Window proxy target, custom trap, "onclick" event handler attribute'); |
| |
| test(() => { |
| let documentProxy = new Proxy(document, { |
| getOwnPropertyDescriptor: Reflect.getOwnPropertyDescriptor, |
| }); |
| |
| assert_object_equals( |
| Object.getOwnPropertyDescriptor(documentProxy, 'location'), |
| Object.getOwnPropertyDescriptor(document, 'location') |
| ); |
| }, 'Document target, forwarding trap, [Unforgeable] "location" attribute'); |
| |
| test(() => { |
| let trapResult = {value: 4, writable: false, enumerable: true, configurable: true}; |
| let documentProxy = new Proxy(new Proxy(document, {}), { |
| getOwnPropertyDescriptor: () => trapResult, |
| }); |
| |
| assert_object_equals( |
| Object.getOwnPropertyDescriptor(documentProxy, 'foo'), |
| trapResult |
| ); |
| }, 'Document proxy target, custom trap, non-existent value attribute'); |
| |
| test(() => { |
| let locationProxy = new Proxy(location, {}); |
| location.hash = '#old'; |
| let descriptor = Object.getOwnPropertyDescriptor(locationProxy, 'hash'); |
| |
| assert_equals(descriptor.get.call(location), '#old'); |
| descriptor.set.call(location, '#new'); |
| assert_equals(location.hash, '#new'); |
| assert_true(descriptor.enumerable); |
| assert_false(descriptor.configurable); |
| }, 'Location target, no trap, [Unforgeable] "hash" attribute'); |
| |
| test(() => { |
| let locationProxy = new Proxy(new Proxy(location, {}), { |
| getOwnPropertyDescriptor: Reflect.getOwnPropertyDescriptor, |
| }); |
| |
| assert_object_equals( |
| Object.getOwnPropertyDescriptor(locationProxy, 'reload'), |
| Object.getOwnPropertyDescriptor(location, 'reload') |
| ); |
| }, 'Location proxy target, forwarding trap, [Unforgeable] "reload" method'); |
| </script> |
| </body> |
| </html> |