| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.android_webview; | 5 package org.chromium.android_webview; |
| 6 | 6 |
| 7 import android.content.Context; | 7 import android.content.Context; |
| 8 import android.os.StrictMode; | 8 import android.os.StrictMode; |
| 9 | 9 |
| 10 import org.chromium.android_webview.policy.AwPolicyProvider; | 10 import org.chromium.android_webview.policy.AwPolicyProvider; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 | 33 |
| 34 private static final String TAG = "AwBrowserProcess"; | 34 private static final String TAG = "AwBrowserProcess"; |
| 35 private static final String EXCLUSIVE_LOCK_FILE = "webview_data.lock"; | 35 private static final String EXCLUSIVE_LOCK_FILE = "webview_data.lock"; |
| 36 private static FileLock sExclusiveFileLock; | 36 private static FileLock sExclusiveFileLock; |
| 37 | 37 |
| 38 /** | 38 /** |
| 39 * Loads the native library, and performs basic static construction of objec
ts needed | 39 * Loads the native library, and performs basic static construction of objec
ts needed |
| 40 * to run webview in this process. Does not create threads; safe to call fro
m zygote. | 40 * to run webview in this process. Does not create threads; safe to call fro
m zygote. |
| 41 * Note: it is up to the caller to ensure this is only called once. | 41 * Note: it is up to the caller to ensure this is only called once. |
| 42 */ | 42 */ |
| 43 public static void loadLibrary(Context context) { | 43 public static void loadLibrary() { |
| 44 PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX, c
ontext); | 44 Context appContext = ContextUtils.getApplicationContext(); |
| 45 ContextUtils.initApplicationContext(context.getApplicationContext()); | 45 PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX, a
ppContext); |
| 46 try { | 46 try { |
| 47 LibraryLoader libraryLoader = LibraryLoader.get(LibraryProcessType.P
ROCESS_WEBVIEW); | 47 LibraryLoader libraryLoader = LibraryLoader.get(LibraryProcessType.P
ROCESS_WEBVIEW); |
| 48 libraryLoader.loadNow(context); | 48 libraryLoader.loadNow(appContext); |
| 49 // Switch the command line implementation from Java to native. | 49 // Switch the command line implementation from Java to native. |
| 50 // It's okay for the WebView to do this before initialization becaus
e we have | 50 // It's okay for the WebView to do this before initialization becaus
e we have |
| 51 // setup the JNI bindings by this point. | 51 // setup the JNI bindings by this point. |
| 52 libraryLoader.switchCommandLineForWebView(); | 52 libraryLoader.switchCommandLineForWebView(); |
| 53 } catch (ProcessInitException e) { | 53 } catch (ProcessInitException e) { |
| 54 throw new RuntimeException("Cannot load WebView", e); | 54 throw new RuntimeException("Cannot load WebView", e); |
| 55 } | 55 } |
| 56 } | 56 } |
| 57 | 57 |
| 58 /** | 58 /** |
| 59 * Configures child process launcher. This is required only if child service
s are used in | 59 * Configures child process launcher. This is required only if child service
s are used in |
| 60 * WebView. | 60 * WebView. |
| 61 */ | 61 */ |
| 62 public static void configureChildProcessLauncher(String packageName, int ext
raBindFlags) { | 62 public static void configureChildProcessLauncher(String packageName, int ext
raBindFlags) { |
| 63 ChildProcessCreationParams.set( | 63 ChildProcessCreationParams.set( |
| 64 new ChildProcessCreationParams(packageName, extraBindFlags, | 64 new ChildProcessCreationParams(packageName, extraBindFlags, |
| 65 LibraryProcessType.PROCESS_WEBVIEW_CHILD)); | 65 LibraryProcessType.PROCESS_WEBVIEW_CHILD)); |
| 66 } | 66 } |
| 67 | 67 |
| 68 /** | 68 /** |
| 69 * Starts the chromium browser process running within this process. Creates
threads | 69 * Starts the chromium browser process running within this process. Creates
threads |
| 70 * and performs other per-app resource allocations; must not be called from
zygote. | 70 * and performs other per-app resource allocations; must not be called from
zygote. |
| 71 * Note: it is up to the caller to ensure this is only called once. | 71 * Note: it is up to the caller to ensure this is only called once. |
| 72 * @param context The Android application context | |
| 73 */ | 72 */ |
| 74 public static void start(final Context context) { | 73 public static void start() { |
| 75 tryObtainingDataDirLockOrDie(context); | 74 tryObtainingDataDirLockOrDie(); |
| 76 // We must post to the UI thread to cover the case that the user | 75 // We must post to the UI thread to cover the case that the user |
| 77 // has invoked Chromium startup by using the (thread-safe) | 76 // has invoked Chromium startup by using the (thread-safe) |
| 78 // CookieManager rather than creating a WebView. | 77 // CookieManager rather than creating a WebView. |
| 79 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 78 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 80 @Override | 79 @Override |
| 81 public void run() { | 80 public void run() { |
| 81 Context appContext = ContextUtils.getApplicationContext(); |
| 82 // The policies are used by browser startup, so we need to regis
ter the policy | 82 // The policies are used by browser startup, so we need to regis
ter the policy |
| 83 // providers before starting the browser process. This only regi
sters java objects | 83 // providers before starting the browser process. This only regi
sters java objects |
| 84 // and doesn't need the native library. | 84 // and doesn't need the native library. |
| 85 CombinedPolicyProvider.get().registerProvider(new AwPolicyProvid
er(context)); | 85 CombinedPolicyProvider.get().registerProvider(new AwPolicyProvid
er(appContext)); |
| 86 | 86 |
| 87 try { | 87 try { |
| 88 BrowserStartupController.get(context, LibraryProcessType.PRO
CESS_WEBVIEW) | 88 BrowserStartupController.get(appContext, LibraryProcessType.
PROCESS_WEBVIEW) |
| 89 .startBrowserProcessesSync(!CommandLine.getInstance(
).hasSwitch( | 89 .startBrowserProcessesSync(!CommandLine.getInstance(
).hasSwitch( |
| 90 AwSwitches.WEBVIEW_SANDBOXED_RENDERE
R)); | 90 AwSwitches.WEBVIEW_SANDBOXED_RENDERE
R)); |
| 91 } catch (ProcessInitException e) { | 91 } catch (ProcessInitException e) { |
| 92 throw new RuntimeException("Cannot initialize WebView", e); | 92 throw new RuntimeException("Cannot initialize WebView", e); |
| 93 } | 93 } |
| 94 } | 94 } |
| 95 }); | 95 }); |
| 96 } | 96 } |
| 97 | 97 |
| 98 private static void tryObtainingDataDirLockOrDie(Context context) { | 98 private static void tryObtainingDataDirLockOrDie() { |
| 99 StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); | 99 StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); |
| 100 StrictMode.allowThreadDiskWrites(); | 100 StrictMode.allowThreadDiskWrites(); |
| 101 try { | 101 try { |
| 102 String dataPath = PathUtils.getDataDirectory(context); | 102 String dataPath = PathUtils.getDataDirectory(ContextUtils.getApplica
tionContext()); |
| 103 File lockFile = new File(dataPath, EXCLUSIVE_LOCK_FILE); | 103 File lockFile = new File(dataPath, EXCLUSIVE_LOCK_FILE); |
| 104 boolean success = false; | 104 boolean success = false; |
| 105 try { | 105 try { |
| 106 // Note that the file is not closed intentionally. | 106 // Note that the file is not closed intentionally. |
| 107 RandomAccessFile file = new RandomAccessFile(lockFile, "rw"); | 107 RandomAccessFile file = new RandomAccessFile(lockFile, "rw"); |
| 108 sExclusiveFileLock = file.getChannel().tryLock(); | 108 sExclusiveFileLock = file.getChannel().tryLock(); |
| 109 success = sExclusiveFileLock != null; | 109 success = sExclusiveFileLock != null; |
| 110 } catch (IOException e) { | 110 } catch (IOException e) { |
| 111 Log.w(TAG, "Failed to create lock file " + lockFile, e); | 111 Log.w(TAG, "Failed to create lock file " + lockFile, e); |
| 112 } | 112 } |
| 113 if (!success) { | 113 if (!success) { |
| 114 Log.w(TAG, "The app may have another WebView opened in a separat
e process. " | 114 Log.w(TAG, "The app may have another WebView opened in a separat
e process. " |
| 115 + "This is not recommended and may stop working in futur
e versions."); | 115 + "This is not recommended and may stop working in futur
e versions."); |
| 116 } | 116 } |
| 117 } finally { | 117 } finally { |
| 118 StrictMode.setThreadPolicy(oldPolicy); | 118 StrictMode.setThreadPolicy(oldPolicy); |
| 119 } | 119 } |
| 120 } | 120 } |
| 121 } | 121 } |
| OLD | NEW |