summaryrefslogtreecommitdiffstats
path: root/dom/bindings/parser/tests/test_conditional_dictionary_member.py
blob: 433b7e501a4b2444df46cadff371b93873f1b36a (plain)
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
def WebIDLTest(parser, harness):
    parser.parse("""
      dictionary Dict {
        any foo;
        [ChromeOnly] any bar;
      };
    """)
    results = parser.finish()
    harness.check(len(results), 1, "Should have a dictionary")
    members = results[0].members;
    harness.check(len(members), 2, "Should have two members")
    # Note that members are ordered lexicographically, so "bar" comes
    # before "foo".
    harness.ok(members[0].getExtendedAttribute("ChromeOnly"),
               "First member is not ChromeOnly")
    harness.ok(not members[1].getExtendedAttribute("ChromeOnly"),
               "Second member is ChromeOnly")

    parser = parser.reset()
    parser.parse("""
      dictionary Dict {
        any foo;
        any bar;
      };

      interface Iface {
        [Constant, Cached] readonly attribute Dict dict;
      };
    """)
    results = parser.finish()
    harness.check(len(results), 2, "Should have a dictionary and an interface")

    parser = parser.reset()
    exception = None
    try:
      parser.parse("""
        dictionary Dict {
          any foo;
          [ChromeOnly] any bar;
        };

        interface Iface {
          [Constant, Cached] readonly attribute Dict dict;
        };
      """)
      results = parser.finish()
    except Exception, exception:
        pass

    harness.ok(exception, "Should have thrown.")
    harness.check(exception.message,
                  "[Cached] and [StoreInSlot] must not be used on an attribute "
                  "whose type contains a [ChromeOnly] dictionary member",
                  "Should have thrown the right exception")

    parser = parser.reset()
    exception = None
    try:
      parser.parse("""
        dictionary ParentDict {
          [ChromeOnly] any bar;
        };

        dictionary Dict : ParentDict {
          any foo;
        };

        interface Iface {
          [Constant, Cached] readonly attribute Dict dict;
        };
      """)
      results = parser.finish()
    except Exception, exception:
        pass

    harness.ok(exception, "Should have thrown (2).")
    harness.check(exception.message,
                  "[Cached] and [StoreInSlot] must not be used on an attribute "
                  "whose type contains a [ChromeOnly] dictionary member",
                  "Should have thrown the right exception (2)")

    parser = parser.reset()
    exception = None
    try:
      parser.parse("""
        dictionary GrandParentDict {
          [ChromeOnly] any baz;
        };

        dictionary ParentDict : GrandParentDict {
          any bar;
        };

        dictionary Dict : ParentDict {
          any foo;
        };

        interface Iface {
          [Constant, Cached] readonly attribute Dict dict;
        };
      """)
      results = parser.finish()
    except Exception, exception:
        pass

    harness.ok(exception, "Should have thrown (3).")
    harness.check(exception.message,
                  "[Cached] and [StoreInSlot] must not be used on an attribute "
                  "whose type contains a [ChromeOnly] dictionary member",
                  "Should have thrown the right exception (3)")