getFontFaces

by denvdmj

CSS

@font-face {
    font-family: foo;
    src: url('bar.otf');
}

@font-face {
  font-family: mono-coding;
  src: local(PragmataPro Mono), local(PragmataPro), local(Iosevka), local(Consolas);
}

JavaScript

function getFonts () {
    var o = {},
        sheet = document.styleSheets,
        rule = null,
        i = sheet.length, j;
    
    while ( 0 <= --i ) {
        rule = sheet[i].rules || sheet[i].cssRules || [];
        j = rule.length;
        while ( 0 <= --j ) {
            if ( rule[j].constructor.name === 'CSSFontFaceRule' ) {
                o[ rule[j].style.fontFamily ] = rule[j].style.src;
            };
        }
    }
    return o;
}

const getFontFaces = () => {
  const fmap = {};
  for (let sheet of document.styleSheets) {
    let cssRulesEntries;
    // test on cors error
    try {
      cssRulesEntries = [].entries.call(sheet.cssRules);
    } catch (e) {
      continue;
    }
    for (let [index, rule] of cssRulesEntries) {
      if (rule.type === CSSRule.FONT_FACE_RULE) {
        const style = rule.style;
        fmap[ style.fontFamily ] = style.src;
      }
    }
  }
  return fmap;
}

console.log( getFonts() );
console.log( getFontFaces() );