diff options
author | mnaganov <mnaganov@chromium.org> | 2015-12-29 16:37:22 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-30 00:38:09 +0000 |
commit | 079328852c8cd8aab87d8cf6811fe371f4c65307 (patch) | |
tree | ee246fd9383ef13c089cb77dabdecd9152bbbabd /android_webview/java | |
parent | 2c86c0a1752156d1d921aa1fc7b922700185e625 (diff) | |
download | chromium_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.java | 7 | ||||
-rw-r--r-- | android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java | 28 |
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"); + } + } } |