diff options
author | Huihong Luo <huisinro@google.com> | 2021-06-25 21:54:16 -0700 |
---|---|---|
committer | Huihong Luo <huisinro@google.com> | 2021-07-01 11:50:53 -0700 |
commit | ec68b7c973924e98592cd80e9be0690103c66831 (patch) | |
tree | e469755eddb046aa74c98b467f24f6f486c1e88e /libs/hwui | |
parent | ac57d157da34f34b818611603699e6ec60ab3ae4 (diff) |
Disable Webview Overlay when invisible
Remove Webview overlays when Webview node is set to invisible
Bug: 187292989
Test: play a video in a Webview, toggle visibility for the view, check
existence of a surface control named as "Webview Overlay
SurfaceControl#0"
Change-Id: If47a78a8ae1f7b65b9e7ab983ec72f580d78191a
Diffstat (limited to 'libs/hwui')
-rw-r--r-- | libs/hwui/DisplayList.h | 11 | ||||
-rw-r--r-- | libs/hwui/RenderNode.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/WebViewFunctorManager.cpp | 15 | ||||
-rw-r--r-- | libs/hwui/WebViewFunctorManager.h | 3 | ||||
-rw-r--r-- | libs/hwui/canvas/CanvasOpBuffer.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/canvas/CanvasOpBuffer.h | 1 | ||||
-rw-r--r-- | libs/hwui/pipeline/skia/FunctorDrawable.h | 4 | ||||
-rw-r--r-- | libs/hwui/pipeline/skia/SkiaDisplayList.cpp | 6 | ||||
-rw-r--r-- | libs/hwui/pipeline/skia/SkiaDisplayList.h | 7 |
9 files changed, 53 insertions, 2 deletions
diff --git a/libs/hwui/DisplayList.h b/libs/hwui/DisplayList.h index 894b479c11db..eb5878d95561 100644 --- a/libs/hwui/DisplayList.h +++ b/libs/hwui/DisplayList.h @@ -133,6 +133,12 @@ public: } } + void onRemovedFromTree() { + if (mImpl) { + mImpl->onRemovedFromTree(); + } + } + [[nodiscard]] bool hasText() const { return mImpl && mImpl->hasText(); } @@ -172,6 +178,7 @@ private: return false; } void syncContents(const WebViewSyncData& data) { } + void onRemovedFromTree() { } void applyColorTransform(ColorTransform transform) { } }; @@ -298,6 +305,10 @@ public: apply([&](auto& it) { it.syncContents(data); }); } + void onRemovedFromTree() { + apply([&](auto& it) { it.onRemovedFromTree(); }); + } + [[nodiscard]] bool hasText() const { return apply([](const auto& it) -> auto { return it.hasText(); }); } diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index 44c335f6adb3..0c422df65881 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -18,6 +18,7 @@ #include "DamageAccumulator.h" #include "Debug.h" +#include "Properties.h" #include "TreeInfo.h" #include "VectorDrawable.h" #include "private/hwui/WebViewFunctor.h" @@ -473,6 +474,9 @@ void RenderNode::decParentRefCount(TreeObserver& observer, TreeInfo* info) { } void RenderNode::onRemovedFromTree(TreeInfo* info) { + if (Properties::enableWebViewOverlays && mDisplayList) { + mDisplayList.onRemovedFromTree(); + } destroyHardwareResources(info); } diff --git a/libs/hwui/WebViewFunctorManager.cpp b/libs/hwui/WebViewFunctorManager.cpp index 93f2f42a00fd..df4101109a18 100644 --- a/libs/hwui/WebViewFunctorManager.cpp +++ b/libs/hwui/WebViewFunctorManager.cpp @@ -108,6 +108,13 @@ void WebViewFunctor::sync(const WebViewSyncData& syncData) const { mCallbacks.onSync(mFunctor, mData, syncData); } +void WebViewFunctor::onRemovedFromTree() { + ATRACE_NAME("WebViewFunctor::onRemovedFromTree"); + if (mSurfaceControl) { + removeOverlays(); + } +} + void WebViewFunctor::drawGl(const DrawGlInfo& drawInfo) { ATRACE_NAME("WebViewFunctor::drawGl"); if (!mHasContext) { @@ -185,6 +192,7 @@ void WebViewFunctor::removeOverlays() { ScopedCurrentFunctor currentFunctor(this); mCallbacks.removeOverlays(mFunctor, mData, currentFunctor.mergeTransaction); if (mSurfaceControl) { + reparentSurfaceControl(nullptr); auto funcs = renderthread::RenderThread::getInstance().getASurfaceControlFunctions(); funcs.releaseFunc(mSurfaceControl); mSurfaceControl = nullptr; @@ -217,9 +225,12 @@ ASurfaceControl* WebViewFunctor::getSurfaceControl() { void WebViewFunctor::mergeTransaction(ASurfaceTransaction* transaction) { ATRACE_NAME("WebViewFunctor::mergeTransaction"); if (transaction == nullptr) return; + bool done = false; renderthread::CanvasContext* activeContext = renderthread::CanvasContext::getActiveContext(); - LOG_ALWAYS_FATAL_IF(activeContext == nullptr, "Null active canvas context!"); - bool done = activeContext->mergeTransaction(transaction, mSurfaceControl); + // activeContext might be null when called from mCallbacks.removeOverlays() + if (activeContext != nullptr) { + done = activeContext->mergeTransaction(transaction, mSurfaceControl); + } if (!done) { auto funcs = renderthread::RenderThread::getInstance().getASurfaceControlFunctions(); funcs.transactionApplyFunc(transaction); diff --git a/libs/hwui/WebViewFunctorManager.h b/libs/hwui/WebViewFunctorManager.h index 048d1fbe1c7c..f28f310993ec 100644 --- a/libs/hwui/WebViewFunctorManager.h +++ b/libs/hwui/WebViewFunctorManager.h @@ -58,6 +58,8 @@ public: void removeOverlays() { mReference.removeOverlays(); } + void onRemovedFromTree() { mReference.onRemovedFromTree(); } + private: friend class WebViewFunctor; @@ -74,6 +76,7 @@ public: void postDrawVk(); void destroyContext(); void removeOverlays(); + void onRemovedFromTree(); ASurfaceControl* getSurfaceControl(); void mergeTransaction(ASurfaceTransaction* transaction); diff --git a/libs/hwui/canvas/CanvasOpBuffer.cpp b/libs/hwui/canvas/CanvasOpBuffer.cpp index 6089c572b0d5..336c5d8dab35 100644 --- a/libs/hwui/canvas/CanvasOpBuffer.cpp +++ b/libs/hwui/canvas/CanvasOpBuffer.cpp @@ -46,6 +46,10 @@ void CanvasOpBuffer::syncContents(const WebViewSyncData& data) { LOG_ALWAYS_FATAL("TODO"); } +void CanvasOpBuffer::onRemovedFromTree() { + LOG_ALWAYS_FATAL("TODO"); +} + void CanvasOpBuffer::applyColorTransform(ColorTransform transform) { LOG_ALWAYS_FATAL("TODO"); } diff --git a/libs/hwui/canvas/CanvasOpBuffer.h b/libs/hwui/canvas/CanvasOpBuffer.h index af797ca8288b..529546d5c49c 100644 --- a/libs/hwui/canvas/CanvasOpBuffer.h +++ b/libs/hwui/canvas/CanvasOpBuffer.h @@ -100,6 +100,7 @@ public: TreeObserver& observer, TreeInfo& info, bool functorsNeedLayer, std::function<void(RenderNode*, TreeObserver&, TreeInfo&, bool)> childFn); void syncContents(const WebViewSyncData& data); + void onRemovedFromTree(); void applyColorTransform(ColorTransform transform); [[nodiscard]] bool isEmpty() const { return !mHas.content; } diff --git a/libs/hwui/pipeline/skia/FunctorDrawable.h b/libs/hwui/pipeline/skia/FunctorDrawable.h index 988a896b6267..9bbd0a92600b 100644 --- a/libs/hwui/pipeline/skia/FunctorDrawable.h +++ b/libs/hwui/pipeline/skia/FunctorDrawable.h @@ -44,6 +44,10 @@ public: mWebViewHandle->sync(data); } + virtual void onRemovedFromTree() { + mWebViewHandle->onRemovedFromTree(); + } + protected: virtual SkRect onGetBounds() override { return mBounds; } diff --git a/libs/hwui/pipeline/skia/SkiaDisplayList.cpp b/libs/hwui/pipeline/skia/SkiaDisplayList.cpp index 3498f715b455..fcfc4f82abed 100644 --- a/libs/hwui/pipeline/skia/SkiaDisplayList.cpp +++ b/libs/hwui/pipeline/skia/SkiaDisplayList.cpp @@ -47,6 +47,12 @@ void SkiaDisplayList::syncContents(const WebViewSyncData& data) { } } +void SkiaDisplayList::onRemovedFromTree() { + for (auto& functor : mChildFunctors) { + functor->onRemovedFromTree(); + } +} + bool SkiaDisplayList::reuseDisplayList(RenderNode* node) { reset(); node->attachAvailableList(this); diff --git a/libs/hwui/pipeline/skia/SkiaDisplayList.h b/libs/hwui/pipeline/skia/SkiaDisplayList.h index 90e9bc6a1a28..2a677344b7b2 100644 --- a/libs/hwui/pipeline/skia/SkiaDisplayList.h +++ b/libs/hwui/pipeline/skia/SkiaDisplayList.h @@ -111,6 +111,13 @@ public: */ void syncContents(const WebViewSyncData& data); + /** + * ONLY to be called by RenderNode::onRemovedFromTree so that we can notify any + * contained VectorDrawables or GLFunctors. + * + */ + void onRemovedFromTree(); + void applyColorTransform(ColorTransform transform) { mDisplayList.applyColorTransform(transform); } |