Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4002)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java

Issue 1521013002: Make the ChromeBrowserInitializer the only way to start the browser process. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: yfriedman@ comment Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
index 56ce9ee00a65c82d65a6a7578665c7ae6b69de56..cfa2c2002b2958a5f75764aea1d11d912fa8fe8a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
@@ -16,18 +16,22 @@ import org.chromium.base.ContentUriUtils;
import org.chromium.base.ResourceExtractor;
import org.chromium.base.ThreadUtils;
import org.chromium.base.TraceEvent;
+import org.chromium.base.library_loader.LibraryLoader;
+import org.chromium.base.library_loader.LibraryProcessType;
import org.chromium.base.library_loader.ProcessInitException;
import org.chromium.chrome.browser.ChromeApplication;
import org.chromium.chrome.browser.ChromeStrictMode;
import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.browser.FileProviderHelper;
import org.chromium.chrome.browser.device.DeviceClassManager;
+import org.chromium.chrome.browser.services.GoogleServicesManager;
import org.chromium.chrome.browser.tabmodel.document.DocumentTabModelImpl;
import org.chromium.content.app.ContentApplication;
import org.chromium.content.browser.BrowserStartupController;
import org.chromium.content.browser.DeviceUtils;
import org.chromium.content.browser.SpeechRecognition;
import org.chromium.net.NetworkChangeNotifier;
+import org.chromium.policy.CombinedPolicyProvider;
import java.util.LinkedList;
@@ -75,12 +79,28 @@ public class ChromeBrowserInitializer {
}
/**
+ * Initializes the Chrome browser process synchronously.
+ *
+ * @throws ProcessInitException if there is a problem with the native library.
+ */
+ public void handleSynchronousStartup() throws ProcessInitException {
+ assert ThreadUtils.runningOnUiThread() : "Tried to start the browser on the wrong thread";
+
+ ChromeBrowserInitializer initializer = ChromeBrowserInitializer.getInstance(mApplication);
+ BrowserParts parts = new EmptyBrowserParts();
+ initializer.handlePreNativeStartup(parts);
+ initializer.handlePostNativeStartup(false, parts);
+ }
+
+ /**
* Execute startup tasks that can be done without native libraries. See {@link BrowserParts} for
* a list of calls to be implemented.
* @param parts The delegate for the {@link ChromeBrowserInitializer} to communicate
* initialization tasks.
*/
public void handlePreNativeStartup(final BrowserParts parts) {
+ assert ThreadUtils.runningOnUiThread() : "Tried to start the browser on the wrong thread";
+
preInflationStartup();
parts.preInflationStartup();
preInflationStartupDone();
@@ -102,7 +122,6 @@ public class ChromeBrowserInitializer {
}
}
-
/**
* Pre-load shared prefs to avoid being blocked on the
* disk access async task in the future.
@@ -145,10 +164,15 @@ public class ChromeBrowserInitializer {
/**
* Execute startup tasks that require native libraries to be loaded. See {@link BrowserParts}
* for a list of calls to be implemented.
- * @param parts The delegate for the {@link ChromeBrowserInitializer} to communicate
- * initialization tasks.
+ * @param isAsync Whether this call should synchronously wait for the browser process to be
+ * fully initialized before returning to the caller.
+ * @param delegate The delegate for the {@link ChromeBrowserInitializer} to communicate
+ * initialization tasks.
*/
- public void handlePostNativeStartup(final BrowserParts delegate) {
+ public void handlePostNativeStartup(final boolean isAsync, final BrowserParts delegate)
+ throws ProcessInitException {
+ assert ThreadUtils.runningOnUiThread() : "Tried to start the browser on the wrong thread";
+
final LinkedList<Runnable> initQueue = new LinkedList<Runnable>();
abstract class NativeInitTask implements Runnable {
@@ -159,7 +183,12 @@ public class ChromeBrowserInitializer {
// between tasks.
initFunction();
if (!initQueue.isEmpty()) {
- mHandler.post(initQueue.pop());
+ Runnable nextTask = initQueue.pop();
+ if (isAsync) {
+ mHandler.post(nextTask);
+ } else {
+ nextTask.run();
+ }
}
}
public abstract void initFunction();
@@ -226,31 +255,57 @@ public class ChromeBrowserInitializer {
}
});
- // We want to start this queue once the C++ startup tasks have run; allow the
- // C++ startup to run asynchonously, and set it up to start the Java queue once
- // it has finished.
- startChromeBrowserProcesses(delegate, new BrowserStartupController.StartupCallback() {
- @Override
- public void onFailure() {
- delegate.onStartupFailure();
- }
+ if (isAsync) {
+ // We want to start this queue once the C++ startup tasks have run; allow the
+ // C++ startup to run asynchonously, and set it up to start the Java queue once
+ // it has finished.
+ startChromeBrowserProcessesAsync(
+ new BrowserStartupController.StartupCallback() {
+ @Override
+ public void onFailure() {
+ delegate.onStartupFailure();
+ }
+
+ @Override
+ public void onSuccess(boolean success) {
+ mHandler.post(initQueue.pop());
+ }
+ });
+ } else {
+ startChromeBrowserProcessesSync();
+ initQueue.pop().run();
+ assert initQueue.isEmpty();
+ }
+ }
- @Override
- public void onSuccess(boolean arg0) {
- mHandler.post(initQueue.pop());
- }
- });
+ private void startChromeBrowserProcessesAsync(
+ BrowserStartupController.StartupCallback callback) throws ProcessInitException {
+ try {
+ TraceEvent.begin("ChromeBrowserInitializer.startChromeBrowserProcessesAsync");
+ mApplication.registerPolicyProviders(CombinedPolicyProvider.get());
+ BrowserStartupController.get(mApplication, LibraryProcessType.PROCESS_BROWSER)
+ .startBrowserProcessesAsync(callback);
+ } finally {
+ TraceEvent.end("ChromeBrowserInitializer.startChromeBrowserProcessesAsync");
+ }
}
- private void startChromeBrowserProcesses(BrowserParts parts,
- BrowserStartupController.StartupCallback callback) {
+ private void startChromeBrowserProcessesSync() throws ProcessInitException {
try {
- TraceEvent.begin("ChromeBrowserInitializer.startChromeBrowserProcesses");
- mApplication.startChromeBrowserProcessesAsync(callback);
- } catch (ProcessInitException e) {
- parts.onStartupFailure();
+ TraceEvent.begin("ChromeBrowserInitializer.startChromeBrowserProcessesSync");
+ ThreadUtils.assertOnUiThread();
+ mApplication.initCommandLine();
+ LibraryLoader libraryLoader = LibraryLoader.get(LibraryProcessType.PROCESS_BROWSER);
+ libraryLoader.ensureInitialized(mApplication);
+ libraryLoader.asyncPrefetchLibrariesToMemory();
+ // The policies are used by browser startup, so we need to register the policy providers
+ // before starting the browser process.
+ mApplication.registerPolicyProviders(CombinedPolicyProvider.get());
+ BrowserStartupController.get(mApplication, LibraryProcessType.PROCESS_BROWSER)
+ .startBrowserProcessesSync(false);
+ GoogleServicesManager.get(mApplication);
} finally {
- TraceEvent.end("ChromeBrowserInitializer.startChromeBrowserProcesses");
+ TraceEvent.end("ChromeBrowserInitializer.startChromeBrowserProcessesSync");
}
}

Powered by Google App Engine
This is Rietveld 408576698