- From: Ms2ger <notifications@github.com>
- Date: Tue, 19 Feb 2019 03:47:52 -0800
- To: heycam/webidl <webidl@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <heycam/webidl/pull/635/review/205168532@github.com>
Ms2ger commented on this pull request.
> @@ -10699,14 +10714,18 @@ the <code>typeof</code> operator will return "function" when applied to an inter
1. Let <|constructor|, |values|> be the result
of passing |S| and |args|.
to the [=overload resolution algorithm=].
- 1. Let |R| be the result of performing
- the actions listed in the description of |constructor|
- with |values| as the argument values.
+ 1. Let |targetRealm| be [$GetFunctionRealm$]({{NewTarget}}).
+ 1. Let |object| be the result of [=internally create a new object implementing the
Okay, thanks for clarifying. I wrote some tests, and it turns out no two browsers agree. I updated the PR to match my understanding of what ES does, based on your comment. Note that this doesn't match Gecko if NewTarget has a prototype property that isn't an object.
<table>
<thead>
<tr><th>Test <th>Gecko <th>WebKit <th>Chrome
<tbody>
<tr><th colspan=4>new DOMParser()
<tr><th>Prototype <td colspan=3>DOMParser.­prototype
<tr><th>Object realm <td colspan=3>parent window
<tr><th colspan=4>new i.­contentWindow.­DOMParser()
<tr><th>Prototype <td colspan=3>i.­contentWindow.­DOMParser.­prototype
<tr><th>Object realm <td colspan=3>child window
<tr><th colspan=4>Reflect.­construct(i.­contentWindow.­DOMParser, [], DOMParser)
<tr><th>Prototype <td>DOMParser.­prototype <td>i.­contentWindow.­DOMParser.­prototype <td>DOMParser.­prototype
<tr><th>Object realm <td>child window <td>child window <td>parent window
<tr><th colspan=4>Reflect.­construct(DOMParser, [], i.­contentWindow.­DOMParser)
<tr><th>Prototype <td>i.­contentWindow.­DOMParser.­prototype <td>DOMParser.­prototype <td>i.­contentWindow.­DOMParser.­prototype
<tr><th>Object realm <td>parent window <td>parent window <td>child window
<tr><th colspan=4>Reflect.­construct(i.­contentWindow.­DOMParser, [], cons)
<tr><th>Prototype <td>i.­contentWindow.­DOMParser.­prototype <td>i.­contentWindow.­DOMParser.­prototype <td>Object.­prototype
<tr><th>Object realm <td>child window <td>child window <td>parent window
<tr><th colspan=4>Reflect.­construct(DOMParser, [], i.­contentWindow.­cons)
<tr><th>Prototype <td>DOMParser.­prototype <td>DOMParser.­prototype <td>i.­contentWindow.­Object.­prototype
<tr><th>Object realm <td>parent window <td>parent window <td>child window
<tr><th colspan=4>Conclusion
<tr><th>Prototype <td>From NewTarget; fallback to interface object from constructor's realm <td>Interface object from constructor's realm <td>From NewTarget; fallback to Object.prototype from NewTarget's realm
<tr><th>Object realm <td>From constructor <td>From constructor <td>From NewTarget
</table>
<details>
<summary>Test</summary>
```html
<!DOCTYPE html>
<script>
function identify(proto, i) {
if (proto === Object.prototype)
return "Object.prototype";
if (proto === i.contentWindow.Object.prototype)
return "i.contentWindow.Object.prototype";
if (proto === DOMParser.prototype)
return "DOMParser.prototype";
if (proto === i.contentWindow.DOMParser.prototype)
return "i.contentWindow.DOMParser.prototype";
return "???"
}
function object_realm(dp) {
var url = DOMParser.prototype.parseFromString.call(dp, "x", "text/html").documentURI;
if (url === "http://software.hixie.ch/utilities/js/live-dom-viewer/")
return "parent window";
if (url === "http://software.hixie.ch/utilities/js/live-dom-viewer/document")
return "child window";
return "???";
}
function f(i) {
var dp = new DOMParser();
w("new DOMParser()");
w(identify(dp.__proto__, i));
w(object_realm(dp));
w("");
dp = new i.contentWindow.DOMParser();
w("new i.contentWindow.DOMParser()");
w(identify(dp.__proto__, i));
w(object_realm(dp));
w("");
dp = Reflect.construct(i.contentWindow.DOMParser, [], DOMParser);
w("Reflect.construct(i.contentWindow.DOMParser, [], DOMParser)");
w(identify(dp.__proto__, i));
w(object_realm(dp));
w("");
dp = Reflect.construct(DOMParser, [], i.contentWindow.DOMParser);
w("Reflect.construct(DOMParser, [], i.contentWindow.DOMParser)");
w(identify(dp.__proto__, i));
w(object_realm(dp));
w("");
var cons = function() {};
cons.prototype = 7;
dp = Reflect.construct(i.contentWindow.DOMParser, [], cons);
w("Reflect.construct(i.contentWindow.DOMParser, [], cons)");
w(identify(dp.__proto__, i));
w(object_realm(dp));
w("");
var script = i.contentWindow.document.createElement("script");
script.textContent = "window.cons = function() {}; cons.prototype = 8;";
i.contentWindow.document.documentElement.appendChild(script);
dp = Reflect.construct(DOMParser, [], i.contentWindow.cons);
w("Reflect.construct(DOMParser, [], i.contentWindow.cons)");
w(identify(dp.__proto__, i));
w(object_realm(dp));
w("");
}
</script>
<iframe src=document onload=f(this)></iframe>
```
</summary>
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/heycam/webidl/pull/635#discussion_r258004672
Received on Tuesday, 19 February 2019 11:48:15 UTC