diff --git a/src/display/font_loader.js b/src/display/font_loader.js index a7deaaf1f0aee7..7ea08c6ab07019 100644 --- a/src/display/font_loader.js +++ b/src/display/font_loader.js @@ -15,7 +15,7 @@ * limitations under the License. */ /* globals PDFJS, shadow, isWorker, assert, warn, bytesToString, string32, - globalScope */ + globalScope, FontFace, Promise */ 'use strict'; @@ -40,6 +40,12 @@ var FontLoader = { if (styleElement) { styleElement.parentNode.removeChild(styleElement); } +//#if !(MOZCENTRAL) + this.nativeFontFaces.forEach(function(nativeFontFace) { + document.fonts.delete(nativeFontFace); + }); + this.nativeFontFaces.length = 0; +//#endif }, //#if !(MOZCENTRAL) get loadTestFont() { @@ -97,10 +103,21 @@ var FontLoader = { return false; })(), + nativeFontFaces: [], + + isFontLoadingAPISupported: !isWorker && !!document.fonts, + + addNativeFontFace: function fontLoader__addNativeFontFace(nativeFontFace) { + this.nativeFontFaces.push(nativeFontFace); + document.fonts.add(nativeFontFace); + }, + bind: function fontLoaderBind(fonts, callback) { assert(!isWorker, 'bind() shall be called from main thread'); - var rules = [], fontsToLoad = []; + var rules = []; + var fontsToLoad = []; + var fontLoadPromises = []; for (var i = 0, ii = fonts.length; i < ii; i++) { var font = fonts[i]; @@ -111,15 +128,26 @@ var FontLoader = { } font.attached = true; - var rule = font.bindDOM(); - if (rule) { - rules.push(rule); - fontsToLoad.push(font); + if (this.isFontLoadingAPISupported) { + var nativeFontFace = font.createNativeFontFace(); + if (nativeFontFace) { + fontLoadPromises.push(nativeFontFace.loaded); + } + } else { + var rule = font.bindDOM(); + if (rule) { + rules.push(rule); + fontsToLoad.push(font); + } } } var request = FontLoader.queueLoadingCallback(callback); - if (rules.length > 0 && !this.isSyncFontLoadingSupported) { + if (this.isFontLoadingAPISupported) { + Promise.all(fontsToLoad).then(function() { + request.complete(); + }); + } else if (rules.length > 0 && !this.isSyncFontLoadingSupported) { FontLoader.prepareFontLoadEvent(rules, fontsToLoad, request); } else { request.complete(); @@ -284,6 +312,29 @@ var FontFaceObject = (function FontFaceObjectClosure() { } } FontFaceObject.prototype = { +//#if !(MOZCENTRAL) + createNativeFontFace: function FontFaceObject__createNativeFontFace() { + if (!this.data) { + return null; + } + + if (PDFJS.disableFontFace) { + this.disableFontFace = true; + return null; + } + + var nativeFontFace = new FontFace(this.loadedName, this.data); + + FontLoader.addNativeFontFace(nativeFontFace); + + if (PDFJS.pdfBug && 'FontInspector' in globalScope && + globalScope['FontInspector'].enabled) { + globalScope['FontInspector'].fontAdded(this); + } + return nativeFontFace; + }, +//#endif + bindDOM: function FontFaceObject_bindDOM() { if (!this.data) { return null; diff --git a/web/debugger.js b/web/debugger.js index 81da232ee77c21..a9d173b72fae2a 100644 --- a/web/debugger.js +++ b/web/debugger.js @@ -112,13 +112,20 @@ var FontInspector = (function FontInspectorClosure() { return moreInfo; } var moreInfo = properties(fontObj, ['name', 'type']); - var m = /url\(['"]?([^\)"']+)/.exec(url); var fontName = fontObj.loadedName; var font = document.createElement('div'); var name = document.createElement('span'); name.textContent = fontName; var download = document.createElement('a'); - download.href = m[1]; + if (url) { + url = /url\(['"]?([^\)"']+)/.exec(url); + download.href = url[1]; + } else if (fontObj.data) { + url = URL.createObjectURL(new Blob([fontObj.data], { + type: fontObj.mimeType + })); + } + download.href = url; download.textContent = 'Download'; var logIt = document.createElement('a'); logIt.href = '';