OSDN Git Service

Fix WebCoreStringToJString() to not delete the local reference to the new jstring
authorSteve Block <steveblock@google.com>
Mon, 1 Nov 2010 13:16:30 +0000 (13:16 +0000)
committerSteve Block <steveblock@google.com>
Mon, 1 Nov 2010 15:49:26 +0000 (15:49 +0000)
The JNI spec allows for local objects to be GC'ed before the JNI frame
returns, so this is dangerous.

Also rename the method to WtfStringToJstring() to match the existing
jstringToWtfString() and update call sites to JNIEnv::NewString() to
make use of it.

Change-Id: I84aa25ba1aca2aee346bf6e3d83a58afc3a95219

12 files changed:
WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp
WebKit/android/jni/GeolocationPermissionsBridge.cpp
WebKit/android/jni/JavaBridge.cpp
WebKit/android/jni/MIMETypeRegistry.cpp
WebKit/android/jni/WebCoreFrameBridge.cpp
WebKit/android/jni/WebCoreJni.cpp
WebKit/android/jni/WebCoreJni.h
WebKit/android/jni/WebCoreResourceLoader.cpp
WebKit/android/jni/WebHistory.cpp
WebKit/android/jni/WebStorage.cpp
WebKit/android/jni/WebViewCore.cpp
WebKit/android/nav/WebView.cpp

index 9711d26..c05a417 100644 (file)
@@ -178,7 +178,7 @@ public:
             return;
 
         m_paused = false;
-        jstring jUrl = env->NewString((unsigned short *)m_url.characters(), m_url.length());
+        jstring jUrl = WtfStringToJstring(env, m_url);
         env->CallVoidMethod(m_glue->m_javaProxy, m_glue->m_play, jUrl);
         env->DeleteLocalRef(jUrl);
 
@@ -191,7 +191,7 @@ public:
         if (!env || !m_glue->m_javaProxy || !m_posterUrl.length())
             return;
         // Send the poster
-        jstring jUrl = env->NewString((unsigned short *)m_posterUrl.characters(), m_posterUrl.length());
+        jstring jUrl = WtfStringToJstring(env, m_posterUrl);
         env->CallVoidMethod(m_glue->m_javaProxy, m_glue->m_loadPoster, jUrl);
         env->DeleteLocalRef(jUrl);
     }
@@ -297,7 +297,7 @@ public:
         // Send the poster
         jstring jUrl = 0;
         if (m_posterUrl.length())
-            jUrl = env->NewString((unsigned short *)m_posterUrl.characters(), m_posterUrl.length());
+            jUrl = WtfStringToJstring(env, m_posterUrl);
         // Sending a NULL jUrl allows the Java side to try to load the default poster.
         env->CallVoidMethod(m_glue->m_javaProxy, m_glue->m_loadPoster, jUrl);
         if (jUrl)
@@ -324,7 +324,7 @@ public:
         if (!m_glue->m_javaProxy)
             return;
 
-        jstring jUrl = env->NewString((unsigned short *)m_url.characters(), m_url.length());
+        jstring jUrl = WtfStringToJstring(env, m_url);
         // start loading the data asynchronously
         env->CallVoidMethod(m_glue->m_javaProxy, m_glue->m_setDataSource, jUrl);
         env->DeleteLocalRef(jUrl);
index 17628ab..e4275bf 100755 (executable)
@@ -51,7 +51,7 @@ static jobject getOrigins(JNIEnv* env, jobject obj)
 
     GeolocationPermissions::OriginSet::const_iterator end = origins.end();
     for (GeolocationPermissions::OriginSet::const_iterator iter = origins.begin(); iter != end; ++iter) {
-        jstring originString = env->NewString(iter->characters(), iter->length());
+        jstring originString = WtfStringToJstring(env, *iter);
         env->CallBooleanMethod(set, addMethod, originString);
         env->DeleteLocalRef(originString);
     }
index 49fb1b1..cb8a8af 100644 (file)
@@ -198,8 +198,8 @@ JavaBridge::setCookies(WebCore::KURL const& url, WTF::String const& value)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
     const WTF::String& urlStr = url.string();
-    jstring jUrlStr = env->NewString(urlStr.characters(), urlStr.length());
-    jstring jValueStr = env->NewString(value.characters(), value.length());
+    jstring jUrlStr = WtfStringToJstring(env, urlStr);
+    jstring jValueStr = WtfStringToJstring(env, value);
 
     AutoJObject obj = getRealObject(env, mJavaObject);
     env->CallVoidMethod(obj.get(), mSetCookies, jUrlStr, jValueStr);
