jsdom / webidl2js

Auto-generate JS class structures for Web IDL specifications
MIT License
79 stars 30 forks source link

Monkey patch partial interface definitions #84

Open danyao opened 7 years ago

danyao commented 7 years ago

When a spec defines a partial addition to an existing interface, it will be useful if webidl2js can generate the monkey patch required to implement the addition.

For example, from the Credential Management Level 1 spec:

partial interface Navigator {
  [SecureContext, SameObject] readonly attribute CredentialsContainer credentials;
};

Currently webild2js assumes that Navigator is defined somewhere else in the provided webidl and errors out in parsing as it's not found:

TypeError: Cannot read property 'idl' of undefined
    at Transformer._parse (/Users/danyao/sandbox/webidl2js/e2e/node_modules/webidl2js/lib/transformer.js:143:58)
    at Transformer.<anonymous> (/Users/danyao/sandbox/webidl2js/e2e/node_modules/webidl2js/lib/transformer.js:250:12)
    at Generator.next (<anonymous>)
    at onFulfilled (/Users/danyao/sandbox/webidl2js/e2e/node_modules/co/index.js:65:19)
    at <anonymous>

What we need is probably something like this:

const CredentialsContainer = require("./CredentialsContainer");
navigator.credentials = Object.create(CredentialsContainer.interface.prototype);

We might need to also account for the fact that CredentialsContainer may be provided natively by the UA, so may not have the interface attribute (see https://github.com/jsdom/webidl2js/issues/81).

Sebmaster commented 7 years ago

Can you work around this by adding all the necessary dependent idl interfaces and throwing away the output of the unnecessary files?

Sebmaster commented 7 years ago

Oh, if you're monkey patching anyways, do you even need the partial Navigator idl at all?

domenic commented 7 years ago

It seems to me that between this and #81 there's room for a "assume existing globals" mode (or "polyfill mode") which makes this sort of thing seamlessly work.

danyao commented 7 years ago

An polyfill mode would be great!

For my use case, I'm using webidl2js to generate JavaScript polyfills for use in a browser. Adding necessary dependent IDL interfaces and throwing away the output can work, but would be tricky to automate into the build process.

The partial Navigator IDL is convenient so I can use the same IDL source for both interface generating using webidl2js and running Web Platform Test idlharness test to cover the entire interface definition.