Bug 575750 - Implement support for OS protocol handlers on Android [r=mwu,bzbarsky]

This commit is contained in:
Brad Lassey
2010-06-29 22:22:08 -04:00
parent b2285db5c7
commit 0509608776
9 changed files with 185 additions and 35 deletions

View File

@@ -40,6 +40,7 @@
#include "mozilla/dom/ContentChild.h"
#include <pthread.h>
#include <prthread.h>
#include "nsXPCOMStrings.h"
#include "AndroidBridge.h"
@@ -100,7 +101,8 @@ AndroidBridge::Init(JNIEnv *jEnv,
jScheduleRestart = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "scheduleRestart", "()V");
jNotifyXreExit = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "onXreExit", "()V");
jGetHandlersForMimeType = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "getHandlersForMimeType", "(Ljava/lang/String;)[Ljava/lang/String;");
jOpenUriExternal = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "openUriExternal", "(Ljava/lang/String;Ljava/lang/String;)Z");
jGetHandlersForProtocol = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "getHandlersForProtocol", "(Ljava/lang/String;)[Ljava/lang/String;");
jOpenUriExternal = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "openUriExternal", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z");
jGetMimeTypeFromExtension = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "getMimeTypeFromExtension", "(Ljava/lang/String;)Ljava/lang/String;");
jMoveTaskToBack = (jmethodID) jEnv->GetStaticMethodID(jGeckoAppShellClass, "moveTaskToBack", "()V");
@@ -254,38 +256,81 @@ AndroidBridge::NotifyXreExit()
mJNIEnv->CallStaticVoidMethod(mGeckoAppShellClass, jNotifyXreExit);
}
void
PRBool
AndroidBridge::GetHandlersForMimeType(const char *aMimeType, nsStringArray* aStringArray)
{
NS_PRECONDITION(aStringArray != nsnull, "null array pointer passed in");
AutoLocalJNIFrame jniFrame;
NS_ConvertUTF8toUTF16 wMimeType(aMimeType);
jstring jstr = mJNIEnv->NewString(wMimeType.get(), wMimeType.Length());
jobject obj = mJNIEnv->CallStaticObjectMethod(mGeckoAppShellClass,
jGetHandlersForMimeType,
jobject obj = mJNIEnv->CallStaticObjectMethod(mGeckoAppShellClass,
jGetHandlersForMimeType,
jstr);
jobjectArray arr = static_cast<jobjectArray>(obj);
if (!arr)
return;
return PR_FALSE;
jsize len = mJNIEnv->GetArrayLength(arr);
for (jsize i = 0; i < len; i+=2) {
if (!aStringArray)
return len > 0;
for (jsize i = 0; i < len; i++) {
jstring jstr = static_cast<jstring>(mJNIEnv->GetObjectArrayElement(arr, i));
nsJNIString jniStr(jstr);
aStringArray->AppendString(jniStr);
}
aStringArray->InsertStringAt(jniStr, i);
}
return PR_TRUE;
}
PRBool
AndroidBridge::OpenUriExternal(nsCString& aUriSpec, nsCString& aMimeType)
AndroidBridge::GetHandlersForProtocol(const char *aScheme, nsStringArray* aStringArray)
{
NS_PRECONDITION(aStringArray != nsnull, "null array pointer passed in");
AutoLocalJNIFrame jniFrame;
NS_ConvertUTF8toUTF16 wScheme(aScheme);
jstring jstr = mJNIEnv->NewString(wScheme.get(), wScheme.Length());
jobject obj = mJNIEnv->CallStaticObjectMethod(mGeckoAppShellClass,
jGetHandlersForProtocol,
jstr);
jobjectArray arr = static_cast<jobjectArray>(obj);
if (!arr)
return PR_FALSE;
jsize len = mJNIEnv->GetArrayLength(arr);
if (!aStringArray)
return len > 0;
for (jsize i = 0; i < len; i++) {
jstring jstr = static_cast<jstring>(mJNIEnv->GetObjectArrayElement(arr, i));
nsJNIString jniStr(jstr);
aStringArray->InsertStringAt(jniStr, i);
}
return PR_TRUE;
}
PRBool
AndroidBridge::OpenUriExternal(const nsACString& aUriSpec, const nsACString& aMimeType,
const nsAString& aPackageName, const nsAString& aClassName)
{
AutoLocalJNIFrame jniFrame;
NS_ConvertUTF8toUTF16 wUriSpec(aUriSpec);
NS_ConvertUTF8toUTF16 wMimeType(aMimeType);
const PRUnichar* wPackageName;
PRUint32 packageNameLen = NS_StringGetData(aPackageName, &wPackageName);
const PRUnichar* wClassName;
PRUint32 classNameLen = NS_StringGetData(aClassName, &wClassName);
jstring jstrUri = mJNIEnv->NewString(wUriSpec.get(), wUriSpec.Length());
jstring jstrType = mJNIEnv->NewString(wMimeType.get(), wMimeType.Length());
jstring jstrPackage = mJNIEnv->NewString(wPackageName, packageNameLen);
jstring jstrClass = mJNIEnv->NewString(wClassName, classNameLen);
return mJNIEnv->CallStaticBooleanMethod(mGeckoAppShellClass,
jOpenUriExternal,
jstrUri, jstrType);
jstrUri, jstrType, jstrPackage, jstrClass);
}
void
@@ -377,5 +422,5 @@ mozilla_AndroidBridge_AttachThread(PRBool asDaemon)
extern "C" JNIEnv * GetJNIForThread()
{
return mozilla::AndroidBridge::JNIForThread();
return mozilla::AndroidBridge::JNIForThread();
}