Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3b3721f9 authored by John Reck's avatar John Reck Committed by Automerger Merge Worker
Browse files

Merge "Have HWUI validate the WebViewFunctors at registration" into sc-dev am: 22b214ba

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14531562

Change-Id: I8706f33336f93e0943c0cbb4643af99d3e4ae59d
parents 55e99e65 22b214ba
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -221,8 +221,30 @@ WebViewFunctorManager& WebViewFunctorManager::instance() {
    return sInstance;
}

static void validateCallbacks(const WebViewFunctorCallbacks& callbacks) {
    // TODO: Should we do a stack peek to see if this is really webview?
    LOG_ALWAYS_FATAL_IF(callbacks.onSync == nullptr, "onSync is null");
    LOG_ALWAYS_FATAL_IF(callbacks.onContextDestroyed == nullptr, "onContextDestroyed is null");
    LOG_ALWAYS_FATAL_IF(callbacks.onDestroyed == nullptr, "onDestroyed is null");
    LOG_ALWAYS_FATAL_IF(callbacks.removeOverlays == nullptr, "removeOverlays is null");
    switch (auto mode = WebViewFunctor_queryPlatformRenderMode()) {
        case RenderMode::OpenGL_ES:
            LOG_ALWAYS_FATAL_IF(callbacks.gles.draw == nullptr, "gles.draw is null");
            break;
        case RenderMode::Vulkan:
            LOG_ALWAYS_FATAL_IF(callbacks.vk.initialize == nullptr, "vk.initialize is null");
            LOG_ALWAYS_FATAL_IF(callbacks.vk.draw == nullptr, "vk.draw is null");
            LOG_ALWAYS_FATAL_IF(callbacks.vk.postDraw == nullptr, "vk.postDraw is null");
            break;
        default:
            LOG_ALWAYS_FATAL("unknown platform mode? %d", (int)mode);
            break;
    }
}

int WebViewFunctorManager::createFunctor(void* data, const WebViewFunctorCallbacks& callbacks,
                                         RenderMode functorMode) {
    validateCallbacks(callbacks);
    auto object = std::make_unique<WebViewFunctor>(data, callbacks, functorMode);
    int id = object->id();
    auto handle = object->createHandle();
+7 −0
Original line number Diff line number Diff line
@@ -287,6 +287,7 @@ public:
        int sync = 0;
        int contextDestroyed = 0;
        int destroyed = 0;
        int removeOverlays = 0;
        int glesDraw = 0;
    };

@@ -311,6 +312,12 @@ public:
                            expectOnRenderThread("onDestroyed");
                            sMockFunctorCounts[functor].destroyed++;
                        },
                .removeOverlays =
                        [](int functor, void* data,
                           void (*mergeTransaction)(ASurfaceTransaction*)) {
                            expectOnRenderThread("removeOverlays");
                            sMockFunctorCounts[functor].removeOverlays++;
                        },
        };
        switch (mode) {
            case RenderMode::OpenGL_ES:
+3 −1
Original line number Diff line number Diff line
@@ -62,8 +62,10 @@ int main(int argc, char* argv[]) {
        gSigChain.insert(pair<int, struct sigaction>(sig, old_sa));
    }

    // Replace the default GLES driver
    // Avoid talking to SF
    Properties::isolatedProcess = true;
    // Default to GLES (Vulkan-aware tests will override this)
    Properties::overrideRenderPipelineType(RenderPipelineType::SkiaGL);

    // Run the tests
    testing::InitGoogleTest(&argc, argv);
+35 −36
Original line number Diff line number Diff line
@@ -192,26 +192,25 @@ 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 = {
    static uirenderer::WebViewFunctorCallbacks webview_functor_callbacks = [] {
        uirenderer::WebViewFunctorCallbacks ret = {
                .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;
                ret.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;
                ret.vk.initialize = &initializeVk;
                ret.vk.draw = &drawVk;
                ret.vk.postDraw = &postDrawVk;
                break;
        }
    callbacks_initialized = true;
  }
        return ret;
    }();
    SupportData* support = new SupportData{
            .data = data,
    };