diff --git a/js/core/css/webidl.css b/js/core/css/webidl.css index 92a667feee..05e45ee19e 100644 --- a/js/core/css/webidl.css +++ b/js/core/css/webidl.css @@ -228,7 +228,7 @@ a.idlEnumItem { color: #c00; } -.idlImplements a { +.idlImplements a, .idlIncludes a { font-weight: bold; } diff --git a/js/core/templates/webidl-contiguous/includes.html b/js/core/templates/webidl-contiguous/includes.html new file mode 100644 index 0000000000..3b486f27d7 --- /dev/null +++ b/js/core/templates/webidl-contiguous/includes.html @@ -0,0 +1,2 @@ +{{extAttr obj indent +}}{{idn indent}}{{obj.target}} includes {{obj.includes}}; \ No newline at end of file diff --git a/js/core/templates/webidl-contiguous/interface.html b/js/core/templates/webidl-contiguous/interface.html index 8db2f81bc5..e2600bbb21 100644 --- a/js/core/templates/webidl-contiguous/interface.html +++ b/js/core/templates/webidl-contiguous/interface.html @@ -1,4 +1,4 @@ {{extAttr obj indent -}}{{idn indent}}{{partial}}{{callback}}interface {{#tryLink obj}}{{obj.name}}{{/tryLink +}}{{idn indent}}{{partial}}{{callback}}interface {{mixin}}{{#tryLink obj}}{{obj.name}}{{/tryLink }}{{#if obj.inheritance}} : {{obj.inheritance}}{{/if}} { {{{children}}}{{idn indent}}}; \ No newline at end of file diff --git a/src/core/webidl.js b/src/core/webidl.js index dcf4b72755..59f8e6f62c 100644 --- a/src/core/webidl.js +++ b/src/core/webidl.js @@ -22,6 +22,7 @@ var idlEnumItemTmpl = tmpls["enum-item.html"]; var idlEnumTmpl = tmpls["enum.html"]; var idlExtAttributeTmpl = tmpls["extended-attribute.html"]; var idlFieldTmpl = tmpls["field.html"]; +var idlIncludesTmpl = tmpls["includes.html"]; var idlImplementsTmpl = tmpls["implements.html"]; var idlInterfaceTmpl = tmpls["interface.html"]; var idlIterableTmpl = tmpls["iterable.html"]; @@ -514,12 +515,16 @@ function writeDefinition(obj, indent) { switch (obj.type) { case "typedef": return idlTypedefTmpl(opt); + case "includes": + return idlIncludesTmpl(opt); case "implements": return idlImplementsTmpl(opt); case "interface": return writeInterfaceDefinition(opt); + case "interface mixin": + return writeInterfaceDefinition(opt, { mixin: true }); case "callback interface": - return writeInterfaceDefinition(opt, "callback "); + return writeInterfaceDefinition(opt, { callback: true }); case "dictionary": var maxQualifiers = 0, maxType = 0; @@ -643,20 +648,20 @@ function writeDefinition(obj, indent) { } } -function writeInterfaceDefinition(opt, callback) { +function writeInterfaceDefinition(opt, fixes = {}) { var obj = opt.obj, indent = opt.indent; var maxAttr = 0, maxAttrQualifiers = 0, maxMeth = 0, maxConst = 0; - obj.members.forEach(function(it) { + for (const it of obj.members) { if ( typeIsWhitespace(it.type) || it.type === "maplike" || it.type === "iterable" ) { - return; + continue; } var len = idlType2Text(it.idlType).length; if (it.type === "attribute") { @@ -666,7 +671,7 @@ function writeInterfaceDefinition(opt, callback) { qualifiersLen > maxAttrQualifiers ? qualifiersLen : maxAttrQualifiers; } else if (it.type === "operation") maxMeth = len > maxMeth ? len : maxMeth; else if (it.type === "const") maxConst = len > maxConst ? len : maxConst; - }); + } var children = obj.members .map(function(ch) { switch (ch.type) { @@ -692,11 +697,12 @@ function writeInterfaceDefinition(opt, callback) { }) .join(""); return idlInterfaceTmpl({ - obj: obj, - indent: indent, + obj, + indent, partial: obj.partial ? "partial " : "", - callback: callback, - children: children, + callback: fixes.callback ? "callback " : "", + mixin: fixes.mixin ? "mixin ": "", + children, }); } @@ -867,6 +873,7 @@ function linkDefinitions(parse, definitionMap, parent, idlElem) { .filter( ({ type }) => [ + "includes", "implements", "ws", "ws-pea", @@ -881,8 +888,8 @@ function linkDefinitions(parse, definitionMap, parent, idlElem) { // Top-level entities with linkable members. case "callback interface": case "dictionary": - case "exception": case "interface": + case "interface mixin": var partialIdx = ""; if (defn.partial) { if (!idlPartials[defn.name]) { diff --git a/tests/spec/core/webidl-spec.js b/tests/spec/core/webidl-spec.js index 56bf6be69d..e184440579 100644 --- a/tests/spec/core/webidl-spec.js +++ b/tests/spec/core/webidl-spec.js @@ -143,6 +143,14 @@ describe("Core - WebIDL", function() { text = "callback interface SuperStar {\n};"; expect($target.text()).toEqual(text); + $target = $("#if-mixin", doc); + text = "interface mixin SuperStar {\n};"; + expect($target.text()).toEqual(text); + + $target = $("#if-partial-mixin", doc); + text = "partial interface mixin SuperStar {\n};"; + expect($target.text()).toEqual(text); + $target = $("#if-doc", doc); expect( $target.find(":contains('DocInterface')").filter("a").attr("href") @@ -579,7 +587,18 @@ describe("Core - WebIDL", function() { done(); }); - it("should handle implements", function(done) { + it("should handle includes", () => { + var $target = $("#incl-basic", doc); + var text = "Window includes Breakable;"; + expect($target.text()).toEqual(text); + expect($target.find(".idlIncludes").length).toEqual(1); + + $target = $("#incl-less-basic", doc); + text = "[Something]\n" + text; + expect($target.text()).toEqual(text); + }); + + it("should handle implements", () => { var $target = $("#impl-basic", doc); var text = "Window implements Breakable;"; expect($target.text()).toEqual(text); @@ -588,7 +607,6 @@ describe("Core - WebIDL", function() { $target = $("#impl-less-basic", doc); text = "[Something]\n" + text; expect($target.text()).toEqual(text); - done(); }); it("should link documentation", function() { diff --git a/tests/spec/core/webidl.html b/tests/spec/core/webidl.html index 22daf3daff..52ce187e1e 100644 --- a/tests/spec/core/webidl.html +++ b/tests/spec/core/webidl.html @@ -189,6 +189,15 @@

Interfaces

         callback interface SuperStar {};
       
+

+ Interface mixin . +

+
+        interface mixin SuperStar {};
+      
+
+        partial interface mixin SuperStar {};
+      
         interface DocInterface {};
         interface DocIsNotCaseSensitive {};
@@ -505,6 +514,21 @@ 

Implements

[Something]Window implements Breakable;
+
+

Includes

+

+ Basic includes. +

+
+        Window includes Breakable;
+      
+

+ Less basic includes. +

+
+        [Something]Window includes Breakable;
+      
+

Documentation