Commit 788d98be authored by Dominik Röttsches's avatar Dominik Röttsches Committed by Commit Bot

[GoogleSans] Lookup local() fonts from downloadable fonts

Lookup local() fonts from Android downloadable fonts and the GMS core
provider. Instantiate Mojo connection to the Java side, send IPC
requests for font lookups this way.

Requires
https://chromium-review.googlesource.com/c/chromium/src/+/2347916 and
https://chromium-review.googlesource.com/c/chromium/src/+/2375329.

Bug: 1115064
Change-Id: Ibb0112f9df3f75003a91d880a1476a6f6087a942
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2387017Reviewed-by: default avatarKoji Ishii <kojii@chromium.org>
Reviewed-by: default avatarRune Lillesveen <futhark@chromium.org>
Commit-Queue: Dominik Röttsches <drott@chromium.org>
Cr-Commit-Position: refs/heads/master@{#804471}
parent 6dcaf80a
......@@ -2,12 +2,17 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/files/file.h"
#include "third_party/blink/renderer/platform/fonts/android/font_unique_name_lookup_android.h"
#include "mojo/public/mojom/base/shared_memory.mojom-blink.h"
#include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
#include "third_party/skia/include/core/SkData.h"
#include "third_party/skia/include/core/SkRefCnt.h"
#include "third_party/skia/include/core/SkTypeface.h"
namespace blink {
FontUniqueNameLookupAndroid::~FontUniqueNameLookupAndroid() = default;
......@@ -74,15 +79,26 @@ sk_sp<SkTypeface> FontUniqueNameLookupAndroid::MatchUniqueName(
const String& font_unique_name) {
if (!IsFontUniqueNameLookupReadyForSyncLookup())
return nullptr;
return MatchUniqueNameFromFirmwareFonts(font_unique_name);
sk_sp<SkTypeface> result_font =
MatchUniqueNameFromFirmwareFonts(font_unique_name);
if (result_font)
return result_font;
return MatchUniqueNameFromDownloadableFonts(font_unique_name);
}
void FontUniqueNameLookupAndroid::EnsureServiceConnected() {
if (firmware_font_lookup_service_)
if (firmware_font_lookup_service_ && android_font_lookup_service_)
return;
Platform::Current()->GetBrowserInterfaceBroker()->GetInterface(
firmware_font_lookup_service_.BindNewPipeAndPassReceiver());
if (!firmware_font_lookup_service_) {
Platform::Current()->GetBrowserInterfaceBroker()->GetInterface(
firmware_font_lookup_service_.BindNewPipeAndPassReceiver());
}
if (!android_font_lookup_service_) {
Platform::Current()->GetBrowserInterfaceBroker()->GetInterface(
android_font_lookup_service_.BindNewPipeAndPassReceiver());
}
}
void FontUniqueNameLookupAndroid::ReceiveReadOnlySharedMemoryRegion(
......@@ -104,4 +120,40 @@ sk_sp<SkTypeface> FontUniqueNameLookupAndroid::MatchUniqueNameFromFirmwareFonts(
return SkTypeface::MakeFromFile(match_result->font_path.c_str(),
match_result->ttc_index);
}
sk_sp<SkTypeface>
FontUniqueNameLookupAndroid::MatchUniqueNameFromDownloadableFonts(
const String& font_unique_name) {
if (!android_font_lookup_service_.is_bound()) {
LOG(ERROR) << "Service not connected.";
return nullptr;
}
base::File font_file;
if (!android_font_lookup_service_->MatchLocalFontByUniqueName(
font_unique_name, &font_file)) {
LOG(ERROR) << "Mojo method returned false for unique font name: "
<< font_unique_name;
return nullptr;
}
if (!font_file.IsValid()) {
LOG(ERROR) << "Received platform font handle invalid.";
return nullptr;
}
sk_sp<SkData> font_data = SkData::MakeFromFD(font_file.GetPlatformFile());
if (font_data->isEmpty()) {
LOG(ERROR) << "Received file descriptor has 0 size.";
return nullptr;
}
sk_sp<SkTypeface> return_typeface(SkTypeface::MakeFromData(font_data));
if (!return_typeface)
LOG(ERROR) << "Cannot instantiate SkTypeface from font blob SkData.";
return return_typeface;
}
} // namespace blink
......@@ -7,6 +7,7 @@
#include "mojo/public/cpp/bindings/remote.h"
#include "third_party/blink/public/common/font_unique_name_lookup/font_table_matcher.h"
#include "third_party/blink/public/mojom/android_font_lookup/android_font_lookup.mojom-blink.h"
#include "third_party/blink/public/mojom/font_unique_name_lookup/font_unique_name_lookup.mojom-blink.h"
#include "third_party/blink/renderer/platform/fonts/font_unique_name_lookup.h"
#include "third_party/blink/renderer/platform/wtf/deque.h"
......@@ -15,6 +16,12 @@
namespace blink {
// Unique font lookup implementation for Android, uses two backends: Fonts from
// the firmware in the font directories indexed by
// content/browser/font_unique_name_lookup/font_unique_name_lookup.cc as well
// as the Mojo IPC connection to a java implementation that fetches fonts from
// GMSCore, see
// content/public/android/java/src/org/chromium/content/browser/font/AndroidFontLookupImpl.java
class FontUniqueNameLookupAndroid : public FontUniqueNameLookup {
public:
FontUniqueNameLookupAndroid() = default;
......@@ -33,10 +40,14 @@ class FontUniqueNameLookupAndroid : public FontUniqueNameLookup {
void ReceiveReadOnlySharedMemoryRegion(
base::ReadOnlySharedMemoryRegion shared_memory_region);
sk_sp<SkTypeface> MatchUniqueNameFromFirmwareFonts(const String&);
sk_sp<SkTypeface> MatchUniqueNameFromFirmwareFonts(
const String& font_unique_name);
sk_sp<SkTypeface> MatchUniqueNameFromDownloadableFonts(
const String& font_unique_name);
mojo::Remote<mojom::blink::FontUniqueNameLookup>
firmware_font_lookup_service_;
mojo::Remote<mojom::blink::AndroidFontLookup> android_font_lookup_service_;
WTF::Deque<NotifyFontUniqueNameLookupReady> pending_callbacks_;
base::Optional<bool> sync_available_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment