summaryrefslogtreecommitdiffstats
path: root/android_webview/java
diff options
context:
space:
mode:
authormnaganov <mnaganov@chromium.org>2015-12-29 16:37:22 -0800
committerCommit bot <commit-bot@chromium.org>2015-12-30 00:38:09 +0000
commit079328852c8cd8aab87d8cf6811fe371f4c65307 (patch)
treeee246fd9383ef13c089cb77dabdecd9152bbbabd /android_webview/java
parent2c86c0a1752156d1d921aa1fc7b922700185e625 (diff)
downloadchromium_src-079328852c8cd8aab87d8cf6811fe371f4c65307.zip
chromium_src-079328852c8cd8aab87d8cf6811fe371f4c65307.tar.gz
chromium_src-079328852c8cd8aab87d8cf6811fe371f4c65307.tar.bz2
[Android WebView] Forbid launching of two browser processes in the app
Use FileLock in the data directory to enforce exclusive access to it. Attempting to share the data directory between two browser processes will most likely lead to data corruption. BUG=558377 Review URL: https://codereview.chromium.org/1555513003 Cr-Commit-Position: refs/heads/master@{#367120}
Diffstat (limited to 'android_webview/java')
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java7
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java28
2 files changed, 32 insertions, 3 deletions
diff --git a/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java b/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java
index 244dfed..ea5a637 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java
@@ -12,9 +12,10 @@ import org.chromium.content.browser.ContentViewStatics;
/**
* Java side of the Browser Context: contains all the java side objects needed to host one
* browing session (i.e. profile).
- * Note that due to running in single process mode, and limitations on renderer process only
- * being able to use a single browser context, currently there can only be one AwBrowserContext
- * instance, so at this point the class mostly exists for conceptual clarity.
+ *
+ * Note that historically WebView was running in single process mode, and limitations on renderer
+ * process only being able to use a single browser context, currently there can only be one
+ * AwBrowserContext instance, so at this point the class mostly exists for conceptual clarity.
*/
public class AwBrowserContext {
private static final String HTTP_AUTH_DATABASE_FILE = "http_auth.db";
diff --git a/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java b/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java
index a936cd3..ead518f 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java
@@ -8,6 +8,7 @@ import android.content.Context;
import org.chromium.android_webview.policy.AwPolicyProvider;
import org.chromium.base.CommandLine;
+import org.chromium.base.Log;
import org.chromium.base.PathUtils;
import org.chromium.base.ThreadUtils;
import org.chromium.base.library_loader.LibraryLoader;
@@ -16,6 +17,11 @@ import org.chromium.base.library_loader.ProcessInitException;
import org.chromium.content.browser.BrowserStartupController;
import org.chromium.policy.CombinedPolicyProvider;
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.channels.FileLock;
+
/**
* Wrapper for the steps needed to initialize the java and native sides of webview chromium.
*/
@@ -23,6 +29,8 @@ public abstract class AwBrowserProcess {
public static final String PRIVATE_DATA_DIRECTORY_SUFFIX = "webview";
private static final String TAG = "AwBrowserProcess";
+ private static final String EXCLUSIVE_LOCK_FILE = "webview_data.lock";
+ private static FileLock sExclusiveFileLock;
/**
* Loads the native library, and performs basic static construction of objects needed
@@ -50,6 +58,7 @@ public abstract class AwBrowserProcess {
* @param context The Android application context
*/
public static void start(final Context context) {
+ tryObtainingDataDirLockOrDie(context);
// We must post to the UI thread to cover the case that the user
// has invoked Chromium startup by using the (thread-safe)
// CookieManager rather than creating a WebView.
@@ -71,4 +80,23 @@ public abstract class AwBrowserProcess {
}
});
}
+
+ private static void tryObtainingDataDirLockOrDie(Context context) {
+ String dataPath = PathUtils.getDataDirectory(context);
+ File lockFile = new File(dataPath, EXCLUSIVE_LOCK_FILE);
+ boolean success = false;
+ try {
+ // Note that the file is not closed intentionally.
+ RandomAccessFile file = new RandomAccessFile(lockFile, "rw");
+ sExclusiveFileLock = file.getChannel().tryLock();
+ success = sExclusiveFileLock != null;
+ } catch (IOException e) {
+ Log.w(TAG, "Failed to create lock file " + lockFile, e);
+ }
+ if (!success) {
+ throw new RuntimeException(
+ "Could not obtain an exclusive lock on the data dir. The app may have "
+ + "another WebView opened in a separate process");
+ }
+ }
}