summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--WebCore/Android.jscbindings.mk2
-rw-r--r--WebCore/bridge/jni/jni_instance.cpp1
-rw-r--r--WebCore/bridge/jni/jni_runtime.cpp4
-rw-r--r--WebCore/bridge/jni/jni_utility.cpp242
-rw-r--r--WebCore/bridge/jni/jni_utility.h20
-rw-r--r--WebCore/bridge/jni/jsc/jni_utility_private.cpp291
-rw-r--r--WebCore/bridge/jni/jsc/jni_utility_private.h51
-rw-r--r--WebCore/page/Geolocation.cpp17
-rw-r--r--WebCore/page/Geolocation.h1
-rw-r--r--WebCore/platform/android/TemporaryLinkStubs.cpp4
-rw-r--r--WebKit/android/nav/CacheBuilder.cpp10
-rw-r--r--WebKit/android/nav/CachedInput.h7
-rw-r--r--WebKit/android/nav/CachedRoot.cpp6
-rw-r--r--WebKit/android/nav/CachedRoot.h3
-rw-r--r--WebKit/android/nav/WebView.cpp11
15 files changed, 387 insertions, 283 deletions
diff --git a/WebCore/Android.jscbindings.mk b/WebCore/Android.jscbindings.mk
index 8fe17e0..0eaff05 100644
--- a/WebCore/Android.jscbindings.mk
+++ b/WebCore/Android.jscbindings.mk
@@ -28,6 +28,7 @@ BINDING_C_INCLUDES := \
$(LOCAL_PATH)/bridge \
$(LOCAL_PATH)/bridge/c \
$(LOCAL_PATH)/bridge/jni \
+ $(LOCAL_PATH)/bridge/jni/jsc \
\
$(JAVASCRIPTCORE_PATH)/API \
$(JAVASCRIPTCORE_PATH)/assembler \
@@ -206,6 +207,7 @@ LOCAL_SRC_FILES += \
bridge/jni/jni_instance.cpp \
bridge/jni/jni_runtime.cpp \
bridge/jni/jni_utility.cpp \
+ bridge/jni/jsc/jni_utility_private.cpp \
bridge/npruntime.cpp \
bridge/runtime.cpp \
bridge/runtime_array.cpp \
diff --git a/WebCore/bridge/jni/jni_instance.cpp b/WebCore/bridge/jni/jni_instance.cpp
index d0bcfcb..3783d10 100644
--- a/WebCore/bridge/jni/jni_instance.cpp
+++ b/WebCore/bridge/jni/jni_instance.cpp
@@ -31,6 +31,7 @@
#include "jni_class.h"
#include "jni_runtime.h"
#include "jni_utility.h"
+#include "jni_utility_private.h"
#include "runtime_object.h"
#include "runtime_root.h"
#include <runtime/ArgList.h>
diff --git a/WebCore/bridge/jni/jni_runtime.cpp b/WebCore/bridge/jni/jni_runtime.cpp
index d7d0696..be11981 100644
--- a/WebCore/bridge/jni/jni_runtime.cpp
+++ b/WebCore/bridge/jni/jni_runtime.cpp
@@ -28,8 +28,8 @@
#if ENABLE(MAC_JAVA_BRIDGE)
-#include <jni_utility.h>
-
+#include "jni_utility.h"
+#include "jni_utility_private.h"
#include "runtime_array.h"
#include "runtime_object.h"
#include "runtime_root.h"
diff --git a/WebCore/bridge/jni/jni_utility.cpp b/WebCore/bridge/jni/jni_utility.cpp
index fa63a42..faa7a8b 100644
--- a/WebCore/bridge/jni/jni_utility.cpp
+++ b/WebCore/bridge/jni/jni_utility.cpp
@@ -28,15 +28,6 @@
#if ENABLE(MAC_JAVA_BRIDGE)
-// TODO: ANDROID We need to merge this file with the V8 version.
-#if USE(JSC)
-#include "jni_runtime.h"
-#include "runtime_array.h"
-#include "runtime_object.h"
-#include <runtime/JSArray.h>
-#include <runtime/JSLock.h>
-#endif
-
#include <dlfcn.h>
namespace JSC {
@@ -351,239 +342,6 @@ jvalue getJNIField( jobject obj, JNIType type, const char *name, const char *sig
return result;
}
-// TODO: ANDROID we need to merge this file with the V8 version.
-#if USE(JSC)
-static jobject convertArrayInstanceToJavaArray(ExecState* exec, JSArray* jsArray, const char* javaClassName)
-{
- JNIEnv *env = getJNIEnv();
- // As JS Arrays can contain a mixture of objects, assume we can convert to
- // the requested Java Array type requested, unless the array type is some object array
- // other than a string.
- unsigned length = jsArray->length();
- jobjectArray jarray = 0;
-
- // Build the correct array type
- switch (JNITypeFromPrimitiveType(javaClassName[1])) {
- case object_type: {
- // Only support string object types
- if (0 == strcmp("[Ljava.lang.String;", javaClassName)) {
- jarray = (jobjectArray)env->NewObjectArray(length,
- env->FindClass("java/lang/String"),
- env->NewStringUTF(""));
- for(unsigned i = 0; i < length; i++) {
- JSValue item = jsArray->get(exec, i);
- UString stringValue = item.toString(exec);
- env->SetObjectArrayElement(jarray,i,
- env->functions->NewString(env, (const jchar *)stringValue.data(), stringValue.size()));
- }
- }
- break;
- }
-
- case boolean_type: {
- jarray = (jobjectArray)env->NewBooleanArray(length);
- for(unsigned i = 0; i < length; i++) {
- JSValue item = jsArray->get(exec, i);
- jboolean value = (jboolean)item.toNumber(exec);
- env->SetBooleanArrayRegion((jbooleanArray)jarray, (jsize)i, (jsize)1, &value);
- }
- break;
- }
-
- case byte_type: {
- jarray = (jobjectArray)env->NewByteArray(length);
- for(unsigned i = 0; i < length; i++) {
- JSValue item = jsArray->get(exec, i);
- jbyte value = (jbyte)item.toNumber(exec);
- env->SetByteArrayRegion((jbyteArray)jarray, (jsize)i, (jsize)1, &value);
- }
- break;
- }
-
- case char_type: {
- jarray = (jobjectArray)env->NewCharArray(length);
- for(unsigned i = 0; i < length; i++) {
- JSValue item = jsArray->get(exec, i);
- UString stringValue = item.toString(exec);
- jchar value = 0;
- if (stringValue.size() > 0)
- value = ((const jchar*)stringValue.data())[0];
- env->SetCharArrayRegion((jcharArray)jarray, (jsize)i, (jsize)1, &value);
- }
- break;
- }
-
- case short_type: {
- jarray = (jobjectArray)env->NewShortArray(length);
- for(unsigned i = 0; i < length; i++) {
- JSValue item = jsArray->get(exec, i);
- jshort value = (jshort)item.toNumber(exec);
- env->SetShortArrayRegion((jshortArray)jarray, (jsize)i, (jsize)1, &value);
- }
- break;
- }
-
- case int_type: {
- jarray = (jobjectArray)env->NewIntArray(length);
- for(unsigned i = 0; i < length; i++) {
- JSValue item = jsArray->get(exec, i);
- jint value = (jint)item.toNumber(exec);
- env->SetIntArrayRegion((jintArray)jarray, (jsize)i, (jsize)1, &value);
- }
- break;
- }
-
- case long_type: {
- jarray = (jobjectArray)env->NewLongArray(length);
- for(unsigned i = 0; i < length; i++) {
- JSValue item = jsArray->get(exec, i);
- jlong value = (jlong)item.toNumber(exec);
- env->SetLongArrayRegion((jlongArray)jarray, (jsize)i, (jsize)1, &value);
- }
- break;
- }
-
- case float_type: {
- jarray = (jobjectArray)env->NewFloatArray(length);
- for(unsigned i = 0; i < length; i++) {
- JSValue item = jsArray->get(exec, i);
- jfloat value = (jfloat)item.toNumber(exec);
- env->SetFloatArrayRegion((jfloatArray)jarray, (jsize)i, (jsize)1, &value);
- }
- break;
- }
-
- case double_type: {
- jarray = (jobjectArray)env->NewDoubleArray(length);
- for(unsigned i = 0; i < length; i++) {
- JSValue item = jsArray->get(exec, i);
- jdouble value = (jdouble)item.toNumber(exec);
- env->SetDoubleArrayRegion((jdoubleArray)jarray, (jsize)i, (jsize)1, &value);
- }
- break;
- }
-
- case array_type: // don't handle embedded arrays
- case void_type: // Don't expect arrays of void objects
- case invalid_type: // Array of unknown objects
- break;
- }
-
- // if it was not one of the cases handled, then null is returned
- return jarray;
-}
-
-
-jvalue convertValueToJValue(ExecState* exec, JSValue value, JNIType _JNIType, const char* javaClassName)
-{
- JSLock lock(SilenceAssertionsOnly);
-
- jvalue result;
-
- switch (_JNIType){
- case array_type:
- case object_type: {
- result.l = (jobject)0;
-
- // First see if we have a Java instance.
- if (value.isObject()){
- JSObject* objectImp = asObject(value);
- if (objectImp->classInfo() == &RuntimeObjectImp::s_info) {
- RuntimeObjectImp* imp = static_cast<RuntimeObjectImp*>(objectImp);
- JavaInstance *instance = static_cast<JavaInstance*>(imp->getInternalInstance());
- if (instance)
- result.l = instance->javaInstance();
- }
- else if (objectImp->classInfo() == &RuntimeArray::s_info) {
- // Input is a JavaScript Array that was originally created from a Java Array
- RuntimeArray* imp = static_cast<RuntimeArray*>(objectImp);
- JavaArray *array = static_cast<JavaArray*>(imp->getConcreteArray());
- result.l = array->javaArray();
- }
- else if (objectImp->classInfo() == &JSArray::info) {
- // Input is a Javascript Array. We need to create it to a Java Array.
- result.l = convertArrayInstanceToJavaArray(exec, asArray(value), javaClassName);
- }
- }
-
- // Now convert value to a string if the target type is a java.lang.string, and we're not
- // converting from a Null.
- if (result.l == 0 && strcmp(javaClassName, "java.lang.String") == 0) {
-#ifdef CONVERT_NULL_TO_EMPTY_STRING
- if (value->isNull()) {
- JNIEnv *env = getJNIEnv();
- jchar buf[2];
- jobject javaString = env->functions->NewString (env, buf, 0);
- result.l = javaString;
- }
- else
-#else
- if (!value.isNull())
-#endif
- {
- UString stringValue = value.toString(exec);
- JNIEnv *env = getJNIEnv();
- jobject javaString = env->functions->NewString (env, (const jchar *)stringValue.data(), stringValue.size());
- result.l = javaString;
- }
- } else if (result.l == 0)
- bzero (&result, sizeof(jvalue)); // Handle it the same as a void case
- }
- break;
-
- case boolean_type: {
- result.z = (jboolean)value.toNumber(exec);
- }
- break;
-
- case byte_type: {
- result.b = (jbyte)value.toNumber(exec);
- }
- break;
-
- case char_type: {
- result.c = (jchar)value.toNumber(exec);
- }
- break;
-
- case short_type: {
- result.s = (jshort)value.toNumber(exec);
- }
- break;
-
- case int_type: {
- result.i = (jint)value.toNumber(exec);
- }
- break;
-
- case long_type: {
- result.j = (jlong)value.toNumber(exec);
- }
- break;
-
- case float_type: {
- result.f = (jfloat)value.toNumber(exec);
- }
- break;
-
- case double_type: {
- result.d = (jdouble)value.toNumber(exec);
- }
- break;
-
- break;
-
- case invalid_type:
- default:
- case void_type: {
- bzero (&result, sizeof(jvalue));
- }
- break;
- }
- return result;
-}
-#endif // USE(JSC)
-
} // end of namespace Bindings
} // end of namespace JSC
diff --git a/WebCore/bridge/jni/jni_utility.h b/WebCore/bridge/jni/jni_utility.h
index 57a0500..66b3b2f 100644
--- a/WebCore/bridge/jni/jni_utility.h
+++ b/WebCore/bridge/jni/jni_utility.h
@@ -28,10 +28,6 @@
#if ENABLE(MAC_JAVA_BRIDGE)
-// TODO: ANDROID we need to merge this file with the V8 version.
-#if USE(JSC)
-#include <runtime/JSValue.h>
-#endif
#include <JavaVM/jni.h>
// The order of these items can not be modified as they are tightly
@@ -56,12 +52,6 @@ typedef enum {
namespace JSC {
-// TODO: ANDROID we need to merge this file with the V8 version.
-#if USE(JSC)
-class ExecState;
-class JSObject;
-#endif
-
namespace Bindings {
class JavaParameter;
@@ -78,11 +68,6 @@ JNIType JNITypeFromClassName(const char *name);
JNIType JNITypeFromPrimitiveType(char type);
const char *signatureFromPrimitiveType(JNIType type);
-// TODO: ANDROID we need to merge this file with the V8 version.
-#if USE(JSC)
-jvalue convertValueToJValue(ExecState*, JSValue, JNIType, const char* javaClassName);
-#endif
-
jvalue getJNIField(jobject obj, JNIType type, const char *name, const char *signature);
jmethodID getMethodID(jobject obj, const char *name, const char *sig);
@@ -288,11 +273,6 @@ T callJNIStaticMethod(jclass cls, const char* methodName, const char* methodSign
return result;
}
-// TODO: ANDROID we need to merge this file with the V8 version.
-#if USE(JSC)
-bool dispatchJNICall(ExecState*, const void* targetAppletView, jobject obj, bool isStatic, JNIType returnType, jmethodID methodID, jvalue* args, jvalue& result, const char* callingURL, JSValue& exceptionDescription);
-#endif
-
} // namespace Bindings
} // namespace JSC
diff --git a/WebCore/bridge/jni/jsc/jni_utility_private.cpp b/WebCore/bridge/jni/jsc/jni_utility_private.cpp
new file mode 100644
index 0000000..7f8afd5
--- /dev/null
+++ b/WebCore/bridge/jni/jsc/jni_utility_private.cpp
@@ -0,0 +1,291 @@
+/*
+ * Copyright (C) 2003 Apple Computer, Inc. All rights reserved.
+ * Copyright 2009, The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "jni_utility_private.h"
+
+#if ENABLE(MAC_JAVA_BRIDGE)
+
+#include "jni_runtime.h"
+#include "runtime_array.h"
+#include "runtime_object.h"
+#include <runtime/JSArray.h>
+#include <runtime/JSLock.h>
+
+namespace JSC {
+
+namespace Bindings {
+
+static jobject convertArrayInstanceToJavaArray(ExecState* exec, JSArray* jsArray, const char* javaClassName)
+{
+ JNIEnv* env = getJNIEnv();
+ // As JS Arrays can contain a mixture of objects, assume we can convert to
+ // the requested Java Array type requested, unless the array type is some object array
+ // other than a string.
+ unsigned length = jsArray->length();
+ jobjectArray jarray = 0;
+
+ // Build the correct array type
+ switch (JNITypeFromPrimitiveType(javaClassName[1])) {
+ case object_type:
+ {
+ // Only support string object types
+ if (!strcmp("[Ljava.lang.String;", javaClassName)) {
+ jarray = (jobjectArray)env->NewObjectArray(length,
+ env->FindClass("java/lang/String"),
+ env->NewStringUTF(""));
+ for (unsigned i = 0; i < length; i++) {
+ JSValue item = jsArray->get(exec, i);
+ UString stringValue = item.toString(exec);
+ env->SetObjectArrayElement(jarray, i,
+ env->functions->NewString(env, (const jchar *)stringValue.data(), stringValue.size()));
+ }
+ }
+ break;
+ }
+
+ case boolean_type:
+ {
+ jarray = (jobjectArray)env->NewBooleanArray(length);
+ for (unsigned i = 0; i < length; i++) {
+ JSValue item = jsArray->get(exec, i);
+ jboolean value = (jboolean)item.toNumber(exec);
+ env->SetBooleanArrayRegion((jbooleanArray)jarray, (jsize)i, (jsize)1, &value);
+ }
+ break;
+ }
+
+ case byte_type:
+ {
+ jarray = (jobjectArray)env->NewByteArray(length);
+ for (unsigned i = 0; i < length; i++) {
+ JSValue item = jsArray->get(exec, i);
+ jbyte value = (jbyte)item.toNumber(exec);
+ env->SetByteArrayRegion((jbyteArray)jarray, (jsize)i, (jsize)1, &value);
+ }
+ break;
+ }
+
+ case char_type:
+ {
+ jarray = (jobjectArray)env->NewCharArray(length);
+ for (unsigned i = 0; i < length; i++) {
+ JSValue item = jsArray->get(exec, i);
+ UString stringValue = item.toString(exec);
+ jchar value = 0;
+ if (stringValue.size() > 0)
+ value = ((const jchar*)stringValue.data())[0];
+ env->SetCharArrayRegion((jcharArray)jarray, (jsize)i, (jsize)1, &value);
+ }
+ break;
+ }
+
+ case short_type:
+ {
+ jarray = (jobjectArray)env->NewShortArray(length);
+ for (unsigned i = 0; i < length; i++) {
+ JSValue item = jsArray->get(exec, i);
+ jshort value = (jshort)item.toNumber(exec);
+ env->SetShortArrayRegion((jshortArray)jarray, (jsize)i, (jsize)1, &value);
+ }
+ break;
+ }
+
+ case int_type:
+ {
+ jarray = (jobjectArray)env->NewIntArray(length);
+ for (unsigned i = 0; i < length; i++) {
+ JSValue item = jsArray->get(exec, i);
+ jint value = (jint)item.toNumber(exec);
+ env->SetIntArrayRegion((jintArray)jarray, (jsize)i, (jsize)1, &value);
+ }
+ break;
+ }
+
+ case long_type:
+ {
+ jarray = (jobjectArray)env->NewLongArray(length);
+ for (unsigned i = 0; i < length; i++) {
+ JSValue item = jsArray->get(exec, i);
+ jlong value = (jlong)item.toNumber(exec);
+ env->SetLongArrayRegion((jlongArray)jarray, (jsize)i, (jsize)1, &value);
+ }
+ break;
+ }
+
+ case float_type:
+ {
+ jarray = (jobjectArray)env->NewFloatArray(length);
+ for (unsigned i = 0; i < length; i++) {
+ JSValue item = jsArray->get(exec, i);
+ jfloat value = (jfloat)item.toNumber(exec);
+ env->SetFloatArrayRegion((jfloatArray)jarray, (jsize)i, (jsize)1, &value);
+ }
+ break;
+ }
+
+ case double_type:
+ {
+ jarray = (jobjectArray)env->NewDoubleArray(length);
+ for (unsigned i = 0; i < length; i++) {
+ JSValue item = jsArray->get(exec, i);
+ jdouble value = (jdouble)item.toNumber(exec);
+ env->SetDoubleArrayRegion((jdoubleArray)jarray, (jsize)i, (jsize)1, &value);
+ }
+ break;
+ }
+
+ case array_type: // don't handle embedded arrays
+ case void_type: // Don't expect arrays of void objects
+ case invalid_type: // Array of unknown objects
+ break;
+ }
+
+ // if it was not one of the cases handled, then null is returned
+ return jarray;
+}
+
+jvalue convertValueToJValue(ExecState* exec, JSValue value, JNIType jniType, const char* javaClassName)
+{
+ JSLock lock(SilenceAssertionsOnly);
+
+ jvalue result;
+
+ switch (jniType) {
+ case array_type:
+ case object_type:
+ {
+ result.l = (jobject)0;
+
+ // First see if we have a Java instance.
+ if (value.isObject()) {
+ JSObject* objectImp = asObject(value);
+ if (objectImp->classInfo() == &RuntimeObjectImp::s_info) {
+ RuntimeObjectImp* imp = static_cast<RuntimeObjectImp*>(objectImp);
+ JavaInstance* instance = static_cast<JavaInstance*>(imp->getInternalInstance());
+ if (instance)
+ result.l = instance->javaInstance();
+ } else if (objectImp->classInfo() == &RuntimeArray::s_info) {
+ // Input is a JavaScript Array that was originally created from a Java Array
+ RuntimeArray* imp = static_cast<RuntimeArray*>(objectImp);
+ JavaArray* array = static_cast<JavaArray*>(imp->getConcreteArray());
+ result.l = array->javaArray();
+ } else if (objectImp->classInfo() == &JSArray::info) {
+ // Input is a Javascript Array. We need to create it to a Java Array.
+ result.l = convertArrayInstanceToJavaArray(exec, asArray(value), javaClassName);
+ }
+ }
+
+ // Now convert value to a string if the target type is a java.lang.string, and we're not
+ // converting from a Null.
+ if (!result.l && !strcmp(javaClassName, "java.lang.String")) {
+#ifdef CONVERT_NULL_TO_EMPTY_STRING
+ if (value->isNull()) {
+ JNIEnv* env = getJNIEnv();
+ jchar buf[2];
+ jobject javaString = env->functions->NewString(env, buf, 0);
+ result.l = javaString;
+ } else
+#else
+ if (!value.isNull())
+#endif
+ {
+ UString stringValue = value.toString(exec);
+ JNIEnv* env = getJNIEnv();
+ jobject javaString = env->functions->NewString(env, (const jchar *)stringValue.data(), stringValue.size());
+ result.l = javaString;
+ }
+ } else if (!result.l)
+ bzero(&result, sizeof(jvalue)); // Handle it the same as a void case
+ }
+ break;
+
+ case boolean_type:
+ {
+ result.z = (jboolean)value.toNumber(exec);
+ }
+ break;
+
+ case byte_type:
+ {
+ result.b = (jbyte)value.toNumber(exec);
+ }
+ break;
+
+ case char_type:
+ {
+ result.c = (jchar)value.toNumber(exec);
+ }
+ break;
+
+ case short_type:
+ {
+ result.s = (jshort)value.toNumber(exec);
+ }
+ break;
+
+ case int_type:
+ {
+ result.i = (jint)value.toNumber(exec);
+ }
+ break;
+
+ case long_type:
+ {
+ result.j = (jlong)value.toNumber(exec);
+ }
+ break;
+
+ case float_type:
+ {
+ result.f = (jfloat)value.toNumber(exec);
+ }
+ break;
+
+ case double_type:
+ {
+ result.d = (jdouble)value.toNumber(exec);
+ }
+ break;
+
+ break;
+
+ case invalid_type:
+ default:
+ case void_type:
+ {
+ bzero(&result, sizeof(jvalue));
+ }
+ break;
+ }
+ return result;
+}
+
+} // end of namespace Bindings
+
+} // end of namespace JSC
+
+#endif // ENABLE(MAC_JAVA_BRIDGE)
diff --git a/WebCore/bridge/jni/jsc/jni_utility_private.h b/WebCore/bridge/jni/jsc/jni_utility_private.h
new file mode 100644
index 0000000..647852e
--- /dev/null
+++ b/WebCore/bridge/jni/jsc/jni_utility_private.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2003 Apple Computer, Inc. All rights reserved.
+ * Copyright 2009, The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _JNI_UTILITY_PRIVATE_H_
+#define _JNI_UTILITY_PRIVATE_H_
+
+#if ENABLE(MAC_JAVA_BRIDGE)
+
+#include "jni_utility.h"
+#include <runtime/JSValue.h>
+
+namespace JSC {
+
+class ExecState;
+class JSObject;
+
+namespace Bindings {
+
+jvalue convertValueToJValue(ExecState*, JSValue, JNIType, const char* javaClassName);
+bool dispatchJNICall(ExecState*, const void* targetAppletView, jobject obj, bool isStatic, JNIType returnType, jmethodID methodID, jvalue* args, jvalue& result, const char* callingURL, JSValue& exceptionDescription);
+
+} // namespace Bindings
+
+} // namespace JSC
+
+#endif // ENABLE(MAC_JAVA_BRIDGE)
+
+#endif // _JNI_UTILITY_H_
diff --git a/WebCore/page/Geolocation.cpp b/WebCore/page/Geolocation.cpp
index 978a1b0..604802f 100644
--- a/WebCore/page/Geolocation.cpp
+++ b/WebCore/page/Geolocation.cpp
@@ -136,6 +136,11 @@ void Geolocation::Watchers::remove(GeoNotifier* notifier)
m_notifierToIdMap.remove(iter);
}
+bool Geolocation::Watchers::contains(GeoNotifier* notifier) const
+{
+ return m_notifierToIdMap.contains(notifier);
+}
+
void Geolocation::Watchers::clear()
{
m_idToNotifierMap.clear();
@@ -403,11 +408,13 @@ void Geolocation::requestReturnedCachedPosition(GeoNotifier* notifier)
return;
}
- // Otherwise, start the service to get updates.
- if (m_service->startUpdating(notifier->m_options.get()))
- notifier->startTimerIfNeeded();
- else
- notifier->setFatalError(PositionError::create(PositionError::UNKNOWN_ERROR, "Failed to start Geolocation service"));
+ // Otherwise, if the watch still exists, start the service to get updates.
+ if (m_watchers.contains(notifier)) {
+ if (m_service->startUpdating(notifier->m_options.get()))
+ notifier->startTimerIfNeeded();
+ else
+ notifier->setFatalError(PositionError::create(PositionError::UNKNOWN_ERROR, "Failed to start Geolocation service"));
+ }
}
bool Geolocation::haveSuitableCachedPosition(PositionOptions* options)
diff --git a/WebCore/page/Geolocation.h b/WebCore/page/Geolocation.h
index d9b23c4..fd9d560 100644
--- a/WebCore/page/Geolocation.h
+++ b/WebCore/page/Geolocation.h
@@ -105,6 +105,7 @@ private:
void set(int id, PassRefPtr<GeoNotifier>);
void remove(int id);
void remove(GeoNotifier*);
+ bool contains(GeoNotifier*) const;
void clear();
bool isEmpty() const;
void getNotifiersVector(Vector<RefPtr<GeoNotifier> >&) const;
diff --git a/WebCore/platform/android/TemporaryLinkStubs.cpp b/WebCore/platform/android/TemporaryLinkStubs.cpp
index e1889f0..366368b 100644
--- a/WebCore/platform/android/TemporaryLinkStubs.cpp
+++ b/WebCore/platform/android/TemporaryLinkStubs.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright 2007, The Android Open Source Project
+ * Copyright 2009, The Android Open Source Project
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -85,7 +85,7 @@
#include "JavaScriptCallFrame.h"
#include "JavaScriptDebugServer.h"
#include "JavaScriptProfile.h"
-#include "jni_utility.h"
+#include "jni_utility_private.h"
#endif
using namespace WebCore;
diff --git a/WebKit/android/nav/CacheBuilder.cpp b/WebKit/android/nav/CacheBuilder.cpp
index c9adb53..620e059 100644
--- a/WebKit/android/nav/CacheBuilder.cpp
+++ b/WebKit/android/nav/CacheBuilder.cpp
@@ -1097,26 +1097,30 @@ void CacheBuilder::BuildFrame(Frame* root, Frame* frame,
}
if (node->hasTagName(WebCore::HTMLNames::inputTag)) {
HTMLInputElement* input = (HTMLInputElement*) node;
+ HTMLInputElement::InputType inputType = input->inputType();
if (input->isTextField()) {
type = TEXT_INPUT_CACHEDNODETYPE;
cachedInput.init();
cachedInput.setIsTextField(true);
cachedInput.setIsReadOnly(input->readOnly());
exported = input->value().threadsafeCopy();
- cachedInput.setIsPassword(input->inputType() ==
- HTMLInputElement::PASSWORD);
cachedInput.setMaxLength(input->maxLength());
+ cachedInput.setInputType(inputType);
// If this does not need to be threadsafe, we can use crossThreadString().
// See http://trac.webkit.org/changeset/49160.
cachedInput.setName(input->name().string().threadsafeCopy());
// can't detect if this is drawn on top (example: deviant.com login parts)
isUnclipped = isTransparent;
- }
+ } else if (inputType == HTMLInputElement::HIDDEN)
+ continue;
} else if (node->hasTagName(HTMLNames::textareaTag)) {
cachedInput.init();
type = TEXT_INPUT_CACHEDNODETYPE;
HTMLTextAreaElement* area = static_cast<HTMLTextAreaElement*>(node);
cachedInput.setIsReadOnly(area->readOnly());
+ // Although technically it is not an HTMLInputElement, and therefore
+ // has no InputType, this one is the most appropriate.
+ cachedInput.setInputType(HTMLInputElement::TEXT);
exported = area->value().threadsafeCopy();
} else if (node->hasTagName(HTMLNames::aTag)) {
const HTMLAnchorElement* anchorNode =
diff --git a/WebKit/android/nav/CachedInput.h b/WebKit/android/nav/CachedInput.h
index 3b00b52..f4f0e95 100644
--- a/WebKit/android/nav/CachedInput.h
+++ b/WebKit/android/nav/CachedInput.h
@@ -27,6 +27,7 @@
#define CachedInput_H
#include "CachedDebug.h"
+#include "HTMLInputElement.h"
#include "PlatformString.h"
namespace android {
@@ -41,13 +42,13 @@ public:
bzero(this, sizeof(CachedInput));
mName = WebCore::String();
}
- bool isPassword() const { return mIsPassword; }
+ WebCore::HTMLInputElement::InputType inputType() const { return mInputType; }
bool isReadOnly() const { return mIsReadOnly; }
bool isRtlText() const { return mIsRtlText; }
bool isTextField() const { return mIsTextField; }
int maxLength() const { return mMaxLength; };
const WebCore::String& name() const { return mName; }
- void setIsPassword(bool isPassword) { mIsPassword = isPassword; }
+ void setInputType(WebCore::HTMLInputElement::InputType type) { mInputType = type; }
void setIsReadOnly(bool isReadOnly) { mIsReadOnly = isReadOnly; }
void setIsRtlText(bool isRtlText) { mIsRtlText = isRtlText; }
void setIsTextField(bool isTextField) { mIsTextField = isTextField; }
@@ -59,7 +60,7 @@ private:
WebCore::String mName;
int mMaxLength;
int mTextSize;
- bool mIsPassword : 1;
+ WebCore::HTMLInputElement::InputType mInputType;
bool mIsReadOnly : 1;
bool mIsRtlText : 1;
bool mIsTextField : 1;
diff --git a/WebKit/android/nav/CachedRoot.cpp b/WebKit/android/nav/CachedRoot.cpp
index 83e2ab6..77fb5b8 100644
--- a/WebKit/android/nav/CachedRoot.cpp
+++ b/WebKit/android/nav/CachedRoot.cpp
@@ -26,7 +26,9 @@
#include "CachedPrefix.h"
#include "android_graphics.h"
#include "CachedHistory.h"
+#include "CachedInput.h"
#include "CachedNode.h"
+#include "HTMLInputElement.h"
#include "SkBitmap.h"
#include "SkBounder.h"
#include "SkCanvas.h"
@@ -764,6 +766,10 @@ CachedRoot::ImeAction CachedRoot::cursorTextFieldAction() const
// the cursor
return FAILURE;
}
+ const CachedInput* textInput = cursorFrame->textInput(cursor);
+ if (!textInput) return FAILURE;
+ if (textInput->inputType() == WebCore::HTMLInputElement::SEARCH)
+ return SEARCH;
const CachedNode* firstTextfield = nextTextField(0, 0, false);
if (!firstTextfield) {
// Error case. There are no textfields in this tree.
diff --git a/WebKit/android/nav/CachedRoot.h b/WebKit/android/nav/CachedRoot.h
index 435937a..f93927c 100644
--- a/WebKit/android/nav/CachedRoot.h
+++ b/WebKit/android/nav/CachedRoot.h
@@ -44,7 +44,8 @@ public:
FAILURE = -1,
NEXT = 0,
GO = 1,
- DONE = 2
+ DONE = 2,
+ SEARCH = 3
};
bool adjustForScroll(BestData* , Direction , WebCore::IntPoint* scrollPtr,
bool findClosest);
diff --git a/WebKit/android/nav/WebView.cpp b/WebKit/android/nav/WebView.cpp
index f47b7f0..af9227d 100644
--- a/WebKit/android/nav/WebView.cpp
+++ b/WebKit/android/nav/WebView.cpp
@@ -36,6 +36,7 @@
#include "FindCanvas.h"
#include "Frame.h"
#include "GraphicsJNI.h"
+#include "HTMLInputElement.h"
#include "IntPoint.h"
#include "IntRect.h"
#include "Node.h"
@@ -940,15 +941,15 @@ bool motionUp(int x, int y, int slop)
bool syntheticLink = result->isSyntheticLink();
if (!syntheticLink) {
sendMotionUp(
- frame ? (WebCore::Frame*) frame->framePointer() : 0,
- result ? (WebCore::Node*) result->nodePointer() : 0, rx, ry);
+ (WebCore::Frame*) frame->framePointer(),
+ (WebCore::Node*) result->nodePointer(), rx, ry);
}
viewInvalidate();
if (result->isTextInput()) {
+ bool isReadOnly = frame->textInput(result)->isReadOnly();
rebuildWebTextView(true);
- if (!frame->textInput(result)->isReadOnly()) {
+ if (!isReadOnly)
displaySoftKeyboard(true);
- }
} else {
clearTextEntry();
setFollowedLink(true);
@@ -1613,7 +1614,7 @@ static jint nativeFocusCandidateFramePointer(JNIEnv *env, jobject obj)
static bool nativeFocusCandidateIsPassword(JNIEnv *env, jobject obj)
{
const CachedInput* input = getInputCandidate(env, obj);
- return input ? input->isPassword() : false;
+ return input && input->inputType() == WebCore::HTMLInputElement::PASSWORD;
}
static bool nativeFocusCandidateIsRtlText(JNIEnv *env, jobject obj)