gecko-dev/widget/android/GeckoProcessManager.h
Aaron Klotz 646a40b5ed Bug 1625326: Add priority management for non-content child processes to GeckoProcessManager; r=geckoview-reviewers,agi
* 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
2020-05-19 21:34:05 +00:00

83 lines
2.5 KiB
C++

/* -*- Mode: c++; c-basic-offset: 2; tab-width: 20; indent-tabs-mode: nil; -*-
* 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/. */
#ifndef GeckoProcessManager_h
#define GeckoProcessManager_h
#include "WidgetUtils.h"
#include "nsAppShell.h"
#include "nsIObserver.h"
#include "nsWindow.h"
#include "mozilla/RefPtr.h"
#include "mozilla/dom/ContentProcessManager.h"
#include "mozilla/java/GeckoProcessManagerNatives.h"
namespace mozilla {
class GeckoProcessManager final
: public java::GeckoProcessManager::Natives<GeckoProcessManager> {
using BaseNatives = java::GeckoProcessManager::Natives<GeckoProcessManager>;
GeckoProcessManager() = delete;
static already_AddRefed<nsIWidget> GetWidget(int64_t aContentId,
int64_t aTabId) {
using namespace dom;
MOZ_ASSERT(NS_IsMainThread());
ContentProcessManager* const cpm = ContentProcessManager::GetSingleton();
NS_ENSURE_TRUE(cpm, nullptr);
RefPtr<BrowserParent> tab = cpm->GetTopLevelBrowserParentByProcessAndTabId(
ContentParentId(aContentId), TabId(aTabId));
NS_ENSURE_TRUE(tab, nullptr);
nsCOMPtr<nsPIDOMWindowOuter> domWin = tab->GetParentWindowOuter();
NS_ENSURE_TRUE(domWin, nullptr);
return widget::WidgetUtils::DOMWindowToWidget(domWin);
}
class ConnectionManager final
: public java::GeckoProcessManager::ConnectionManager::Natives<
ConnectionManager>,
public nsIObserver {
using BaseNatives = java::GeckoProcessManager::ConnectionManager::Natives<
ConnectionManager>;
virtual ~ConnectionManager() = default;
public:
ConnectionManager() = default;
NS_DECL_ISUPPORTS
NS_DECL_NSIOBSERVER
static void AttachTo(
java::GeckoProcessManager::ConnectionManager::Param aInstance);
void ObserveNetworkNotifications();
private:
java::GeckoProcessManager::ConnectionManager::WeakRef mJavaConnMgr;
};
public:
static void Init();
static void GetEditableParent(jni::Object::Param aEditableChild,
int64_t aContentId, int64_t aTabId) {
nsCOMPtr<nsIWidget> widget = GetWidget(aContentId, aTabId);
if (RefPtr<nsWindow> window = nsWindow::From(widget)) {
java::GeckoProcessManager::SetEditableChildParent(
aEditableChild, window->GetEditableParent());
}
}
};
} // namespace mozilla
#endif // GeckoProcessManager_h