Support for the FreeMonoTengwar font and ConScript encoding
[tengwarjs.git] / detect-web-font.js
1
2 /*!
3 * isFontFaceSupported - v0.9 - 12/19/2009
4 * http://paulirish.com/2009/font-face-feature-detection/
5 *
6 * Copyright (c) 2009 Paul Irish
7 * MIT license
8 */
9
10 module.exports = (function makeDetectWebFont() {
11
12 var fontret,
13 fontfaceCheckDelay = 100;
14
15 // IE supports EOT and has had EOT support since IE 5.
16 // This is a proprietary standard (ATOW) and thus this off-spec,
17 // proprietary test for it is acceptable.
18 if (!(!/*@cc_on@if(@_jscript_version>=5)!@end@*/0)) fontret = true;
19
20 else {
21
22 // Create variables for dedicated @font-face test
23 var doc = document, docElement = doc.documentElement,
24 st = doc.createElement('style'),
25 spn = doc.createElement('span'),
26 wid, nwid, body = doc.body,
27 callback, isCallbackCalled;
28
29 // The following is a font, only containing the - character. Thanks Ethan Dunham.
30 st.textContent = "@font-face{font-family:testfont;src:url(data:font/opentype;base64,T1RUTwALAIAAAwAwQ0ZGIMA92IQAAAVAAAAAyUZGVE1VeVesAAAGLAAAABxHREVGADAABAAABgwAAAAgT1MvMlBHT5sAAAEgAAAAYGNtYXAATQPNAAAD1AAAAUpoZWFk8QMKmwAAALwAAAA2aGhlYQS/BDgAAAD0AAAAJGhtdHgHKQAAAAAGSAAAAAxtYXhwAANQAAAAARgAAAAGbmFtZR8kCUMAAAGAAAACUnBvc3T/uAAyAAAFIAAAACAAAQAAAAEAQVTDUm9fDzz1AAsD6AAAAADHUuOGAAAAAMdS44YAAADzAz8BdgAAAAgAAgAAAAAAAAABAAABdgDzAAkDQQAAAAADPwABAAAAAAAAAAAAAAAAAAAAAwAAUAAAAwAAAAICmgGQAAUAAAK8AooAAACMArwCigAAAd0AMgD6AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAEZIRAAAQAAgAC0C7v8GAAABdv8NAAAAAQAAAAAAAAAAACAAIAABAAAAFAD2AAEAAAAAAAAAPAB6AAEAAAAAAAEAAgC9AAEAAAAAAAIABwDQAAEAAAAAAAMAEQD8AAEAAAAAAAQAAwEWAAEAAAAAAAUABQEmAAEAAAAAAAYAAgEyAAEAAAAAAA0AAQE5AAEAAAAAABAAAgFBAAEAAAAAABEABwFUAAMAAQQJAAAAeAAAAAMAAQQJAAEABAC3AAMAAQQJAAIADgDAAAMAAQQJAAMAIgDYAAMAAQQJAAQABgEOAAMAAQQJAAUACgEaAAMAAQQJAAYABAEsAAMAAQQJAA0AAgE1AAMAAQQJABAABAE7AAMAAQQJABEADgFEAEcAZQBuAGUAcgBhAHQAZQBkACAAaQBuACAAMgAwADAAOQAgAGIAeQAgAEYAbwBuAHQATABhAGIAIABTAHQAdQBkAGkAbwAuACAAQwBvAHAAeQByAGkAZwBoAHQAIABpAG4AZgBvACAAcABlAG4AZABpAG4AZwAuAABHZW5lcmF0ZWQgaW4gMjAwOSBieSBGb250TGFiIFN0dWRpby4gQ29weXJpZ2h0IGluZm8gcGVuZGluZy4AAFAASQAAUEkAAFIAZQBnAHUAbABhAHIAAFJlZ3VsYXIAAEYATwBOAFQATABBAEIAOgBPAFQARgBFAFgAUABPAFIAVAAARk9OVExBQjpPVEZFWFBPUlQAAFAASQAgAABQSSAAADEALgAwADAAMAAAMS4wMDAAAFAASQAAUEkAACAAACAAAFAASQAAUEkAAFIAZQBnAHUAbABhAHIAAFJlZ3VsYXIAAAAAAAADAAAAAwAAABwAAQAAAAAARAADAAEAAAAcAAQAKAAAAAYABAABAAIAIAAt//8AAAAgAC3////h/9UAAQAAAAAAAAAAAQYAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAA/7UAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAEBAABAQEDUEkAAQIAAQAu+BAA+BsB+BwC+B0D+BgEWQwDi/eH+dP4CgUcAIwPHAAAEBwAkREcAB4cAKsSAAMCAAEAPQA/AEFHZW5lcmF0ZWQgaW4gMjAwOSBieSBGb250TGFiIFN0dWRpby4gQ29weXJpZ2h0IGluZm8gcGVuZGluZy5QSVBJAAAAAAEADgADAQECAxQODvb3h/cXAfeHBPnT9xf90wYO+IgU+WoVHgoDliX/DAmLDAr3Fwr3FwwMHgoG/wwSAAAAAAEAAAAOAAAAGAAAAAAAAgABAAEAAgABAAQAAAACAAAAAAABAAAAAMbULpkAAAAAx1KUiQAAAADHUpSJAfQAAAH0AAADQQAA)}";
31 doc.getElementsByTagName('head')[0].appendChild(st);
32
33
34 spn.setAttribute('style','font:99px _,serif;position:absolute;visibility:hidden');
35
36 if (!body){
37 body = docElement.appendChild(doc.createElement('fontface'));
38 }
39
40 // the data-uri'd font only has the - character
41 spn.innerHTML = '-------';
42 spn.id = 'fonttest';
43
44 body.appendChild(spn);
45 wid = spn.offsetWidth;
46
47 spn.style.font = '99px testfont,_,serif';
48
49 // needed for the CSSFontFaceRule false positives (ff3, chrome, op9)
50 fontret = wid !== spn.offsetWidth;
51
52 var delayedCheck = function(){
53 if (isCallbackCalled) return;
54 fontret = wid !== spn.offsetWidth;
55 callback && (isCallbackCalled = true) && callback(fontret);
56 }
57
58 addEventListener('load',delayedCheck,false);
59 setTimeout(delayedCheck,fontfaceCheckDelay);
60 }
61
62 function ret(){ return fontret || wid !== spn.offsetWidth; };
63
64 // allow for a callback
65 return function (fn) {
66 (isCallbackCalled || fontret) ? fn(fontret) : (callback = fn);
67 };
68
69 })();