@@ -212,7 +212,7 @@ JavaBridge::cookies(WebCore::KURL const& url)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
     const WTF::String& urlStr = url.string();
-    jstring jUrlStr = env->NewString(urlStr.characters(), urlStr.length());
+    jstring jUrlStr = WtfStringToJstring(env, urlStr);
 
     AutoJObject obj = getRealObject(env, mJavaObject);
     jstring string = (jstring)(env->CallObjectMethod(obj.get(), mCookies, jUrlStr));
@@ -301,10 +301,9 @@ WTF::Vector<WTF::String>JavaBridge::getSupportedKeyStrengthList() {
 WTF::String JavaBridge::getSignedPublicKeyAndChallengeString(unsigned index,
         const WTF::String& challenge, const WebCore::KURL& url) {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    jstring jChallenge = env->NewString(challenge.characters(),
-            challenge.length());
+    jstring jChallenge = WtfStringToJstring(env, challenge);
     const WTF::String& urlStr = url.string();
-    jstring jUrl = env->NewString(urlStr.characters(), urlStr.length());
+    jstring jUrl = WtfStringToJstring(env, urlStr);
     AutoJObject obj = getRealObject(env, mJavaObject);
     jstring key = (jstring) env->CallObjectMethod(obj.get(),
             mGetSignedPublicKey, index, jChallenge, jUrl);
@@ -317,7 +316,7 @@ WTF::String JavaBridge::getSignedPublicKeyAndChallengeString(unsigned index,
 
 WTF::String JavaBridge::resolveFilePathForContentUri(const WTF::String& uri) {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    jstring jUri = env->NewString(uri.characters(), uri.length());
+    jstring jUri = WtfStringToJstring(env, uri);
     AutoJObject obj = getRealObject(env, mJavaObject);
     jstring path = static_cast<jstring>(env->CallObjectMethod(obj.get(), mResolveFilePathForContentUri, jUri));
     WTF::String ret = jstringToWtfString(env, path);
index f885d57..85da12a 100644 (file)
@@ -35,6 +35,8 @@
 #include <jni.h>
 #include <utils/Log.h>
 
+using namespace android;
+
 namespace WebCore {
 
 String MIMETypeRegistry::getMIMETypeForExtension(const String& ext)
@@ -47,8 +49,7 @@ String MIMETypeRegistry::getMIMETypeForExtension(const String& ext)
             "(Ljava/lang/String;)Ljava/lang/String;");
     LOG_ASSERT(mimeTypeFromExtension,
             "Could not find method mimeTypeFromExtension");
-    jstring extString =
-            env->NewString((const jchar*) ext.characters(), ext.length());
+    jstring extString = WtfStringToJstring(env, ext);
     jobject mimeType = env->CallStaticObjectMethod(mimeClass,
             mimeTypeFromExtension, extString);
     String result = android::jstringToWtfString(env, (jstring) mimeType);
index bc20c47..9cd5c79 100644 (file)
@@ -341,8 +341,8 @@ static jobject createJavaMapFromHTTPHeaders(JNIEnv* env, const WebCore::HTTPHead
     for (WebCore::HTTPHeaderMap::const_iterator i = map.begin(); i != end; ++i) {
         if (i->first.length() == 0 || i->second.length() == 0)
             continue;
-        jstring key = env->NewString(i->first.characters(), i->first.length());
-        jstring val = env->NewString(i->second.characters(), i->second.length());
+        jstring key = WtfStringToJstring(env, i->first);
+        jstring val = WtfStringToJstring(env, i->second);
         if (key && val) {
             env->CallObjectMethod(hashMap, put, key, val);
         }
@@ -363,7 +363,7 @@ static jobject createJavaMapFromHTTPHeaders(JNIEnv* env, const WebCore::HTTPHead
 class FileInfo {
 public:
     FileInfo(JNIEnv* env, const WTF::String& name) {
-        m_uri = env->NewString(name.characters(), name.length());
+        m_uri = WtfStringToJstring(env, name);
         checkException(env);
         m_size = 0;
         m_env = env;
@@ -424,10 +424,10 @@ WebFrame::startLoadingResource(WebCore::ResourceHandle* loader,
         }
     }
     LOGV("%s lower=%s", __FUNCTION__, urlStr.latin1().data());
-    jstring jUrlStr = env->NewString(urlStr.characters(), urlStr.length());
+    jstring jUrlStr = WtfStringToJstring(env, urlStr);
     jstring jMethodStr = NULL;
     if (!method.isEmpty())
-        jMethodStr = env->NewString(method.characters(), method.length());
+        jMethodStr = WtfStringToJstring(env, method);
     jbyteArray jPostDataStr = NULL;
     WebCore::FormData* formdata = request.httpBody();
     AutoJObject obj = mJavaFrame->frame(env);
@@ -512,9 +512,9 @@ WebFrame::startLoadingResource(WebCore::ResourceHandle* loader,
 
     ResourceHandleInternal* loaderInternal = loader->getInternal();
     jstring jUsernameString = loaderInternal->m_user.isEmpty() ?
-            NULL : env->NewString(loaderInternal->m_user.characters(), loaderInternal->m_user.length());
+            NULL : WtfStringToJstring(env, loaderInternal->m_user);
     jstring jPasswordString = loaderInternal->m_pass.isEmpty() ?
-            NULL : env->NewString(loaderInternal->m_pass.characters(), loaderInternal->m_pass.length());
+            NULL : WtfStringToJstring(env, loaderInternal->m_pass);
 
     bool isUserGesture = UserGestureIndicator::processingUserGesture();
     jobject jLoadListener =
@@ -550,8 +550,8 @@ WebFrame::reportError(int errorCode, const WTF::String& description,
     LOGV("::WebCore:: reportError(%d, %s)", errorCode, description.ascii().data());
     JNIEnv* env = getJNIEnv();
 
-    jstring descStr = env->NewString(description.characters(), description.length());
-    jstring failUrl = env->NewString(failingUrl.characters(), failingUrl.length());
+    jstring descStr = WtfStringToJstring(env, description);
+    jstring failUrl = WtfStringToJstring(env, failingUrl);
     env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mReportError,
             errorCode, descStr, failUrl);
     env->DeleteLocalRef(descStr);
@@ -594,7 +594,7 @@ WebFrame::loadStarted(WebCore::Frame* frame)
             favicon = webcoreImageToJavaBitmap(env, icon);
         LOGV("favicons", "Starting load with icon %p for %s", icon, url.string().utf8().data());
     }
-    jstring urlStr = env->NewString(urlString.characters(), urlString.length());
+    jstring urlStr = WtfStringToJstring(env, urlString);
 
     env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mLoadStarted, urlStr, favicon,
             (int)loadType, isMainFrame);
@@ -650,7 +650,7 @@ WebFrame::didFinishLoad(WebCore::Frame* frame)
     bool isMainFrame = (!frame->tree() || !frame->tree()->parent());
     WebCore::FrameLoadType loadType = loader->loadType();
     WTF::String urlString(url.string());
-    jstring urlStr = env->NewString(urlString.characters(), urlString.length());
+    jstring urlStr = WtfStringToJstring(env, urlString);
     env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mLoadFinished, urlStr,
             (int)loadType, isMainFrame);
     checkException(env);
@@ -707,10 +707,9 @@ WebFrame::setTitle(const WTF::String& title)
     LOGV("setTitle(%s)", title.ascii().data());
 #endif
     JNIEnv* env = getJNIEnv();
-    jstring jTitleStr = env->NewString(title.characters(), title.length());
+    jstring jTitleStr = WtfStringToJstring(env, title);
 
-    env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mSetTitle,
-                                        jTitleStr);
+    env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mSetTitle, jTitleStr);
     checkException(env);
     env->DeleteLocalRef(jTitleStr);
 }
@@ -770,7 +769,7 @@ WebFrame::didReceiveTouchIconURL(const WTF::String& url, bool precomposed)
     TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
 #endif
     JNIEnv* env = getJNIEnv();
-    jstring jUrlStr = env->NewString(url.characters(), url.length());
+    jstring jUrlStr = WtfStringToJstring(env, url);
 
     env->CallVoidMethod(mJavaFrame->frame(env).get(),
             mJavaFrame->mDidReceiveTouchIconUrl, jUrlStr, precomposed);
@@ -786,7 +785,7 @@ WebFrame::updateVisitedHistory(const WebCore::KURL& url, bool reload)
 #endif
     WTF::String urlStr(url.string());
     JNIEnv* env = getJNIEnv();
-    jstring jUrlStr = env->NewString(urlStr.characters(), urlStr.length());
+    jstring jUrlStr = WtfStringToJstring(env, urlStr);
 
     env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mUpdateVisitedHistory, jUrlStr, reload);
     env->DeleteLocalRef(jUrlStr);
@@ -814,7 +813,7 @@ WebFrame::canHandleRequest(const WebCore::ResourceRequest& request)
     if (url.isEmpty())
         return true;
     JNIEnv* env = getJNIEnv();
-    jstring jUrlStr = env->NewString(url.characters(), url.length());
+    jstring jUrlStr = WtfStringToJstring(env, url);
 
     // check to see whether browser app wants to hijack url loading.
     // if browser app handles the url, we will return false to bail out WebCore loading
@@ -1280,9 +1279,8 @@ static jstring SaveWebArchive(JNIEnv *env, jobject obj, jstring basename, jboole
     releaseCharactersForJStringInEnv(env, basename, basenameNative);
     xmlFreeTextWriter(writer);
 
-    if (result) {
-        return env->NewString(filename.characters(), filename.length());
-    }
+    if (result)
+        return WtfStringToJstring(env, filename);
 
     return NULL;
 #endif
@@ -1298,10 +1296,7 @@ static jstring ExternalRepresentation(JNIEnv *env, jobject obj)
 
     // Request external representation of the render tree
     WTF::String renderDump = WebCore::externalRepresentation(pFrame);
-    unsigned len = renderDump.length();
-    if (!len)
-        return NULL;
-    return env->NewString(renderDump.characters(), len);
+    return WtfStringToJstring(env, renderDump);
 }
 
 static StringBuilder FrameAsText(WebCore::Frame *pFrame, jboolean dumpChildFrames) {
@@ -1335,10 +1330,7 @@ static jstring DocumentAsText(JNIEnv *env, jobject obj)
     LOG_ASSERT(pFrame, "android_webcore_nativeDocumentAsText must take a valid frame pointer!");
 
     WTF::String renderDump = FrameAsText(pFrame, false /* dumpChildFrames */).toString();
-    unsigned len = renderDump.length();
-    if (!len)
-        return NULL;
-    return env->NewString(renderDump.characters(), len);
+    return WtfStringToJstring(env, renderDump);
 }
 
 static jstring ChildFramesAsText(JNIEnv *env, jobject obj)
@@ -1354,10 +1346,7 @@ static jstring ChildFramesAsText(JNIEnv *env, jobject obj)
         renderDumpBuilder.append(FrameAsText(pFrame->tree()->child(i), true /* dumpChildFrames */).toString());
     }
     WTF::String renderDump = renderDumpBuilder.toString();
-    unsigned len = renderDump.length();
-    if (!len)
-        return NULL;
-    return env->NewString(renderDump.characters(), len);
+    return WtfStringToJstring(env, renderDump);
 }
 
 static void Reload(JNIEnv *env, jobject obj, jboolean allowStale)
