summaryrefslogtreecommitdiff
path: root/libs/hwui
diff options
context:
space:
mode:
authorHuihong Luo <huisinro@google.com>2021-06-25 21:54:16 -0700
committerHuihong Luo <huisinro@google.com>2021-07-01 11:50:53 -0700
commitec68b7c973924e98592cd80e9be0690103c66831 (patch)
treee469755eddb046aa74c98b467f24f6f486c1e88e /libs/hwui
parentac57d157da34f34b818611603699e6ec60ab3ae4 (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.h11
-rw-r--r--libs/hwui/RenderNode.cpp4
-rw-r--r--libs/hwui/WebViewFunctorManager.cpp15
-rw-r--r--libs/hwui/WebViewFunctorManager.h3
-rw-r--r--libs/hwui/canvas/CanvasOpBuffer.cpp4
-rw-r--r--libs/hwui/canvas/CanvasOpBuffer.h1
-rw-r--r--libs/hwui/pipeline/skia/FunctorDrawable.h4
-rw-r--r--libs/hwui/pipeline/skia/SkiaDisplayList.cpp6
-rw-r--r--libs/hwui/pipeline/skia/SkiaDisplayList.h7
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);
}