mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
* Update WebIDL.py * Update WebIDL.py * Add builtin-array.patch * Fix CodegenRust.py and Configuration.py * Fix missing downcasts * mach fmt * Update check and comment to explain why we need this check * Update Global of DissimilarOriginWindow.webidl
596 lines
17 KiB
Python
596 lines
17 KiB
Python
import WebIDL
|
|
|
|
|
|
def WebIDLTest(parser, harness):
|
|
def checkArgument(argument, QName, name, type, optional, variadic):
|
|
harness.ok(isinstance(argument, WebIDL.IDLArgument), "Should be an IDLArgument")
|
|
harness.check(
|
|
argument.identifier.QName(), QName, "Argument has the right QName"
|
|
)
|
|
harness.check(argument.identifier.name, name, "Argument has the right name")
|
|
harness.check(str(argument.type), type, "Argument has the right return type")
|
|
harness.check(
|
|
argument.optional, optional, "Argument has the right optional value"
|
|
)
|
|
harness.check(
|
|
argument.variadic, variadic, "Argument has the right variadic value"
|
|
)
|
|
|
|
def checkMethod(
|
|
method,
|
|
QName,
|
|
name,
|
|
signatures,
|
|
static=True,
|
|
getter=False,
|
|
setter=False,
|
|
deleter=False,
|
|
legacycaller=False,
|
|
stringifier=False,
|
|
chromeOnly=False,
|
|
htmlConstructor=False,
|
|
secureContext=False,
|
|
pref=None,
|
|
func=None,
|
|
):
|
|
harness.ok(isinstance(method, WebIDL.IDLMethod), "Should be an IDLMethod")
|
|
harness.ok(method.isMethod(), "Method is a method")
|
|
harness.ok(not method.isAttr(), "Method is not an attr")
|
|
harness.ok(not method.isConst(), "Method is not a const")
|
|
harness.check(method.identifier.QName(), QName, "Method has the right QName")
|
|
harness.check(method.identifier.name, name, "Method has the right name")
|
|
harness.check(method.isStatic(), static, "Method has the correct static value")
|
|
harness.check(method.isGetter(), getter, "Method has the correct getter value")
|
|
harness.check(method.isSetter(), setter, "Method has the correct setter value")
|
|
harness.check(
|
|
method.isDeleter(), deleter, "Method has the correct deleter value"
|
|
)
|
|
harness.check(
|
|
method.isLegacycaller(),
|
|
legacycaller,
|
|
"Method has the correct legacycaller value",
|
|
)
|
|
harness.check(
|
|
method.isStringifier(),
|
|
stringifier,
|
|
"Method has the correct stringifier value",
|
|
)
|
|
harness.check(
|
|
method.getExtendedAttribute("ChromeOnly") is not None,
|
|
chromeOnly,
|
|
"Method has the correct value for ChromeOnly",
|
|
)
|
|
harness.check(
|
|
method.isHTMLConstructor(),
|
|
htmlConstructor,
|
|
"Method has the correct htmlConstructor value",
|
|
)
|
|
harness.check(
|
|
len(method.signatures()),
|
|
len(signatures),
|
|
"Method has the correct number of signatures",
|
|
)
|
|
harness.check(
|
|
method.getExtendedAttribute("Pref"),
|
|
pref,
|
|
"Method has the correct pref value",
|
|
)
|
|
harness.check(
|
|
method.getExtendedAttribute("Func"),
|
|
func,
|
|
"Method has the correct func value",
|
|
)
|
|
harness.check(
|
|
method.getExtendedAttribute("SecureContext") is not None,
|
|
secureContext,
|
|
"Method has the correct SecureContext value",
|
|
)
|
|
|
|
sigpairs = zip(method.signatures(), signatures)
|
|
for gotSignature, expectedSignature in sigpairs:
|
|
(gotRetType, gotArgs) = gotSignature
|
|
(expectedRetType, expectedArgs) = expectedSignature
|
|
|
|
harness.check(
|
|
str(gotRetType), expectedRetType, "Method has the expected return type."
|
|
)
|
|
|
|
for i in range(0, len(gotArgs)):
|
|
(QName, name, type, optional, variadic) = expectedArgs[i]
|
|
checkArgument(gotArgs[i], QName, name, type, optional, variadic)
|
|
|
|
def checkResults(results):
|
|
harness.check(len(results), 3, "Should be three productions")
|
|
harness.ok(
|
|
isinstance(results[0], WebIDL.IDLInterface), "Should be an IDLInterface"
|
|
)
|
|
harness.ok(
|
|
isinstance(results[1], WebIDL.IDLInterface), "Should be an IDLInterface"
|
|
)
|
|
harness.ok(
|
|
isinstance(results[2], WebIDL.IDLInterface), "Should be an IDLInterface"
|
|
)
|
|
|
|
checkMethod(
|
|
results[0].ctor(),
|
|
"::TestConstructorNoArgs::constructor",
|
|
"constructor",
|
|
[("TestConstructorNoArgs (Wrapper)", [])],
|
|
)
|
|
harness.check(
|
|
len(results[0].members), 0, "TestConstructorNoArgs should not have members"
|
|
)
|
|
checkMethod(
|
|
results[1].ctor(),
|
|
"::TestConstructorWithArgs::constructor",
|
|
"constructor",
|
|
[
|
|
(
|
|
"TestConstructorWithArgs (Wrapper)",
|
|
[
|
|
(
|
|
"::TestConstructorWithArgs::constructor::name",
|
|
"name",
|
|
"String",
|
|
False,
|
|
False,
|
|
)
|
|
],
|
|
)
|
|
],
|
|
)
|
|
harness.check(
|
|
len(results[1].members),
|
|
0,
|
|
"TestConstructorWithArgs should not have members",
|
|
)
|
|
checkMethod(
|
|
results[2].ctor(),
|
|
"::TestConstructorOverloads::constructor",
|
|
"constructor",
|
|
[
|
|
(
|
|
"TestConstructorOverloads (Wrapper)",
|
|
[
|
|
(
|
|
"::TestConstructorOverloads::constructor::foo",
|
|
"foo",
|
|
"Object",
|
|
False,
|
|
False,
|
|
)
|
|
],
|
|
),
|
|
(
|
|
"TestConstructorOverloads (Wrapper)",
|
|
[
|
|
(
|
|
"::TestConstructorOverloads::constructor::bar",
|
|
"bar",
|
|
"Boolean",
|
|
False,
|
|
False,
|
|
)
|
|
],
|
|
),
|
|
],
|
|
)
|
|
harness.check(
|
|
len(results[2].members),
|
|
0,
|
|
"TestConstructorOverloads should not have members",
|
|
)
|
|
|
|
parser.parse(
|
|
"""
|
|
interface TestConstructorNoArgs {
|
|
constructor();
|
|
};
|
|
|
|
interface TestConstructorWithArgs {
|
|
constructor(DOMString name);
|
|
};
|
|
|
|
interface TestConstructorOverloads {
|
|
constructor(object foo);
|
|
constructor(boolean bar);
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
checkResults(results)
|
|
|
|
parser = parser.reset()
|
|
parser.parse(
|
|
"""
|
|
interface TestPrefConstructor {
|
|
[Pref="dom.webidl.test1"] constructor();
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
harness.check(len(results), 1, "Should be one production")
|
|
harness.ok(isinstance(results[0], WebIDL.IDLInterface), "Should be an IDLInterface")
|
|
|
|
checkMethod(
|
|
results[0].ctor(),
|
|
"::TestPrefConstructor::constructor",
|
|
"constructor",
|
|
[("TestPrefConstructor (Wrapper)", [])],
|
|
pref=["dom.webidl.test1"],
|
|
)
|
|
|
|
parser = parser.reset()
|
|
parser.parse(
|
|
"""
|
|
interface TestChromeOnlyConstructor {
|
|
[ChromeOnly] constructor();
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
harness.check(len(results), 1, "Should be one production")
|
|
harness.ok(isinstance(results[0], WebIDL.IDLInterface), "Should be an IDLInterface")
|
|
|
|
checkMethod(
|
|
results[0].ctor(),
|
|
"::TestChromeOnlyConstructor::constructor",
|
|
"constructor",
|
|
[("TestChromeOnlyConstructor (Wrapper)", [])],
|
|
chromeOnly=True,
|
|
)
|
|
|
|
parser = parser.reset()
|
|
parser.parse(
|
|
"""
|
|
interface TestSCConstructor {
|
|
[SecureContext] constructor();
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
harness.check(len(results), 1, "Should be one production")
|
|
harness.ok(isinstance(results[0], WebIDL.IDLInterface), "Should be an IDLInterface")
|
|
|
|
checkMethod(
|
|
results[0].ctor(),
|
|
"::TestSCConstructor::constructor",
|
|
"constructor",
|
|
[("TestSCConstructor (Wrapper)", [])],
|
|
secureContext=True,
|
|
)
|
|
|
|
parser = parser.reset()
|
|
parser.parse(
|
|
"""
|
|
interface TestFuncConstructor {
|
|
[Func="IsNotUAWidget"] constructor();
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
harness.check(len(results), 1, "Should be one production")
|
|
harness.ok(isinstance(results[0], WebIDL.IDLInterface), "Should be an IDLInterface")
|
|
|
|
checkMethod(
|
|
results[0].ctor(),
|
|
"::TestFuncConstructor::constructor",
|
|
"constructor",
|
|
[("TestFuncConstructor (Wrapper)", [])],
|
|
func=["IsNotUAWidget"],
|
|
)
|
|
|
|
parser = parser.reset()
|
|
parser.parse(
|
|
(
|
|
"\n"
|
|
" interface TestPrefChromeOnlySCFuncConstructor {\n"
|
|
' [ChromeOnly, Pref="dom.webidl.test1", SecureContext, '
|
|
'Func="IsNotUAWidget"]\n'
|
|
" constructor();\n"
|
|
" };\n"
|
|
)
|
|
)
|
|
results = parser.finish()
|
|
harness.check(len(results), 1, "Should be one production")
|
|
harness.ok(isinstance(results[0], WebIDL.IDLInterface), "Should be an IDLInterface")
|
|
|
|
checkMethod(
|
|
results[0].ctor(),
|
|
"::TestPrefChromeOnlySCFuncConstructor::constructor",
|
|
"constructor",
|
|
[("TestPrefChromeOnlySCFuncConstructor (Wrapper)", [])],
|
|
func=["IsNotUAWidget"],
|
|
pref=["dom.webidl.test1"],
|
|
chromeOnly=True,
|
|
secureContext=True,
|
|
)
|
|
|
|
parser = parser.reset()
|
|
parser.parse(
|
|
"""
|
|
interface TestHTMLConstructor {
|
|
[HTMLConstructor] constructor();
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
harness.check(len(results), 1, "Should be one production")
|
|
harness.ok(isinstance(results[0], WebIDL.IDLInterface), "Should be an IDLInterface")
|
|
|
|
checkMethod(
|
|
results[0].ctor(),
|
|
"::TestHTMLConstructor::constructor",
|
|
"constructor",
|
|
[("TestHTMLConstructor (Wrapper)", [])],
|
|
htmlConstructor=True,
|
|
)
|
|
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse(
|
|
"""
|
|
interface TestChromeOnlyConstructor {
|
|
constructor()
|
|
[ChromeOnly] constructor(DOMString a);
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
except WebIDL.WebIDLError:
|
|
threw = True
|
|
|
|
harness.ok(threw, "Can't have both a constructor and a ChromeOnly constructor")
|
|
|
|
# Test HTMLConstructor with argument
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse(
|
|
"""
|
|
interface TestHTMLConstructorWithArgs {
|
|
[HTMLConstructor] constructor(DOMString a);
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
except WebIDL.WebIDLError:
|
|
threw = True
|
|
|
|
harness.ok(threw, "HTMLConstructor should take no argument")
|
|
|
|
# Test HTMLConstructor on a callback interface
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse(
|
|
"""
|
|
callback interface TestHTMLConstructorOnCallbackInterface {
|
|
[HTMLConstructor] constructor();
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
except WebIDL.WebIDLError:
|
|
threw = True
|
|
|
|
harness.ok(threw, "HTMLConstructor can't be used on a callback interface")
|
|
|
|
# Test HTMLConstructor and constructor operation
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse(
|
|
"""
|
|
interface TestHTMLConstructorAndConstructor {
|
|
constructor();
|
|
[HTMLConstructor] constructor();
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
except WebIDL.WebIDLError:
|
|
threw = True
|
|
|
|
harness.ok(threw, "Can't have both a constructor and a HTMLConstructor")
|
|
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse(
|
|
"""
|
|
interface TestHTMLConstructorAndConstructor {
|
|
[Throws]
|
|
constructor();
|
|
[HTMLConstructor] constructor();
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
except WebIDL.WebIDLError:
|
|
threw = True
|
|
|
|
harness.ok(threw, "Can't have both a throwing constructor and a HTMLConstructor")
|
|
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse(
|
|
"""
|
|
interface TestHTMLConstructorAndConstructor {
|
|
constructor(DOMString a);
|
|
[HTMLConstructor] constructor();
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
except WebIDL.WebIDLError:
|
|
threw = True
|
|
|
|
harness.ok(threw, "Can't have both a HTMLConstructor and a constructor operation")
|
|
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse(
|
|
"""
|
|
interface TestHTMLConstructorAndConstructor {
|
|
[Throws]
|
|
constructor(DOMString a);
|
|
[HTMLConstructor] constructor();
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
except WebIDL.WebIDLError:
|
|
threw = True
|
|
|
|
harness.ok(
|
|
threw,
|
|
"Can't have both a HTMLConstructor and a throwing constructor " "operation",
|
|
)
|
|
|
|
# Test HTMLConstructor and [ChromeOnly] constructor operation
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse(
|
|
"""
|
|
interface TestHTMLConstructorAndConstructor {
|
|
[ChromeOnly]
|
|
constructor();
|
|
[HTMLConstructor] constructor();
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
except WebIDL.WebIDLError:
|
|
threw = True
|
|
|
|
harness.ok(threw, "Can't have both a ChromeOnly constructor and a HTMLConstructor")
|
|
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse(
|
|
"""
|
|
interface TestHTMLConstructorAndConstructor {
|
|
[Throws, ChromeOnly]
|
|
constructor();
|
|
[HTMLConstructor] constructor();
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
except WebIDL.WebIDLError:
|
|
threw = True
|
|
|
|
harness.ok(
|
|
threw,
|
|
"Can't have both a throwing chromeonly constructor and a " "HTMLConstructor",
|
|
)
|
|
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse(
|
|
"""
|
|
interface TestHTMLConstructorAndConstructor {
|
|
[ChromeOnly]
|
|
constructor(DOMString a);
|
|
[HTMLConstructor] constructor();
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
except WebIDL.WebIDLError:
|
|
threw = True
|
|
|
|
harness.ok(
|
|
threw,
|
|
"Can't have both a HTMLConstructor and a chromeonly constructor " "operation",
|
|
)
|
|
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse(
|
|
"""
|
|
interface TestHTMLConstructorAndConstructor {
|
|
[Throws, ChromeOnly]
|
|
constructor(DOMString a);
|
|
[HTMLConstructor] constructor();
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
except WebIDL.WebIDLError:
|
|
threw = True
|
|
|
|
harness.ok(
|
|
threw,
|
|
"Can't have both a HTMLConstructor and a throwing chromeonly "
|
|
"constructor operation",
|
|
)
|
|
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse(
|
|
"""
|
|
[LegacyNoInterfaceObject]
|
|
interface InterfaceWithoutInterfaceObject {
|
|
constructor();
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
except WebIDL.WebIDLError:
|
|
threw = True
|
|
|
|
harness.ok(
|
|
threw,
|
|
"Can't have a constructor operation on a [LegacyNoInterfaceObject] "
|
|
"interface",
|
|
)
|
|
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse(
|
|
"""
|
|
interface InterfaceWithPartial {
|
|
};
|
|
|
|
partial interface InterfaceWithPartial {
|
|
constructor();
|
|
};
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
except WebIDL.WebIDLError:
|
|
threw = True
|
|
|
|
harness.ok(threw, "Can't have a constructor operation on a partial interface")
|
|
|
|
parser = parser.reset()
|
|
threw = False
|
|
try:
|
|
parser.parse(
|
|
"""
|
|
interface InterfaceWithMixin {
|
|
};
|
|
|
|
interface mixin Mixin {
|
|
constructor();
|
|
};
|
|
|
|
InterfaceWithMixin includes Mixin
|
|
"""
|
|
)
|
|
results = parser.finish()
|
|
except WebIDL.WebIDLError:
|
|
threw = True
|
|
|
|
harness.ok(threw, "Can't have a constructor operation on a mixin")
|