Skip to content
This repository was archived by the owner on Sep 19, 2018. It is now read-only.

Commit 6ea11dc

Browse files
bzbarskyjgraham
authored andcommitted
Fix interface [Exposed] handling to handle string args, not just list args, and implement [Exposed] handling for interface members.
1 parent afeb016 commit 6ea11dc

File tree

1 file changed

+39
-8
lines changed

1 file changed

+39
-8
lines changed

idlharness.js

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,24 @@ IdlArray.prototype.recursively_get_implements = function(interface_name)
322322
return ret;
323323
};
324324

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+
325343
function exposed_in(globals) {
326344
if ('document' in self) {
327345
return globals.indexOf("Window") >= 0;
@@ -396,15 +414,9 @@ IdlArray.prototype.test = function()
396414
return;
397415
}
398416

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"]);
407418
member.exposed = exposed_in(globals);
419+
member.exposureSet = globals;
408420
}.bind(this));
409421

410422
// Now run test() on every member, and test_object() for every object.
@@ -1494,6 +1506,19 @@ IdlInterface.prototype.test_members = function()
14941506
continue;
14951507
}
14961508

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+
14971522
switch (member.type) {
14981523
case "const":
14991524
this.test_member_const(member);
@@ -1627,6 +1652,12 @@ IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expect
16271652
for (var i = 0; i < this.members.length; i++)
16281653
{
16291654
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+
}
16301661
if (member.type == "attribute" && member.isUnforgeable)
16311662
{
16321663
var a_test = async_test(this.name + " interface: " + desc + ' must have own property "' + member.name + '"');

0 commit comments

Comments
 (0)