Dealing with another crash when some fonts are unresolved

Only happens when resources/fonts have certain fonts
Bugs: skia:10255

Change-Id: Ib346f8d005685290c90886c455def14bb5d49f79
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/294997
Commit-Queue: Julia Lavrova <jlavrova@google.com>
Reviewed-by: Julia Lavrova <jlavrova@google.com>
Reviewed-by: Ben Wagner <bungeman@google.com>
diff --git a/modules/skparagraph/samples/SampleParagraph.cpp b/modules/skparagraph/samples/SampleParagraph.cpp
index ccbb49c..4ddac51 100644
--- a/modules/skparagraph/samples/SampleParagraph.cpp
+++ b/modules/skparagraph/samples/SampleParagraph.cpp
@@ -2842,6 +2842,60 @@
     typedef Sample INHERITED;
 };
 
+class ParagraphView45 : public ParagraphView_Base {
+protected:
+    SkString name() override { return SkString("Paragraph45"); }
+
+    void onDrawContent(SkCanvas* canvas) override {
+
+      // This test crashed when resources/fonts directory had only 5 fonts listed below
+      std::string fonts = GetResourcePath("fonts/").c_str();
+      std::set<std::pair<std::string, std::string>> font_paths = {
+          {"Roboto", "Roboto-Regular.ttf"},
+          {"Roboto", "Roboto-Bold.ttf"},
+          {"Noto","NotoSansCJK-Regular.ttc"},
+          {"Noto", "NotoSansCJK-Bold.ttc"},
+          {"Emoji","NotoColorEmoji.ttf"}};
+
+      sk_sp<TypefaceFontProvider> font_provider = sk_make_sp<TypefaceFontProvider>();
+
+      for (auto& pair : font_paths) {
+        SkString family_name = SkString(pair.first.c_str());
+        std::string path = fonts;
+        path += pair.second;
+
+        auto data = SkData::MakeFromFileName(path.c_str());
+        font_provider->registerTypeface(SkTypeface::MakeFromData(std::move(data)), family_name);
+      }
+
+      sk_sp<FontCollection> font_collection = sk_make_sp<FontCollection>();
+      font_collection->setAssetFontManager(std::move(font_provider));
+      font_collection->getParagraphCache()->turnOn(false);
+
+        const std::u16string text = u"β€οΈπŸ•΅πŸΎ‍♀️ πŸ•΅πŸΎ πŸ‘©πŸΎ‍βš•οΈ πŸ‘¨πŸΎ‍βš•οΈ πŸ‘©πŸΎ‍🌾 πŸ‘¨πŸΎ‍🌾 πŸ‘©πŸΎ‍🍳 πŸ‘¨πŸΎ‍🍳 πŸ‘©πŸΎ‍πŸŽ“ πŸ‘¨πŸΎ‍πŸŽ“ πŸ‘©πŸΎ‍🎀 πŸ‘¨πŸΎ‍🎀 πŸ‘©πŸΎ‍🏫 πŸ‘¨πŸΎ‍🏫 πŸ‘©πŸΎ‍🏭 πŸ‘¨πŸΎ‍🏭 πŸ‘©πŸΎ‍πŸ’» πŸ‘¨πŸΎ‍πŸ’» πŸ‘©πŸΎ‍πŸ’Ό πŸ‘¨πŸΎ‍πŸ’Ό πŸ‘©πŸΎ‍πŸ”§ πŸ‘¨πŸΎ‍πŸ”§ πŸ‘©πŸΎ‍πŸ”¬ πŸ‘¨πŸΎ‍πŸ”¬ πŸ‘©πŸΎ‍🎨 πŸ‘¨πŸΎ‍🎨 πŸ‘©πŸΎ‍πŸš’ πŸ‘¨πŸΎ‍πŸš’ πŸ‘©πŸΎ‍✈️ πŸ‘¨πŸΎ‍✈️ πŸ‘©πŸΎ‍πŸš€ πŸ‘¨πŸΎ‍πŸš€ πŸ‘©πŸΎ‍βš–οΈ πŸ‘¨πŸΎ‍βš–οΈ 🀢🏾 πŸŽ…πŸΎ";
+        canvas->drawColor(SK_ColorWHITE);
+
+        ParagraphStyle paragraph_style;
+        paragraph_style.setMaxLines(1);
+        paragraph_style.setHeight(0);
+        paragraph_style.setEllipsis(u"\u2026");
+        ParagraphBuilderImpl builder(paragraph_style, font_collection);
+        TextStyle text_style;
+        text_style.setColor(SK_ColorBLACK);
+        text_style.setFontFamilies({SkString("Roboto"), SkString("Noto"), SkString("Emoji")});
+        text_style.setFontSize(20);
+        text_style.setFontStyle(SkFontStyle::Bold());
+        builder.pushStyle(text_style);
+        builder.addText(text);
+        auto paragraph = builder.Build();
+        paragraph->layout(width());
+        paragraph->paint(canvas, 0, 0);
+    }
+
+private:
+    typedef Sample INHERITED;
+};
+
 }  // namespace
 
 //////////////////////////////////////////////////////////////////////////////
@@ -2887,3 +2941,4 @@
 DEF_SAMPLE(return new ParagraphView42();)
 DEF_SAMPLE(return new ParagraphView43();)
 DEF_SAMPLE(return new ParagraphView44();)
+DEF_SAMPLE(return new ParagraphView45();)