summaryrefslogtreecommitdiff
path: root/native
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2021-05-13 10:28:38 -0400
committerJohn Reck <jreck@google.com>2021-05-13 17:17:21 -0400
commitfaa1b0ab2a63993db5e2b8d1ab207190c9d55880 (patch)
treec909ebdbca8fa96157e3a9fd663d807b7918ed6e /native
parentc49b886d7316354cede2b9510777882bc4c8598e (diff)
Have HWUI validate the WebViewFunctors at registration
Also tweak how webview's plat_support creates the functor sruct to be thread-safe, avoids any potential race conditions even though WebView itself is stated to be thread-hostile in general. It's too easy to have this just be defined-safe instead. Bug: 186814981 Test: build & boot, no crashes in real-webview apps Change-Id: I06f02a279e248fee375ce133c5ce9a2250665ad9
Diffstat (limited to 'native')
-rw-r--r--native/webview/plat_support/draw_functor.cpp71
1 files changed, 35 insertions, 36 deletions
diff --git a/native/webview/plat_support/draw_functor.cpp b/native/webview/plat_support/draw_functor.cpp
index ea57ea070369..472e0a4347fc 100644
--- a/native/webview/plat_support/draw_functor.cpp
+++ b/native/webview/plat_support/draw_functor.cpp
@@ -192,44 +192,43 @@ void postDrawVk(int functor, void* data) {
int CreateFunctor_v3(void* data, int version,
AwDrawFnFunctorCallbacks* functor_callbacks) {
- static bool callbacks_initialized = false;
- static uirenderer::WebViewFunctorCallbacks webview_functor_callbacks = {
- .onSync = &onSync,
- .onContextDestroyed = &onContextDestroyed,
- .onDestroyed = &onDestroyed,
- .removeOverlays = &removeOverlays,
- };
- if (!callbacks_initialized) {
- switch (uirenderer::WebViewFunctor_queryPlatformRenderMode()) {
- case uirenderer::RenderMode::OpenGL_ES:
- webview_functor_callbacks.gles.draw = &draw_gl;
- break;
- case uirenderer::RenderMode::Vulkan:
- webview_functor_callbacks.vk.initialize = &initializeVk;
- webview_functor_callbacks.vk.draw = &drawVk;
- webview_functor_callbacks.vk.postDraw = &postDrawVk;
- break;
- }
- callbacks_initialized = true;
- }
- SupportData* support = new SupportData{
- .data = data,
- };
+ static uirenderer::WebViewFunctorCallbacks webview_functor_callbacks = [] {
+ uirenderer::WebViewFunctorCallbacks ret = {
+ .onSync = &onSync,
+ .onContextDestroyed = &onContextDestroyed,
+ .onDestroyed = &onDestroyed,
+ .removeOverlays = &removeOverlays,
+ };
+ switch (uirenderer::WebViewFunctor_queryPlatformRenderMode()) {
+ case uirenderer::RenderMode::OpenGL_ES:
+ ret.gles.draw = &draw_gl;
+ break;
+ case uirenderer::RenderMode::Vulkan:
+ ret.vk.initialize = &initializeVk;
+ ret.vk.draw = &drawVk;
+ ret.vk.postDraw = &postDrawVk;
+ break;
+ }
+ return ret;
+ }();
+ SupportData* support = new SupportData{
+ .data = data,
+ };
- // These callbacks are available on all versions.
- support->callbacks = {
- .on_sync = functor_callbacks->on_sync,
- .on_context_destroyed = functor_callbacks->on_context_destroyed,
- .on_destroyed = functor_callbacks->on_destroyed,
- .draw_gl = functor_callbacks->draw_gl,
- .init_vk = functor_callbacks->init_vk,
- .draw_vk = functor_callbacks->draw_vk,
- .post_draw_vk = functor_callbacks->post_draw_vk,
- };
+ // These callbacks are available on all versions.
+ support->callbacks = {
+ .on_sync = functor_callbacks->on_sync,
+ .on_context_destroyed = functor_callbacks->on_context_destroyed,
+ .on_destroyed = functor_callbacks->on_destroyed,
+ .draw_gl = functor_callbacks->draw_gl,
+ .init_vk = functor_callbacks->init_vk,
+ .draw_vk = functor_callbacks->draw_vk,
+ .post_draw_vk = functor_callbacks->post_draw_vk,
+ };
- if (version >= 3) {
- support->callbacks.remove_overlays = functor_callbacks->remove_overlays;
- }
+ if (version >= 3) {
+ support->callbacks.remove_overlays = functor_callbacks->remove_overlays;
+ }
int functor = uirenderer::WebViewFunctor_create(
support, webview_functor_callbacks,