diff options
author | John Reck <jreck@google.com> | 2021-05-13 10:28:38 -0400 |
---|---|---|
committer | John Reck <jreck@google.com> | 2021-05-13 17:17:21 -0400 |
commit | faa1b0ab2a63993db5e2b8d1ab207190c9d55880 (patch) | |
tree | c909ebdbca8fa96157e3a9fd663d807b7918ed6e /native | |
parent | c49b886d7316354cede2b9510777882bc4c8598e (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.cpp | 71 |
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, |