Bug 1372777 - Check that the native pointer has not been detached from the java object when dispatched to different thread r=esawin a=jcristau
authorRandall Barker <rbarker@mozilla.com>
Mon, 19 Jun 2017 11:57:27 -0700
changeset 414247 e8e60131e908bb4cf7f919a98646ccb548a6c0b9
parent 414246 e3d205dc31f33fd2897fd68ffb9ff15e9e3bc079
child 414248 04fc201151527b3084222ac209e554c063de1104
push id1490
push usermtabara@mozilla.com
push dateMon, 31 Jul 2017 14:08:16 +0000
treeherdermozilla-release@70e32e6bf15e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersesawin, jcristau
bugs1372777
milestone55.0
Bug 1372777 - Check that the native pointer has not been detached from the java object when dispatched to different thread r=esawin a=jcristau 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
@@ -982,21 +982,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()