summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryfriedman@chromium.org <yfriedman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-07 04:12:13 +0000
committeryfriedman@chromium.org <yfriedman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-07 04:12:13 +0000
commitf804551d543ddbe59a1d216a30b217a90ca5a910 (patch)
treecc6df91b8cfb6be51cf73ff5c47a3760317aeb82
parent2362015c5ba54deae8e362ed55aa3aa2ecb3a449 (diff)
downloadchromium_src-f804551d543ddbe59a1d216a30b217a90ca5a910.zip
chromium_src-f804551d543ddbe59a1d216a30b217a90ca5a910.tar.gz
chromium_src-f804551d543ddbe59a1d216a30b217a90ca5a910.tar.bz2
Handle LibraryLoader error from the renderer process.
If we fail to load the library in the renderer process, just abort early. This prevents an extra user-visible dialog that Chrome has crashed. Note that we currently assume the browser process hits the same error and will prompt the user. If this only happens for the renderer process we'd end up with a hung tab, but it's not clear how that would happen. As part of this, convert the RESULT_CODES enum to be generated from a template so that we can re-use the same values for C++ and Java BUG=180054 Review URL: https://chromiumcodereview.appspot.com/12464004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@186610 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java7
-rw-r--r--build/android/java_cpp_template.gypi1
-rw-r--r--content/content.gyp13
-rw-r--r--content/content_common.gypi1
-rw-r--r--content/public/android/java/src/org/chromium/content/app/LibraryLoader.java25
-rw-r--r--content/public/android/java/src/org/chromium/content/app/SandboxedProcessService.java13
-rw-r--r--content/public/android/java/src/org/chromium/content/common/ResultCodes.template13
-rw-r--r--content/public/common/result_codes.h28
-rw-r--r--content/public/common/result_codes_list.h38
9 files changed, 97 insertions, 42 deletions
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 4d6c1ff..e930af1 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java
@@ -11,7 +11,6 @@ import org.chromium.base.PathUtils;
import org.chromium.base.ThreadUtils;
import org.chromium.content.app.LibraryLoader;
import org.chromium.content.browser.AndroidBrowserProcess;
-import org.chromium.content.browser.ResourceExtractor;
import org.chromium.content.common.ProcessInitException;
/**
@@ -35,7 +34,11 @@ public abstract class AwBrowserProcess {
public static void loadLibrary() {
PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX);
LibraryLoader.setLibraryToLoad(NATIVE_LIBRARY);
- LibraryLoader.loadNow();
+ try {
+ LibraryLoader.loadNow();
+ } catch (ProcessInitException e) {
+ throw new RuntimeException("Cannot load WebView", e);
+ }
}
// TODO(joth): remove when downstream is using new version below.
diff --git a/build/android/java_cpp_template.gypi b/build/android/java_cpp_template.gypi
index 22b7214..c55b100 100644
--- a/build/android/java_cpp_template.gypi
+++ b/build/android/java_cpp_template.gypi
@@ -56,6 +56,7 @@
'action': [
'gcc', # invoke host gcc.
'-E', # stop after preprocessing.
+ '-D', 'ANDROID', # Specify ANDROID define for pre-processor.
'-x', 'c-header', # treat sources as C header files
'-P', # disable line markers, i.e. '#line 309'
'-I', '<(DEPTH)', # Add project top-level to include path
diff --git a/content/content.gyp b/content/content.gyp
index 0b40689..f5679b9 100644
--- a/content/content.gyp
+++ b/content/content.gyp
@@ -312,6 +312,7 @@
'common_aidl',
'content_common',
'page_transition_types_java',
+ 'result_codes_java',
],
'variables': {
'java_in_dir': '../content/public/android/java',
@@ -343,6 +344,18 @@
'includes': [ '../build/android/java_cpp_template.gypi' ],
},
{
+ 'target_name': 'result_codes_java',
+ 'type': 'none',
+ 'sources': [
+ 'public/android/java/src/org/chromium/content/common/ResultCodes.template',
+ ],
+ 'variables': {
+ 'package_name': 'org/chromium/content/common',
+ 'template_deps': ['public/common/result_codes_list.h'],
+ },
+ 'includes': [ '../build/android/java_cpp_template.gypi' ],
+ },
+ {
'target_name': 'surface_texture_jni_headers',
'type': 'none',
'variables': {
diff --git a/content/content_common.gypi b/content/content_common.gypi
index 07df4dd..7faa1ec 100644
--- a/content/content_common.gypi
+++ b/content/content_common.gypi
@@ -78,6 +78,7 @@
'public/common/resource_dispatcher_delegate.h',
'public/common/resource_response.h',
'public/common/result_codes.h',
+ 'public/common/result_codes_list.h',
'public/common/sandbox_init.cc',
'public/common/sandbox_init.h',
'public/common/sandbox_linux.h',
diff --git a/content/public/android/java/src/org/chromium/content/app/LibraryLoader.java b/content/public/android/java/src/org/chromium/content/app/LibraryLoader.java
index 91e3234..0facd0b 100644
--- a/content/public/android/java/src/org/chromium/content/app/LibraryLoader.java
+++ b/content/public/android/java/src/org/chromium/content/app/LibraryLoader.java
@@ -4,14 +4,13 @@
package org.chromium.content.app;
-import android.os.AsyncTask;
-import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import org.chromium.base.JNINamespace;
import org.chromium.content.common.CommandLine;
import org.chromium.content.common.ProcessInitException;
+import org.chromium.content.common.ResultCodes;
import org.chromium.content.common.TraceEvent;
/**
@@ -78,20 +77,24 @@ public class LibraryLoader {
* this is called on will be the thread that runs the native code's static initializers.
* See the comment in doInBackground() for more considerations on this.
*
- * @return Whether the native library was successfully loaded.
+ * @throws ProcessInitException if the native library failed to load.
*/
- public static void loadNow() {
+ public static void loadNow() throws ProcessInitException {
if (sLibrary == null) {
assert false : "No library specified to load. Call setLibraryToLoad before first.";
}
- synchronized (sLoadedLock) {
- if (!sLoaded) {
- assert !sInitialized;
- Log.i(TAG, "loading: " + sLibrary);
- System.loadLibrary(sLibrary);
- Log.i(TAG, "loaded: " + sLibrary);
- sLoaded = true;
+ try {
+ synchronized (sLoadedLock) {
+ if (!sLoaded) {
+ assert !sInitialized;
+ Log.i(TAG, "loading: " + sLibrary);
+ System.loadLibrary(sLibrary);
+ Log.i(TAG, "loaded: " + sLibrary);
+ sLoaded = true;
+ }
}
+ } catch (UnsatisfiedLinkError e) {
+ throw new ProcessInitException(ResultCodes.RESULT_CODE_NATIVE_LIBRARY_LOAD_FAILED, e);
}
}
diff --git a/content/public/android/java/src/org/chromium/content/app/SandboxedProcessService.java b/content/public/android/java/src/org/chromium/content/app/SandboxedProcessService.java
index 3933858..2c5bd60 100644
--- a/content/public/android/java/src/org/chromium/content/app/SandboxedProcessService.java
+++ b/content/public/android/java/src/org/chromium/content/app/SandboxedProcessService.java
@@ -16,16 +16,16 @@ import android.os.RemoteException;
import android.util.Log;
import android.view.Surface;
-import java.util.ArrayList;
-
import org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;
-import org.chromium.content.app.ContentMain;
import org.chromium.content.browser.SandboxedProcessConnection;
import org.chromium.content.common.ISandboxedProcessCallback;
import org.chromium.content.common.ISandboxedProcessService;
+import org.chromium.content.browser.SandboxedProcessLauncher;
import org.chromium.content.common.ProcessInitException;
+import java.util.ArrayList;
+
/**
* This is the base class for sandboxed services; the SandboxedProcessService0, 1.. etc
* subclasses provide the concrete service entry points, to enable the browser to connect
@@ -118,7 +118,12 @@ public class SandboxedProcessService extends Service {
}
}
LibraryLoader.setLibraryToLoad(mNativeLibraryName);
- LibraryLoader.loadNow();
+ try {
+ LibraryLoader.loadNow();
+ } catch (ProcessInitException e) {
+ Log.e(TAG, "Failed to load native library, exiting sandboxed process", e);
+ return;
+ }
synchronized (mSandboxMainThread) {
while (mCommandLineParams == null) {
mSandboxMainThread.wait();
diff --git a/content/public/android/java/src/org/chromium/content/common/ResultCodes.template b/content/public/android/java/src/org/chromium/content/common/ResultCodes.template
new file mode 100644
index 0000000..69962bf
--- /dev/null
+++ b/content/public/android/java/src/org/chromium/content/common/ResultCodes.template
@@ -0,0 +1,13 @@
+// Copyright (c) 2013 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.content.common;
+
+public class ResultCodes {
+#define RESULT_CODE(label, value) public static final int \
+ RESULT_CODE_ ## label = value;
+#include "content/public/common/result_codes_list.h"
+#undef RESULT_CODE
+}
+
diff --git a/content/public/common/result_codes.h b/content/public/common/result_codes.h
index b3c4a6b..1bf625d 100644
--- a/content/public/common/result_codes.h
+++ b/content/public/common/result_codes.h
@@ -5,35 +5,13 @@
#ifndef CONTENT_PUBLIC_COMMON_RESULT_CODES_H_
#define CONTENT_PUBLIC_COMMON_RESULT_CODES_H_
-// This file consolidates all the return codes for the browser and renderer
-// process. The return code is the value that:
-// a) is returned by main() or winmain(), or
-// b) specified in the call for ExitProcess() or TerminateProcess(), or
-// c) the exception value that causes a process to terminate.
-//
-// It is advisable to not use negative numbers because the Windows API returns
-// it as an unsigned long and the exception values have high numbers. For
-// example EXCEPTION_ACCESS_VIOLATION value is 0xC0000005.
-
namespace content {
enum ResultCode {
- // Process terminated normally.
- RESULT_CODE_NORMAL_EXIT = 0,
-
- // Process was killed by user or system.
- RESULT_CODE_KILLED = 1,
-
- // Process hung.
- RESULT_CODE_HUNG = 2,
-
- // A bad message caused the process termination.
- RESULT_CODE_KILLED_BAD_MESSAGE = 3,
-#if defined(OS_ANDROID)
- // Failed to register JNI methods.
- RESULT_CODE_FAILED_TO_REGISTER_JNI = 4,
-#endif
+#define RESULT_CODE(label, value) RESULT_CODE_ ## label = value,
+#include "content/public/common/result_codes_list.h"
+#undef RESULT_CODE
// Last return code (keep this last).
RESULT_CODE_LAST_CODE
diff --git a/content/public/common/result_codes_list.h b/content/public/common/result_codes_list.h
new file mode 100644
index 0000000..9f6453b
--- /dev/null
+++ b/content/public/common/result_codes_list.h
@@ -0,0 +1,38 @@
+// Copyright (c) 2013 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.
+
+// Intentionally no include guards because this file is meant to be included
+// inside a macro to generate enum values.
+
+// This file consolidates all the return codes for the browser and renderer
+// process. The return code is the value that:
+// a) is returned by main() or winmain(), or
+// b) specified in the call for ExitProcess() or TerminateProcess(), or
+// c) the exception value that causes a process to terminate.
+//
+// It is advisable to not use negative numbers because the Windows API returns
+// it as an unsigned long and the exception values have high numbers. For
+// example EXCEPTION_ACCESS_VIOLATION value is 0xC0000005.
+
+#include "build/build_config.h"
+
+// Process terminated normally.
+RESULT_CODE(NORMAL_EXIT, 0)
+
+// Process was killed by user or system.
+RESULT_CODE(KILLED, 1)
+
+// Process hung.
+RESULT_CODE(HUNG, 2)
+
+// A bad message caused the process termination.
+RESULT_CODE(KILLED_BAD_MESSAGE, 3)
+
+#if defined(OS_ANDROID)
+// Failed to register JNI methods.
+RESULT_CODE(FAILED_TO_REGISTER_JNI, 4)
+
+// Failed to find and load the native library.
+RESULT_CODE(NATIVE_LIBRARY_LOAD_FAILED, 5)
+#endif