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:
Jonathan Kew 2016-11-15 13:58:29 +00:00
Родитель 15b1c3dd86
Коммит eb88ca57ad
10 изменённых файлов: 179 добавлений и 33 удалений

Просмотреть файл

@ -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,