@@ -1410,10 +1399,7 @@ static jobject StringByEvaluatingJavaScriptFromString(JNIEnv *env, jobject obj,
     ScriptState* scriptState = mainWorldScriptState(pFrame);
     if (!value.getString(scriptState, result))
         return NULL;
-    unsigned len = result.length();
-    if (len == 0)
-        return NULL;
-    return env->NewString(result.characters(), len);
+    return WtfStringToJstring(env, result);
 }
 
 // Wrap the JavaInstance used when binding custom javascript interfaces. Use a
@@ -1710,8 +1696,8 @@ static jobjectArray GetUsernamePassword(JNIEnv *env, jobject obj)
         jclass stringClass = env->FindClass("java/lang/String");
         strArray = env->NewObjectArray(2, stringClass, NULL);
         env->DeleteLocalRef(stringClass);
-        env->SetObjectArrayElement(strArray, 0, env->NewString(username.characters(), username.length()));
-        env->SetObjectArrayElement(strArray, 1, env->NewString(password.characters(), password.length()));
+        env->SetObjectArrayElement(strArray, 0, WtfStringToJstring(env, username));
+        env->SetObjectArrayElement(strArray, 1, WtfStringToJstring(env, password));
     }
     return strArray;
 }
@@ -1797,8 +1783,8 @@ static jobject GetFormTextData(JNIEnv *env, jobject obj)
                             int len = value.length();
                             if (len) {
                                 const WTF::AtomicString& name = input->name();
-                                jstring key = env->NewString(name.characters(), name.length());
-                                jstring val = env->NewString(value.characters(), len);
+                                jstring key = WtfStringToJstring(env, name);
+                                jstring val = WtfStringToJstring(env, value);
                                 LOG_ASSERT(key && val, "name or value not set");
                                 env->CallObjectMethod(hashMap, put, key, val);
                                 env->DeleteLocalRef(key);
index 1b9619b..0ead46b 100644 (file)
@@ -71,6 +71,13 @@ WTF::String jstringToWtfString(JNIEnv* env, jstring str)
     return ret;
 }
 
