Bug 1372777 - Check that the native pointer has not been detached from the java object when dispatched to different thread r=esawin draft
authorRandall Barker <rbarker@mozilla.com>
Mon, 19 Jun 2017 11:57:27 -0700
changeset 596773 1b3720381302435070d415720dccaaff15caa48c
parent 596772 17af61e163bdede0d8801c044e3c81fd117786ae
child 634065 7721a881905a1ee1051370186eae2a3270b6956e
push id64751
push userbmo:rbarker@mozilla.com
push dateMon, 19 Jun 2017 19:08:32 +0000
reviewersesawin
bugs1372777
milestone56.0a1
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
widget/android/jni/Natives.h
widget/android/nsWindow.cpp
--- 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()