mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
Bug 1314932 - Reduce content-process startup time on MacOSX by passing the system font list from chrome to content process via the GetXPCOMProcessAttributes message. r=mstange
This commit is contained in:
parent
15b1c3dd86
commit
eb88ca57ad
@ -918,7 +918,8 @@ ContentChild::InitXPCOM()
|
||||
SendGetXPCOMProcessAttributes(&isOffline, &isConnected,
|
||||
&isLangRTL, &haveBidiKeyboards,
|
||||
&mAvailableDictionaries,
|
||||
&clipboardCaps, &domainPolicy, &initialData);
|
||||
&clipboardCaps, &domainPolicy, &initialData,
|
||||
&mFontFamilies);
|
||||
RecvSetOffline(isOffline);
|
||||
RecvSetConnectivity(isConnected);
|
||||
RecvBidiKeyboardNotify(isLangRTL, haveBidiKeyboards);
|
||||
|
@ -625,6 +625,13 @@ public:
|
||||
SendGetA11yContentId();
|
||||
#endif // defined(XP_WIN) && defined(ACCESSIBILITY)
|
||||
|
||||
// Get a reference to the font family list passed from the chrome process,
|
||||
// for use during gfx initialization.
|
||||
InfallibleTArray<mozilla::dom::FontFamilyListEntry>&
|
||||
SystemFontFamilyList() {
|
||||
return mFontFamilies;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function for protocols that use the GPU process when available.
|
||||
* Overrides FatalError to just be a warning when communicating with the
|
||||
@ -650,6 +657,11 @@ private:
|
||||
|
||||
InfallibleTArray<nsString> mAvailableDictionaries;
|
||||
|
||||
// Temporary storage for a list of available font families, passed from the
|
||||
// parent process and used to initialize gfx in the child. Currently used
|
||||
// only on MacOSX.
|
||||
InfallibleTArray<mozilla::dom::FontFamilyListEntry> mFontFamilies;
|
||||
|
||||
/**
|
||||
* An ID unique to the process containing our corresponding
|
||||
* content parent.
|
||||
|
@ -2541,7 +2541,8 @@ ContentParent::RecvGetXPCOMProcessAttributes(bool* aIsOffline,
|
||||
InfallibleTArray<nsString>* dictionaries,
|
||||
ClipboardCapabilities* clipboardCaps,
|
||||
DomainPolicyClone* domainPolicy,
|
||||
StructuredCloneData* aInitialData)
|
||||
StructuredCloneData* aInitialData,
|
||||
InfallibleTArray<FontFamilyListEntry>* fontFamilies)
|
||||
{
|
||||
nsCOMPtr<nsIIOService> io(do_GetIOService());
|
||||
MOZ_ASSERT(io, "No IO service?");
|
||||
@ -2598,6 +2599,9 @@ ContentParent::RecvGetXPCOMProcessAttributes(bool* aIsOffline,
|
||||
}
|
||||
}
|
||||
|
||||
// This is only implemented (returns a non-empty list) by MacOSX at present.
|
||||
gfxPlatform::GetPlatform()->GetSystemFontFamilyList(fontFamilies);
|
||||
|
||||
return IPC_OK();
|
||||
}
|
||||
|
||||
|
@ -672,7 +672,9 @@ private:
|
||||
InfallibleTArray<nsString>* dictionaries,
|
||||
ClipboardCapabilities* clipboardCaps,
|
||||
DomainPolicyClone* domainPolicy,
|
||||
StructuredCloneData* initialData) override;
|
||||
StructuredCloneData* initialData,
|
||||
InfallibleTArray<FontFamilyListEntry>* fontFamilies)
|
||||
override;
|
||||
|
||||
virtual bool
|
||||
DeallocPJavaScriptParent(mozilla::jsipc::PJavaScriptParent*) override;
|
||||
|
@ -105,6 +105,8 @@ union ChromeRegistryItem
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
// Used on Android/B2G to pass the list of fonts on the device
|
||||
// to the child process
|
||||
struct FontListEntry {
|
||||
nsString familyName;
|
||||
nsString faceName;
|
||||
@ -116,6 +118,15 @@ struct FontListEntry {
|
||||
bool isHidden;
|
||||
};
|
||||
|
||||
// Used on Mac OS X to pass the list of font families (not faces)
|
||||
// from chrome to content processes.
|
||||
// The entryType field distinguishes several types of font family
|
||||
// record; see gfxMacPlatformFontList.h for values and meaning.
|
||||
struct FontFamilyListEntry {
|
||||
nsString familyName;
|
||||
uint8_t entryType;
|
||||
};
|
||||
|
||||
struct DeviceStorageFreeSpaceParams
|
||||
{
|
||||
nsString type;
|
||||
@ -682,7 +693,8 @@ parent:
|
||||
bool haveBidiKeyboards, nsString[] dictionaries,
|
||||
ClipboardCapabilities clipboardCaps,
|
||||
DomainPolicyClone domainPolicy,
|
||||
StructuredCloneData initialData);
|
||||
StructuredCloneData initialData,
|
||||
FontFamilyListEntry[] fontFamilies /* used on MacOSX only */);
|
||||
|
||||
sync CreateChildProcess(IPCTabContext context,
|
||||
ProcessPriority priority,
|
||||
|
@ -108,6 +108,17 @@ public:
|
||||
gfxFontStyle &aFontStyle,
|
||||
float aDevPixPerCSSPixel);
|
||||
|
||||
// Values for the entryType field in FontFamilyListEntry records passed
|
||||
// from chrome to content process.
|
||||
enum FontFamilyEntryType {
|
||||
kStandardFontFamily = 0, // a standard installed font family
|
||||
kHiddenSystemFontFamily = 1, // hidden system family, not exposed to UI
|
||||
kTextSizeSystemFontFamily = 2, // name of 'system' font at text sizes
|
||||
kDisplaySizeSystemFontFamily = 3 // 'system' font at display sizes
|
||||
};
|
||||
void GetSystemFontFamilyList(
|
||||
InfallibleTArray<mozilla::dom::FontFamilyListEntry>* aList);
|
||||
|
||||
protected:
|
||||
virtual gfxFontFamily*
|
||||
GetDefaultFontForPlatform(const gfxFontStyle* aStyle) override;
|
||||
@ -154,6 +165,8 @@ private:
|
||||
// toll-free bridged).
|
||||
void AddFamily(CFStringRef aFamily);
|
||||
|
||||
void AddFamily(const nsAString& aFamilyName, bool aSystemFont);
|
||||
|
||||
#ifdef MOZ_BUNDLED_FONTS
|
||||
void ActivateBundledFonts();
|
||||
#endif
|
||||
|
@ -62,6 +62,7 @@
|
||||
#include "nsCocoaUtils.h"
|
||||
#include "gfxFontConstants.h"
|
||||
|
||||
#include "mozilla/dom/ContentChild.h"
|
||||
#include "mozilla/MemoryReporting.h"
|
||||
#include "mozilla/Preferences.h"
|
||||
#include "mozilla/Sprintf.h"
|
||||
@ -74,6 +75,8 @@
|
||||
|
||||
using namespace mozilla;
|
||||
|
||||
using mozilla::dom::FontFamilyListEntry;
|
||||
|
||||
// indexes into the NSArray objects that the Cocoa font manager returns
|
||||
// as the available members of a family
|
||||
#define INDEX_FONT_POSTSCRIPT_NAME 0
|
||||
@ -416,7 +419,7 @@ MacOSFontEntry::AddSizeOfIncludingThis(MallocSizeOf aMallocSizeOf,
|
||||
class gfxMacFontFamily : public gfxFontFamily
|
||||
{
|
||||
public:
|
||||
explicit gfxMacFontFamily(nsAString& aName, double aSizeHint) :
|
||||
explicit gfxMacFontFamily(const nsAString& aName, double aSizeHint) :
|
||||
gfxFontFamily(aName),
|
||||
mSizeHint(aSizeHint)
|
||||
{}
|
||||
@ -427,6 +430,11 @@ public:
|
||||
|
||||
virtual void FindStyleVariations(FontInfoData *aFontInfoData = nullptr);
|
||||
|
||||
virtual bool IsSingleFaceFamily() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
protected:
|
||||
double mSizeHint;
|
||||
};
|
||||
@ -580,7 +588,7 @@ gfxMacFontFamily::FindStyleVariations(FontInfoData *aFontInfoData)
|
||||
class gfxSingleFaceMacFontFamily : public gfxFontFamily
|
||||
{
|
||||
public:
|
||||
explicit gfxSingleFaceMacFontFamily(nsAString& aName) :
|
||||
explicit gfxSingleFaceMacFontFamily(const nsAString& aName) :
|
||||
gfxFontFamily(aName)
|
||||
{
|
||||
mFaceNamesInitialized = true; // omit from face name lists
|
||||
@ -591,6 +599,11 @@ public:
|
||||
virtual void LocalizedName(nsAString& aLocalizedName);
|
||||
|
||||
virtual void ReadOtherFamilyNames(gfxPlatformFontList *aPlatformFontList);
|
||||
|
||||
virtual bool IsSingleFaceFamily() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
void
|
||||
@ -675,6 +688,32 @@ gfxMacPlatformFontList::~gfxMacPlatformFontList()
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gfxMacPlatformFontList::AddFamily(const nsAString& aFamilyName,
|
||||
bool aSystemFont)
|
||||
{
|
||||
FontFamilyTable& table =
|
||||
aSystemFont ? mSystemFontFamilies : mFontFamilies;
|
||||
|
||||
double sizeHint = 0.0;
|
||||
if (aSystemFont && mUseSizeSensitiveSystemFont &&
|
||||
mSystemDisplayFontFamilyName.Equals(aFamilyName)) {
|
||||
sizeHint = 128.0;
|
||||
}
|
||||
|
||||
nsAutoString key;
|
||||
ToLowerCase(aFamilyName, key);
|
||||
|
||||
RefPtr<gfxFontFamily> familyEntry =
|
||||
new gfxMacFontFamily(aFamilyName, sizeHint);
|
||||
table.Put(key, familyEntry);
|
||||
|
||||
// check the bad underline blacklist
|
||||
if (mBadUnderlineFamilyNames.Contains(key)) {
|
||||
familyEntry->SetBadUnderlineFamily();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gfxMacPlatformFontList::AddFamily(CFStringRef aFamily)
|
||||
{
|
||||
@ -686,29 +725,40 @@ gfxMacPlatformFontList::AddFamily(CFStringRef aFamily)
|
||||
return;
|
||||
}
|
||||
|
||||
bool hiddenSystemFont = [family hasPrefix:@"."];
|
||||
|
||||
FontFamilyTable& table =
|
||||
hiddenSystemFont ? mSystemFontFamilies : mFontFamilies;
|
||||
|
||||
nsAutoString familyName;
|
||||
nsCocoaUtils::GetStringForNSString(family, familyName);
|
||||
|
||||
double sizeHint = 0.0;
|
||||
if (hiddenSystemFont && mUseSizeSensitiveSystemFont &&
|
||||
mSystemDisplayFontFamilyName.Equals(familyName)) {
|
||||
sizeHint = 128.0;
|
||||
bool isHiddenSystemFont = familyName[0] == '.';
|
||||
AddFamily(familyName, isHiddenSystemFont);
|
||||
}
|
||||
|
||||
void
|
||||
gfxMacPlatformFontList::GetSystemFontFamilyList(
|
||||
InfallibleTArray<FontFamilyListEntry>* aList)
|
||||
{
|
||||
// Note: We rely on the records for mSystemTextFontFamilyName and
|
||||
// mSystemDisplayFontFamilyName (if present) being *before* the main
|
||||
// font list, so that those names are known in the content process
|
||||
// by the time we add the actual family records to the font list.
|
||||
aList->AppendElement(FontFamilyListEntry(mSystemTextFontFamilyName,
|
||||
kTextSizeSystemFontFamily));
|
||||
if (mUseSizeSensitiveSystemFont) {
|
||||
aList->AppendElement(FontFamilyListEntry(mSystemDisplayFontFamilyName,
|
||||
kDisplaySizeSystemFontFamily));
|
||||
}
|
||||
|
||||
nsAutoString key;
|
||||
ToLowerCase(familyName, key);
|
||||
|
||||
RefPtr<gfxFontFamily> familyEntry = new gfxMacFontFamily(familyName, sizeHint);
|
||||
table.Put(key, familyEntry);
|
||||
|
||||
// check the bad underline blacklist
|
||||
if (mBadUnderlineFamilyNames.Contains(key)) {
|
||||
familyEntry->SetBadUnderlineFamily();
|
||||
// Now collect the lists of available families, both hidden and visible.
|
||||
for (auto f = mSystemFontFamilies.Iter(); !f.Done(); f.Next()) {
|
||||
aList->AppendElement(FontFamilyListEntry(f.Data()->Name(),
|
||||
kHiddenSystemFontFamily));
|
||||
}
|
||||
for (auto f = mFontFamilies.Iter(); !f.Done(); f.Next()) {
|
||||
auto macFamily = static_cast<gfxMacFontFamily*>(f.Data().get());
|
||||
if (macFamily->IsSingleFaceFamily()) {
|
||||
continue; // skip, this will be recreated separately in the child
|
||||
}
|
||||
aList->AppendElement(FontFamilyListEntry(macFamily->Name(),
|
||||
kStandardFontFamily));
|
||||
}
|
||||
}
|
||||
|
||||
@ -721,18 +771,44 @@ gfxMacPlatformFontList::InitFontListForPlatform()
|
||||
|
||||
// reset system font list
|
||||
mSystemFontFamilies.Clear();
|
||||
|
||||
// iterate over available families
|
||||
|
||||
InitSystemFontNames();
|
||||
|
||||
CFArrayRef familyNames = CTFontManagerCopyAvailableFontFamilyNames();
|
||||
|
||||
for (NSString* familyName in (NSArray*)familyNames) {
|
||||
AddFamily((CFStringRef)familyName);
|
||||
if (XRE_IsContentProcess()) {
|
||||
// Content process: use font list passed from the chrome process via
|
||||
// the GetXPCOMProcessAttributes message, because it's much faster than
|
||||
// querying Core Text again in the child.
|
||||
mozilla::dom::ContentChild* cc =
|
||||
mozilla::dom::ContentChild::GetSingleton();
|
||||
for (auto f : cc->SystemFontFamilyList()) {
|
||||
switch (f.entryType()) {
|
||||
case kStandardFontFamily:
|
||||
AddFamily(f.familyName(), false);
|
||||
break;
|
||||
case kHiddenSystemFontFamily:
|
||||
AddFamily(f.familyName(), true);
|
||||
break;
|
||||
case kTextSizeSystemFontFamily:
|
||||
mSystemTextFontFamilyName = f.familyName();
|
||||
break;
|
||||
case kDisplaySizeSystemFontFamily:
|
||||
mSystemDisplayFontFamilyName = f.familyName();
|
||||
mUseSizeSensitiveSystemFont = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// The ContentChild doesn't need the font list any longer.
|
||||
cc->SystemFontFamilyList().Clear();
|
||||
}
|
||||
|
||||
CFRelease(familyNames);
|
||||
// If this is the chrome process, or if for some reason we failed to get
|
||||
// a usable list above, get the available fonts from Core Text.
|
||||
if (!mFontFamilies.Count()) {
|
||||
InitSystemFontNames();
|
||||
CFArrayRef familyNames = CTFontManagerCopyAvailableFontFamilyNames();
|
||||
for (NSString* familyName in (NSArray*)familyNames) {
|
||||
AddFamily((CFStringRef)familyName);
|
||||
}
|
||||
CFRelease(familyNames);
|
||||
}
|
||||
|
||||
InitSingleFaceList();
|
||||
|
||||
|
@ -62,6 +62,9 @@ BackendTypeBit(BackendType b)
|
||||
}
|
||||
|
||||
} // namespace gfx
|
||||
namespace dom {
|
||||
class FontFamilyListEntry;
|
||||
}
|
||||
} // namespace mozilla
|
||||
|
||||
#define MOZ_PERFORMANCE_WARNING(module, ...) \
|
||||
@ -318,6 +321,15 @@ public:
|
||||
const nsACString& aGenericFamily,
|
||||
nsTArray<nsString>& aListOfFonts);
|
||||
|
||||
/**
|
||||
* Fill aFontFamilies with a list of FontFamilyListEntry records for the
|
||||
* available fonts on the platform; used to pass the list from chrome to
|
||||
* content process. Currently implemented only on MacOSX.
|
||||
*/
|
||||
virtual void GetSystemFontFamilyList(
|
||||
InfallibleTArray<mozilla::dom::FontFamilyListEntry>* aFontFamilies)
|
||||
{ }
|
||||
|
||||
/**
|
||||
* Rebuilds the any cached system font lists
|
||||
*/
|
||||
|
@ -30,6 +30,8 @@
|
||||
using namespace mozilla;
|
||||
using namespace mozilla::gfx;
|
||||
|
||||
using mozilla::dom::FontFamilyListEntry;
|
||||
|
||||
// cribbed from CTFontManager.h
|
||||
enum {
|
||||
kAutoActivationDisabled = 1
|
||||
@ -110,6 +112,14 @@ gfxPlatformMac::CreatePlatformFontList()
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void
|
||||
gfxPlatformMac::GetSystemFontFamilyList(
|
||||
InfallibleTArray<FontFamilyListEntry>* aFontFamilies)
|
||||
{
|
||||
gfxMacPlatformFontList::PlatformFontList()->
|
||||
GetSystemFontFamilyList(aFontFamilies);
|
||||
}
|
||||
|
||||
already_AddRefed<gfxASurface>
|
||||
gfxPlatformMac::CreateOffscreenSurface(const IntSize& aSize,
|
||||
gfxImageFormat aFormat)
|
||||
|
@ -42,6 +42,10 @@ public:
|
||||
|
||||
virtual gfxPlatformFontList* CreatePlatformFontList() override;
|
||||
|
||||
void
|
||||
GetSystemFontFamilyList(InfallibleTArray<mozilla::dom::FontFamilyListEntry>*
|
||||
aFontFamilies) override;
|
||||
|
||||
bool IsFontFormatSupported(nsIURI *aFontURI, uint32_t aFormatFlags) override;
|
||||
|
||||
virtual void GetCommonFallbackFonts(uint32_t aCh, uint32_t aNextCh,
|
||||
|
Loading…
Reference in New Issue
Block a user