+jstring WtfStringToJstring(JNIEnv* env, const WTF::String& str)
+{
+    int length = str.length();
+    return length ? env->NewString(str.characters(), length) : 0;
+}
+
+
 #if USE(CHROME_NETWORK_STACK)
 string16 jstringToString16(JNIEnv* env, jstring jstr)
 {
index d4a9821..26da3d5 100644 (file)
@@ -71,13 +71,15 @@ AutoJObject getRealObject(JNIEnv*, jobject);
 bool checkException(JNIEnv* env);
 
 // Create a WTF::String object from a jstring object.
-WTF::String jstringToWtfString(JNIEnv* env, jstring str);
+WTF::String jstringToWtfString(JNIEnv*, jstring);
+// Returns a local reference to a new jstring.
+jstring WtfStringToJstring(JNIEnv*, const WTF::String&);
 
 #if USE(CHROME_NETWORK_STACK)
-string16 jstringToString16(JNIEnv* env, jstring jstr);
+string16 jstringToString16(JNIEnv*, jstring);
 #endif
 
-std::string jstringToStdString(JNIEnv* env, jstring jstr);
+std::string jstringToStdString(JNIEnv*, jstring);
 
 }
 
index 301ccde..0c7bad9 100644 (file)
@@ -120,7 +120,7 @@ bool WebCoreResourceLoader::willLoadFromCache(const WebCore::KURL& url, int64_t
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
     WTF::String urlStr = url.string();
-    jstring jUrlStr = env->NewString(urlStr.characters(), urlStr.length());
+    jstring jUrlStr = WtfStringToJstring(env, urlStr);
     jclass resourceLoader = env->FindClass("android/webkit/LoadListener");
     bool val = env->CallStaticBooleanMethod(resourceLoader, gResourceLoader.mWillLoadFromCacheMethodID, jUrlStr, identifier);
     checkException(env);
@@ -272,8 +272,7 @@ jstring WebCoreResourceLoader::RedirectedToUrl(JNIEnv* env, jobject obj,
     }
     handle->client()->willSendRequest(handle, r, *response);
     delete response;
-    WTF::String s = url.string();
-    return env->NewString((unsigned short*)s.characters(), s.length());
+    return WtfStringToJstring(env, url.string());
 }
 
 void WebCoreResourceLoader::Error(JNIEnv* env, jobject obj, jint id, jstring description,
index deff687..c060e4c 100644 (file)
@@ -271,18 +271,15 @@ void WebHistoryItem::updateHistoryItem(WebCore::HistoryItem* item) {
     const WTF::String& urlString = item->urlString();
     jstring urlStr = NULL;
     if (!urlString.isNull())
-        urlStr = env->NewString((unsigned short*)urlString.characters(), urlString.length());
+        urlStr = WtfStringToJstring(env, urlString);
     const WTF::String& originalUrlString = item->originalURLString();
     jstring originalUrlStr = NULL;
-    if (!originalUrlString.isNull()) {
-        originalUrlStr = env->NewString(
-                (unsigned short*) originalUrlString.characters(), 
-                originalUrlString.length());
-    }
+    if (!originalUrlString.isNull())
+        originalUrlStr = WtfStringToJstring(env, originalUrlString);
     const WTF::String& titleString = item->title();
     jstring titleStr = NULL;
     if (!titleString.isNull())
-        titleStr = env->NewString((unsigned short*)titleString.characters(), titleString.length());
+        titleStr = WtfStringToJstring(env, titleString);
 
     // Try to get the favicon from the history item. For some pages like Grand
     // Prix, there are history items with anchors. If the icon fails for the
index 23220f4..b31b212 100644 (file)
@@ -63,7 +63,7 @@ static jobject GetOrigins(JNIEnv* env, jobject obj)
     for (unsigned i = 0; i < coreOrigins.size(); ++i) {
         WebCore::SecurityOrigin* origin = coreOrigins[i].get();
         WTF::String url = origin->toString();
-        jstring jUrl = env->NewString(url.characters(), url.length());
+        jstring jUrl = WtfStringToJstring(env, url);
         env->CallBooleanMethod(set, mid, jUrl);
         env->DeleteLocalRef(jUrl);
     }
index 9edc1e2..aa7b79c 100644 (file)
@@ -209,7 +209,7 @@ struct WebViewCoreStaticMethods {
 // Check whether a media mimeType is supported in Android media framework.
 bool WebViewCore::isSupportedMediaMimeType(const WTF::String& mimeType) {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    jstring jMimeType = env->NewString(mimeType.characters(), mimeType.length());
+    jstring jMimeType = WtfStringToJstring(env, mimeType);
     jclass webViewCore = env->FindClass("android/webkit/WebViewCore");
     bool val = env->CallStaticBooleanMethod(webViewCore,
           gWebViewCoreStaticMethods.m_isSupportedMediaMimeType, jMimeType);
@@ -2517,7 +2517,7 @@ void WebViewCore::openFileChooser(PassRefPtr<WebCore::FileChooser> chooser) {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
 
     WTF::String acceptType = chooser->acceptTypes();
-    jstring jAcceptType = env->NewString(const_cast<unsigned short*>(acceptType.characters()), acceptType.length());
+    jstring jAcceptType = WtfStringToJstring(env, acceptType);
     jstring jName = (jstring) env->CallObjectMethod(
             m_javaGlue->object(env).get(), m_javaGlue->m_openFileChooser, jAcceptType);
     checkException(env);
@@ -2940,8 +2940,8 @@ void WebViewCore::formDidBlur(const WebCore::Node* node)
 
 void WebViewCore::addMessageToConsole(const WTF::String& message, unsigned int lineNumber, const WTF::String& sourceID, int msgLevel) {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    jstring jMessageStr = env->NewString((unsigned short *)message.characters(), message.length());
-    jstring jSourceIDStr = env->NewString((unsigned short *)sourceID.characters(), sourceID.length());
+    jstring jMessageStr = WtfStringToJstring(env, message);
+    jstring jSourceIDStr = WtfStringToJstring(env, sourceID);
     env->CallVoidMethod(m_javaGlue->object(env).get(),
             m_javaGlue->m_addMessageToConsole, jMessageStr, lineNumber,
             jSourceIDStr, msgLevel);
@@ -2953,8 +2953,8 @@ void WebViewCore::addMessageToConsole(const WTF::String& message, unsigned int l
 void WebViewCore::jsAlert(const WTF::String& url, const WTF::String& text)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    jstring jInputStr = env->NewString((unsigned short *)text.characters(), text.length());
-    jstring jUrlStr = env->NewString((unsigned short *)url.characters(), url.length());
+    jstring jInputStr = WtfStringToJstring(env, text);
+    jstring jUrlStr = WtfStringToJstring(env, url);
     env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_jsAlert, jUrlStr, jInputStr);
     env->DeleteLocalRef(jInputStr);
     env->DeleteLocalRef(jUrlStr);
@@ -2965,8 +2965,8 @@ void WebViewCore::exceededDatabaseQuota(const WTF::String& url, const WTF::Strin
 {
 #if ENABLE(DATABASE)
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    jstring jDatabaseIdentifierStr = env->NewString((unsigned short *)databaseIdentifier.characters(), databaseIdentifier.length());
-    jstring jUrlStr = env->NewString((unsigned short *)url.characters(), url.length());
+    jstring jDatabaseIdentifierStr = WtfStringToJstring(env, databaseIdentifier);
+    jstring jUrlStr = WtfStringToJstring(env, url);
     env->CallVoidMethod(m_javaGlue->object(env).get(),
             m_javaGlue->m_exceededDatabaseQuota, jUrlStr,
             jDatabaseIdentifierStr, currentQuota, estimatedSize);
@@ -2997,7 +2997,7 @@ void WebViewCore::populateVisitedLinks(WebCore::PageGroup* group)
 void WebViewCore::geolocationPermissionsShowPrompt(const WTF::String& origin)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    jstring originString = env->NewString((unsigned short *)origin.characters(), origin.length());
+    jstring originString = WtfStringToJstring(env, origin);
     env->CallVoidMethod(m_javaGlue->object(env).get(),
                         m_javaGlue->m_geolocationPermissionsShowPrompt,
                         originString);
@@ -3034,8 +3034,8 @@ jobject WebViewCore::getDeviceOrientationService()
 bool WebViewCore::jsConfirm(const WTF::String& url, const WTF::String& text)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    jstring jInputStr = env->NewString((unsigned short *)text.characters(), text.length());
-    jstring jUrlStr = env->NewString((unsigned short *)url.characters(), url.length());
+    jstring jInputStr = WtfStringToJstring(env, text);
+    jstring jUrlStr = WtfStringToJstring(env, url);
     jboolean result = env->CallBooleanMethod(m_javaGlue->object(env).get(), m_javaGlue->m_jsConfirm, jUrlStr, jInputStr);
     env->DeleteLocalRef(jInputStr);
     env->DeleteLocalRef(jUrlStr);
@@ -3046,27 +3046,28 @@ bool WebViewCore::jsConfirm(const WTF::String& url, const WTF::String& text)
 bool WebViewCore::jsPrompt(const WTF::String& url, const WTF::String& text, const WTF::String& defaultValue, WTF::String& result)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    jstring jInputStr = env->NewString((unsigned short *)text.characters(), text.length());
-    jstring jDefaultStr = env->NewString((unsigned short *)defaultValue.characters(), defaultValue.length());
-    jstring jUrlStr = env->NewString((unsigned short *)url.characters(), url.length());
-    jstring returnVal = (jstring) env->CallObjectMethod(m_javaGlue->object(env).get(), m_javaGlue->m_jsPrompt, jUrlStr, jInputStr, jDefaultStr);
+    jstring jInputStr = WtfStringToJstring(env, text);
+    jstring jDefaultStr = WtfStringToJstring(env, defaultValue);
+    jstring jUrlStr = WtfStringToJstring(env, url);
+    jstring returnVal = static_cast<jstring>(env->CallObjectMethod(m_javaGlue->object(env).get(), m_javaGlue->m_jsPrompt, jUrlStr, jInputStr, jDefaultStr));
+    env->DeleteLocalRef(jInputStr);
+    env->DeleteLocalRef(jDefaultStr);
+    env->DeleteLocalRef(jUrlStr);
+    checkException(env);
+
     // If returnVal is null, it means that the user cancelled the dialog.
     if (!returnVal)
         return false;
 
     result = jstringToWtfString(env, returnVal);
-    env->DeleteLocalRef(jInputStr);
-    env->DeleteLocalRef(jDefaultStr);
-    env->DeleteLocalRef(jUrlStr);
-    checkException(env);
     return true;
 }
 
 bool WebViewCore::jsUnload(const WTF::String& url, const WTF::String& message)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    jstring jInputStr = env->NewString((unsigned short *)message.characters(), message.length());
-    jstring jUrlStr = env->NewString((unsigned short *)url.characters(), url.length());
+    jstring jInputStr = WtfStringToJstring(env, message);
+    jstring jUrlStr = WtfStringToJstring(env, url);
     jboolean result = env->CallBooleanMethod(m_javaGlue->object(env).get(), m_javaGlue->m_jsUnload, jUrlStr, jInputStr);
     env->DeleteLocalRef(jInputStr);
     env->DeleteLocalRef(jUrlStr);
@@ -3122,8 +3123,7 @@ void WebViewCore::updateTextfield(WebCore::Node* ptr, bool changeToPassword,
         checkException(env);
         return;
     }
-    int length = text.length();
-    jstring string = env->NewString((unsigned short *) text.characters(), length);
+    jstring string = WtfStringToJstring(env, text);
     env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_updateTextfield,
             (int) ptr, false, string, m_textGeneration);
     env->DeleteLocalRef(string);
@@ -3157,7 +3157,7 @@ jclass WebViewCore::getPluginClass(const WTF::String& libName, const char* class
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
 
-    jstring libString = env->NewString(libName.characters(), libName.length());
+    jstring libString = WtfStringToJstring(env, libName);
     jstring classString = env->NewStringUTF(className);
     jobject pluginClass = env->CallObjectMethod(m_javaGlue->object(env).get(),
                                            m_javaGlue->m_getPluginClass,
@@ -3295,16 +3295,6 @@ bool WebViewCore::drawIsPaused() const
 //----------------------------------------------------------------------
 // Native JNI methods
 //----------------------------------------------------------------------
-static jstring WebCoreStringToJString(JNIEnv *env, WTF::String string)
-{
-    int length = string.length();
-    if (!length)
-        return 0;
-    jstring ret = env->NewString((jchar *)string.characters(), length);
-    env->DeleteLocalRef(ret);
-    return ret;
-}
-
 static void RevealSelection(JNIEnv *env, jobject obj)
 {
     GET_NATIVE_VIEW(env, obj)->revealSelection();
@@ -3313,7 +3303,7 @@ static void RevealSelection(JNIEnv *env, jobject obj)
 static jstring RequestLabel(JNIEnv *env, jobject obj, int framePointer,
         int nodePointer)
 {
-    return WebCoreStringToJString(env, GET_NATIVE_VIEW(env, obj)->requestLabel(
+    return WtfStringToJstring(env, GET_NATIVE_VIEW(env, obj)->requestLabel(
             (WebCore::Frame*) framePointer, (WebCore::Node*) nodePointer));
 }
 
@@ -3422,7 +3412,7 @@ static jstring ModifySelection(JNIEnv *env, jobject obj, jint direction, jint gr
 #endif
     WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
     String selectionString = viewImpl->modifySelection(direction, granularity);
-    return WebCoreStringToJString(env, selectionString);
+    return WtfStringToJstring(env, selectionString);
 }
 
 static void ReplaceTextfieldText(JNIEnv *env, jobject obj,
@@ -3564,7 +3554,7 @@ static jstring FindAddress(JNIEnv *env, jobject obj, jstring addr,
         &start, &end, caseInsensitive) == CacheBuilder::FOUND_COMPLETE;
     jstring ret = 0;
     if (success) {
-        ret = env->NewString((jchar*) addrChars + start, end - start);
+        ret = env->NewString(addrChars + start, end - start);
         env->DeleteLocalRef(ret);
     }
     env->ReleaseStringChars(addr, addrChars);
@@ -3615,7 +3605,7 @@ static jstring RetrieveHref(JNIEnv *env, jobject obj, jint frame,
     WTF::String result = viewImpl->retrieveHref((WebCore::Frame*) frame,
             (WebCore::Node*) node);
     if (!result.isEmpty())
-        return WebCoreStringToJString(env, result);
+        return WtfStringToJstring(env, result);
     return 0;
 }
 
@@ -3630,7 +3620,7 @@ static jstring RetrieveAnchorText(JNIEnv *env, jobject obj, jint frame,
     WTF::String result = viewImpl->retrieveAnchorText((WebCore::Frame*) frame,
             (WebCore::Node*) node);
     if (!result.isEmpty())
-        return WebCoreStringToJString(env, result);
+        return WtfStringToJstring(env, result);
     return 0;
 }
 
index ae09a7e..8720c44 100644 (file)
@@ -982,7 +982,7 @@ int getBlockLeftEdge(int x, int y, float scale)
 void overrideUrlLoading(const WTF::String& url)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    jstring jName = env->NewString((jchar*) url.characters(), url.length());
+    jstring jName = WtfStringToJstring(env, url);
     env->CallVoidMethod(m_javaGlue.object(env).get(),
             m_javaGlue.m_overrideLoading, jName);
     env->DeleteLocalRef(jName);
@@ -1339,16 +1339,6 @@ private: // local state for WebView
 /*
  * Native JNI methods
  */
-static jstring WebCoreStringToJString(JNIEnv *env, WTF::String string)
-{
-    int length = string.length();
-    if (!length)
-        return 0;
-    jstring ret = env->NewString((jchar *)string.characters(), length);
-    env->DeleteLocalRef(ret);
-    return ret;
-}
-
 static int nativeCacheHitFramePointer(JNIEnv *env, jobject obj)
 {
     return reinterpret_cast<int>(GET_NATIVE_VIEW(env, obj)
@@ -1554,8 +1544,7 @@ static jobject nativeCursorText(JNIEnv *env, jobject obj)
     if (!node)
         return 0;
     WTF::String value = node->getExport();
-    return !value.isEmpty() ? env->NewString((jchar *)value.characters(),
-        value.length()) : 0;
+    return WtfStringToJstring(env, value);
 }
 
 static void nativeDebugDump(JNIEnv *env, jobject obj)
@@ -1619,13 +1608,7 @@ static jobject nativeImageURI(JNIEnv *env, jobject obj, jint x, jint y)
     WebView* view = GET_NATIVE_VIEW(env, obj);
     LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
     WTF::String uri = view->imageURI(x, y);
-    jstring ret = 0;
-    unsigned len = uri.length();
-    if (len) {
-        ret = env->NewString((jchar*) uri.characters(), len);
-        env->DeleteLocalRef(ret);
-    }
-    return ret;
+    return WtfStringToJstring(env, uri);
 }
 
 static jint nativeFocusCandidateFramePointer(JNIEnv *env, jobject obj)
@@ -1671,7 +1654,7 @@ static jobject nativeFocusCandidateName(JNIEnv *env, jobject obj)
     if (!input)
         return 0;
     const WTF::String& name = input->name();
-    return env->NewString((jchar*)name.characters(), name.length());
+    return WtfStringToJstring(env, name);
 }
 
 static jobject createJavaRect(JNIEnv* env, int x, int y, int right, int bottom)
@@ -1715,8 +1698,7 @@ static jobject nativeFocusCandidateText(JNIEnv *env, jobject obj)
     if (!node)
         return 0;
     WTF::String value = node->getExport();
-    return !value.isEmpty() ? env->NewString((jchar *)value.characters(),
-        value.length()) : 0;
+    return WtfStringToJstring(env, value);
 }
 
 static jint nativeFocusCandidateTextSize(JNIEnv *env, jobject obj)
@@ -2099,7 +2081,7 @@ static jobject nativeGetSelection(JNIEnv *env, jobject obj)
     WebView* view = GET_NATIVE_VIEW(env, obj);
     LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
     String selection = view->getSelection();
-    return env->NewString((jchar*)selection.characters(), selection.length());
+    return WtfStringToJstring(env, selection);
 }
 
 static jboolean nativeHitSelection(JNIEnv *env, jobject obj, int x, int y)