diff --git a/src/core/webidl.js b/src/core/webidl.js index 21afbaa173..e248dd1a64 100644 --- a/src/core/webidl.js +++ b/src/core/webidl.js @@ -333,6 +333,7 @@ function renderWebIDL(idlElement, index) { // Skip this
 and move on to the next one.
     return [];
   }
+  addDataDfnFor(idlElement, parse);
   // we add "idl" as the canonical match, so both "webidl" and "idl" work
   idlElement.classList.add("def", "idl");
   const highlights = webidl2.write(parse, { templates });
@@ -364,6 +365,29 @@ function renderWebIDL(idlElement, index) {
   addIDLHeader(idlElement);
   return parse;
 }
+
+/**
+ * Add data-dfn-for to the closest section if not present already.
+ * @param {HTMLPreElement} idlElement
+ * @param {ReturnType} parse
+ */
+function addDataDfnFor(idlElement, parse) {
+  const closestSection = idlElement.closest("section");
+  if (!closestSection || closestSection.hasAttribute("data-dfn-for")) return;
+
+  const dfnFors = [];
+  for (const { tokens } of parse) {
+    if (["interface", "dictionary", "enum"].includes(tokens.base.type)) {
+      const dfnFor = tokens.name.value;
+      dfnFors.push(dfnFor);
+    }
+  }
+  if (dfnFors.length === 1) {
+    closestSection.dataset.dfnFor = dfnFors[0];
+  }
+  // TODO: make linker support multiple dfnFors
+}
+
 /**
  * Adds a "WebIDL" decorative header/permalink to a block of WebIDL.
  * @param {HTMLPreElement} pre