Skip to content

Commit

Permalink
Bug 1540776 - Have parent send color profile to child during launch r…
Browse files Browse the repository at this point in the history
…=aosmond,jld,jfkthame

For Win32k lockdown, we need to remove the content processes' ability to
call GetICMProfileW(). Since it needs this to retrieve the output color
profile, a new synchronous call is added that allows it to request the
parent process to read this file on its behalf.

The contents of the file are now being cached as well, as this should help
ease some of the increased parent process I/O caused by the children not
being able to do this in their process anymore.

For performance reasons, during launch this information is passed directly
to the child through the SetXPCOMProcessAttributes call

Differential Revision: https://phabricator.services.mozilla.com/D66126
  • Loading branch information
Chris Martin committed Mar 26, 2020
1 parent 551b883 commit 8832b66
Show file tree
Hide file tree
Showing 8 changed files with 70 additions and 10 deletions.
7 changes: 7 additions & 0 deletions dom/ipc/ContentParent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4988,6 +4988,13 @@ mozilla::ipc::IPCResult ContentParent::RecvGetGraphicsDeviceInitData(
return IPC_OK();
}

mozilla::ipc::IPCResult ContentParent::RecvGetOutputColorProfileData(
nsTArray<uint8_t>* aOutputColorProfileData) {
(*aOutputColorProfileData) =
gfxPlatform::GetPlatform()->GetCMSOutputProfileData();
return IPC_OK();
}

