summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/WebCore/platform/android/GeolocationServiceBridge.cpp17
-rw-r--r--Source/WebCore/plugins/android/PluginViewAndroid.cpp2
-rw-r--r--Source/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp24
-rw-r--r--Source/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp10
-rw-r--r--Source/WebKit/android/jni/DeviceMotionClientImpl.cpp30
-rw-r--r--Source/WebKit/android/jni/DeviceOrientationClientImpl.cpp30
-rw-r--r--Source/WebKit/android/jni/JavaBridge.cpp33
-rw-r--r--Source/WebKit/android/jni/WebCoreFrameBridge.cpp226
-rw-r--r--Source/WebKit/android/jni/WebViewCore.cpp320
-rw-r--r--Source/WebKit/android/jni/WebViewCore.h12
-rw-r--r--Source/WebKit/android/nav/WebView.cpp101
11 files changed, 567 insertions, 238 deletions
diff --git a/Source/WebCore/platform/android/GeolocationServiceBridge.cpp b/Source/WebCore/platform/android/GeolocationServiceBridge.cpp
index 2e81b32..697b63b 100644
--- a/Source/WebCore/platform/android/GeolocationServiceBridge.cpp
+++ b/Source/WebCore/platform/android/GeolocationServiceBridge.cpp
@@ -87,21 +87,24 @@ GeolocationServiceBridge::~GeolocationServiceBridge()
bool GeolocationServiceBridge::start()
{
- ASSERT(m_javaGeolocationServiceObject);
+ if (!m_javaGeolocationServiceObject)
+ return false;
return getJNIEnv()->CallBooleanMethod(m_javaGeolocationServiceObject,
javaGeolocationServiceClassMethodIDs[GeolocationServiceMethodStart]);
}
void GeolocationServiceBridge::stop()
{
- ASSERT(m_javaGeolocationServiceObject);
+ if (!m_javaGeolocationServiceObject)
+ return;
getJNIEnv()->CallVoidMethod(m_javaGeolocationServiceObject,
javaGeolocationServiceClassMethodIDs[GeolocationServiceMethodStop]);
}
void GeolocationServiceBridge::setEnableGps(bool enable)
{
- ASSERT(m_javaGeolocationServiceObject);
+ if (!m_javaGeolocationServiceObject)
+ return;
getJNIEnv()->CallVoidMethod(m_javaGeolocationServiceObject,
javaGeolocationServiceClassMethodIDs[GeolocationServiceMethodSetEnableGps],
enable);
@@ -185,10 +188,13 @@ void GeolocationServiceBridge::startJavaImplementation(Frame* frame)
env->GetMethodID(javaGeolocationServiceClass, "setEnableGps", "(Z)V");
// Create the Java GeolocationService object.
+ jobject context = android::WebViewCore::getWebViewCore(frame->view())->getContext();
+ if (!context)
+ return;
jlong nativeObject = reinterpret_cast<jlong>(this);
jobject object = env->NewObject(javaGeolocationServiceClass,
javaGeolocationServiceClassMethodIDs[GeolocationServiceMethodInit],
- android::WebViewCore::getWebViewCore(frame->view())->getContext(),
+ context,
nativeObject);
m_javaGeolocationServiceObject = getJNIEnv()->NewGlobalRef(object);
@@ -232,7 +238,8 @@ void GeolocationServiceBridge::startJavaImplementation(Frame* frame)
void GeolocationServiceBridge::stopJavaImplementation()
{
// Called by GeolocationServiceAndroid on WebKit thread.
- ASSERT(m_javaGeolocationServiceObject);
+ if (!m_javaGeolocationServiceObject)
+ return;
getJNIEnv()->DeleteGlobalRef(m_javaGeolocationServiceObject);
}
diff --git a/Source/WebCore/plugins/android/PluginViewAndroid.cpp b/Source/WebCore/plugins/android/PluginViewAndroid.cpp
index 6c712d0..8b737ea 100644
--- a/Source/WebCore/plugins/android/PluginViewAndroid.cpp
+++ b/Source/WebCore/plugins/android/PluginViewAndroid.cpp
@@ -539,6 +539,7 @@ bool PluginView::platformGetValue(NPNVariable variable, void* value, NPError* re
// Return the top level WebView Java object associated
// with this instance.
jobject *retObject = static_cast<jobject*>(value);
+ // TODO: Is it safe for this to be NULL? It looks from the NPNVWindowNPObject case that it is.
*retObject = android::WebViewCore::getWebViewCore(parent())->getWebViewJavaObject();
*result = NPERR_NO_ERROR;
return true;
@@ -564,6 +565,7 @@ bool PluginView::platformGetValue(NPNVariable variable, void* value, NPError* re
case kJavaContext_ANPGetValue: {
jobject* retObject = static_cast<jobject*>(value);
+ // TODO: Is it safe for this to be NULL? It looks from the NPNVWindowNPObject case that it is.
*retObject = android::WebViewCore::getWebViewCore(parent())->getContext();
*result = NPERR_NO_ERROR;
return true;
diff --git a/Source/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp b/Source/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp
index 1c8f398..1fd8ee9 100644
--- a/Source/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp
+++ b/Source/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp
@@ -378,14 +378,18 @@ void ChromeClientAndroid::exceededDatabaseQuota(Frame* frame, const String& name
if (tracker.usageForDatabase(name, origin) == 0)
estimatedSize = tracker.detailsForNameAndOrigin(name, origin).expectedUsage();
- android::WebViewCore::getWebViewCore(frame->view())->exceededDatabaseQuota(frame->document()->documentURI(), name, currentQuota, estimatedSize);
-
- // We've sent notification to the browser so now wait for it to come back.
- m_quotaThreadLock.lock();
- while (!m_isNewQuotaSet) {
- m_quotaThreadCondition.wait(m_quotaThreadLock);
+ if (android::WebViewCore::getWebViewCore(frame->view())->exceededDatabaseQuota(frame->document()->documentURI(), name, currentQuota, estimatedSize)) {
+ // We've sent notification to the browser so now wait for it to come back.
+ m_quotaThreadLock.lock();
+ while (!m_isNewQuotaSet) {
+ m_quotaThreadCondition.wait(m_quotaThreadLock);
+ }
+ m_quotaThreadLock.unlock();
+ } else {
+ // We failed to send the message to the UI thread to request a new quota,
+ // so just use the current quota as a default.
+ m_newQuota = currentQuota;
}
- m_quotaThreadLock.unlock();
if (m_newQuota < currentQuota)
m_newQuota = currentQuota;
@@ -445,7 +449,11 @@ void ChromeClientAndroid::reachedMaxAppCacheSize(int64_t spaceNeeded)
Page* page = m_webFrame->page();
Frame* mainFrame = page->mainFrame();
FrameView* view = mainFrame->view();
- android::WebViewCore::getWebViewCore(view)->reachedMaxAppCacheSize(spaceNeeded);
+
+ // If we fail to send the message to the UI thread to request a new quota,
+ // there's nothing to do.
+ if (!android::WebViewCore::getWebViewCore(view)->reachedMaxAppCacheSize(spaceNeeded))
+ return;
// We've sent notification to the browser so now wait for it to come back.
m_quotaThreadLock.lock();
diff --git a/Source/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp b/Source/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp
index 1e51989..ae8bec8 100644
--- a/Source/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp
+++ b/Source/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp
@@ -345,11 +345,12 @@ public:
FrameView* frameView = m_player->frameView();
if (!frameView)
return;
- WebViewCore* webViewCore = WebViewCore::getWebViewCore(frameView);
- ASSERT(webViewCore);
+ AutoJObject javaObject = WebViewCore::getWebViewCore(frameView)->getJavaObject();
+ if (!javaObject.get())
+ return;
// Get the HTML5VideoViewProxy instance
- obj = env->CallStaticObjectMethod(clazz, m_glue->m_getInstance, webViewCore->getJavaObject().get(), this);
+ obj = env->CallStaticObjectMethod(clazz, m_glue->m_getInstance, javaObject.get(), this);
m_glue->m_javaProxy = env->NewGlobalRef(obj);
// Send the poster
jstring jUrl = 0;
@@ -361,8 +362,7 @@ public:
env->DeleteLocalRef(jUrl);
// Clean up.
- if (obj)
- env->DeleteLocalRef(obj);
+ env->DeleteLocalRef(obj);
env->DeleteLocalRef(clazz);
checkException(env);
}
diff --git a/Source/WebKit/android/jni/DeviceMotionClientImpl.cpp b/Source/WebKit/android/jni/DeviceMotionClientImpl.cpp
index 82f3c35..8376de8 100644
--- a/Source/WebKit/android/jni/DeviceMotionClientImpl.cpp
+++ b/Source/WebKit/android/jni/DeviceMotionClientImpl.cpp
@@ -67,6 +67,8 @@ jobject DeviceMotionClientImpl::getJavaInstance()
ASSERT(m_webViewCore);
jobject object = m_webViewCore->getDeviceMotionService();
+ if (!object)
+ return 0;
// Get the Java DeviceMotionService class.
jclass javaServiceClass = env->GetObjectClass(object);
@@ -93,20 +95,24 @@ jobject DeviceMotionClientImpl::getJavaInstance()
void DeviceMotionClientImpl::releaseJavaInstance()
{
- ASSERT(m_javaServiceObject);
- getJNIEnv()->DeleteGlobalRef(m_javaServiceObject);
+ if (m_javaServiceObject)
+ getJNIEnv()->DeleteGlobalRef(m_javaServiceObject);
}
void DeviceMotionClientImpl::startUpdating()
{
- getJNIEnv()->CallVoidMethod(getJavaInstance(),
- javaServiceClassMethodIDs[ServiceMethodStart]);
+ jobject javaInstance = getJavaInstance();
+ if (!javaInstance)
+ return;
+ getJNIEnv()->CallVoidMethod(javaInstance, javaServiceClassMethodIDs[ServiceMethodStart]);
}
void DeviceMotionClientImpl::stopUpdating()
{
- getJNIEnv()->CallVoidMethod(getJavaInstance(),
- javaServiceClassMethodIDs[ServiceMethodStop]);
+ jobject javaInstance = getJavaInstance();
+ if (!javaInstance)
+ return;
+ getJNIEnv()->CallVoidMethod(javaInstance, javaServiceClassMethodIDs[ServiceMethodStop]);
}
void DeviceMotionClientImpl::onMotionChange(PassRefPtr<DeviceMotionData> motion)
@@ -117,14 +123,18 @@ void DeviceMotionClientImpl::onMotionChange(PassRefPtr<DeviceMotionData> motion)
void DeviceMotionClientImpl::suspend()
{
- getJNIEnv()->CallVoidMethod(getJavaInstance(),
- javaServiceClassMethodIDs[ServiceMethodSuspend]);
+ jobject javaInstance = getJavaInstance();
+ if (!javaInstance)
+ return;
+ getJNIEnv()->CallVoidMethod(javaInstance, javaServiceClassMethodIDs[ServiceMethodSuspend]);
}
void DeviceMotionClientImpl::resume()
{
- getJNIEnv()->CallVoidMethod(getJavaInstance(),
- javaServiceClassMethodIDs[ServiceMethodResume]);
+ jobject javaInstance = getJavaInstance();
+ if (!javaInstance)
+ return;
+ getJNIEnv()->CallVoidMethod(javaInstance, javaServiceClassMethodIDs[ServiceMethodResume]);
}
} // namespace android
diff --git a/Source/WebKit/android/jni/DeviceOrientationClientImpl.cpp b/Source/WebKit/android/jni/DeviceOrientationClientImpl.cpp
index bf3b3c3..718389f 100644
--- a/Source/WebKit/android/jni/DeviceOrientationClientImpl.cpp
+++ b/Source/WebKit/android/jni/DeviceOrientationClientImpl.cpp
@@ -67,6 +67,8 @@ jobject DeviceOrientationClientImpl::getJavaInstance()
ASSERT(m_webViewCore);
jobject object = m_webViewCore->getDeviceOrientationService();
+ if (!object)
+ return 0;
// Get the Java DeviceOrientationService class.
jclass javaDeviceOrientationServiceClass = env->GetObjectClass(object);
@@ -93,20 +95,24 @@ jobject DeviceOrientationClientImpl::getJavaInstance()
void DeviceOrientationClientImpl::releaseJavaInstance()
{
- ASSERT(m_javaDeviceOrientationServiceObject);
- getJNIEnv()->DeleteGlobalRef(m_javaDeviceOrientationServiceObject);
+ if (m_javaDeviceOrientationServiceObject)
+ getJNIEnv()->DeleteGlobalRef(m_javaDeviceOrientationServiceObject);
}
void DeviceOrientationClientImpl::startUpdating()
{
- getJNIEnv()->CallVoidMethod(getJavaInstance(),
- javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodStart]);
+ jobject javaInstance = getJavaInstance();
+ if (!javaInstance)
+ return;
+ getJNIEnv()->CallVoidMethod(javaInstance, javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodStart]);
}
void DeviceOrientationClientImpl::stopUpdating()
{
- getJNIEnv()->CallVoidMethod(getJavaInstance(),
- javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodStop]);
+ jobject javaInstance = getJavaInstance();
+ if (!javaInstance)
+ return;
+ getJNIEnv()->CallVoidMethod(javaInstance, javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodStop]);
}
void DeviceOrientationClientImpl::onOrientationChange(PassRefPtr<DeviceOrientation> orientation)
@@ -117,14 +123,18 @@ void DeviceOrientationClientImpl::onOrientationChange(PassRefPtr<DeviceOrientati
void DeviceOrientationClientImpl::suspend()
{
- getJNIEnv()->CallVoidMethod(getJavaInstance(),
- javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodSuspend]);
+ jobject javaInstance = getJavaInstance();
+ if (!javaInstance)
+ return;
+ getJNIEnv()->CallVoidMethod(javaInstance, javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodSuspend]);
}
void DeviceOrientationClientImpl::resume()
{
- getJNIEnv()->CallVoidMethod(getJavaInstance(),
- javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodResume]);
+ jobject javaInstance = getJavaInstance();
+ if (!javaInstance)
+ return;
+ getJNIEnv()->CallVoidMethod(javaInstance, javaDeviceOrientationServiceClassMethodIDs[DeviceOrientationServiceMethodResume]);
}
} // namespace android
diff --git a/Source/WebKit/android/jni/JavaBridge.cpp b/Source/WebKit/android/jni/JavaBridge.cpp
index 8c17c85..68eb367 100644
--- a/Source/WebKit/android/jni/JavaBridge.cpp
+++ b/Source/WebKit/android/jni/JavaBridge.cpp
@@ -185,6 +185,8 @@ JavaBridge::setSharedTimer(long long timemillis)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
AutoJObject obj = javaObject(env);
+ if (!obj.get())
+ return;
env->CallVoidMethod(obj.get(), mSetSharedTimer, timemillis);
}
@@ -193,6 +195,8 @@ JavaBridge::stopSharedTimer()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
AutoJObject obj = javaObject(env);
+ if (!obj.get())
+ return;
env->CallVoidMethod(obj.get(), mStopSharedTimer);
}
@@ -200,11 +204,14 @@ void
JavaBridge::setCookies(WebCore::KURL const& url, WTF::String const& value)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject obj = javaObject(env);
+ if (!obj.get())
+ return;
+
const WTF::String& urlStr = url.string();
jstring jUrlStr = wtfStringToJstring(env, urlStr);
jstring jValueStr = wtfStringToJstring(env, value);
- AutoJObject obj = javaObject(env);
env->CallVoidMethod(obj.get(), mSetCookies, jUrlStr, jValueStr);
env->DeleteLocalRef(jUrlStr);
env->DeleteLocalRef(jValueStr);
@@ -214,10 +221,12 @@ WTF::String
JavaBridge::cookies(WebCore::KURL const& url)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject obj = javaObject(env);
+ if (!obj.get())
+ return String();
+
const WTF::String& urlStr = url.string();
jstring jUrlStr = wtfStringToJstring(env, urlStr);
-
- AutoJObject obj = javaObject(env);
jstring string = (jstring)(env->CallObjectMethod(obj.get(), mCookies, jUrlStr));
WTF::String ret = jstringToWtfString(env, string);
@@ -231,6 +240,8 @@ JavaBridge::cookiesEnabled()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
AutoJObject obj = javaObject(env);
+ if (!obj.get())
+ return false;
jboolean ret = env->CallBooleanMethod(obj.get(), mCookiesEnabled);
return (ret != 0);
}
@@ -241,6 +252,8 @@ JavaBridge::getPluginDirectories()
WTF::Vector<WTF::String> directories;
JNIEnv* env = JSC::Bindings::getJNIEnv();
AutoJObject obj = javaObject(env);
+ if (!obj.get())
+ return directories;
jobjectArray array = (jobjectArray)
env->CallObjectMethod(obj.get(), mGetPluginDirectories);
int count = env->GetArrayLength(array);
@@ -259,6 +272,8 @@ JavaBridge::getPluginSharedDataDirectory()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
AutoJObject obj = javaObject(env);
+ if (!obj.get())
+ return String();
jstring ret = (jstring)env->CallObjectMethod(obj.get(), mGetPluginSharedDataDirectory);
WTF::String path = jstringToWtfString(env, ret);
checkException(env);
@@ -281,6 +296,8 @@ void JavaBridge::signalServiceFuncPtrQueue()
// environment is setup.
JNIEnv* env = JSC::Bindings::getJNIEnv();
AutoJObject obj = javaObject(env);
+ if (!obj.get())
+ return;
env->CallVoidMethod(obj.get(), mSignalFuncPtrQueue);
}
@@ -288,6 +305,8 @@ WTF::Vector<WTF::String>JavaBridge::getSupportedKeyStrengthList() {
WTF::Vector<WTF::String> list;
JNIEnv* env = JSC::Bindings::getJNIEnv();
AutoJObject obj = javaObject(env);
+ if (!obj.get())
+ return list;
jobjectArray array = (jobjectArray) env->CallObjectMethod(obj.get(),
mGetKeyStrengthList);
int count = env->GetArrayLength(array);
@@ -304,10 +323,12 @@ 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();
+ AutoJObject obj = javaObject(env);
+ if (!obj.get())
+ return String();
jstring jChallenge = wtfStringToJstring(env, challenge);
const WTF::String& urlStr = url.string();
jstring jUrl = wtfStringToJstring(env, urlStr);
- AutoJObject obj = javaObject(env);
jstring key = (jstring) env->CallObjectMethod(obj.get(),
mGetSignedPublicKey, index, jChallenge, jUrl);
WTF::String ret = jstringToWtfString(env, key);
@@ -319,8 +340,10 @@ WTF::String JavaBridge::getSignedPublicKeyAndChallengeString(unsigned index,
WTF::String JavaBridge::resolveFilePathForContentUri(const WTF::String& uri) {
JNIEnv* env = JSC::Bindings::getJNIEnv();
- jstring jUri = wtfStringToJstring(env, uri);
AutoJObject obj = javaObject(env);
+ if (!obj.get())
+ return String();
+ jstring jUri = wtfStringToJstring(env, uri);
jstring path = static_cast<jstring>(env->CallObjectMethod(obj.get(), mResolveFilePathForContentUri, jUri));
WTF::String ret = jstringToWtfString(env, path);
env->DeleteLocalRef(jUri);
diff --git a/Source/WebKit/android/jni/WebCoreFrameBridge.cpp b/Source/WebKit/android/jni/WebCoreFrameBridge.cpp
index 6d278f0..29cd17d 100644
--- a/Source/WebKit/android/jni/WebCoreFrameBridge.cpp
+++ b/Source/WebKit/android/jni/WebCoreFrameBridge.cpp
@@ -422,10 +422,14 @@ WebFrame::startLoadingResource(WebCore::ResourceHandle* loader,
LOGV("::WebCore:: startLoadingResource(%p, %s)",
loader, request.url().string().latin1().data());
+ JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return 0;
+
WTF::String method = request.httpMethod();
WebCore::HTTPHeaderMap headers = request.httpHeaderFields();
- JNIEnv* env = getJNIEnv();
WTF::String urlStr = request.url().string();
int colon = urlStr.find(':');
bool allLower = true;
@@ -475,7 +479,7 @@ WebFrame::startLoadingResource(WebCore::ResourceHandle* loader,
bool isUserGesture = UserGestureIndicator::processingUserGesture();
jobject jLoadListener =
- env->CallObjectMethod(mJavaFrame->frame(env).get(), mJavaFrame->mStartLoadingResource,
+ env->CallObjectMethod(javaFrame.get(), mJavaFrame->mStartLoadingResource,
(int)loader, jUrlStr, jMethodStr, jHeaderMap,
jPostDataStr, formdata ? formdata->identifier(): 0,
cacheMode, mainResource, isUserGesture,
@@ -488,7 +492,7 @@ WebFrame::startLoadingResource(WebCore::ResourceHandle* loader,
env->DeleteLocalRef(jUsernameString);
env->DeleteLocalRef(jPasswordString);
if (checkException(env))
- return NULL;
+ return 0;
PassRefPtr<WebCore::ResourceLoaderAndroid> h;
if (jLoadListener)
@@ -506,8 +510,12 @@ WebFrame::shouldInterceptRequest(const WTF::String& url)
LOGV("::WebCore:: shouldInterceptRequest(%s)", url.latin1().data());
JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return 0;
+
jstring urlStr = wtfStringToJstring(env, url);
- jobject response = env->CallObjectMethod(mJavaFrame->frame(env).get(), mJavaFrame->mShouldInterceptRequest, urlStr);
+ jobject response = env->CallObjectMethod(javaFrame.get(), mJavaFrame->mShouldInterceptRequest, urlStr);
env->DeleteLocalRef(urlStr);
if (response == 0)
return 0;
@@ -523,11 +531,13 @@ WebFrame::reportError(int errorCode, const WTF::String& description,
#endif
LOGV("::WebCore:: reportError(%d, %s)", errorCode, description.ascii().data());
JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
jstring descStr = wtfStringToJstring(env, description);
jstring failUrl = wtfStringToJstring(env, failingUrl);
- env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mReportError,
- errorCode, descStr, failUrl);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mReportError, errorCode, descStr, failUrl);
env->DeleteLocalRef(descStr);
env->DeleteLocalRef(failUrl);
}
@@ -538,6 +548,11 @@ WebFrame::loadStarted(WebCore::Frame* frame)
#ifdef ANDROID_INSTRUMENT
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
#endif
+ JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
+
// activeDocumentLoader() can return null.
DocumentLoader* documentLoader = frame->loader()->activeDocumentLoader();
if (documentLoader == NULL)
@@ -556,7 +571,6 @@ WebFrame::loadStarted(WebCore::Frame* frame)
!isMainFrame))
return;
- JNIEnv* env = getJNIEnv();
const WTF::String& urlString = url.string();
// If this is the main frame and we already have a favicon in the database,
// send it along with the page started notification.
@@ -569,8 +583,7 @@ WebFrame::loadStarted(WebCore::Frame* frame)
}
jstring urlStr = wtfStringToJstring(env, urlString);
- env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mLoadStarted, urlStr, favicon,
- (int)loadType, isMainFrame);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mLoadStarted, urlStr, favicon, static_cast<int>(loadType), isMainFrame);
checkException(env);
env->DeleteLocalRef(urlStr);
if (favicon)
@@ -594,10 +607,13 @@ WebFrame::transitionToCommitted(WebCore::Frame* frame)
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
#endif
JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
+
WebCore::FrameLoadType loadType = frame->loader()->loadType();
bool isMainFrame = (!frame->tree() || !frame->tree()->parent());
- env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mTransitionToCommitted,
- (int)loadType, isMainFrame);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mTransitionToCommitted, static_cast<int>(loadType), isMainFrame);
checkException(env);
}
@@ -608,6 +624,9 @@ WebFrame::didFinishLoad(WebCore::Frame* frame)
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
#endif
JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
// activeDocumentLoader() can return null.
WebCore::FrameLoader* loader = frame->loader();
@@ -624,8 +643,7 @@ WebFrame::didFinishLoad(WebCore::Frame* frame)
WebCore::FrameLoadType loadType = loader->loadType();
const WTF::String& urlString = url.string();
jstring urlStr = wtfStringToJstring(env, urlString);
- env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mLoadFinished, urlStr,
- (int)loadType, isMainFrame);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mLoadFinished, urlStr, static_cast<int>(loadType), isMainFrame);
checkException(env);
env->DeleteLocalRef(urlStr);
}
@@ -673,9 +691,13 @@ WebFrame::setTitle(const WTF::String& title)
LOGV("setTitle(%s)", title.ascii().data());
#endif
JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
+
jstring jTitleStr = wtfStringToJstring(env, title);
- env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mSetTitle, jTitleStr);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mSetTitle, jTitleStr);
checkException(env);
env->DeleteLocalRef(jTitleStr);
}
@@ -688,8 +710,11 @@ WebFrame::windowObjectCleared(WebCore::Frame* frame)
#endif
LOGV("::WebCore:: windowObjectCleared");
JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
- env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mWindowObjectCleared, (int)frame);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mWindowObjectCleared, (int)frame);
checkException(env);
}
@@ -700,8 +725,12 @@ WebFrame::setProgress(float newProgress)
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
#endif
JNIEnv* env = getJNIEnv();
- int progress = (int) (100 * newProgress);
- env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mSetProgress, progress);
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
+
+ int progress = static_cast<int>(100 * newProgress);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mSetProgress, progress);
checkException(env);
}
@@ -719,11 +748,15 @@ WebFrame::didReceiveIcon(WebCore::Image* icon)
#endif
LOG_ASSERT(icon, "DidReceiveIcon called without an image!");
JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
+
jobject bitmap = webcoreImageToJavaBitmap(env, icon);
if (!bitmap)
return;
- env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mDidReceiveIcon, bitmap);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mDidReceiveIcon, bitmap);
env->DeleteLocalRef(bitmap);
checkException(env);
}
@@ -735,10 +768,13 @@ WebFrame::didReceiveTouchIconURL(const WTF::String& url, bool precomposed)
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
#endif
JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
+
jstring jUrlStr = wtfStringToJstring(env, url);
- env->CallVoidMethod(mJavaFrame->frame(env).get(),
- mJavaFrame->mDidReceiveTouchIconUrl, jUrlStr, precomposed);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mDidReceiveTouchIconUrl, jUrlStr, precomposed);
env->DeleteLocalRef(jUrlStr);
checkException(env);
}
@@ -749,11 +785,15 @@ WebFrame::updateVisitedHistory(const WebCore::KURL& url, bool reload)
#ifdef ANDROID_INSTRUMENT
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
#endif
- const WTF::String& urlStr = url.string();
JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
+
+ const WTF::String& urlStr = url.string();
jstring jUrlStr = wtfStringToJstring(env, urlStr);
- env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mUpdateVisitedHistory, jUrlStr, reload);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mUpdateVisitedHistory, jUrlStr, reload);
env->DeleteLocalRef(jUrlStr);
checkException(env);
}
@@ -764,6 +804,11 @@ WebFrame::canHandleRequest(const WebCore::ResourceRequest& request)
#ifdef ANDROID_INSTRUMENT
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
#endif
+ JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return true;
+
// always handle "POST" in place
if (equalIgnoringCase(request.httpMethod(), "POST"))
return true;
@@ -778,12 +823,11 @@ WebFrame::canHandleRequest(const WebCore::ResourceRequest& request)
// Empty urls should not be sent to java
if (url.isEmpty())
return true;
- JNIEnv* env = getJNIEnv();
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
- jboolean ret = env->CallBooleanMethod(mJavaFrame->frame(env).get(), mJavaFrame->mHandleUrl, jUrlStr);
+ jboolean ret = env->CallBooleanMethod(javaFrame.get(), mJavaFrame->mHandleUrl, jUrlStr);
checkException(env);
env->DeleteLocalRef(jUrlStr);
return (ret == 0);
@@ -793,8 +837,10 @@ bool
WebFrame::shouldSaveFormData()
{
JNIEnv* env = getJNIEnv();
- jboolean ret = env->CallBooleanMethod(mJavaFrame->frame(env).get(),
- mJavaFrame->mShouldSaveFormData);
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return false;
+ jboolean ret = env->CallBooleanMethod(javaFrame.get(), mJavaFrame->mShouldSaveFormData);
checkException(env);
return ret;
}
@@ -806,13 +852,13 @@ WebFrame::createWindow(bool dialog, bool userGesture)
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
#endif
JNIEnv* env = getJNIEnv();
- jobject obj = env->CallObjectMethod(mJavaFrame->frame(env).get(),
- mJavaFrame->mCreateWindow, dialog, userGesture);
- if (obj) {
- WebCore::Frame* frame = GET_NATIVE_FRAME(env, obj);
- return frame;
- }
- return NULL;
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return 0;
+ jobject obj = env->CallObjectMethod(javaFrame.get(), mJavaFrame->mCreateWindow, dialog, userGesture);
+ if (!obj)
+ return 0;
+ return GET_NATIVE_FRAME(env, obj);
}
void
@@ -822,7 +868,10 @@ WebFrame::requestFocus() const
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
#endif
JNIEnv* env = getJNIEnv();
- env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mRequestFocus);
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mRequestFocus);
checkException(env);
}
@@ -834,8 +883,13 @@ WebFrame::closeWindow(WebViewCore* webViewCore)
#endif
assert(webViewCore);
JNIEnv* env = getJNIEnv();
- env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mCloseWindow,
- webViewCore->getJavaObject().get());
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
+ AutoJObject javaObject = webViewCore->getJavaObject();
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mCloseWindow, javaObject.get());
}
struct PolicyFunctionWrapper {
@@ -849,17 +903,22 @@ WebFrame::decidePolicyForFormResubmission(WebCore::FramePolicyFunction func)
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
#endif
JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
PolicyFunctionWrapper* p = new PolicyFunctionWrapper;
p->func = func;
- env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mDecidePolicyForFormResubmission, p);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mDecidePolicyForFormResubmission, p);
}
WTF::String
WebFrame::getRawResourceFilename(WebCore::PlatformBridge::rawResId id) const
{
JNIEnv* env = getJNIEnv();
- jstring ret = (jstring) env->CallObjectMethod(mJavaFrame->frame(env).get(),
- mJavaFrame->mGetRawResFilename, (int)id);
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return String();
+ jstring ret = (jstring) env->CallObjectMethod(javaFrame.get(), mJavaFrame->mGetRawResFilename, static_cast<int>(id));
return jstringToWtfString(env, ret);
}
@@ -868,7 +927,10 @@ float
WebFrame::density() const
{
JNIEnv* env = getJNIEnv();
- jfloat dpi = env->CallFloatMethod(mJavaFrame->frame(env).get(), mJavaFrame->mDensity);
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return 0.0;
+ jfloat dpi = env->CallFloatMethod(javaFrame.get(), mJavaFrame->mDensity);
checkException(env);
return dpi;
}
@@ -881,12 +943,14 @@ WebFrame::didReceiveAuthenticationChallenge(WebUrlLoaderClient* client, const st
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
#endif
JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
int jHandle = reinterpret_cast<int>(client);
jstring jHost = stdStringToJstring(env, host, true);
jstring jRealm = stdStringToJstring(env, realm, true);
- env->CallVoidMethod(mJavaFrame->frame(env).get(),
- mJavaFrame->mDidReceiveAuthenticationChallenge, jHandle, jHost, jRealm, useCachedCredentials);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mDidReceiveAuthenticationChallenge, jHandle, jHost, jRealm, useCachedCredentials);
env->DeleteLocalRef(jHost);
env->DeleteLocalRef(jRealm);
checkException(env);
@@ -900,6 +964,9 @@ WebFrame::reportSslCertError(WebUrlLoaderClient* client, int cert_error, const s
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
#endif
JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
int jHandle = reinterpret_cast<int>(client);
int len = cert.length();
@@ -907,8 +974,7 @@ WebFrame::reportSslCertError(WebUrlLoaderClient* client, int cert_error, const s
jbyte* bytes = env->GetByteArrayElements(jCert, NULL);
cert.copy(reinterpret_cast<char*>(bytes), len);
- env->CallVoidMethod(mJavaFrame->frame(env).get(),
- mJavaFrame->mReportSslCertError, jHandle, cert_error, jCert);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mReportSslCertError, jHandle, cert_error, jCert);
env->DeleteLocalRef(jCert);
checkException(env);
}
@@ -921,13 +987,15 @@ WebFrame::downloadStart(const std::string& url, const std::string& userAgent, co
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
#endif
JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
jstring jUrl = stdStringToJstring(env, url, true);
jstring jUserAgent = stdStringToJstring(env, userAgent, true);
jstring jContentDisposition = stdStringToJstring(env, contentDisposition, true);
jstring jMimetype = stdStringToJstring(env, mimetype, true);
- env->CallVoidMethod(mJavaFrame->frame(env).get(),
- mJavaFrame->mDownloadStart, jUrl, jUserAgent, jContentDisposition, jMimetype, contentLength);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mDownloadStart, jUrl, jUserAgent, jContentDisposition, jMimetype, contentLength);
env->DeleteLocalRef(jUrl);
env->DeleteLocalRef(jUserAgent);
@@ -942,13 +1010,15 @@ WebFrame::didReceiveData(const char* data, int size) {
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
#endif
JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
jbyteArray jData = env->NewByteArray(size);
jbyte* bytes = env->GetByteArrayElements(jData, NULL);
memcpy(reinterpret_cast<char*>(bytes), data, size);
- env->CallVoidMethod(mJavaFrame->frame(env).get(),
- mJavaFrame->mDidReceiveData, jData, size);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mDidReceiveData, jData, size);
env->DeleteLocalRef(jData);
checkException(env);
}
@@ -959,8 +1029,11 @@ WebFrame::didFinishLoading() {
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
#endif
JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
- env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mDidFinishLoading);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mDidFinishLoading);
checkException(env);
}
@@ -973,13 +1046,16 @@ void WebFrame::setCertificate(const std::string& cert)
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
#endif
JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
int len = cert.length();
jbyteArray jCert = env->NewByteArray(len);
jbyte* bytes = env->GetByteArrayElements(jCert, NULL);
cert.copy(reinterpret_cast<char*>(bytes), len);
- env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mSetCertificate, jCert);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mSetCertificate, jCert);
env->DeleteLocalRef(jCert);
checkException(env);
@@ -991,6 +1067,11 @@ void WebFrame::autoLogin(const std::string& loginHeader)
#ifdef ANDROID_INSTRUMENT
TimeCounterAuto counter(TimerCoutner::JavaCallbackTimeCounter);
#endif
+ JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
+
WTF::String header(loginHeader.c_str(), loginHeader.length());
WTF::Vector<WTF::String> split;
header.split('&', split);
@@ -1022,17 +1103,20 @@ void WebFrame::autoLogin(const std::string& loginHeader)
if (realm.isEmpty() || args.isEmpty())
return;
- JNIEnv* env = getJNIEnv();
jstring jRealm = wtfStringToJstring(env, realm, true);
jstring jAccount = wtfStringToJstring(env, account);
jstring jArgs = wtfStringToJstring(env, args, true);
- env->CallVoidMethod(mJavaFrame->frame(env).get(),
- mJavaFrame->mAutoLogin, jRealm, jAccount, jArgs);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mAutoLogin, jRealm, jAccount, jArgs);
}
}
void WebFrame::maybeSavePassword(WebCore::Frame* frame, const WebCore::ResourceRequest& request)
{
+ JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
+
if (request.httpMethod() != "POST")
return;
@@ -1041,14 +1125,11 @@ void WebFrame::maybeSavePassword(WebCore::Frame* frame, const WebCore::ResourceR
if (!getUsernamePasswordFromDom(frame, username, password))
return;
- JNIEnv* env = getJNIEnv();
jstring jUsername = wtfStringToJstring(env, username);
jstring jPassword = wtfStringToJstring(env, password);
jbyteArray jPostData = getPostData(request);
- if (jPostData) {
- env->CallVoidMethod(mJavaFrame->frame(env).get(),
- mJavaFrame->mMaybeSavePassword, jPostData, jUsername, jPassword);
- }
+ if (jPostData)
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mMaybeSavePassword, jPostData, jUsername, jPassword);
env->DeleteLocalRef(jPostData);
env->DeleteLocalRef(jUsername);
@@ -1087,12 +1168,14 @@ bool WebFrame::getUsernamePasswordFromDom(WebCore::Frame* frame, WTF::String& us
jbyteArray WebFrame::getPostData(const WebCore::ResourceRequest& request)
{
- jbyteArray jPostDataStr = NULL;
+ JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return 0;
+
+ jbyteArray jPostDataStr = 0;
WebCore::FormData* formdata = request.httpBody();
if (formdata) {
- JNIEnv* env = getJNIEnv();
- AutoJObject obj = mJavaFrame->frame(env);
-
// We can use the formdata->flatten() but it will result in two
// memcpys, first through loading up the vector with the form data
// then another to copy it out of the vector and into the java byte
@@ -1112,8 +1195,7 @@ jbyteArray WebFrame::getPostData(const WebCore::ResourceRequest& request)
size += e.m_data.size();
} else if (e.m_type == WebCore::FormDataElement::encodedFile) {
fileinfos[i] = new FileInfo(env, e.m_filename);
- int delta = env->CallIntMethod(obj.get(),
- mJavaFrame->mGetFileSize, fileinfos[i]->getUri());
+ int delta = env->CallIntMethod(javaFrame.get(), mJavaFrame->mGetFileSize, fileinfos[i]->getUri());
checkException(env);
fileinfos[i]->setSize(delta);
size += delta;
@@ -1135,11 +1217,10 @@ jbyteArray WebFrame::getPostData(const WebCore::ResourceRequest& request)
int delta = e.m_data.size();
memcpy(bytes + offset, e.m_data.data(), delta);
offset += delta;
- } else if (e.m_type
- == WebCore::FormDataElement::encodedFile) {
- int delta = env->CallIntMethod(obj.get(),
- mJavaFrame->mGetFile, fileinfos[i]->getUri(),
- jPostDataStr, offset, fileinfos[i]->getSize());
+ } else if (e.m_type == WebCore::FormDataElement::encodedFile) {
+ int delta = env->CallIntMethod(javaFrame.get(),
+ mJavaFrame->mGetFile, fileinfos[i]->getUri(),
+ jPostDataStr, offset, fileinfos[i]->getSize());
checkException(env);
offset += delta;
}
@@ -1942,6 +2023,11 @@ static void SetUsernamePassword(JNIEnv *env, jobject obj,
void
WebFrame::saveFormData(HTMLFormElement* form)
{
+ JNIEnv* env = getJNIEnv();
+ AutoJObject javaFrame = mJavaFrame->frame(env);
+ if (!javaFrame.get())
+ return;
+
if (form->autoComplete()) {
JNIEnv* env = getJNIEnv();
jclass mapClass = env->FindClass("java/util/HashMap");
@@ -1975,7 +2061,7 @@ WebFrame::saveFormData(HTMLFormElement* form)
}
}
}
- env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mSaveFormData, hashMap);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mSaveFormData, hashMap);
env->DeleteLocalRef(hashMap);
env->DeleteLocalRef(mapClass);
}
diff --git a/Source/WebKit/android/jni/WebViewCore.cpp b/Source/WebKit/android/jni/WebViewCore.cpp
index 494ebea..ded3965 100644
--- a/Source/WebKit/android/jni/WebViewCore.cpp
+++ b/Source/WebKit/android/jni/WebViewCore.cpp
@@ -303,6 +303,13 @@ struct WebViewCore::JavaGlue {
jmethodID m_setWebTextViewAutoFillable;
jmethodID m_selectAt;
AutoJObject object(JNIEnv* env) {
+ // We hold a weak reference to the Java WebViewCore to avoid memeory
+ // leaks due to circular references when WebView.destroy() is not
+ // called manually. The WebView and hence the WebViewCore could become
+ // weakly reachable at any time, after which the GC could null our weak
+ // reference, so we have to check the return value of this method at
+ // every use. Note that our weak reference will be nulled before the
+ // WebViewCore is finalized.
return getRealObject(env, m_obj);
}
};
@@ -724,12 +731,13 @@ void WebViewCore::recordPictureSet(PictureSet* content)
DBG_NAV_LOG("call updateFrameCache");
updateFrameCache();
if (m_findIsUp) {
- LOG_ASSERT(m_javaGlue->m_obj,
- "A Java widget was not associated with this view bridge!");
+ LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!");
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(),
- m_javaGlue->m_sendFindAgain);
- checkException(env);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (javaObject.get()) {
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_sendFindAgain);
+ checkException(env);
+ }
}
}
@@ -947,7 +955,10 @@ void WebViewCore::scrollTo(int x, int y, bool animate)
// LOGD("WebViewCore::scrollTo(%d %d)\n", x, y);
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_scrollTo,
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_scrollTo,
x, y, animate, false);
checkException(env);
}
@@ -956,7 +967,10 @@ void WebViewCore::sendNotifyProgressFinished()
{
LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!");
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_sendNotifyProgressFinished);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_sendNotifyProgressFinished);
checkException(env);
}
@@ -964,7 +978,10 @@ void WebViewCore::viewInvalidate(const WebCore::IntRect& rect)
{
LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!");
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(),
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(),
m_javaGlue->m_sendViewInvalidate,
rect.x(), rect.y(), rect.maxX(), rect.maxY());
checkException(env);
@@ -973,14 +990,20 @@ void WebViewCore::viewInvalidate(const WebCore::IntRect& rect)
void WebViewCore::contentDraw()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_contentDraw);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_contentDraw);
checkException(env);
}
void WebViewCore::layersDraw()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_layersDraw);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_layersDraw);
checkException(env);
}
@@ -1027,6 +1050,11 @@ void WebViewCore::didFirstLayout()
DEBUG_NAV_UI_LOGD("%s", __FUNCTION__);
LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!");
+ JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+
const WebCore::KURL& url = m_mainFrame->document()->url();
if (url.isEmpty())
return;
@@ -1034,8 +1062,7 @@ void WebViewCore::didFirstLayout()
WebCore::FrameLoadType loadType = m_mainFrame->loader()->loadType();
- JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_didFirstLayout,
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_didFirstLayout,
loadType == WebCore::FrameLoadTypeStandard
// When redirect with locked history, we would like to reset the
// scale factor. This is important for www.yahoo.com as it is
@@ -1055,7 +1082,10 @@ void WebViewCore::updateViewport()
LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!");
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_updateViewport);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_updateViewport);
checkException(env);
}
@@ -1065,7 +1095,10 @@ void WebViewCore::restoreScale(float scale, float textWrapScale)
LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!");
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_restoreScale, scale, textWrapScale);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_restoreScale, scale, textWrapScale);
checkException(env);
}
@@ -1075,11 +1108,15 @@ void WebViewCore::needTouchEvents(bool need)
LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!");
#if ENABLE(TOUCH_EVENTS)
+ JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+
if (m_forwardingTouchEvents == need)
return;
- JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_needTouchEvents, need);
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_needTouchEvents, need);
checkException(env);
m_forwardingTouchEvents = need;
@@ -1093,7 +1130,10 @@ void WebViewCore::requestKeyboardWithSelection(const WebCore::Node* node,
LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!");
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(),
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(),
m_javaGlue->m_requestKeyboardWithSelection,
reinterpret_cast<int>(node), selStart, selEnd, m_textGeneration);
checkException(env);
@@ -1105,8 +1145,10 @@ void WebViewCore::requestKeyboard(bool showKeyboard)
LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!");
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(),
- m_javaGlue->m_requestKeyboard, showKeyboard);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_requestKeyboard, showKeyboard);
checkException(env);
}
@@ -2738,8 +2780,10 @@ String WebViewCore::formatMarkup(DOMSelection* selection)
void WebViewCore::selectAt(int x, int y)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_selectAt,
- x, y);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_selectAt, x, y);
checkException(env);
}
@@ -2888,19 +2932,24 @@ static jobjectArray makeLabelArray(JNIEnv* env, const uint16_t** labels, size_t
return array;
}
-void WebViewCore::openFileChooser(PassRefPtr<WebCore::FileChooser> chooser) {
+void WebViewCore::openFileChooser(PassRefPtr<WebCore::FileChooser> chooser)
+{
+ JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+
if (!chooser)
return;
- JNIEnv* env = JSC::Bindings::getJNIEnv();
WTF::String acceptType = chooser->acceptTypes();
jstring jAcceptType = wtfStringToJstring(env, acceptType, true);
jstring jName = (jstring) env->CallObjectMethod(
- m_javaGlue->object(env).get(), m_javaGlue->m_openFileChooser, jAcceptType);
+ javaObject.get(), m_javaGlue->m_openFileChooser, jAcceptType);
checkException(env);
env->DeleteLocalRef(jAcceptType);
- const UChar* string = static_cast<const UChar*>(env->GetStringChars(jName, NULL));
+ const UChar* string = static_cast<const UChar*>(env->GetStringChars(jName, 0));
if (!string)
return;
@@ -2915,14 +2964,18 @@ void WebViewCore::openFileChooser(PassRefPtr<WebCore::FileChooser> chooser) {
void WebViewCore::listBoxRequest(WebCoreReply* reply, const uint16_t** labels, size_t count, const int enabled[], size_t enabledCount,
bool multiple, const int selected[], size_t selectedCountOrSelection)
{
+ LOG_ASSERT(m_javaGlue->m_obj, "No java widget associated with this view!");
+
+ JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+
// If m_popupReply is not null, then we already have a list showing.
if (m_popupReply != 0)
return;
- LOG_ASSERT(m_javaGlue->m_obj, "No java widget associated with this view!");
-
// Create an array of java Strings for the drop down.
- JNIEnv* env = JSC::Bindings::getJNIEnv();
jobjectArray labelArray = makeLabelArray(env, labels, count);
// Create an array determining whether each item is enabled.
@@ -2947,13 +3000,13 @@ void WebViewCore::listBoxRequest(WebCoreReply* reply, const uint16_t** labels, s
}
env->ReleaseIntArrayElements(selectedArray, selArray, 0);
- env->CallVoidMethod(m_javaGlue->object(env).get(),
+ env->CallVoidMethod(javaObject.get(),
m_javaGlue->m_requestListBox, labelArray, enabledArray,
selectedArray);
env->DeleteLocalRef(selectedArray);
} else {
// Pass up the single selection.
- env->CallVoidMethod(m_javaGlue->object(env).get(),
+ env->CallVoidMethod(javaObject.get(),
m_javaGlue->m_requestSingleListBox, labelArray, enabledArray,
selectedCountOrSelection);
}
@@ -3267,8 +3320,10 @@ void WebViewCore::focusNodeChanged(const WebCore::Node* newFocus)
m_shouldPaintCaret = true;
else if (m_blurringNodePointer) {
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(),
- m_javaGlue->m_formDidBlur, m_blurringNodePointer);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_formDidBlur, m_blurringNodePointer);
checkException(env);
m_blurringNodePointer = 0;
}
@@ -3276,9 +3331,12 @@ void WebViewCore::focusNodeChanged(const WebCore::Node* newFocus)
void WebViewCore::addMessageToConsole(const WTF::String& message, unsigned int lineNumber, const WTF::String& sourceID, int msgLevel) {
JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
jstring jMessageStr = wtfStringToJstring(env, message);
jstring jSourceIDStr = wtfStringToJstring(env, sourceID);
- env->CallVoidMethod(m_javaGlue->object(env).get(),
+ env->CallVoidMethod(javaObject.get(),
m_javaGlue->m_addMessageToConsole, jMessageStr, lineNumber,
jSourceIDStr, msgLevel);
env->DeleteLocalRef(jMessageStr);
@@ -3289,52 +3347,68 @@ 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();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
jstring jInputStr = wtfStringToJstring(env, text);
jstring jUrlStr = wtfStringToJstring(env, url);
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_jsAlert, jUrlStr, jInputStr);
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_jsAlert, jUrlStr, jInputStr);
env->DeleteLocalRef(jInputStr);
env->DeleteLocalRef(jUrlStr);
checkException(env);
}
-void WebViewCore::exceededDatabaseQuota(const WTF::String& url, const WTF::String& databaseIdentifier, const unsigned long long currentQuota, unsigned long long estimatedSize)
+bool WebViewCore::exceededDatabaseQuota(const WTF::String& url, const WTF::String& databaseIdentifier, const unsigned long long currentQuota, unsigned long long estimatedSize)
{
#if ENABLE(DATABASE)
JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return false;
jstring jDatabaseIdentifierStr = wtfStringToJstring(env, databaseIdentifier);
jstring jUrlStr = wtfStringToJstring(env, url);
- env->CallVoidMethod(m_javaGlue->object(env).get(),
+ env->CallVoidMethod(javaObject.get(),
m_javaGlue->m_exceededDatabaseQuota, jUrlStr,
jDatabaseIdentifierStr, currentQuota, estimatedSize);
env->DeleteLocalRef(jDatabaseIdentifierStr);
env->DeleteLocalRef(jUrlStr);
checkException(env);
+ return true;
#endif
}
-void WebViewCore::reachedMaxAppCacheSize(const unsigned long long spaceNeeded)
+bool WebViewCore::reachedMaxAppCacheSize(const unsigned long long spaceNeeded)
{
#if ENABLE(OFFLINE_WEB_APPLICATIONS)
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(),
- m_javaGlue->m_reachedMaxAppCacheSize, spaceNeeded);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return false;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_reachedMaxAppCacheSize, spaceNeeded);
checkException(env);
+ return true;
#endif
}
void WebViewCore::populateVisitedLinks(WebCore::PageGroup* group)
{
- m_groupForVisitedLinks = group;
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_populateVisitedLinks);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ m_groupForVisitedLinks = group;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_populateVisitedLinks);
checkException(env);
}
void WebViewCore::geolocationPermissionsShowPrompt(const WTF::String& origin)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
jstring originString = wtfStringToJstring(env, origin);
- env->CallVoidMethod(m_javaGlue->object(env).get(),
+ env->CallVoidMethod(javaObject.get(),
m_javaGlue->m_geolocationPermissionsShowPrompt,
originString);
env->DeleteLocalRef(originString);
@@ -3344,16 +3418,20 @@ void WebViewCore::geolocationPermissionsShowPrompt(const WTF::String& origin)
void WebViewCore::geolocationPermissionsHidePrompt()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(),
- m_javaGlue->m_geolocationPermissionsHidePrompt);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_geolocationPermissionsHidePrompt);
checkException(env);
}
jobject WebViewCore::getDeviceMotionService()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- jobject object = env->CallObjectMethod(m_javaGlue->object(env).get(),
- m_javaGlue->m_getDeviceMotionService);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return 0;
+ jobject object = env->CallObjectMethod(javaObject.get(), m_javaGlue->m_getDeviceMotionService);
checkException(env);
return object;
}
@@ -3361,8 +3439,10 @@ jobject WebViewCore::getDeviceMotionService()
jobject WebViewCore::getDeviceOrientationService()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- jobject object = env->CallObjectMethod(m_javaGlue->object(env).get(),
- m_javaGlue->m_getDeviceOrientationService);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return 0;
+ jobject object = env->CallObjectMethod(javaObject.get(), m_javaGlue->m_getDeviceOrientationService);
checkException(env);
return object;
}
@@ -3370,9 +3450,12 @@ jobject WebViewCore::getDeviceOrientationService()
bool WebViewCore::jsConfirm(const WTF::String& url, const WTF::String& text)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return false;
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);
+ jboolean result = env->CallBooleanMethod(javaObject.get(), m_javaGlue->m_jsConfirm, jUrlStr, jInputStr);
env->DeleteLocalRef(jInputStr);
env->DeleteLocalRef(jUrlStr);
checkException(env);
@@ -3382,10 +3465,13 @@ 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();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return false;
jstring jUrlStr = wtfStringToJstring(env, url);
jstring jInputStr = wtfStringToJstring(env, text);
jstring jDefaultStr = wtfStringToJstring(env, defaultValue);
- jstring returnVal = static_cast<jstring>(env->CallObjectMethod(m_javaGlue->object(env).get(), m_javaGlue->m_jsPrompt, jUrlStr, jInputStr, jDefaultStr));
+ jstring returnVal = static_cast<jstring>(env->CallObjectMethod(javaObject.get(), m_javaGlue->m_jsPrompt, jUrlStr, jInputStr, jDefaultStr));
env->DeleteLocalRef(jUrlStr);
env->DeleteLocalRef(jInputStr);
env->DeleteLocalRef(jDefaultStr);
@@ -3403,9 +3489,12 @@ bool WebViewCore::jsPrompt(const WTF::String& url, const WTF::String& text, cons
bool WebViewCore::jsUnload(const WTF::String& url, const WTF::String& message)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return false;
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);
+ jboolean result = env->CallBooleanMethod(javaObject.get(), m_javaGlue->m_jsUnload, jUrlStr, jInputStr);
env->DeleteLocalRef(jInputStr);
env->DeleteLocalRef(jUrlStr);
checkException(env);
@@ -3415,7 +3504,10 @@ bool WebViewCore::jsUnload(const WTF::String& url, const WTF::String& message)
bool WebViewCore::jsInterrupt()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- jboolean result = env->CallBooleanMethod(m_javaGlue->object(env).get(), m_javaGlue->m_jsInterrupt);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return false;
+ jboolean result = env->CallBooleanMethod(javaObject.get(), m_javaGlue->m_jsInterrupt);
checkException(env);
return result;
}
@@ -3430,10 +3522,18 @@ jobject
WebViewCore::getWebViewJavaObject()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- return env->GetObjectField(m_javaGlue->object(env).get(), gWebViewCoreFields.m_webView);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return 0;
+ return env->GetObjectField(javaObject.get(), gWebViewCoreFields.m_webView);
}
-void WebViewCore::updateTextSelection() {
+void WebViewCore::updateTextSelection()
+{
+ JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
WebCore::Node* focusNode = currentFocus();
if (!focusNode)
return;
@@ -3441,8 +3541,7 @@ void WebViewCore::updateTextSelection() {
if (!renderer || (!renderer->isTextArea() && !renderer->isTextField()))
return;
RenderTextControl* rtc = static_cast<RenderTextControl*>(renderer);
- JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(),
+ env->CallVoidMethod(javaObject.get(),
m_javaGlue->m_updateTextSelection, reinterpret_cast<int>(focusNode),
rtc->selectionStart(), rtc->selectionEnd(), m_textGeneration);
checkException(env);
@@ -3451,17 +3550,20 @@ void WebViewCore::updateTextSelection() {
void WebViewCore::updateTextfield(WebCore::Node* ptr, bool changeToPassword,
const WTF::String& text)
{
+ JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
if (m_blockTextfieldUpdates)
return;
- JNIEnv* env = JSC::Bindings::getJNIEnv();
if (changeToPassword) {
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_updateTextfield,
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_updateTextfield,
(int) ptr, true, 0, m_textGeneration);
checkException(env);
return;
}
jstring string = wtfStringToJstring(env, text);
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_updateTextfield,
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_updateTextfield,
(int) ptr, false, string, m_textGeneration);
env->DeleteLocalRef(string);
checkException(env);
@@ -3470,8 +3572,10 @@ void WebViewCore::updateTextfield(WebCore::Node* ptr, bool changeToPassword,
void WebViewCore::clearTextEntry()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(),
- m_javaGlue->m_clearTextEntry);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_clearTextEntry);
}
void WebViewCore::setBackgroundColor(SkColor c)
@@ -3493,10 +3597,13 @@ void WebViewCore::setBackgroundColor(SkColor c)
jclass WebViewCore::getPluginClass(const WTF::String& libName, const char* className)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return 0;
jstring libString = wtfStringToJstring(env, libName);
jstring classString = env->NewStringUTF(className);
- jobject pluginClass = env->CallObjectMethod(m_javaGlue->object(env).get(),
+ jobject pluginClass = env->CallObjectMethod(javaObject.get(),
m_javaGlue->m_getPluginClass,
libString, classString);
checkException(env);
@@ -3505,36 +3612,41 @@ jclass WebViewCore::getPluginClass(const WTF::String& libName, const char* class
env->DeleteLocalRef(libString);
env->DeleteLocalRef(classString);
- if (pluginClass != NULL) {
+ if (pluginClass != 0) {
return static_cast<jclass>(pluginClass);
} else {
- return NULL;
+ return 0;
}
}
void WebViewCore::showFullScreenPlugin(jobject childView, NPP npp)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- AutoJObject obj = m_javaGlue->object(env);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
- env->CallVoidMethod(obj.get(),
- m_javaGlue->m_showFullScreenPlugin, childView, (int)npp);
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_showFullScreenPlugin, childView, reinterpret_cast<int>(npp));
checkException(env);
}
void WebViewCore::hideFullScreenPlugin()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(),
- m_javaGlue->m_hideFullScreenPlugin);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_hideFullScreenPlugin);
checkException(env);
}
jobject WebViewCore::createSurface(jobject view)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- jobject result = env->CallObjectMethod(m_javaGlue->object(env).get(),
- m_javaGlue->m_createSurface, view);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return 0;
+ jobject result = env->CallObjectMethod(javaObject.get(), m_javaGlue->m_createSurface, view);
checkException(env);
return result;
}
@@ -3542,7 +3654,10 @@ jobject WebViewCore::createSurface(jobject view)
jobject WebViewCore::addSurface(jobject view, int x, int y, int width, int height)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- jobject result = env->CallObjectMethod(m_javaGlue->object(env).get(),
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return 0;
+ jobject result = env->CallObjectMethod(javaObject.get(),
m_javaGlue->m_addSurface,
view, x, y, width, height);
checkException(env);
@@ -3552,7 +3667,10 @@ jobject WebViewCore::addSurface(jobject view, int x, int y, int width, int heigh
void WebViewCore::updateSurface(jobject childView, int x, int y, int width, int height)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(),
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(),
m_javaGlue->m_updateSurface, childView,
x, y, width, height);
checkException(env);
@@ -3561,16 +3679,21 @@ void WebViewCore::updateSurface(jobject childView, int x, int y, int width, int
void WebViewCore::destroySurface(jobject childView)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_destroySurface, childView);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_destroySurface, childView);
checkException(env);
}
jobject WebViewCore::getContext()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- AutoJObject obj = m_javaGlue->object(env);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return 0;
- jobject result = env->CallObjectMethod(obj.get(), m_javaGlue->m_getContext);
+ jobject result = env->CallObjectMethod(javaObject.get(), m_javaGlue->m_getContext);
checkException(env);
return result;
}
@@ -3578,7 +3701,10 @@ jobject WebViewCore::getContext()
void WebViewCore::keepScreenOn(bool screenOn) {
if ((screenOn && m_screenOnCounter == 0) || (!screenOn && m_screenOnCounter == 1)) {
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_keepScreenOn, screenOn);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_keepScreenOn, screenOn);
checkException(env);
}
@@ -3609,7 +3735,10 @@ void WebViewCore::showRect(int left, int top, int width, int height,
float xPercentInView, float yPercentInDoc, float yPercentInView)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_showRect,
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_showRect,
left, top, width, height, contentWidth, contentHeight,
xPercentInDoc, xPercentInView, yPercentInDoc, yPercentInView);
checkException(env);
@@ -3618,24 +3747,30 @@ void WebViewCore::showRect(int left, int top, int width, int height,
void WebViewCore::centerFitRect(int x, int y, int width, int height)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(),
- m_javaGlue->m_centerFitRect, x, y, width, height);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_centerFitRect, x, y, width, height);
checkException(env);
}
-
void WebViewCore::setScrollbarModes(ScrollbarMode horizontalMode, ScrollbarMode verticalMode)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_setScrollbarModes,
- horizontalMode, verticalMode);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_setScrollbarModes, horizontalMode, verticalMode);
checkException(env);
}
void WebViewCore::notifyWebAppCanBeInstalled()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_setInstallableWebApp);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_setInstallableWebApp);
checkException(env);
}
@@ -3643,9 +3778,11 @@ void WebViewCore::notifyWebAppCanBeInstalled()
void WebViewCore::enterFullscreenForVideoLayer(int layerId, const WTF::String& url)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
jstring jUrlStr = wtfStringToJstring(env, url);
- env->CallVoidMethod(m_javaGlue->object(env).get(),
- m_javaGlue->m_enterFullscreenForVideoLayer, layerId, jUrlStr);
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_enterFullscreenForVideoLayer, layerId, jUrlStr);
checkException(env);
}
#endif
@@ -3654,8 +3791,11 @@ void WebViewCore::setWebTextViewAutoFillable(int queryId, const string16& previe
{
#if ENABLE(WEB_AUTOFILL)
JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
jstring preview = env->NewString(previewSummary.data(), previewSummary.length());
- env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_setWebTextViewAutoFillable, queryId, preview);
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_setWebTextViewAutoFillable, queryId, preview);
env->DeleteLocalRef(preview);
#endif
}
@@ -3663,8 +3803,10 @@ void WebViewCore::setWebTextViewAutoFillable(int queryId, const string16& previe
bool WebViewCore::drawIsPaused() const
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- return env->GetBooleanField(m_javaGlue->object(env).get(),
- gWebViewCoreFields.m_drawIsPaused);
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return false;
+ return env->GetBooleanField(javaObject.get(), gWebViewCoreFields.m_drawIsPaused);
}
#if USE(CHROME_NETWORK_STACK)
diff --git a/Source/WebKit/android/jni/WebViewCore.h b/Source/WebKit/android/jni/WebViewCore.h
index 8d8f303..0e9d80f 100644
--- a/Source/WebKit/android/jni/WebViewCore.h
+++ b/Source/WebKit/android/jni/WebViewCore.h
@@ -231,24 +231,28 @@ namespace android {
bool jsInterrupt();
/**
- * Tell the Java side that the origin has exceeded its database quota.
+ * Posts a message to the UI thread to inform the Java side that the
+ * origin has exceeded its database quota.
* @param url The URL of the page that caused the quota overflow
* @param databaseIdentifier the id of the database that caused the
* quota overflow.
* @param currentQuota The current quota for the origin
* @param estimatedSize The estimated size of the database
+ * @return Whether the message was successfully sent.
*/
- void exceededDatabaseQuota(const WTF::String& url,
+ bool exceededDatabaseQuota(const WTF::String& url,
const WTF::String& databaseIdentifier,
const unsigned long long currentQuota,
const unsigned long long estimatedSize);
/**
- * Tell the Java side that the appcache has exceeded its max size.
+ * Posts a message to the UI thread to inform the Java side that the
+ * appcache has exceeded its max size.
* @param spaceNeeded is the amount of disk space that would be needed
* in order for the last appcache operation to succeed.
+ * @return Whether the message was successfully sent.
*/
- void reachedMaxAppCacheSize(const unsigned long long spaceNeeded);
+ bool reachedMaxAppCacheSize(const unsigned long long spaceNeeded);
/**
* Set up the PageGroup's idea of which links have been visited,
diff --git a/Source/WebKit/android/nav/WebView.cpp b/Source/WebKit/android/nav/WebView.cpp
index f56cd69..2494399 100644
--- a/Source/WebKit/android/nav/WebView.cpp
+++ b/Source/WebKit/android/nav/WebView.cpp
@@ -359,11 +359,13 @@ void scrollRectOnScreen(const IntRect& rect)
void calcOurContentVisibleRect(SkRect* r)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue.object(env);
+ if (!javaObject.get())
+ return;
jclass rectClass = env->FindClass("android/graphics/RectF");
jmethodID init = env->GetMethodID(rectClass, "<init>", "(FFFF)V");
jobject jRect = env->NewObject(rectClass, init, 0, 0, 0, 0);
- env->CallVoidMethod(m_javaGlue.object(env).get(),
- m_javaGlue.m_calcOurContentVisibleRectF, jRect);
+ env->CallVoidMethod(javaObject.get(), m_javaGlue.m_calcOurContentVisibleRectF, jRect);
r->fLeft = env->GetFloatField(jRect, m_javaGlue.m_rectFLeft);
r->fTop = env->GetFloatField(jRect, m_javaGlue.m_rectFTop);
r->fRight = r->fLeft + env->CallFloatMethod(jRect, m_javaGlue.m_rectFWidth);
@@ -726,9 +728,11 @@ CachedRoot* getFrameCache(FrameCachePermission allowNewer)
// The focus has changed. We may need to update things.
LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue.object(env).get(),
- m_javaGlue.m_domChangedFocus);
- checkException(env);
+ AutoJObject javaObject = m_javaGlue.object(env);
+ if (javaObject.get()) {
+ env->CallVoidMethod(javaObject.get(), m_javaGlue.m_domChangedFocus);
+ checkException(env);
+ }
}
}
if (oldCursorNode && (!m_frameCacheUI || !m_frameCacheUI->currentCursor()))
@@ -740,7 +744,10 @@ int getScaledMaxXScroll()
{
LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
JNIEnv* env = JSC::Bindings::getJNIEnv();
- int result = env->CallIntMethod(m_javaGlue.object(env).get(), m_javaGlue.m_getScaledMaxXScroll);
+ AutoJObject javaObject = m_javaGlue.object(env);
+ if (!javaObject.get())
+ return 0;
+ int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxXScroll);
checkException(env);
return result;
}
@@ -749,7 +756,10 @@ int getScaledMaxYScroll()
{
LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
JNIEnv* env = JSC::Bindings::getJNIEnv();
- int result = env->CallIntMethod(m_javaGlue.object(env).get(), m_javaGlue.m_getScaledMaxYScroll);
+ AutoJObject javaObject = m_javaGlue.object(env);
+ if (!javaObject.get())
+ return 0;
+ int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxYScroll);
checkException(env);
return result;
}
@@ -759,7 +769,10 @@ IntRect getVisibleRect()
IntRect rect;
LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
JNIEnv* env = JSC::Bindings::getJNIEnv();
- jobject jRect = env->CallObjectMethod(m_javaGlue.object(env).get(), m_javaGlue.m_getVisibleRect);
+ AutoJObject javaObject = m_javaGlue.object(env);
+ if (!javaObject.get())
+ return rect;
+ jobject jRect = env->CallObjectMethod(javaObject.get(), m_javaGlue.m_getVisibleRect);
checkException(env);
rect.setX(env->GetIntField(jRect, m_javaGlue.m_rectLeft));
checkException(env);
@@ -1083,9 +1096,11 @@ int getBlockLeftEdge(int x, int y, float scale)
void overrideUrlLoading(const WTF::String& url)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue.object(env);
+ if (!javaObject.get())
+ return;
jstring jName = wtfStringToJstring(env, url);
- env->CallVoidMethod(m_javaGlue.object(env).get(),
- m_javaGlue.m_overrideLoading, jName);
+ env->CallVoidMethod(javaObject.get(), m_javaGlue.m_overrideLoading, jName);
env->DeleteLocalRef(jName);
}
@@ -1205,8 +1220,10 @@ void sendMoveFocus(WebCore::Frame* framePtr, WebCore::Node* nodePtr)
{
DBG_NAV_LOGD("framePtr=%p nodePtr=%p", framePtr, nodePtr);
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue.object(env).get(),
- m_javaGlue.m_sendMoveFocus, (jint) framePtr, (jint) nodePtr);
+ AutoJObject javaObject = m_javaGlue.object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMoveFocus, (jint) framePtr, (jint) nodePtr);
checkException(env);
}
@@ -1214,8 +1231,10 @@ void sendMoveMouse(WebCore::Frame* framePtr, WebCore::Node* nodePtr, int x, int
{
DBG_NAV_LOGD("framePtr=%p nodePtr=%p x=%d y=%d", framePtr, nodePtr, x, y);
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue.object(env).get(), m_javaGlue.m_sendMoveMouse,
- (jint) framePtr, (jint) nodePtr, x, y);
+ AutoJObject javaObject = m_javaGlue.object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMoveMouse, reinterpret_cast<jint>(framePtr), reinterpret_cast<jint>(nodePtr), x, y);
checkException(env);
}
@@ -1223,21 +1242,24 @@ void sendMoveMouseIfLatest(bool clearTextEntry, bool stopPaintingCaret)
{
LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue.object(env).get(),
- m_javaGlue.m_sendMoveMouseIfLatest, clearTextEntry, stopPaintingCaret);
+ AutoJObject javaObject = m_javaGlue.object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMoveMouseIfLatest, clearTextEntry, stopPaintingCaret);
checkException(env);
}
-void sendMotionUp(
- WebCore::Frame* framePtr, WebCore::Node* nodePtr, int x, int y)
+void sendMotionUp(WebCore::Frame* framePtr, WebCore::Node* nodePtr, int x, int y)
{
- m_viewImpl->m_touchGeneration = ++m_generation;
- DBG_NAV_LOGD("m_generation=%d framePtr=%p nodePtr=%p x=%d y=%d",
- m_generation, framePtr, nodePtr, x, y);
+ DBG_NAV_LOGD("m_generation=%d framePtr=%p nodePtr=%p x=%d y=%d", m_generation, framePtr, nodePtr, x, y);
LOG_ASSERT(m_javaGlue.m_obj, "A WebView was not associated with this WebViewNative!");
+
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue.object(env).get(), m_javaGlue.m_sendMotionUp,
- m_generation, (jint) framePtr, (jint) nodePtr, x, y);
+ AutoJObject javaObject = m_javaGlue.object(env);
+ if (!javaObject.get())
+ return;
+ m_viewImpl->m_touchGeneration = ++m_generation;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMotionUp, m_generation, (jint) framePtr, (jint) nodePtr, x, y);
checkException(env);
}
@@ -1285,8 +1307,10 @@ bool scrollBy(int dx, int dy)
LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
JNIEnv* env = JSC::Bindings::getJNIEnv();
- bool result = env->CallBooleanMethod(m_javaGlue.object(env).get(),
- m_javaGlue.m_scrollBy, dx, dy, true);
+ AutoJObject javaObject = m_javaGlue.object(env);
+ if (!javaObject.get())
+ return false;
+ bool result = env->CallBooleanMethod(javaObject.get(), m_javaGlue.m_scrollBy, dx, dy, true);
checkException(env);
return result;
}
@@ -1322,29 +1346,40 @@ bool hasFocusNode()
void rebuildWebTextView()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue.object(env).get(),
- m_javaGlue.m_rebuildWebTextView);
+ AutoJObject javaObject = m_javaGlue.object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue.m_rebuildWebTextView);
checkException(env);
}
void viewInvalidate()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue.object(env).get(), m_javaGlue.m_viewInvalidate);
+ AutoJObject javaObject = m_javaGlue.object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidate);
checkException(env);
}
void viewInvalidateRect(int l, int t, int r, int b)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue.object(env).get(), m_javaGlue.m_viewInvalidateRect, l, r, t, b);
+ AutoJObject javaObject = m_javaGlue.object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidateRect, l, r, t, b);
checkException(env);
}
void postInvalidateDelayed(int64_t delay, const WebCore::IntRect& bounds)
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- env->CallVoidMethod(m_javaGlue.object(env).get(), m_javaGlue.m_postInvalidateDelayed,
+ AutoJObject javaObject = m_javaGlue.object(env);
+ if (!javaObject.get())
+ return;
+ env->CallVoidMethod(javaObject.get(), m_javaGlue.m_postInvalidateDelayed,
delay, bounds.x(), bounds.y(), bounds.maxX(), bounds.maxY());
checkException(env);
}
@@ -1352,8 +1387,10 @@ void postInvalidateDelayed(int64_t delay, const WebCore::IntRect& bounds)
bool inFullScreenMode()
{
JNIEnv* env = JSC::Bindings::getJNIEnv();
- jboolean result = env->CallBooleanMethod(m_javaGlue.object(env).get(),
- m_javaGlue.m_inFullScreenMode);
+ AutoJObject javaObject = m_javaGlue.object(env);
+ if (!javaObject.get())
+ return false;
+ jboolean result = env->CallBooleanMethod(javaObject.get(), m_javaGlue.m_inFullScreenMode);
checkException(env);
return result;
}