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 as e: exception = e 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 as e: exception = e 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 as e: exception = e 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)", )