diff --git a/gfx/thebes/gfxPlatformFontList.cpp b/gfx/thebes/gfxPlatformFontList.cpp index 2cabf10c7ad8..2301ebd8013f 100644 --- a/gfx/thebes/gfxPlatformFontList.cpp +++ b/gfx/thebes/gfxPlatformFontList.cpp @@ -22,6 +22,7 @@ #include "nsUnicodeProperties.h" #include "nsXULAppAPI.h" +#include "mozilla/AppShutdown.h" #include "mozilla/Attributes.h" #include "mozilla/Likely.h" #include "mozilla/MemoryReporting.h" @@ -1238,12 +1239,46 @@ void gfxPlatformFontList::StartCmapLoadingFromFamily(uint32_t aStartIndex) { } class LoadCmapsRunnable : public CancelableRunnable { + class WillShutdownObserver : public nsIObserver { + public: + NS_DECL_ISUPPORTS + NS_DECL_NSIOBSERVER + + explicit WillShutdownObserver(LoadCmapsRunnable* aRunnable) + : mRunnable(aRunnable) {} + + void Remove() { + nsCOMPtr obs = services::GetObserverService(); + if (obs) { + obs->RemoveObserver(this, NS_XPCOM_WILL_SHUTDOWN_OBSERVER_ID); + } + mRunnable = nullptr; + } + + protected: + virtual ~WillShutdownObserver() = default; + + LoadCmapsRunnable* mRunnable; + }; + public: explicit LoadCmapsRunnable(uint32_t aGeneration, uint32_t aFamilyIndex) : CancelableRunnable("gfxPlatformFontList::LoadCmapsRunnable"), mGeneration(aGeneration), mStartIndex(aFamilyIndex), - mIndex(aFamilyIndex) {} + mIndex(aFamilyIndex) { + nsCOMPtr obs = services::GetObserverService(); + if (obs) { + mObserver = new WillShutdownObserver(this); + obs->AddObserver(mObserver, NS_XPCOM_WILL_SHUTDOWN_OBSERVER_ID, false); + } + } + + virtual ~LoadCmapsRunnable() { + if (mObserver) { + mObserver->Remove(); + } + } // Reset the current family index, if the value passed is earlier than our // original starting position. We don't "reset" if it would move the current @@ -1310,14 +1345,35 @@ class LoadCmapsRunnable : public CancelableRunnable { uint32_t mStartIndex; uint32_t mIndex; bool mIsCanceled = false; + + RefPtr mObserver; }; +NS_IMPL_ISUPPORTS(LoadCmapsRunnable::WillShutdownObserver, nsIObserver) + +NS_IMETHODIMP +LoadCmapsRunnable::WillShutdownObserver::Observe(nsISupports* aSubject, + const char* aTopic, + const char16_t* aData) { + if (!nsCRT::strcmp(aTopic, NS_XPCOM_WILL_SHUTDOWN_OBSERVER_ID)) { + if (mRunnable) { + mRunnable->Cancel(); + } + } else { + MOZ_ASSERT_UNREACHABLE("unexpected notification topic"); + } + return NS_OK; +} + void gfxPlatformFontList::StartCmapLoading(uint32_t aGeneration, uint32_t aStartIndex) { MOZ_RELEASE_ASSERT(XRE_IsParentProcess()); if (aGeneration != SharedFontList()->GetGeneration()) { return; } + if (AppShutdown::IsShuttingDown()) { + return; + } if (mLoadCmapsRunnable) { // We already have a runnable; just make sure it covers the full range of // families needed. @@ -2712,6 +2768,9 @@ void gfxPlatformFontList::InitializeFamily(uint32_t aGeneration, if (list->GetGeneration() != aGeneration) { return; } + if (AppShutdown::IsShuttingDown()) { + return; + } if (aFamilyIndex >= list->NumFamilies()) { return; } @@ -2733,6 +2792,9 @@ void gfxPlatformFontList::SetCharacterMap(uint32_t aGeneration, if (list->GetGeneration() != aGeneration) { return; } + if (AppShutdown::IsShuttingDown()) { + return; + } fontlist::Face* face = static_cast(aFacePtr.ToPtr(list)); if (face) { face->mCharacterMap = GetShmemCharMap(&aMap); @@ -2750,6 +2812,9 @@ void gfxPlatformFontList::SetupFamilyCharMap( if (list->GetGeneration() != aGeneration) { return; } + if (AppShutdown::IsShuttingDown()) { + return; + } // aFamilyPtr was passed from a content process which may not be trusted, // so we cannot assume it is valid or safe to use. If the Pointer value is @@ -2803,6 +2868,9 @@ bool gfxPlatformFontList::InitOtherFamilyNames(uint32_t aGeneration, if (list->GetGeneration() != aGeneration) { return false; } + if (AppShutdown::IsShuttingDown()) { + return false; + } return InitOtherFamilyNames(aDefer); }