summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/public/android/java/src/org/chromium/content/browser/ChildProcessConnectionImpl.java14
-rw-r--r--content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java12
2 files changed, 23 insertions, 3 deletions
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessConnectionImpl.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessConnectionImpl.java
index 2020994..b13ffbb 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessConnectionImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessConnectionImpl.java
@@ -177,9 +177,9 @@ public class ChildProcessConnectionImpl implements ChildProcessConnection {
if (mServiceDisconnected) {
return;
}
- mServiceDisconnected = true;
// Stash the status of the oom bindings, since stop() will release all bindings.
- mWasOomProtected = mInitialBinding.isBound() || mStrongBinding.isBound();
+ mWasOomProtected = isCurrentlyOomProtected();
+ mServiceDisconnected = true;
Log.w(TAG, "onServiceDisconnected (crash or killed by oom): pid=" + mPid);
stop(); // We don't want to auto-restart on crash. Let the browser do that.
mDeathCallback.onChildProcessDied(ChildProcessConnectionImpl.this);
@@ -407,11 +407,19 @@ public class ChildProcessConnectionImpl implements ChildProcessConnection {
if (mServiceDisconnected) {
return mWasOomProtected;
} else {
- return mInitialBinding.isBound() || mStrongBinding.isBound();
+ return isCurrentlyOomProtected();
}
}
}
+ private boolean isCurrentlyOomProtected() {
+ synchronized (mLock) {
+ assert !mServiceDisconnected;
+ if (mAlwaysInForeground) return ChildProcessLauncher.isApplicationInForeground();
+ return mInitialBinding.isBound() || mStrongBinding.isBound();
+ }
+ }
+
@Override
public void dropOomBindings() {
synchronized (mLock) {
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
index eae1698..e9f7beb 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
@@ -351,6 +351,9 @@ public class ChildProcessLauncher {
private static Map<Pair<Integer, Integer>, Surface> sSurfaceTextureSurfaceMap =
new ConcurrentHashMap<Pair<Integer, Integer>, Surface>();
+ // Whether the main application is currently brought to the foreground.
+ private static boolean sApplicationInForeground = true;
+
@VisibleForTesting
public static void setBindingManagerForTesting(BindingManager manager) {
sBindingManager = manager;
@@ -433,6 +436,7 @@ public class ChildProcessLauncher {
* Called when the embedding application is sent to background.
*/
public static void onSentToBackground() {
+ sApplicationInForeground = false;
sBindingManager.onSentToBackground();
}
@@ -440,10 +444,18 @@ public class ChildProcessLauncher {
* Called when the embedding application is brought to foreground.
*/
public static void onBroughtToForeground() {
+ sApplicationInForeground = true;
sBindingManager.onBroughtToForeground();
}
/**
+ * Returns whether the application is currently in the foreground.
+ */
+ static boolean isApplicationInForeground() {
+ return sApplicationInForeground;
+ }
+
+ /**
* Should be called early in startup so the work needed to spawn the child process can be done
* in parallel to other startup work. Must not be called on the UI thread. Spare connection is
* created in sandboxed child process.