Bug 959237 - Define GetVM, GetJNIEnv, and GetJNIForThread as infallible; r=blassey
Currently when either of these methods fail, we log something and rely on the calling code to null check. Since these failures are serious and likely unrecoverable, it's better to define these methods as infallible and just crash if they do fail.
This commit is contained in:
@@ -159,6 +159,9 @@ AndroidBridge::Init(JNIEnv *jEnv)
|
||||
{
|
||||
ALOG_BRIDGE("AndroidBridge::Init");
|
||||
jEnv->GetJavaVM(&mJavaVM);
|
||||
if (!mJavaVM) {
|
||||
MOZ_CRASH(); // Nothing we can do here
|
||||
}
|
||||
|
||||
AutoLocalJNIFrame jniFrame(jEnv);
|
||||
|
||||
@@ -269,32 +272,19 @@ extern "C" {
|
||||
__attribute__ ((visibility("default")))
|
||||
JNIEnv * GetJNIForThread()
|
||||
{
|
||||
JNIEnv *jEnv = nullptr;
|
||||
JavaVM *jVm = mozilla::AndroidBridge::GetVM();
|
||||
if (!jVm) {
|
||||
__android_log_print(ANDROID_LOG_INFO, "GetJNIForThread", "Returned a null VM");
|
||||
return nullptr;
|
||||
}
|
||||
jEnv = static_cast<JNIEnv*>(PR_GetThreadPrivate(sJavaEnvThreadIndex));
|
||||
|
||||
if (jEnv)
|
||||
JNIEnv *jEnv = static_cast<JNIEnv*>(PR_GetThreadPrivate(sJavaEnvThreadIndex));
|
||||
if (jEnv) {
|
||||
return jEnv;
|
||||
|
||||
int status = jVm->GetEnv((void**) &jEnv, JNI_VERSION_1_2);
|
||||
if (status) {
|
||||
|
||||
status = jVm->AttachCurrentThread(&jEnv, nullptr);
|
||||
if (status) {
|
||||
__android_log_print(ANDROID_LOG_INFO, "GetJNIForThread", "Could not attach");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
}
|
||||
JavaVM *jVm = mozilla::AndroidBridge::GetVM();
|
||||
if (!jVm->GetEnv(reinterpret_cast<void**>(&jEnv), JNI_VERSION_1_2) ||
|
||||
!jVm->AttachCurrentThread(&jEnv, nullptr)) {
|
||||
MOZ_ASSERT(jEnv);
|
||||
PR_SetThreadPrivate(sJavaEnvThreadIndex, jEnv);
|
||||
return jEnv;
|
||||
}
|
||||
if (!jEnv) {
|
||||
__android_log_print(ANDROID_LOG_INFO, "GetJNIForThread", "returning NULL");
|
||||
}
|
||||
return jEnv;
|
||||
MOZ_CRASH();
|
||||
return nullptr; // unreachable
|
||||
}
|
||||
}
|
||||
|
||||
@@ -349,8 +339,6 @@ AndroidBridge::GetHandlersForMimeType(const nsAString& aMimeType,
|
||||
ALOG_BRIDGE("AndroidBridge::GetHandlersForMimeType");
|
||||
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return false;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
jobjectArray arr = GeckoAppShell::GetHandlersForMimeTypeWrapper(aMimeType, aAction);
|
||||
@@ -377,8 +365,6 @@ AndroidBridge::GetHandlersForURL(const nsAString& aURL,
|
||||
ALOG_BRIDGE("AndroidBridge::GetHandlersForURL");
|
||||
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return false;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
jobjectArray arr = GeckoAppShell::GetHandlersForURLWrapper(aURL, aAction);
|
||||
@@ -401,8 +387,6 @@ AndroidBridge::GetMimeTypeFromExtensions(const nsACString& aFileExt, nsCString&
|
||||
ALOG_BRIDGE("AndroidBridge::GetMimeTypeFromExtensions");
|
||||
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
jstring jstrType = GeckoAppShell::GetMimeTypeFromExtensionsWrapper(NS_ConvertUTF8toUTF16(aFileExt));
|
||||
@@ -419,8 +403,6 @@ AndroidBridge::GetExtensionFromMimeType(const nsACString& aMimeType, nsACString&
|
||||
ALOG_BRIDGE("AndroidBridge::GetExtensionFromMimeType");
|
||||
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
jstring jstrExt = GeckoAppShell::GetExtensionFromMimeTypeWrapper(NS_ConvertUTF8toUTF16(aMimeType));
|
||||
@@ -437,8 +419,6 @@ AndroidBridge::GetClipboardText(nsAString& aText)
|
||||
ALOG_BRIDGE("AndroidBridge::GetClipboardText");
|
||||
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return false;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
jstring result = Clipboard::GetClipboardTextWrapper();
|
||||
@@ -505,8 +485,6 @@ void
|
||||
AndroidBridge::ShowFilePickerForExtensions(nsAString& aFilePath, const nsAString& aExtensions)
|
||||
{
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
jstring jstr = GeckoAppShell::ShowFilePickerForExtensionsWrapper(aExtensions);
|
||||
@@ -521,8 +499,6 @@ void
|
||||
AndroidBridge::ShowFilePickerForMimeType(nsAString& aFilePath, const nsAString& aMimeType)
|
||||
{
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
jstring jstr = GeckoAppShell::ShowFilePickerForMimeTypeWrapper(aMimeType);
|
||||
@@ -552,8 +528,6 @@ AndroidBridge::Vibrate(const nsTArray<uint32_t>& aPattern)
|
||||
}
|
||||
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
|
||||
@@ -603,8 +577,6 @@ AndroidBridge::GetSystemColors(AndroidSystemColors *aColors)
|
||||
return;
|
||||
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
|
||||
@@ -641,8 +613,6 @@ AndroidBridge::GetIconForExtension(const nsACString& aFileExt, uint32_t aIconSiz
|
||||
return;
|
||||
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
|
||||
@@ -713,9 +683,6 @@ AndroidBridge::CreateEGLSurfaceForCompositor()
|
||||
MOZ_ASSERT(mGLControllerObj, "AndroidBridge::CreateEGLSurfaceForCompositor called with a null GL controller ref");
|
||||
|
||||
JNIEnv* env = GetJNIForThread(); // called on the compositor thread
|
||||
if (!env) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
jobject eglSurface = mGLControllerObj->CreateEGLSurfaceForCompositorWrapper();
|
||||
@@ -733,8 +700,6 @@ AndroidBridge::GetStaticIntField(const char *className, const char *fieldName, i
|
||||
|
||||
if (!jEnv) {
|
||||
jEnv = GetJNIEnv();
|
||||
if (!jEnv)
|
||||
return false;
|
||||
}
|
||||
|
||||
initInit();
|
||||
@@ -759,8 +724,6 @@ AndroidBridge::GetStaticStringField(const char *className, const char *fieldName
|
||||
|
||||
if (!jEnv) {
|
||||
jEnv = GetJNIEnv();
|
||||
if (!jEnv)
|
||||
return false;
|
||||
}
|
||||
|
||||
AutoLocalJNIFrame jniFrame(jEnv, 1);
|
||||
@@ -963,8 +926,6 @@ AndroidBridge::ValidateBitmap(jobject bitmap, int width, int height)
|
||||
struct BitmapInfo info = { 0, };
|
||||
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return false;
|
||||
|
||||
if ((err = AndroidBitmap_getInfo(env, bitmap, &info)) != 0) {
|
||||
ALOG_BRIDGE("AndroidBitmap_getInfo failed! (error %d)", err);
|
||||
@@ -981,8 +942,6 @@ bool
|
||||
AndroidBridge::InitCamera(const nsCString& contentType, uint32_t camera, uint32_t *width, uint32_t *height, uint32_t *fps)
|
||||
{
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return false;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
jintArray arr = GeckoAppShell::InitCameraWrapper(NS_ConvertUTF8toUTF16(contentType), (int32_t) camera, (int32_t) width, (int32_t) height);
|
||||
@@ -1009,8 +968,6 @@ AndroidBridge::GetCurrentBatteryInformation(hal::BatteryInformation* aBatteryInf
|
||||
ALOG_BRIDGE("AndroidBridge::GetCurrentBatteryInformation");
|
||||
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
|
||||
@@ -1036,8 +993,6 @@ AndroidBridge::HandleGeckoMessage(const nsAString &aMessage, nsAString &aRet)
|
||||
ALOG_BRIDGE("%s", __PRETTY_FUNCTION__);
|
||||
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
jstring returnMessage = GeckoAppShell::HandleGeckoMessageWrapper(aMessage);
|
||||
@@ -1066,8 +1021,6 @@ AndroidBridge::GetSegmentInfoForText(const nsAString& aText,
|
||||
data.charsAvailableInLastSegment() = 0;
|
||||
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 2);
|
||||
jstring jText = NewJavaString(&jniFrame, aText);
|
||||
@@ -1141,8 +1094,6 @@ AndroidBridge::CreateMessageList(const dom::mobilemessage::SmsFilterData& aFilte
|
||||
ALOG_BRIDGE("AndroidBridge::CreateMessageList");
|
||||
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
uint32_t requestId;
|
||||
if (!QueueSmsRequest(aRequest, &requestId))
|
||||
@@ -1219,8 +1170,6 @@ AndroidBridge::GetCurrentNetworkInformation(hal::NetworkInformation* aNetworkInf
|
||||
ALOG_BRIDGE("AndroidBridge::GetCurrentNetworkInformation");
|
||||
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
|
||||
@@ -1246,8 +1195,6 @@ void *
|
||||
AndroidBridge::LockBitmap(jobject bitmap)
|
||||
{
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return nullptr;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 0);
|
||||
|
||||
@@ -1266,8 +1213,6 @@ void
|
||||
AndroidBridge::UnlockBitmap(jobject bitmap)
|
||||
{
|
||||
JNIEnv *env = GetJNIEnv();
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 0);
|
||||
|
||||
@@ -1415,8 +1360,6 @@ jobject
|
||||
AndroidBridge::GetGlobalContextRef() {
|
||||
if (sGlobalContext == nullptr) {
|
||||
JNIEnv *env = GetJNIForThread();
|
||||
if (!env)
|
||||
return 0;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 4);
|
||||
|
||||
@@ -1647,8 +1590,6 @@ AndroidBridge::GetProxyForURI(const nsACString & aSpec,
|
||||
nsACString & aResult)
|
||||
{
|
||||
JNIEnv* env = GetJNIEnv();
|
||||
if (!env)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
jstring jstrRet = GeckoAppShell::GetProxyForURIWrapper(NS_ConvertUTF8toUTF16(aSpec),
|
||||
@@ -1699,8 +1640,6 @@ bool
|
||||
AndroidBridge::GetThreadNameJavaProfiling(uint32_t aThreadId, nsCString & aResult)
|
||||
{
|
||||
JNIEnv* env = GetJNIForThread();
|
||||
if (!env)
|
||||
return false;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
|
||||
@@ -1719,8 +1658,6 @@ AndroidBridge::GetFrameNameJavaProfiling(uint32_t aThreadId, uint32_t aSampleId,
|
||||
uint32_t aFrameId, nsCString & aResult)
|
||||
{
|
||||
JNIEnv* env = GetJNIForThread();
|
||||
if (!env)
|
||||
return false;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 1);
|
||||
|
||||
@@ -1777,8 +1714,6 @@ nsresult AndroidBridge::CaptureThumbnail(nsIDOMWindow *window, int32_t bufW, int
|
||||
}
|
||||
|
||||
JNIEnv* env = GetJNIEnv();
|
||||
if (!env)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
AutoLocalJNIFrame jniFrame(env, 0);
|
||||
|
||||
@@ -1847,7 +1782,7 @@ AndroidBridge::GetDisplayPort(bool aPageSizeUpdate, bool aIsBrowserContentDispla
|
||||
|
||||
ALOG_BRIDGE("Enter: %s", __PRETTY_FUNCTION__);
|
||||
JNIEnv* env = GetJNIEnv();
|
||||
if (!env || !mLayerClient || mLayerClient->isNull()) {
|
||||
if (!mLayerClient || mLayerClient->isNull()) {
|
||||
|
||||
ALOG_BRIDGE("Exceptional Exit: %s", __PRETTY_FUNCTION__);
|
||||
return;
|
||||
@@ -1915,8 +1850,7 @@ AndroidBridge::ContentDocumentChanged()
|
||||
bool
|
||||
AndroidBridge::IsContentDocumentDisplayed()
|
||||
{
|
||||
JNIEnv* env = GetJNIEnv();
|
||||
if (!env || !mLayerClient)
|
||||
if (!mLayerClient)
|
||||
return false;
|
||||
|
||||
return mLayerClient->IsContentDocumentDisplayed();
|
||||
|
||||
Reference in New Issue
Block a user