Bug 1372777 - Check that the native pointer has not been detached from the java object when dispatched to different thread r=esawin
MozReview-Commit-ID: DyeZDaHeWdL
--- a/widget/android/jni/Natives.h
+++ b/widget/android/jni/Natives.h
@@ -399,29 +399,31 @@ class ProxyNativeCall : public AbstractC
(*mNativeCall)(mozilla::Get<Indices>(mArgs)...);
}
template<bool Static, bool ThisArg, size_t... Indices>
typename mozilla::EnableIf<!Static && ThisArg, void>::Type
Call(const typename Owner::LocalRef& inst,
mozilla::IndexSequence<Indices...>) const
{
- Impl* const impl = NativePtr<Impl>::Get(inst);
- MOZ_CATCH_JNI_EXCEPTION(inst.Env());
- (impl->*mNativeCall)(inst, mozilla::Get<Indices>(mArgs)...);
+ if (Impl* const impl = NativePtr<Impl>::Get(inst)) {
+ MOZ_CATCH_JNI_EXCEPTION(inst.Env());
+ (impl->*mNativeCall)(inst, mozilla::Get<Indices>(mArgs)...);
+ }
}
template<bool Static, bool ThisArg, size_t... Indices>
typename mozilla::EnableIf<!Static && !ThisArg, void>::Type
Call(const typename Owner::LocalRef& inst,
mozilla::IndexSequence<Indices...>) const
{
- Impl* const impl = NativePtr<Impl>::Get(inst);
- MOZ_CATCH_JNI_EXCEPTION(inst.Env());
- (impl->*mNativeCall)(mozilla::Get<Indices>(mArgs)...);
+ if (Impl* const impl = NativePtr<Impl>::Get(inst)) {
+ MOZ_CATCH_JNI_EXCEPTION(inst.Env());
+ (impl->*mNativeCall)(mozilla::Get<Indices>(mArgs)...);
+ }
}
template<size_t... Indices>
void Clear(JNIEnv* env, mozilla::IndexSequence<Indices...>)
{
int dummy[] = {
(ProxyArg<Args>::Clear(env, Get<Indices>(mArgs)), 0)...
};
--- a/widget/android/nsWindow.cpp
+++ b/widget/android/nsWindow.cpp
@@ -978,21 +978,24 @@ public:
: mCompositor(mozilla::Move(aCompositor))
{}
void Run() override
{
MOZ_ASSERT(NS_IsMainThread());
JNIEnv* const env = jni::GetGeckoThreadEnv();
- LayerViewSupport* const lvs = GetNative(
- LayerView::Compositor::LocalRef(env, mCompositor));
- MOZ_CATCH_JNI_EXCEPTION(env);
+ // Make sure LayerViewSupport hasn't been detached from the
+ // Java object since this event was dispatched.
+ if (LayerViewSupport* const lvs = GetNative(
+ LayerView::Compositor::LocalRef(env, mCompositor))) {
+ MOZ_CATCH_JNI_EXCEPTION(env);
- lvs->OnResumedCompositor();
+ lvs->OnResumedCompositor();
+ }
}
};
nsAppShell::PostEvent(MakeUnique<LayerViewEvent>(
MakeUnique<OnResumedEvent>(aObj)));
}
void SyncInvalidateAndScheduleComposite()