blob: acbce43027f29b6216884068d40d19d7950d6d07 [file] [log] [blame]
import { Container } from "./container.js";
import { Attribute } from "./attribute.js";
import { Operation } from "./operation.js";
import { validationError } from "../error.js";
import { autofixAddExposedWindow } from "./helpers.js";
import { Constant } from "./constant.js";
export class Namespace extends Container {
/**
* @param {import("../tokeniser.js").Tokeniser} tokeniser
* @param {object} [options]
* @param {import("./container.js").AllowedMember[]} [options.extMembers]
* @param {import("../tokeniser.js").Token} [options.partial]
*/
static parse(tokeniser, { extMembers = [], partial } = {}) {
const tokens = { partial };
tokens.base = tokeniser.consume("namespace");
if (!tokens.base) {
return;
}
return Container.parse(
tokeniser,
new Namespace({ source: tokeniser.source, tokens }),
{
allowedMembers: [
...extMembers,
[Attribute.parse, { noInherit: true, readonly: true }],
[Constant.parse],
[Operation.parse, { regular: true }],
],
},
);
}
get type() {
return "namespace";
}
*validate(defs) {
if (
!this.partial &&
this.extAttrs.every((extAttr) => extAttr.name !== "Exposed")
) {
const message = `Namespaces must have [Exposed] extended attribute. \
To fix, add, for example, [Exposed=Window]. Please also consider carefully \
if your namespace should also be exposed in a Worker scope. Refer to the \
[WebIDL spec section on Exposed](https://heycam.github.io/webidl/#Exposed) \
for more information.`;
yield validationError(
this.tokens.name,
this,
"require-exposed",
message,
{
autofix: autofixAddExposedWindow(this),
},
);
}
yield* super.validate(defs);
}
}