Bug 1486596 - Hold a WeakRef to LayerSession::Compositor from nsWindow r=jchen

This commit is contained in:
James Willcox 2018-09-01 16:51:02 -05:00
parent 010a4a02a5
commit 923748371f
2 changed files with 22 additions and 9 deletions

View File

@ -72,10 +72,8 @@ public class LayerSession {
LayerSession.this.onCompositorDetached();
}
@Override protected void disposeNative() {
// Disposal happens in native code.
throw new UnsupportedOperationException();
}
@WrapForJNI(dispatchTo = "gecko")
@Override protected native void disposeNative();
@WrapForJNI(calledFrom = "ui", dispatchTo = "gecko")
public native void attachNPZC(PanZoomController npzc);
@ -141,6 +139,11 @@ public class LayerSession {
private void updateOverscrollOffset(final float x, final float y) {
LayerSession.this.updateOverscrollOffset(x, y);
}
@Override
protected void finalize() throws Throwable {
disposeNative();
}
}
protected final Compositor mCompositor = new Compositor();

View File

@ -845,7 +845,7 @@ class nsWindow::LayerViewSupport final
using LockedWindowPtr = WindowPtr<LayerViewSupport>::Locked;
WindowPtr<LayerViewSupport> mWindow;
LayerSession::Compositor::GlobalRef mCompositor;
LayerSession::Compositor::WeakRef mCompositor;
Atomic<bool, ReleaseAcquire> mCompositorPaused;
jni::Object::GlobalRef mSurface;
@ -909,10 +909,14 @@ public:
void OnDetach(already_AddRefed<Runnable> aDisposer)
{
if (RefPtr<nsThread> uiThread = GetAndroidUiThread()) {
LayerSession::Compositor::GlobalRef compositor(mCompositor);
if (!compositor) {
return;
}
uiThread->Dispatch(NS_NewRunnableFunction(
"LayerViewSupport::OnDetach",
[compositor =
LayerSession::Compositor::GlobalRef(mCompositor),
[compositor,
disposer = RefPtr<Runnable>(aDisposer)] {
compositor->OnCompositorDetached();
disposer->Run();
@ -1125,7 +1129,10 @@ public:
void RecvToolbarAnimatorMessage(int32_t aMessage)
{
mCompositor->RecvToolbarAnimatorMessage(aMessage);
auto compositor = LayerSession::Compositor::LocalRef(mCompositor);
if (compositor) {
compositor->RecvToolbarAnimatorMessage(aMessage);
}
}
void SetDefaultClearColor(int32_t aColor)
@ -1149,7 +1156,10 @@ public:
MOZ_ASSERT(AndroidBridge::IsJavaUiThread());
auto pixels = mozilla::jni::IntArray::New(aMem.get<int>(), aMem.Size<int>());
mCompositor->RecvScreenPixels(aSize.width, aSize.height, pixels);
auto compositor = LayerSession::Compositor::LocalRef(mCompositor);
if (compositor) {
compositor->RecvScreenPixels(aSize.width, aSize.height, pixels);
}
// Pixels have been copied, so Dealloc Shmem
if (RefPtr<UiCompositorControllerChild> child = GetUiCompositorControllerChild()) {