Bug 1337063: Transfer child's initial ContentDeviceData with SendSetXPCOMProcessAttributes - r=dvander

MozReview-Commit-ID: 8Er44xSDHhb

--HG--
extra : rebase_source : 464a09246ca095ba363f988fb9749680d8518926
This commit is contained in:
Milan Sreckovic 2017-06-22 13:45:48 -04:00
Родитель f1d0ca77fa
Коммит 012064db78
7 изменённых файлов: 38 добавлений и 9 удалений

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

@ -536,7 +536,7 @@ ContentChild::RecvSetXPCOMProcessAttributes(const XPCOMInitData& aXPCOMInit,
{
mLookAndFeelCache = aLookAndFeelIntCache;
InitXPCOM(aXPCOMInit, aInitialData);
InitGraphicsDeviceData();
InitGraphicsDeviceData(aXPCOMInit.contentDeviceData());
#ifdef NS_PRINTING
// Force the creation of the nsPrintingProxy so that it's IPC counterpart,
@ -998,11 +998,11 @@ ContentChild::AppendProcessId(nsACString& aName)
}
void
ContentChild::InitGraphicsDeviceData()
ContentChild::InitGraphicsDeviceData(const ContentDeviceData& aData)
{
// Initialize the graphics platform. This may contact the parent process
// to read device preferences.
gfxPlatform::GetPlatform();
gfxPlatform::InitChild(aData);
}
void

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

@ -107,7 +107,7 @@ public:
void InitXPCOM(const XPCOMInitData& aXPCOMInit,
const mozilla::dom::ipc::StructuredCloneData& aInitialData);
void InitGraphicsDeviceData();
void InitGraphicsDeviceData(const ContentDeviceData& aData);
static ContentChild* GetSingleton()
{

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

@ -2290,6 +2290,8 @@ ContentParent::InitInternal(ProcessPriority aInitialPriority,
SerializeURI(nullptr, xpcomInit.userContentSheetURL());
}
gfxPlatform::GetPlatform()->BuildContentDeviceData(&xpcomInit.contentDeviceData());
nsCOMPtr<nsIGfxInfo> gfxInfo = services::GetGfxInfo();
if (gfxInfo) {
for (int32_t i = 1; i <= nsIGfxInfo::FEATURE_MAX_VALUE; ++i) {

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

@ -268,6 +268,7 @@ struct XPCOMInitData
FontFamilyListEntry[] fontFamilies;
OptionalURIParams userContentSheetURL;
PrefSetting[] prefs;
ContentDeviceData contentDeviceData;
GfxInfoFeatureStatus[] gfxFeatureStatus;
DataStorageEntry[] dataStorage;
nsCString[] appLocales;

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

@ -47,8 +47,6 @@ ParamTraits<DxgiAdapterDesc>::Write(Message* aMsg, const paramType& aParam)
WriteParam(aMsg, aParam.SharedSystemMemory);
WriteParam(aMsg, aParam.AdapterLuid.LowPart);
WriteParam(aMsg, aParam.AdapterLuid.HighPart);
#else
MOZ_ASSERT_UNREACHABLE("DxgiAdapterDesc is Windows-only");
#endif
}
@ -72,10 +70,10 @@ ParamTraits<DxgiAdapterDesc>::Read(const Message* aMsg, PickleIterator* aIter, p
{
return true;
}
#else
MOZ_ASSERT_UNREACHABLE("DxgiAdapterDesc is Windows-only");
#endif
return false;
#else
return true;
#endif
}
} // namespace IPC

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

@ -153,6 +153,8 @@ using namespace mozilla::gfx;
gfxPlatform *gPlatform = nullptr;
static bool gEverInitialized = false;
const ContentDeviceData* gContentDeviceInitData = nullptr;
static Mutex* gGfxPlatformPrefsLock = nullptr;
// These two may point to the same profile
@ -528,6 +530,8 @@ gfxPlatform*
gfxPlatform::GetPlatform()
{
if (!gPlatform) {
MOZ_RELEASE_ASSERT(!XRE_IsContentProcess(),
"Content Process should have called InitChild() before first GetPlatform()");
Init();
}
return gPlatform;
@ -539,6 +543,19 @@ gfxPlatform::Initialized()
return !!gPlatform;
}
/* static */ void
gfxPlatform::InitChild(const ContentDeviceData& aData)
{
MOZ_ASSERT(XRE_IsContentProcess());
MOZ_RELEASE_ASSERT(!gPlatform,
"InitChild() should be called before first GetPlatform()");
// Make the provided initial ContentDeviceData available to the init
// routines, so they don't have to do a sync request from the parent.
gContentDeviceInitData = &aData;
Init();
gContentDeviceInitData = nullptr;
}
void RecordingPrefChanged(const char *aPrefName, void *aClosure)
{
if (Preferences::GetBool("gfx.2d.recording", false)) {
@ -2720,6 +2737,11 @@ gfxPlatform::FetchAndImportContentDeviceData()
{
MOZ_ASSERT(XRE_IsContentProcess());
if (gContentDeviceInitData) {
ImportContentDeviceData(*gContentDeviceInitData);
return;
}
mozilla::dom::ContentChild* cc = mozilla::dom::ContentChild::GetSingleton();
mozilla::gfx::ContentDeviceData data;

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

@ -175,6 +175,12 @@ public:
*/
static void Shutdown();
/**
* Initialize gfxPlatform (if not already done) in a child process, with
* the provided ContentDeviceData.
*/
static void InitChild(const mozilla::gfx::ContentDeviceData& aData);
static void InitLayersIPC();
static void ShutdownLayersIPC();