aboutsummaryrefslogtreecommitdiffstats
path: root/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/constructors.html
blob: 423e1bed22827b9b7f37781665b01ceb307d00c6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<!DOCTYPE html>
<meta charset=utf-8>
<title>Realm for constructed objects</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
function object_realm(dp) {
  // Note that browsers use the URL of the relevant global object's associated
  // Document.
  // https://github.com/w3c/DOM-Parsing/issues/46
  var url = DOMParser.prototype.parseFromString.call(dp, "x", "text/html").documentURI;
  var file = url.slice(url.lastIndexOf("/") + 1);
  switch (file) {
  case "constructors.html":
    return "parent window";
  case "constructors-support.html":
    return "child window";
  default:
    return "???";
  }
}

async_test(function() {
  var iframe = document.createElement("iframe");
  iframe.onload = this.step_func_done(function() {
    var child = iframe.contentWindow;
    test(function() {
      var dp = new DOMParser();
      assert_equals(Object.getPrototypeOf(dp), DOMParser.prototype);
      assert_equals(object_realm(dp), "parent window");
    }, "Normal constructor in parent window");

    test(function() {
      var dp = new child.DOMParser();
      assert_equals(Object.getPrototypeOf(dp), child.DOMParser.prototype);
      assert_equals(object_realm(dp), "child window");
    }, "Normal constructor in child window");

    test(function() {
      var dp = Reflect.construct(child.DOMParser, [], DOMParser);
      assert_equals(Object.getPrototypeOf(dp), DOMParser.prototype);
      assert_equals(object_realm(dp), "child window");
    }, "Constructor in child window with normal NewTarget from parent window");

    test(function() {
      var dp = Reflect.construct(DOMParser, [], child.DOMParser);
      assert_equals(Object.getPrototypeOf(dp), child.DOMParser.prototype);
      assert_equals(object_realm(dp), "parent window");
    }, "Constructor in parent window with normal NewTarget from child window");

    test(function() {
      class DOMParserSubclass extends DOMParser {}
      var dp = new DOMParserSubclass();
      assert_equals(Object.getPrototypeOf(dp), DOMParserSubclass.prototype);
      assert_equals(object_realm(dp), "parent window");
    }, "Subclass constructor in parent window");

    test(function() {
      var dp = new child.DOMParserSubclass();
      assert_equals(Object.getPrototypeOf(dp), child.DOMParserSubclass.prototype);
      assert_equals(object_realm(dp), "child window");
    }, "Subclass constructor in child window");

    test(function() {
      class ForeignDOMParserSubclass extends child.DOMParser {}
      var dp = new ForeignDOMParserSubclass();
      assert_equals(Object.getPrototypeOf(dp), ForeignDOMParserSubclass.prototype);
      assert_equals(object_realm(dp), "child window");
    }, "Subclass constructor in parent window with parent class in child window");

    test(function() {
      var dp = new child.ForeignDOMParserSubclass();
      assert_equals(Object.getPrototypeOf(dp), child.ForeignDOMParserSubclass.prototype);
      assert_equals(object_realm(dp), "parent window");
    }, "Subclass constructor in child window with parent class in parent window");

    test(function() {
      var badNewTarget = function() {};
      badNewTarget.prototype = 7;

      var dp = Reflect.construct(child.DOMParser, [], badNewTarget);
      assert_equals(Object.getPrototypeOf(dp), DOMParser.prototype);
      assert_equals(object_realm(dp), "child window");
    }, "Constructor in child window with bad NewTarget from parent window");

    test(function() {
      var dp = Reflect.construct(DOMParser, [], child.badNewTarget);
      assert_equals(Object.getPrototypeOf(dp), child.DOMParser.prototype);
      assert_equals(object_realm(dp), "parent window");
    }, "Constructor in parent window with bad NewTarget from child window");
  });
  iframe.src = "constructors-support.html";
  document.body.appendChild(iframe);
});
</script>