From 8199651a795dbd12e2c577b49a704abe87555a63 Mon Sep 17 00:00:00 2001 From: Imanol Fernandez Date: Fri, 30 Aug 2019 15:13:39 +0200 Subject: [PATCH 1/5] Fix leak when closing a window (surface.release() not called) --- .../vrbrowser/ui/widgets/WindowWidget.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java index b58ec1a16..778900c15 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java @@ -783,15 +783,23 @@ public void releaseWidget() { mSessionStack.removeProgressListener(this); mSessionStack.setHistoryDelegate(null); GeckoSession session = mSessionStack.getSession(mSessionId); - if (session == null) { - return; - } if (mDisplay != null) { mDisplay.surfaceDestroyed(); - session.releaseDisplay(mDisplay); + if (session != null) { + session.releaseDisplay(mDisplay); + } mDisplay = null; } - session.getTextInput().setView(null); + if (session != null) { + session.getTextInput().setView(null); + } + if (mSurface != null) { + mSurface.release(); + } + if (mTexture != null) { + mTexture.release(); + } + super.releaseWidget(); } From dcc1aac1f12873897de5e143ff3393cef5b16195 Mon Sep 17 00:00:00 2001 From: Imanol Fernandez Date: Fri, 30 Aug 2019 15:14:38 +0200 Subject: [PATCH 2/5] Ensure that surface is released when a widget is removed (before waiting for releaseWidget() call) --- .../org/mozilla/vrbrowser/ui/widgets/UIWidget.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/UIWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/UIWidget.java index b44207933..f0df2feeb 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/UIWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/UIWidget.java @@ -191,13 +191,17 @@ public void handleMoveEvent(float aDeltaX, float aDeltaY, float aDeltaZ, float a mWidgetPlacement.rotation = aRotation; } - @Override - public void releaseWidget() { + private void releaseRenderer() { if (mRenderer != null) { mRenderer.release(); mRenderer = null; } mTexture = null; + } + + @Override + public void releaseWidget() { + releaseRenderer(); mWidgetManager = null; } @@ -327,7 +331,7 @@ public void hide(@HideFlags int aHideFlags) { mWidgetPlacement.visible = false; if (aHideFlags == REMOVE_WIDGET) { mWidgetManager.removeWidget(this); - + releaseRenderer(); } else { mWidgetManager.updateWidget(this); } From 8925844ec0d1ba8c9342efd71b2b46678bf8dafd Mon Sep 17 00:00:00 2001 From: Imanol Fernandez Date: Fri, 30 Aug 2019 15:14:55 +0200 Subject: [PATCH 3/5] Do not recreate the tooltip if already created --- .../shared/org/mozilla/vrbrowser/ui/views/UIButton.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/views/UIButton.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/views/UIButton.java index bdf426e17..5ccd27024 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/views/UIButton.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/views/UIButton.java @@ -233,7 +233,9 @@ public void run() { return; } - mTooltipView = new TooltipWidget(getContext()); + if (mTooltipView == null) { + mTooltipView = new TooltipWidget(getContext()); + } mTooltipView.setCurvedMode(mCurvedTooltip); mTooltipView.setText(getTooltip()); From c898b1db173f0ccfe129747e5ca2553d6c0aa34c Mon Sep 17 00:00:00 2001 From: Imanol Fernandez Date: Fri, 30 Aug 2019 17:46:19 +0200 Subject: [PATCH 4/5] Improve WindowWidget.releaseWidget --- .../org/mozilla/vrbrowser/ui/widgets/WindowWidget.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java index 778900c15..72a2644ab 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java @@ -795,9 +795,12 @@ public void releaseWidget() { } if (mSurface != null) { mSurface.release(); + mSurface = null; } - if (mTexture != null) { + if (mTexture != null && mRenderer == null) { + // Custom SurfaceTexture used for GeckoView mTexture.release(); + mTexture = null; } super.releaseWidget(); } From 49d740bf4eed28fae710a2cb8fe29865c4d8f882 Mon Sep 17 00:00:00 2001 From: Imanol Fernandez Date: Fri, 30 Aug 2019 18:02:06 +0200 Subject: [PATCH 5/5] Hide/show Top and TitleBar widgets instead of recreating them each time --- .../org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java | 9 +++++---- .../org/mozilla/vrbrowser/ui/widgets/TopBarWidget.java | 9 +++++---- .../org/mozilla/vrbrowser/ui/widgets/WindowWidget.java | 6 ++++++ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java index 7af510540..07b3c0c3b 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java @@ -37,8 +37,9 @@ public interface Delegate { private TitleBarBinding mBinding; private WindowWidget mAttachedWindow; - private boolean mVisible; + private boolean mVisible = false; private Media mMedia; + private boolean mWidgetAdded = false; public TitleBarWidget(Context aContext) { super(aContext); @@ -123,11 +124,11 @@ public void setVisible(boolean aIsVisible) { } mVisible = aIsVisible; getPlacement().visible = aIsVisible; - - if (aIsVisible) { + if (!mWidgetAdded) { mWidgetManager.addWidget(this); + mWidgetAdded = true; } else { - mWidgetManager.removeWidget(this); + mWidgetManager.updateWidget(this); } } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TopBarWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TopBarWidget.java index d9fdb59bb..9b3d0fe52 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TopBarWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TopBarWidget.java @@ -29,7 +29,8 @@ public class TopBarWidget extends UIWidget implements SessionChangeListener, Wid private WindowWidget mAttachedWindow; private TopBarWidget.Delegate mDelegate; private LinearLayout mMultiWindowControlsContainer; - private boolean mVisible; + private boolean mVisible = false; + private boolean mWidgetAdded = false; public TopBarWidget(Context aContext) { super(aContext); @@ -171,11 +172,11 @@ public void setVisible(boolean aIsVisible) { } mVisible = aIsVisible; getPlacement().visible = aIsVisible; - - if (aIsVisible) { + if (!mWidgetAdded) { mWidgetManager.addWidget(this); + mWidgetAdded = true; } else { - mWidgetManager.removeWidget(this); + mWidgetManager.updateWidget(this); } } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java index 72a2644ab..f36c3106d 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java @@ -246,6 +246,12 @@ public void close() { mBookmarksView.onDestroy(); mHistoryView.onDestroy(); SessionStore.get().destroySessionStack(mWindowId); + if (mTopBar != null) { + mWidgetManager.removeWidget(mTopBar); + } + if (mTitleBar != null) { + mWidgetManager.removeWidget(mTitleBar); + } } public void loadHomeIfNotRestored() {