mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-24 13:21:05 +00:00
646a40b5ed
* We modify connection management such that we now use more specific connection types for {content, non-content, socket process} connections. * We attach a native counterpart to the `GeckoProcessManager.ConnectionManager` instance that listens for app foreground, app background, and when the socket process is enabled, network state events. * On app background, all non-content processes are assigned BACKGROUND priority. Even though backgrounding the app will cause Android to drop all child processes' priority regardless of our priority settings, we still do this as to indicate to Android that these processes are relatively less important than our parent process. * When the socket process is enabled, we drop its priority when we detect that we have no network connectivity. Note that the network management code does the Right Thing if network connectivity changes while our app was in the background: we receive the network state change event once we return to foreground, therefore we do not need to do any special handling ourselves. Differential Revision: https://phabricator.services.mozilla.com/D74478
78 lines
2.4 KiB
C++
78 lines
2.4 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "GeckoProcessManager.h"
|
|
|
|
#include "nsINetworkLinkService.h"
|
|
#include "nsISupportsImpl.h"
|
|
#include "mozilla/Services.h"
|
|
|
|
namespace mozilla {
|
|
|
|
/* static */ void GeckoProcessManager::Init() {
|
|
BaseNatives::Init();
|
|
ConnectionManager::Init();
|
|
}
|
|
|
|
NS_IMPL_ISUPPORTS(GeckoProcessManager::ConnectionManager, nsIObserver)
|
|
|
|
NS_IMETHODIMP GeckoProcessManager::ConnectionManager::Observe(
|
|
nsISupports* aSubject, const char* aTopic, const char16_t* aData) {
|
|
java::GeckoProcessManager::ConnectionManager::LocalRef connMgr(mJavaConnMgr);
|
|
if (!connMgr) {
|
|
return NS_OK;
|
|
}
|
|
|
|
if (!strcmp("application-foreground", aTopic)) {
|
|
connMgr->OnForeground();
|
|
return NS_OK;
|
|
}
|
|
|
|
if (!strcmp("application-background", aTopic)) {
|
|
connMgr->OnBackground();
|
|
return NS_OK;
|
|
}
|
|
|
|
if (!strcmp(NS_NETWORK_LINK_TOPIC, aTopic)) {
|
|
const nsDependentString state(aData);
|
|
// state can be up, down, or unknown. For the purposes of socket process
|
|
// prioritization, we treat unknown as being up.
|
|
const bool isUp = !state.EqualsLiteral(NS_NETWORK_LINK_DATA_DOWN);
|
|
connMgr->OnNetworkStateChange(isUp);
|
|
return NS_OK;
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
/* static */ void GeckoProcessManager::ConnectionManager::AttachTo(
|
|
java::GeckoProcessManager::ConnectionManager::Param aInstance) {
|
|
RefPtr<ConnectionManager> native(new ConnectionManager());
|
|
BaseNatives::AttachNative(aInstance, native);
|
|
|
|
native->mJavaConnMgr = aInstance;
|
|
|
|
nsCOMPtr<nsIObserverService> obsServ(services::GetObserverService());
|
|
obsServ->AddObserver(native, "application-background", false);
|
|
obsServ->AddObserver(native, "application-foreground", false);
|
|
}
|
|
|
|
void GeckoProcessManager::ConnectionManager::ObserveNetworkNotifications() {
|
|
nsCOMPtr<nsIObserverService> obsServ(services::GetObserverService());
|
|
obsServ->AddObserver(this, NS_NETWORK_LINK_TOPIC, false);
|
|
|
|
const bool isUp = java::GeckoAppShell::IsNetworkLinkUp();
|
|
|
|
java::GeckoProcessManager::ConnectionManager::LocalRef connMgr(mJavaConnMgr);
|
|
if (!connMgr) {
|
|
return;
|
|
}
|
|
|
|
connMgr->OnNetworkStateChange(isUp);
|
|
}
|
|
|
|
} // namespace mozilla
|