[whatwg] relationship between Document and HTMLDocument

David Flanagan dflanagan at mozilla.com
Tue Aug 9 08:18:17 PDT 2011

§3.1.1 includes the following:

interface HTMLDocument { ... };
Document implements HTMLDocument;

If I'm reading WebIDL correctly, this means that this expression must be 

    document instanceof HTMLDocument

And also that this code will have no visible effect on the document object:

     HTMLDocument.prototype.foo = function() { ... }

Furthermore, if I want to monkeypatch a method like getElementsByName() 
that is defined by HTML, the correct place to do that is on 
Document.prototype, not HTMLDocument.prototype

Currently, of course (tested in FF, Chrome and Safari), browsers treat 
HTMLDocument as if it were declared like this:

     interface HTMLDocument : Document { ... };

This means that in the current generation of browsers:

    document instanceof HTMLDocument    // => true
    HTMLDocument.prototype.foo = function() {...}  // affects document
    Document.prototype.getElementsByName // undefined; can't monkeypatch it

I would guess (but have no data) that web compatibility will make these 
behaviors difficult to change.

I assume that the use of an implements declaration rather than direct 
inheritance is done to create a clean boundary between the DOM spec and 
the HTML spec.  But it seems to me that this clean boundary does not 
reflect messy reality.

Ian: any chance you'd change HTML to specify that HTMLDocument is a 
regular subclass of Document?

Anne: that would probably mean that you'd have to change the DOM spec to 
say that DOMImplementation.create*Document() creates an HTMLDocument 
even though your spec does not define that interface...


More information about the whatwg mailing list