mozilla::ipc::IPCResult ContentParent::RecvGetFontListShmBlock(
const uint32_t& aGeneration, const uint32_t& aIndex,
mozilla::ipc::SharedMemoryBasic::Handle* aOut) {
Expand Down
3 changes: 3 additions & 0 deletions dom/ipc/ContentParent.h
Original file line number Diff line number Diff line change
Expand Up @@ -1150,6 +1150,9 @@ class ContentParent final
mozilla::ipc::IPCResult RecvGetGraphicsDeviceInitData(
ContentDeviceData* aOut);

mozilla::ipc::IPCResult RecvGetOutputColorProfileData(
nsTArray<uint8_t>* aOutputColorProfileData);

mozilla::ipc::IPCResult RecvGetFontListShmBlock(
const uint32_t& aGeneration, const uint32_t& aIndex,
mozilla::ipc::SharedMemoryBasic::Handle* aOut);
Expand Down
9 changes: 9 additions & 0 deletions dom/ipc/PContent.ipdl
Original file line number Diff line number Diff line change
Expand Up @@ -1184,6 +1184,15 @@ parent:
sync GetGraphicsDeviceInitData()
returns (ContentDeviceData aData);

/**
* Request a buffer containing the contents of the output color profile.
* If set, this is the file pointed to by
* gfx.color_management.display_profile, otherwise it contains a
* platform-specific default
*/
sync GetOutputColorProfileData()
returns (uint8_t[] aOutputColorProfileData);

/**
* A shared font list (see gfx/thebes/SharedFontList.*) contains a list
* of shared-memory blocks that are used to store all the font list data.
Expand Down
1 change: 1 addition & 0 deletions gfx/ipc/GraphicsMessages.ipdlh
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ struct ContentDeviceData
{
DevicePrefs prefs;
D3D11DeviceStatus d3d11;
uint8_t[] cmsOutputProfileData;
};

// Represents the state of a feature that has failed to initialize.
Expand Down
38 changes: 31 additions & 7 deletions gfx/thebes/gfxPlatform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2191,25 +2191,47 @@ nsTArray<uint8_t> gfxPlatform::GetPlatformCMSOutputProfileData() {
}

nsTArray<uint8_t> gfxPlatform::GetCMSOutputProfileData() {
if (XRE_IsContentProcess()) {
// This will be passed in during InitChild so we can avoid sending a
// sync message back to the parent during init.
if (gContentDeviceInitData) {
MOZ_ASSERT(!gContentDeviceInitData->cmsOutputProfileData().IsEmpty());
return gContentDeviceInitData->cmsOutputProfileData();
}

// Otherwise we need to ask the parent for the updated color profile
mozilla::dom::ContentChild* cc = mozilla::dom::ContentChild::GetSingleton();
nsTArray<uint8_t> result;
Unused << cc->SendGetOutputColorProfileData(&result);
return result;
}

if (!mCachedOutputColorProfile.IsEmpty()) {
return nsTArray<uint8_t>(mCachedOutputColorProfile);
}

nsAutoCString fname;
Preferences::GetCString("gfx.color_management.display_profile", fname);

if (fname.IsEmpty()) {
return gfxPlatform::GetPlatform()->GetPlatformCMSOutputProfileData();
mCachedOutputColorProfile = GetPlatformCMSOutputProfileData();
return nsTArray<uint8_t>(mCachedOutputColorProfile);
}

void* mem = nullptr;
size_t size = 0;
qcms_data_from_path(fname.get(), &mem, &size);
if (mem == nullptr) {
return gfxPlatform::GetPlatform()->GetPlatformCMSOutputProfileData();
mCachedOutputColorProfile = GetPlatformCMSOutputProfileData();
return nsTArray<uint8_t>(mCachedOutputColorProfile);
}

nsTArray<uint8_t> result;
result.AppendElements(static_cast<uint8_t*>(mem), size);
MOZ_ASSERT(mCachedOutputColorProfile.IsEmpty());

mCachedOutputColorProfile.AppendElements(static_cast<uint8_t*>(mem), size);
free(mem);

return result;
return nsTArray<uint8_t>(mCachedOutputColorProfile);
}

void gfxPlatform::CreateCMSOutputProfile() {
Expand All @@ -2226,7 +2248,8 @@ void gfxPlatform::CreateCMSOutputProfile() {
}

if (!gCMSOutputProfile) {
nsTArray<uint8_t> outputProfileData = GetCMSOutputProfileData();
nsTArray<uint8_t> outputProfileData =
gfxPlatform::GetPlatform()->GetCMSOutputProfileData();
if (!outputProfileData.IsEmpty()) {
gCMSOutputProfile = qcms_profile_from_memory(
outputProfileData.Elements(), outputProfileData.Length());
Expand Down Expand Up @@ -3404,7 +3427,8 @@ void gfxPlatform::GetFrameStats(mozilla::widget::InfoObject& aObj) {
}

void gfxPlatform::GetCMSSupportInfo(mozilla::widget::InfoObject& aObj) {
nsTArray<uint8_t> outputProfileData = GetCMSOutputProfileData();
nsTArray<uint8_t> outputProfileData =
gfxPlatform::GetPlatform()->GetCMSOutputProfileData();
if (outputProfileData.IsEmpty()) {
nsPrintfCString msg("Empty profile data");
aObj.DefineProperty("CMSOutputProfile", msg.get());
Expand Down
12 changes: 10 additions & 2 deletions gfx/thebes/gfxPlatform.h
Original file line number Diff line number Diff line change
Expand Up @@ -738,6 +738,13 @@ class gfxPlatform : public mozilla::layers::MemoryPressureListener {
*/
virtual void ImportGPUDeviceData(const mozilla::gfx::GPUDeviceData& aData);

/**
* Returns the contents of the file containing the output color profile.
* The result may change if gfx.color_management.display_profile is changed
* or the platform-specific default is changed
*/
nsTArray<uint8_t> GetCMSOutputProfileData();

bool HasVariationFontSupport() const { return mHasVariationFontSupport; }

bool HasNativeColrFontSupport() const { return mHasNativeColrFontSupport; }
Expand Down Expand Up @@ -879,8 +886,6 @@ class gfxPlatform : public mozilla::layers::MemoryPressureListener {
static void InitOpenGLConfig();
static void CreateCMSOutputProfile();

static nsTArray<uint8_t> GetCMSOutputProfileData();

friend void RecordingPrefChanged(const char* aPrefName, void* aClosure);

virtual nsTArray<uint8_t> GetPlatformCMSOutputProfileData();
Expand Down Expand Up @@ -948,6 +953,9 @@ class gfxPlatform : public mozilla::layers::MemoryPressureListener {
// Total number of screen pixels across all monitors.
int64_t mScreenPixels;

// Cached contents of the output color profile file
nsTArray<uint8_t> mCachedOutputColorProfile;

// An instance of gfxSkipChars which is empty. It is used as the
// basis for error-case iterators.
const gfxSkipChars kEmptySkipChars;
Expand Down
6 changes: 6 additions & 0 deletions gfx/thebes/gfxWindowsPlatform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1905,6 +1905,9 @@ void gfxWindowsPlatform::ImportContentDeviceData(
DeviceManagerDx* dm = DeviceManagerDx::Get();
dm->ImportDeviceInfo(aData.d3d11());
}

// aData->cmsOutputProfileData() will be read during color profile init,
// not as part of this import function
}

void gfxWindowsPlatform::BuildContentDeviceData(ContentDeviceData* aOut) {
Expand All @@ -1921,6 +1924,9 @@ void gfxWindowsPlatform::BuildContentDeviceData(ContentDeviceData* aOut) {
DeviceManagerDx* dm = DeviceManagerDx::Get();
dm->ExportDeviceInfo(&aOut->d3d11());
}

aOut->cmsOutputProfileData() =
gfxPlatform::GetPlatform()->GetCMSOutputProfileData();
}

bool gfxWindowsPlatform::CheckVariationFontSupport() {
Expand Down
4 changes: 3 additions & 1 deletion ipc/ipdl/sync-messages.ini
Original file line number Diff line number Diff line change
Expand Up @@ -1014,7 +1014,9 @@ description = legacy sync IPC - please add detailed description
[PContent::EndDriverCrashGuard]
description = legacy sync IPC - please add detailed description
[PContent::GetGraphicsDeviceInitData]
description = legacy sync IPC - please add detailed description
description = Retrieve information needed to initialize the graphics device in the content process
[PContent::GetOutputColorProfileData]
description = Retrieve the contents of the output color profile file
[PContent::GetFontListShmBlock]
description = for bug 1514869 - layout code needs synchronous access to font list, but this is used only once per block, after which content directly reads the shared memory
[PContent::InitializeFamily]
Expand Down

0 comments on commit 8832b66

Please sign in to comment.