Index: chromecast/shell/android/apk/src/org/chromium/chromecast/shell/CastBrowserHelper.java |
diff --git a/chromecast/shell/android/apk/src/org/chromium/chromecast/shell/CastBrowserHelper.java b/chromecast/shell/android/apk/src/org/chromium/chromecast/shell/CastBrowserHelper.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d3ea8eaebfa07d2f38d749b24b5a6dd7a14aec74 |
--- /dev/null |
+++ b/chromecast/shell/android/apk/src/org/chromium/chromecast/shell/CastBrowserHelper.java |
@@ -0,0 +1,100 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.chromecast.shell; |
+ |
+import android.app.Activity; |
+import android.content.Context; |
+import android.content.Intent; |
+import android.os.Build; |
+import android.os.Debug; |
+import android.util.Log; |
+ |
+import org.chromium.base.BaseSwitches; |
+import org.chromium.base.CommandLine; |
+import org.chromium.base.library_loader.LibraryLoader; |
+import org.chromium.base.library_loader.ProcessInitException; |
+import org.chromium.content.browser.BrowserStartupController; |
+import org.chromium.content.browser.DeviceUtils; |
+import org.chromium.content.common.ContentSwitches; |
+ |
+/** |
+ * Static, one-time initialization for the browser process. |
+ */ |
+public class CastBrowserHelper { |
+ private static final String TAG = "CastBrowserHelper"; |
+ |
+ public static final String COMMAND_LINE_FILE = "/data/local/tmp/castshell-command-line"; |
+ public static final String COMMAND_LINE_ARGS_KEY = "commandLineArgs"; |
+ |
+ private static boolean sIsBrowserInitialized = false; |
+ |
+ /** |
+ * Starts the browser process synchronously, returning success or failure. If the browser has |
+ * already started, immediately returns true without performing any more initialization. |
+ * This may only be called on the UI thread. |
+ * |
+ * @return whether or not the process started successfully |
+ */ |
+ public static boolean initializeBrowser(Context context) { |
+ if (sIsBrowserInitialized) return true; |
+ |
+ Log.d(TAG, "Performing one-time browser initialization"); |
+ |
+ // Initializing the command line must occur before loading the library. |
+ if (!CommandLine.isInitialized()) { |
+ if (allowCommandLineImport()) { |
+ Log.d(TAG, "Initializing command line from " + COMMAND_LINE_FILE); |
+ CommandLine.initFromFile(COMMAND_LINE_FILE); |
+ } else { |
+ CommandLine.init(null); |
+ } |
+ |
+ if (context instanceof Activity) { |
+ Intent launchingIntent = ((Activity) context).getIntent(); |
+ String[] commandLineParams = getCommandLineParamsFromIntent(launchingIntent); |
+ if (commandLineParams != null) { |
+ CommandLine.getInstance().appendSwitchesAndArguments(commandLineParams); |
+ } |
+ } |
+ } |
+ |
+ CommandLine.getInstance().appendSwitchWithValue( |
+ ContentSwitches.FORCE_DEVICE_SCALE_FACTOR, "1"); |
+ |
+ waitForDebuggerIfNeeded(); |
+ |
+ DeviceUtils.addDeviceSpecificUserAgentSwitch(context); |
+ |
+ try { |
+ LibraryLoader.ensureInitialized(); |
+ |
+ Log.d(TAG, "Loading BrowserStartupController..."); |
+ BrowserStartupController.get(context).startBrowserProcessesSync(false); |
+ |
+ sIsBrowserInitialized = true; |
+ return true; |
+ } catch (ProcessInitException e) { |
+ Log.e(TAG, "Unable to launch browser process.", e); |
+ return false; |
+ } |
+ } |
+ |
+ private static boolean allowCommandLineImport() { |
+ return !Build.TYPE.equals("user"); |
+ } |
+ |
+ private static String[] getCommandLineParamsFromIntent(Intent intent) { |
+ return intent != null ? intent.getStringArrayExtra(COMMAND_LINE_ARGS_KEY) : null; |
+ } |
+ |
+ private static void waitForDebuggerIfNeeded() { |
+ if (!CommandLine.getInstance().hasSwitch(BaseSwitches.WAIT_FOR_JAVA_DEBUGGER)) { |
+ return; |
+ } |
+ Log.e(TAG, "Waiting for Java debugger to connect..."); |
+ Debug.waitForDebugger(); |
+ Log.e(TAG, "Java debugger connected. Resuming execution."); |
+ } |
+} |