[canvaskit] Make font names programmatically accessible

Change-Id: I384e4f37fa274665438b523f0636bfc1856ec0ae
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/264574
Reviewed-by: Ben Wagner <bungeman@google.com>
diff --git a/modules/canvaskit/CHANGELOG.md b/modules/canvaskit/CHANGELOG.md
index 3ddc977..7ba10bb 100644
--- a/modules/canvaskit/CHANGELOG.md
+++ b/modules/canvaskit/CHANGELOG.md
@@ -6,10 +6,17 @@
 
 ## [Unreleased]
 
+### Added
+ - `SkFontMgr.countFamilies` and `SkFontMgr.getFamilyName` to expose the parsed font names.
+
 ### Changed
  - SKP serialization/deserialization now available (can be disabled with the 'no_skp').
    `SkPicture.DEBUGONLY_saveAsFile` renamed to `SkPicture.saveAsFile` and
    `CanvasKit.MakeSkPicture` is now exposed. SKP support is not shipped to npm builds.
+   `force_serialize_skp` has been removed since it opt-out, not opt-in.
+
+### Fixed
+ - Bug that sometimes resulted in 'Cannot perform Construct on a neutered ArrayBuffer'
 
 ## [0.11.0] - 2020-01-10
 
diff --git a/modules/canvaskit/canvaskit_bindings.cpp b/modules/canvaskit/canvaskit_bindings.cpp
index 62af7be..4c4964c 100644
--- a/modules/canvaskit/canvaskit_bindings.cpp
+++ b/modules/canvaskit/canvaskit_bindings.cpp
@@ -1126,6 +1126,15 @@
             return SkFontMgr_New_Custom_Data(datas, sizes, numFonts);
         }), allow_raw_pointers())
         .class_function("RefDefault", &SkFontMgr::RefDefault)
+        .function("countFamilies", &SkFontMgr::countFamilies)
+        .function("getFamilyName", optional_override([](SkFontMgr& self, int index)->JSString {
+            if (index < 0 || index >= self.countFamilies()) {
+                return emscripten::val::null();
+            }
+            SkString s;
+            self.getFamilyName(index, &s);
+            return emscripten::val(s.c_str());
+        }))
 #ifdef SK_DEBUG
         .function("dumpFamilies", optional_override([](SkFontMgr& self) {
             int numFam = self.countFamilies();
@@ -1137,7 +1146,6 @@
             }
         }))
 #endif
-        .function("countFamilies", &SkFontMgr::countFamilies)
         .function("_makeTypefaceFromData", optional_override([](SkFontMgr& self,
                                                 uintptr_t /* uint8_t*  */ fPtr,
                                                 int flen)->sk_sp<SkTypeface> {
diff --git a/modules/canvaskit/externs.js b/modules/canvaskit/externs.js
index a824464..9e53f45 100644
--- a/modules/canvaskit/externs.js
+++ b/modules/canvaskit/externs.js
@@ -255,6 +255,7 @@
 		FromData: function() {},
 		RefDefault: function() {},
 		countFamilies: function() {},
+		getFamilyName: function() {},
 
 		// private API
 		_makeTypefaceFromData: function() {},
diff --git a/modules/canvaskit/tests/font.spec.js b/modules/canvaskit/tests/font.spec.js
index 2cf748a..aacff8c 100644
--- a/modules/canvaskit/tests/font.spec.js
+++ b/modules/canvaskit/tests/font.spec.js
@@ -1,4 +1,4 @@
-describe('CanvasKit\'s Path Behavior', function() {
+describe('CanvasKit\'s Font Behavior', function() {
     let container = document.createElement('div');
     document.body.appendChild(container);
     const CANVAS_WIDTH = 600;
diff --git a/modules/canvaskit/tests/paragraph.spec.js b/modules/canvaskit/tests/paragraph.spec.js
index c6b437e..71dfa68 100644
--- a/modules/canvaskit/tests/paragraph.spec.js
+++ b/modules/canvaskit/tests/paragraph.spec.js
@@ -51,6 +51,8 @@
             paint.setStyle(CanvasKit.PaintStyle.Stroke);
 
             const fontMgr = CanvasKit.SkFontMgr.FromData(notoSerifFontBuffer);
+            expect(fontMgr.countFamilies()).toEqual(1);
+            expect(fontMgr.getFamilyName(0)).toEqual('Noto Serif');
 
             const wrapTo = 200;
 
@@ -218,9 +220,9 @@
             const canvas = surface.getCanvas();
 
             const fontMgr = CanvasKit.SkFontMgr.FromData([notoSerifFontBuffer, emojiFontBuffer]);
-            if (fontMgr.dumpFamilies) {
-                fontMgr.dumpFamilies();
-            }
+            expect(fontMgr.countFamilies()).toEqual(2);
+            expect(fontMgr.getFamilyName(0)).toEqual('Noto Serif');
+            expect(fontMgr.getFamilyName(1)).toEqual('Noto Color Emoji');
 
             const wrapTo = 450;