From f947415b59bf9cc2a85a73ef8b3f3d99c9c65199 Mon Sep 17 00:00:00 2001 From: Steve Block Date: Mon, 1 Nov 2010 13:16:30 +0000 Subject: [PATCH] Fix WebCoreStringToJString() to not delete the local reference to the new jstring 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 --- .../WebCoreSupport/MediaPlayerPrivateAndroid.cpp | 8 +-- .../android/jni/GeolocationPermissionsBridge.cpp | 2 +- WebKit/android/jni/JavaBridge.cpp | 13 ++--- WebKit/android/jni/MIMETypeRegistry.cpp | 5 +- WebKit/android/jni/WebCoreFrameBridge.cpp | 66 +++++++++------------ WebKit/android/jni/WebCoreJni.cpp | 7 +++ WebKit/android/jni/WebCoreJni.h | 8 ++- WebKit/android/jni/WebCoreResourceLoader.cpp | 5 +- WebKit/android/jni/WebHistory.cpp | 11 ++-- WebKit/android/jni/WebStorage.cpp | 2 +- WebKit/android/jni/WebViewCore.cpp | 68 +++++++++------------- WebKit/android/nav/WebView.cpp | 30 ++-------- 12 files changed, 94 insertions(+), 131 deletions(-) diff --git a/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp b/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp index 9711d26d9..c05a41782 100644 --- a/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp +++ b/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp @@ -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); diff --git a/WebKit/android/jni/GeolocationPermissionsBridge.cpp b/WebKit/android/jni/GeolocationPermissionsBridge.cpp index 17628abfd..e4275bf59 100755 --- a/WebKit/android/jni/GeolocationPermissionsBridge.cpp +++ b/WebKit/android/jni/GeolocationPermissionsBridge.cpp @@ -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); } diff --git a/WebKit/android/jni/JavaBridge.cpp b/WebKit/android/jni/JavaBridge.cpp index 49fb1b1e3..cb8a8af11 100644 --- a/WebKit/android/jni/JavaBridge.cpp +++ b/WebKit/android/jni/JavaBridge.cpp @@ -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::VectorJavaBridge::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(env->CallObjectMethod(obj.get(), mResolveFilePathForContentUri, jUri)); WTF::String ret = jstringToWtfString(env, path); diff --git a/WebKit/android/jni/MIMETypeRegistry.cpp b/WebKit/android/jni/MIMETypeRegistry.cpp index f885d5791..85da12a9f 100644 --- a/WebKit/android/jni/MIMETypeRegistry.cpp +++ b/WebKit/android/jni/MIMETypeRegistry.cpp @@ -35,6 +35,8 @@ #include #include +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); diff --git a/WebKit/android/jni/WebCoreFrameBridge.cpp b/WebKit/android/jni/WebCoreFrameBridge.cpp index bc20c472e..9cd5c79d7 100644 --- a/WebKit/android/jni/WebCoreFrameBridge.cpp +++ b/WebKit/android/jni/WebCoreFrameBridge.cpp @@ -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); diff --git a/WebKit/android/jni/WebCoreJni.cpp b/WebKit/android/jni/WebCoreJni.cpp index 1b9619ba5..0ead46be6 100644 --- a/WebKit/android/jni/WebCoreJni.cpp +++ b/WebKit/android/jni/WebCoreJni.cpp @@ -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) { diff --git a/WebKit/android/jni/WebCoreJni.h b/WebKit/android/jni/WebCoreJni.h index d4a9821d5..26da3d558 100644 --- a/WebKit/android/jni/WebCoreJni.h +++ b/WebKit/android/jni/WebCoreJni.h @@ -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); } diff --git a/WebKit/android/jni/WebCoreResourceLoader.cpp b/WebKit/android/jni/WebCoreResourceLoader.cpp index 301ccde7c..0c7bad9e0 100644 --- a/WebKit/android/jni/WebCoreResourceLoader.cpp +++ b/WebKit/android/jni/WebCoreResourceLoader.cpp @@ -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, diff --git a/WebKit/android/jni/WebHistory.cpp b/WebKit/android/jni/WebHistory.cpp index deff687ce..c060e4cb3 100644 --- a/WebKit/android/jni/WebHistory.cpp +++ b/WebKit/android/jni/WebHistory.cpp @@ -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 diff --git a/WebKit/android/jni/WebStorage.cpp b/WebKit/android/jni/WebStorage.cpp index 23220f4f0..b31b212ba 100644 --- a/WebKit/android/jni/WebStorage.cpp +++ b/WebKit/android/jni/WebStorage.cpp @@ -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); } diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp index 9edc1e297..aa7b79c61 100644 --- a/WebKit/android/jni/WebViewCore.cpp +++ b/WebKit/android/jni/WebViewCore.cpp @@ -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 chooser) { JNIEnv* env = JSC::Bindings::getJNIEnv(); WTF::String acceptType = chooser->acceptTypes(); - jstring jAcceptType = env->NewString(const_cast(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(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; } diff --git a/WebKit/android/nav/WebView.cpp b/WebKit/android/nav/WebView.cpp index ae09a7e0f..8720c44e0 100644 --- a/WebKit/android/nav/WebView.cpp +++ b/WebKit/android/nav/WebView.cpp @@ -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(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) -- 2.11.0