| OLD | NEW |
| 1 /* | 1 /* |
| 2 Distributed under both the W3C Test Suite License [1] and the W3C | 2 Distributed under both the W3C Test Suite License [1] and the W3C |
| 3 3-clause BSD License [2]. To contribute to a W3C Test Suite, see the | 3 3-clause BSD License [2]. To contribute to a W3C Test Suite, see the |
| 4 policies and contribution forms [3]. | 4 policies and contribution forms [3]. |
| 5 | 5 |
| 6 [1] http://www.w3.org/Consortium/Legal/2008/04-testsuite-license | 6 [1] http://www.w3.org/Consortium/Legal/2008/04-testsuite-license |
| 7 [2] http://www.w3.org/Consortium/Legal/2008/03-bsd-license | 7 [2] http://www.w3.org/Consortium/Legal/2008/03-bsd-license |
| 8 [3] http://www.w3.org/2004/10/27-testcases | 8 [3] http://www.w3.org/2004/10/27-testcases |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 { | 300 { |
| 301 ret = ret.concat(this.recursively_get_implements(ret[i])); | 301 ret = ret.concat(this.recursively_get_implements(ret[i])); |
| 302 if (ret.indexOf(ret[i]) != ret.lastIndexOf(ret[i])) | 302 if (ret.indexOf(ret[i]) != ret.lastIndexOf(ret[i])) |
| 303 { | 303 { |
| 304 throw "Circular implements statements involving " + ret[i]; | 304 throw "Circular implements statements involving " + ret[i]; |
| 305 } | 305 } |
| 306 } | 306 } |
| 307 return ret; | 307 return ret; |
| 308 }; | 308 }; |
| 309 | 309 |
| 310 function exposed_in(globals) { |
| 311 if ('document' in self) { |
| 312 return globals.indexOf("Window") >= 0; |
| 313 } |
| 314 if ('DedicatedWorkerGlobalScope' in self && |
| 315 self instanceof DedicatedWorkerGlobalScope) { |
| 316 return globals.indexOf("Worker") >= 0 || |
| 317 globals.indexOf("DedicatedWorker") >= 0; |
| 318 } |
| 319 if ('SharedWorkerGlobalScope' in self && |
| 320 self instanceof SharedWorkerGlobalScope) { |
| 321 return globals.indexOf("Worker") >= 0 || |
| 322 globals.indexOf("SharedWorker") >= 0; |
| 323 } |
| 324 if ('ServiceWorkerGlobalScope' in self && |
| 325 self instanceof ServiceWorkerGlobalScope) { |
| 326 return globals.indexOf("Worker") >= 0 || |
| 327 globals.indexOf("ServiceWorker") >= 0; |
| 328 } |
| 329 throw "Unexpected global object"; |
| 330 } |
| 331 |
| 310 //@} | 332 //@} |
| 311 IdlArray.prototype.test = function() | 333 IdlArray.prototype.test = function() |
| 312 //@{ | 334 //@{ |
| 313 { | 335 { |
| 314 /** Entry point. See documentation at beginning of file. */ | 336 /** Entry point. See documentation at beginning of file. */ |
| 315 | 337 |
| 316 // First merge in all the partial interfaces and implements statements we | 338 // First merge in all the partial interfaces and implements statements we |
| 317 // encountered. | 339 // encountered. |
| 318 this.partials.forEach(function(parsed_idl) | 340 this.partials.forEach(function(parsed_idl) |
| 319 { | 341 { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 346 if (!(rhs in this.members)) throw errStr + rhs + " is undefined."; | 368 if (!(rhs in this.members)) throw errStr + rhs + " is undefined."; |
| 347 if (!(this.members[rhs] instanceof IdlInterface)) throw errStr + rhs
+ " is not an interface."; | 369 if (!(this.members[rhs] instanceof IdlInterface)) throw errStr + rhs
+ " is not an interface."; |
| 348 this.members[rhs].members.forEach(function(member) | 370 this.members[rhs].members.forEach(function(member) |
| 349 { | 371 { |
| 350 this.members[lhs].members.push(new IdlInterfaceMember(member)); | 372 this.members[lhs].members.push(new IdlInterfaceMember(member)); |
| 351 }.bind(this)); | 373 }.bind(this)); |
| 352 }.bind(this)); | 374 }.bind(this)); |
| 353 } | 375 } |
| 354 this["implements"] = {}; | 376 this["implements"] = {}; |
| 355 | 377 |
| 378 Object.getOwnPropertyNames(this.members).forEach(function(memberName) { |
| 379 var member = this.members[memberName]; |
| 380 if (!(member instanceof IdlInterface)) { |
| 381 return; |
| 382 } |
| 383 |
| 384 var exposed = member.extAttrs.filter(function(a) { return a.name == "Exp
osed" }); |
| 385 if (exposed.length > 1) { |
| 386 throw "Unexpected Exposed extended attributes on " + memberName + ":
" + exposed; |
| 387 } |
| 388 |
| 389 var globals = exposed.length === 1 |
| 390 ? exposed[0].rhs.value |
| 391 : ["Window"]; |
| 392 member.exposed = exposed_in(globals); |
| 393 }.bind(this)); |
| 394 |
| 356 // Now run test() on every member, and test_object() for every object. | 395 // Now run test() on every member, and test_object() for every object. |
| 357 for (var name in this.members) | 396 for (var name in this.members) |
| 358 { | 397 { |
| 359 this.members[name].test(); | 398 this.members[name].test(); |
| 360 if (name in this.objects) | 399 if (name in this.objects) |
| 361 { | 400 { |
| 362 this.objects[name].forEach(function(str) | 401 this.objects[name].forEach(function(str) |
| 363 { | 402 { |
| 364 this.members[name].test_object(str); | 403 this.members[name].test_object(str); |
| 365 }.bind(this)); | 404 }.bind(this)); |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 671 //@{ | 710 //@{ |
| 672 { | 711 { |
| 673 if (this.has_extended_attribute("NoInterfaceObject")) | 712 if (this.has_extended_attribute("NoInterfaceObject")) |
| 674 { | 713 { |
| 675 // No tests to do without an instance. TODO: We should still be able | 714 // No tests to do without an instance. TODO: We should still be able |
| 676 // to run tests on the prototype object, if we obtain one through some | 715 // to run tests on the prototype object, if we obtain one through some |
| 677 // other means. | 716 // other means. |
| 678 return; | 717 return; |
| 679 } | 718 } |
| 680 | 719 |
| 720 if (!this.exposed) { |
| 721 test(function() { |
| 722 assert_false(this.name in self); |
| 723 }.bind(this), this.name + " interface: existence and properties of inter
face object"); |
| 724 return; |
| 725 } |
| 726 |
| 681 if (!this.untested) | 727 if (!this.untested) |
| 682 { | 728 { |
| 683 // First test things to do with the exception/interface object and | 729 // First test things to do with the exception/interface object and |
| 684 // exception/interface prototype object. | 730 // exception/interface prototype object. |
| 685 this.test_self(); | 731 this.test_self(); |
| 686 } | 732 } |
| 687 // Then test things to do with its members (constants, fields, attributes, | 733 // Then test things to do with its members (constants, fields, attributes, |
| 688 // operations, . . .). These are run even if .untested is true, because | 734 // operations, . . .). These are run even if .untested is true, because |
| 689 // members might themselves be marked as .untested. This might happen to | 735 // members might themselves be marked as .untested. This might happen to |
| 690 // interfaces if the interface itself is untested but a partial interface | 736 // interfaces if the interface itself is untested but a partial interface |
| 691 // that extends it is tested -- then the interface itself and its initial | 737 // that extends it is tested -- then the interface itself and its initial |
| 692 // members will be marked as untested, but the members added by the partial | 738 // members will be marked as untested, but the members added by the partial |
| 693 // interface are still tested. | 739 // interface are still tested. |
| 694 this.test_members(); | 740 this.test_members(); |
| 695 }; | 741 }; |
| 696 //@} | 742 //@} |
| 697 | 743 |
| 698 IdlInterface.prototype.test_self = function() | 744 IdlInterface.prototype.test_self = function() |
| 699 //@{ | 745 //@{ |
| 700 { | 746 { |
| 701 test(function() | 747 test(function() |
| 702 { | 748 { |
| 703 // This function tests WebIDL as of 2015-01-13. | 749 // This function tests WebIDL as of 2015-01-13. |
| 704 // TODO: Consider [Exposed]. | |
| 705 | 750 |
| 706 // "For every interface that is exposed in a given ECMAScript global | 751 // "For every interface that is exposed in a given ECMAScript global |
| 707 // environment and: | 752 // environment and: |
| 708 // * is a callback interface that has constants declared on it, or | 753 // * is a callback interface that has constants declared on it, or |
| 709 // * is a non-callback interface that is not declared with the | 754 // * is a non-callback interface that is not declared with the |
| 710 // [NoInterfaceObject] extended attribute, | 755 // [NoInterfaceObject] extended attribute, |
| 711 // a corresponding property MUST exist on the ECMAScript global object. | 756 // a corresponding property MUST exist on the ECMAScript global object. |
| 712 // The name of the property is the identifier of the interface, and its | 757 // The name of the property is the identifier of the interface, and its |
| 713 // value is an object called the interface object. | 758 // value is an object called the interface object. |
| 714 // The property has the attributes { [[Writable]]: true, | 759 // The property has the attributes { [[Writable]]: true, |
| (...skipping 1081 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1796 /** An array of values produced by the "typedef" production. */ | 1841 /** An array of values produced by the "typedef" production. */ |
| 1797 this.values = obj.values; | 1842 this.values = obj.values; |
| 1798 | 1843 |
| 1799 } | 1844 } |
| 1800 //@} | 1845 //@} |
| 1801 | 1846 |
| 1802 IdlTypedef.prototype = Object.create(IdlObject.prototype); | 1847 IdlTypedef.prototype = Object.create(IdlObject.prototype); |
| 1803 | 1848 |
| 1804 }()); | 1849 }()); |
| 1805 // vim: set expandtab shiftwidth=4 tabstop=4 foldmarker=@{,@} foldmethod=marker: | 1850 // vim: set expandtab shiftwidth=4 tabstop=4 foldmarker=@{,@} foldmethod=marker: |
| OLD | NEW |