Bug 1157030 - Prevent visibility changes from affecting the process priority when the screen is off. r=khuey

This commit is contained in:
Gabriele Svelto 2015-05-11 23:03:42 +02:00
parent ae624cb0f7
commit 614882a05a
3 changed files with 49 additions and 82 deletions

View File

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

View File

@ -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);

View File

@ -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;
}