mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-17 14:25:49 +00:00
Bug 1157030 - Prevent visibility changes from affecting the process priority when the screen is off. r=khuey
This commit is contained in:
parent
ae624cb0f7
commit
614882a05a
@ -221,6 +221,7 @@ private:
|
||||
|
||||
void ObserveContentParentCreated(nsISupports* aContentParent);
|
||||
void ObserveContentParentDestroyed(nsISupports* aSubject);
|
||||
void ObserveScreenStateChanged(const char16_t* aData);
|
||||
|
||||
nsDataHashtable<nsUint64HashKey, nsRefPtr<ParticularProcessPriorityManager> >
|
||||
mParticularManagers;
|
||||
@ -446,6 +447,7 @@ ProcessPriorityManagerImpl::Init()
|
||||
if (os) {
|
||||
os->AddObserver(this, "ipc:content-created", /* ownsWeak */ false);
|
||||
os->AddObserver(this, "ipc:content-shutdown", /* ownsWeak */ false);
|
||||
os->AddObserver(this, "screen-state-changed", /* ownsWeak */ false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -460,6 +462,8 @@ ProcessPriorityManagerImpl::Observe(
|
||||
ObserveContentParentCreated(aSubject);
|
||||
} else if (topic.EqualsLiteral("ipc:content-shutdown")) {
|
||||
ObserveContentParentDestroyed(aSubject);
|
||||
} else if (topic.EqualsLiteral("screen-state-changed")) {
|
||||
ObserveScreenStateChanged(aData);
|
||||
} else {
|
||||
MOZ_ASSERT(false);
|
||||
}
|
||||
@ -544,6 +548,40 @@ ProcessPriorityManagerImpl::ObserveContentParentDestroyed(nsISupports* aSubject)
|
||||
}
|
||||
}
|
||||
|
||||
static PLDHashOperator
|
||||
FreezeParticularProcessPriorityManagers(
|
||||
const uint64_t& aKey,
|
||||
nsRefPtr<ParticularProcessPriorityManager> aValue,
|
||||
void* aUserData)
|
||||
{
|
||||
aValue->Freeze();
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
static PLDHashOperator
|
||||
UnfreezeParticularProcessPriorityManagers(
|
||||
const uint64_t& aKey,
|
||||
nsRefPtr<ParticularProcessPriorityManager> aValue,
|
||||
void* aUserData)
|
||||
{
|
||||
aValue->Unfreeze();
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
void
|
||||
ProcessPriorityManagerImpl::ObserveScreenStateChanged(const char16_t* aData)
|
||||
{
|
||||
if (NS_LITERAL_STRING("on").Equals(aData)) {
|
||||
sFrozen = false;
|
||||
mParticularManagers.EnumerateRead(
|
||||
&UnfreezeParticularProcessPriorityManagers, nullptr);
|
||||
} else {
|
||||
sFrozen = true;
|
||||
mParticularManagers.EnumerateRead(
|
||||
&FreezeParticularProcessPriorityManagers, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
ProcessPriorityManagerImpl::ChildProcessHasHighPriority( void )
|
||||
{
|
||||
@ -603,42 +641,6 @@ ProcessPriorityManagerImpl::Notify(const WakeLockInformation& aInfo)
|
||||
}
|
||||
}
|
||||
|
||||
static PLDHashOperator
|
||||
FreezeParticularProcessPriorityManagers(
|
||||
const uint64_t& aKey,
|
||||
nsRefPtr<ParticularProcessPriorityManager> aValue,
|
||||
void* aUserData)
|
||||
{
|
||||
aValue->Freeze();
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
void
|
||||
ProcessPriorityManagerImpl::Freeze()
|
||||
{
|
||||
sFrozen = true;
|
||||
mParticularManagers.EnumerateRead(&FreezeParticularProcessPriorityManagers,
|
||||
nullptr);
|
||||
}
|
||||
|
||||
static PLDHashOperator
|
||||
UnfreezeParticularProcessPriorityManagers(
|
||||
const uint64_t& aKey,
|
||||
nsRefPtr<ParticularProcessPriorityManager> aValue,
|
||||
void* aUserData)
|
||||
{
|
||||
aValue->Unfreeze();
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
void
|
||||
ProcessPriorityManagerImpl::Unfreeze()
|
||||
{
|
||||
sFrozen = false;
|
||||
mParticularManagers.EnumerateRead(&UnfreezeParticularProcessPriorityManagers,
|
||||
nullptr);
|
||||
}
|
||||
|
||||
NS_IMPL_ISUPPORTS(ParticularProcessPriorityManager,
|
||||
nsIObserver,
|
||||
nsITimerCallback,
|
||||
@ -852,6 +854,10 @@ ParticularProcessPriorityManager::OnFrameloaderVisibleChanged(nsISupports* aSubj
|
||||
nsCOMPtr<nsIFrameLoader> fl = do_QueryInterface(aSubject);
|
||||
NS_ENSURE_TRUE_VOID(fl);
|
||||
|
||||
if (mFrozen) {
|
||||
return; // Ignore visibility changes when the screen is off
|
||||
}
|
||||
|
||||
TabParent* tp = TabParent::GetFrom(fl);
|
||||
if (!tp) {
|
||||
return;
|
||||
@ -1073,7 +1079,6 @@ void
|
||||
ParticularProcessPriorityManager::Unfreeze()
|
||||
{
|
||||
mFrozen = false;
|
||||
ResetPriorityNow();
|
||||
}
|
||||
|
||||
void
|
||||
@ -1381,24 +1386,4 @@ ProcessPriorityManager::AnyProcessHasHighPriority()
|
||||
}
|
||||
}
|
||||
|
||||
/* static */ void
|
||||
ProcessPriorityManager::Freeze()
|
||||
{
|
||||
ProcessPriorityManagerImpl* singleton =
|
||||
ProcessPriorityManagerImpl::GetSingleton();
|
||||
if (singleton) {
|
||||
singleton->Freeze();
|
||||
}
|
||||
}
|
||||
|
||||
/* static */ void
|
||||
ProcessPriorityManager::Unfreeze()
|
||||
{
|
||||
ProcessPriorityManagerImpl* singleton =
|
||||
ProcessPriorityManagerImpl::GetSingleton();
|
||||
if (singleton) {
|
||||
singleton->Unfreeze();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace mozilla
|
||||
|
@ -74,17 +74,6 @@ public:
|
||||
*/
|
||||
static bool AnyProcessHasHighPriority();
|
||||
|
||||
/**
|
||||
* Prevents processes from changing priority until unfrozen.
|
||||
*/
|
||||
static void Freeze();
|
||||
|
||||
/**
|
||||
* Allow process' priorities to change again. This will immediately adjust
|
||||
* processes whose priority change did not happen because of the freeze.
|
||||
*/
|
||||
static void Unfreeze();
|
||||
|
||||
private:
|
||||
ProcessPriorityManager();
|
||||
DISALLOW_EVIL_CONSTRUCTORS(ProcessPriorityManager);
|
||||
|
@ -83,11 +83,13 @@ public:
|
||||
{}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
// When the screen is off prevent priority changes.
|
||||
if (mIsOn) {
|
||||
ProcessPriorityManager::Unfreeze();
|
||||
} else {
|
||||
ProcessPriorityManager::Freeze();
|
||||
// Notify observers that the screen state has just changed.
|
||||
nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService();
|
||||
if (observerService) {
|
||||
observerService->NotifyObservers(
|
||||
nullptr, "screen-state-changed",
|
||||
mIsOn ? MOZ_UTF16("on") : MOZ_UTF16("off")
|
||||
);
|
||||
}
|
||||
|
||||
nsRefPtr<nsScreenGonk> screen = nsScreenManagerGonk::GetPrimaryScreen();
|
||||
@ -101,15 +103,6 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
// Notify observers that the screen state has just changed.
|
||||
nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService();
|
||||
if (observerService) {
|
||||
observerService->NotifyObservers(
|
||||
nullptr, "screen-state-changed",
|
||||
mIsOn ? MOZ_UTF16("on") : MOZ_UTF16("off")
|
||||
);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user