mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-22 07:07:30 +09:00
Bug 1309147 - Part 1: Implement the support for CEReactions in WebIDL parser.
Tag UXP Issue #1344
This commit is contained in:
parent
932dde0dfe
commit
39fcec342d
2 changed files with 180 additions and 0 deletions
|
|
@ -4083,6 +4083,11 @@ class IDLAttribute(IDLInterfaceMember):
|
||||||
raise WebIDLError("Attribute returns a type that is not exposed "
|
raise WebIDLError("Attribute returns a type that is not exposed "
|
||||||
"everywhere where the attribute is exposed",
|
"everywhere where the attribute is exposed",
|
||||||
[self.location])
|
[self.location])
|
||||||
|
if self.getExtendedAttribute("CEReactions"):
|
||||||
|
if self.readonly:
|
||||||
|
raise WebIDLError("[CEReactions] is not allowed on "
|
||||||
|
"readonly attributes",
|
||||||
|
[self.location])
|
||||||
|
|
||||||
def handleExtendedAttribute(self, attr):
|
def handleExtendedAttribute(self, attr):
|
||||||
identifier = attr.identifier()
|
identifier = attr.identifier()
|
||||||
|
|
@ -4253,6 +4258,10 @@ class IDLAttribute(IDLInterfaceMember):
|
||||||
raise WebIDLError("[Unscopable] is only allowed on non-static "
|
raise WebIDLError("[Unscopable] is only allowed on non-static "
|
||||||
"attributes and operations",
|
"attributes and operations",
|
||||||
[attr.location, self.location])
|
[attr.location, self.location])
|
||||||
|
elif identifier == "CEReactions":
|
||||||
|
if not attr.noArguments():
|
||||||
|
raise WebIDLError("[CEReactions] must take no arguments",
|
||||||
|
[attr.location])
|
||||||
elif (identifier == "Pref" or
|
elif (identifier == "Pref" or
|
||||||
identifier == "Deprecated" or
|
identifier == "Deprecated" or
|
||||||
identifier == "SetterThrows" or
|
identifier == "SetterThrows" or
|
||||||
|
|
@ -4983,6 +4992,15 @@ class IDLMethod(IDLInterfaceMember, IDLScope):
|
||||||
raise WebIDLError("[Unscopable] is only allowed on non-static "
|
raise WebIDLError("[Unscopable] is only allowed on non-static "
|
||||||
"attributes and operations",
|
"attributes and operations",
|
||||||
[attr.location, self.location])
|
[attr.location, self.location])
|
||||||
|
elif identifier == "CEReactions":
|
||||||
|
if not attr.noArguments():
|
||||||
|
raise WebIDLError("[CEReactions] must take no arguments",
|
||||||
|
[attr.location])
|
||||||
|
|
||||||
|
if self.isSpecial() and not self.isSetter() and not self.isDeleter():
|
||||||
|
raise WebIDLError("[CEReactions] is only allowed on operation, "
|
||||||
|
"attribute, setter, and deleter",
|
||||||
|
[attr.location, self.location])
|
||||||
elif (identifier == "Throws" or
|
elif (identifier == "Throws" or
|
||||||
identifier == "NewObject" or
|
identifier == "NewObject" or
|
||||||
identifier == "ChromeOnly" or
|
identifier == "ChromeOnly" or
|
||||||
|
|
|
||||||
162
dom/bindings/parser/tests/test_cereactions.py
Normal file
162
dom/bindings/parser/tests/test_cereactions.py
Normal file
|
|
@ -0,0 +1,162 @@
|
||||||
|
def WebIDLTest(parser, harness):
|
||||||
|
threw = False
|
||||||
|
try:
|
||||||
|
parser.parse("""
|
||||||
|
interface Foo {
|
||||||
|
[CEReactions(DOMString a)] void foo(boolean arg2);
|
||||||
|
};
|
||||||
|
""")
|
||||||
|
|
||||||
|
results = parser.finish()
|
||||||
|
except:
|
||||||
|
threw = True
|
||||||
|
|
||||||
|
harness.ok(threw, "Should have thrown for [CEReactions] with an argument")
|
||||||
|
|
||||||
|
parser = parser.reset()
|
||||||
|
threw = False
|
||||||
|
try:
|
||||||
|
parser.parse("""
|
||||||
|
interface Foo {
|
||||||
|
[CEReactions(DOMString b)] readonly attribute boolean bar;
|
||||||
|
};
|
||||||
|
""")
|
||||||
|
|
||||||
|
results = parser.finish()
|
||||||
|
except:
|
||||||
|
threw = True
|
||||||
|
|
||||||
|
harness.ok(threw, "Should have thrown for [CEReactions] with an argument")
|
||||||
|
|
||||||
|
parser = parser.reset()
|
||||||
|
threw = False
|
||||||
|
try:
|
||||||
|
parser.parse("""
|
||||||
|
interface Foo {
|
||||||
|
[CEReactions] attribute boolean bar;
|
||||||
|
};
|
||||||
|
""")
|
||||||
|
|
||||||
|
results = parser.finish()
|
||||||
|
except Exception, e:
|
||||||
|
harness.ok(False, "Shouldn't have thrown for [CEReactions] used on writable attribute. %s" % e)
|
||||||
|
threw = True
|
||||||
|
|
||||||
|
parser = parser.reset()
|
||||||
|
threw = False
|
||||||
|
try:
|
||||||
|
parser.parse("""
|
||||||
|
interface Foo {
|
||||||
|
[CEReactions] void foo(boolean arg2);
|
||||||
|
};
|
||||||
|
""")
|
||||||
|
|
||||||
|
results = parser.finish()
|
||||||
|
except Exception, e:
|
||||||
|
harness.ok(False, "Shouldn't have thrown for [CEReactions] used on regular operations. %s" % e)
|
||||||
|
threw = True
|
||||||
|
|
||||||
|
parser = parser.reset()
|
||||||
|
threw = False
|
||||||
|
try:
|
||||||
|
parser.parse("""
|
||||||
|
interface Foo {
|
||||||
|
[CEReactions] readonly attribute boolean A;
|
||||||
|
};
|
||||||
|
""")
|
||||||
|
|
||||||
|
results = parser.finish()
|
||||||
|
except:
|
||||||
|
threw = True
|
||||||
|
|
||||||
|
harness.ok(threw, "Should have thrown for [CEReactions] used on a readonly attribute")
|
||||||
|
|
||||||
|
parser = parser.reset()
|
||||||
|
threw = False
|
||||||
|
try:
|
||||||
|
parser.parse("""
|
||||||
|
[CEReactions]
|
||||||
|
interface Foo {
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
|
||||||
|
results = parser.finish()
|
||||||
|
except:
|
||||||
|
threw = True
|
||||||
|
|
||||||
|
harness.ok(threw, "Should have thrown for [CEReactions] used on a interface")
|
||||||
|
|
||||||
|
parser = parser.reset()
|
||||||
|
threw = False
|
||||||
|
try:
|
||||||
|
parser.parse("""
|
||||||
|
interface Foo {
|
||||||
|
[CEReactions] getter any(DOMString name);
|
||||||
|
};
|
||||||
|
""")
|
||||||
|
results = parser.finish()
|
||||||
|
except:
|
||||||
|
threw = True
|
||||||
|
|
||||||
|
harness.ok(threw,
|
||||||
|
"Should have thrown for [CEReactions] used on a named getter")
|
||||||
|
|
||||||
|
parser = parser.reset()
|
||||||
|
threw = False
|
||||||
|
try:
|
||||||
|
parser.parse("""
|
||||||
|
interface Foo {
|
||||||
|
[CEReactions] creator boolean (DOMString name, boolean value);
|
||||||
|
};
|
||||||
|
""")
|
||||||
|
results = parser.finish()
|
||||||
|
except:
|
||||||
|
threw = True
|
||||||
|
|
||||||
|
harness.ok(threw,
|
||||||
|
"Should have thrown for [CEReactions] used on a named creator")
|
||||||
|
|
||||||
|
parser = parser.reset()
|
||||||
|
threw = False
|
||||||
|
try:
|
||||||
|
parser.parse("""
|
||||||
|
interface Foo {
|
||||||
|
[CEReactions] legacycaller double compute(double x);
|
||||||
|
};
|
||||||
|
""")
|
||||||
|
results = parser.finish()
|
||||||
|
except:
|
||||||
|
threw = True
|
||||||
|
|
||||||
|
harness.ok(threw,
|
||||||
|
"Should have thrown for [CEReactions] used on a legacycaller")
|
||||||
|
|
||||||
|
parser = parser.reset()
|
||||||
|
threw = False
|
||||||
|
try:
|
||||||
|
parser.parse("""
|
||||||
|
interface Foo {
|
||||||
|
[CEReactions] stringifier DOMString ();
|
||||||
|
};
|
||||||
|
""")
|
||||||
|
results = parser.finish()
|
||||||
|
except:
|
||||||
|
threw = True
|
||||||
|
|
||||||
|
harness.ok(threw,
|
||||||
|
"Should have thrown for [CEReactions] used on a stringifier")
|
||||||
|
|
||||||
|
parser = parser.reset()
|
||||||
|
threw = False
|
||||||
|
try:
|
||||||
|
parser.parse("""
|
||||||
|
interface Foo {
|
||||||
|
[CEReactions] jsonifier;
|
||||||
|
};
|
||||||
|
""")
|
||||||
|
|
||||||
|
results = parser.finish()
|
||||||
|
except:
|
||||||
|
threw = True
|
||||||
|
|
||||||
|
harness.ok(threw, "Should have thrown for [CEReactions] used on a jsonifier")
|
||||||
Loading…
Add table
Add a link
Reference in a new issue