@@ -322,6 +322,24 @@ IdlArray.prototype.recursively_get_implements = function(interface_name)
322
322
return ret ;
323
323
} ;
324
324
325
+ function exposure_set ( object , default_set ) {
326
+ var exposed = object . extAttrs . filter ( function ( a ) { return a . name == "Exposed" } ) ;
327
+ if ( exposed . length > 1 || exposed . length < 0 ) {
328
+ throw "Unexpected Exposed extended attributes on " + memberName + ": " + exposed ;
329
+ }
330
+
331
+ if ( exposed . length === 0 ) {
332
+ return default_set ;
333
+ }
334
+
335
+ var set = exposed [ 0 ] . rhs . value ;
336
+ // Could be a list or a string.
337
+ if ( typeof set == "string" ) {
338
+ set = [ set ] ;
339
+ }
340
+ return set ;
341
+ }
342
+
325
343
function exposed_in ( globals ) {
326
344
if ( 'document' in self ) {
327
345
return globals . indexOf ( "Window" ) >= 0 ;
@@ -396,15 +414,9 @@ IdlArray.prototype.test = function()
396
414
return ;
397
415
}
398
416
399
- var exposed = member . extAttrs . filter ( function ( a ) { return a . name == "Exposed" } ) ;
400
- if ( exposed . length > 1 ) {
401
- throw "Unexpected Exposed extended attributes on " + memberName + ": " + exposed ;
402
- }
403
-
404
- var globals = exposed . length === 1
405
- ? exposed [ 0 ] . rhs . value
406
- : [ "Window" ] ;
417
+ var globals = exposure_set ( member , [ "Window" ] ) ;
407
418
member . exposed = exposed_in ( globals ) ;
419
+ member . exposureSet = globals ;
408
420
} . bind ( this ) ) ;
409
421
410
422
// Now run test() on every member, and test_object() for every object.
@@ -1494,6 +1506,19 @@ IdlInterface.prototype.test_members = function()
1494
1506
continue ;
1495
1507
}
1496
1508
1509
+ if ( ! exposed_in ( exposure_set ( member , this . exposureSet ) ) ) {
1510
+ test ( function ( ) {
1511
+ // It's not exposed, so we shouldn't find it anywhere.
1512
+ assert_false ( member . name in self [ this . name ] ,
1513
+ "The interface object must not have a property " +
1514
+ format_value ( member . name ) ) ;
1515
+ assert_false ( member . name in self [ this . name ] . prototype ,
1516
+ "The prototype object must not have a property " +
1517
+ format_value ( member . name ) ) ;
1518
+ } . bind ( this ) , this . name + " interface: member " + member . name ) ;
1519
+ continue ;
1520
+ }
1521
+
1497
1522
switch ( member . type ) {
1498
1523
case "const" :
1499
1524
this . test_member_const ( member ) ;
@@ -1627,6 +1652,12 @@ IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expect
1627
1652
for ( var i = 0 ; i < this . members . length ; i ++ )
1628
1653
{
1629
1654
var member = this . members [ i ] ;
1655
+ if ( ! exposed_in ( exposure_set ( member , this . exposureSet ) ) ) {
1656
+ test ( function ( ) {
1657
+ assert_false ( member . name in obj ) ;
1658
+ } . bind ( this ) , this . name + "interface: " + desc + 'must not have property "' + member . name + '"' ) ;
1659
+ continue ;
1660
+ }
1630
1661
if ( member . type == "attribute" && member . isUnforgeable )
1631
1662
{
1632
1663
var a_test = async_test ( this . name + " interface: " + desc + ' must have own property "' + member . name + '"' ) ;
0 commit comments