/*
 * Copyright (C) 2013 Igalia S.L.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#include "config.h"

#include "WebProcessTest.h"
#include <gio/gio.h>
#include <wtf/RunLoop.h>

#if USE(GTK4)
#include <webkit/webkit-web-process-extension.h>
#else
#include <webkit2/webkit-web-extension.h>
typedef _WebKitWebExtension WebKitWebProcessExtension;
#endif

class WebKitDOMDOMWindowTest;
static gboolean loadedCallback(WebKitDOMDOMWindow*, WebKitDOMEvent*, WebKitDOMDOMWindowTest*);
static gboolean clickedCallback(WebKitDOMDOMWindow*, WebKitDOMEvent*, WebKitDOMDOMWindowTest*);

class WebKitDOMDOMWindowTest : public WebProcessTest {
public:
    static std::unique_ptr<WebProcessTest> create() { return makeUnique<WebKitDOMDOMWindowTest>(); }

private:
    guint64 webPageFromArgs(GVariant* args)
    {
        GVariantIter iter;
        g_variant_iter_init(&iter, args);

        const char* key;
        GVariant* value;
        while (g_variant_iter_loop(&iter, "{&sv}", &key, &value)) {
            if (!strcmp(key, "pageID") && g_variant_classify(value) == G_VARIANT_CLASS_UINT64)
                return g_variant_get_uint64(value);
        }

        g_assert_not_reached();
        return 0;
    }

    bool testSignals(WebKitWebProcessExtension* extension, GVariant* args)
    {
        notify("ready", "");

#if ENABLE(2022_GLIB_API)
        WebKitWebPage* page = webkit_web_process_extension_get_page(extension, webPageFromArgs(args));
#else
        WebKitWebPage* page = webkit_web_extension_get_page(extension, webPageFromArgs(args));
#endif
        g_assert_true(WEBKIT_IS_WEB_PAGE(page));
        WebKitDOMDocument* document = webkit_web_page_get_dom_document(page);
        g_assert_true(WEBKIT_DOM_IS_DOCUMENT(document));

        WebKitDOMDOMWindow* domWindow = webkit_dom_document_get_default_view(document);
        g_assert_nonnull(domWindow);

        // The "load" WebKitDOMDOMWindow signal is issued before this test is
        // called. There's no way to capture it here. We simply assume that
        // the document is loaded and notify the uiprocess accordingly
        // notify("loaded", "");

        webkit_dom_event_target_add_event_listener(
            WEBKIT_DOM_EVENT_TARGET(domWindow),
            "load",
            G_CALLBACK(loadedCallback),
            false,
            this);

        // loadedCallback() will stop this loop
        RunLoop::run();

        document = webkit_web_page_get_dom_document(page);
        g_assert_true(WEBKIT_DOM_IS_DOCUMENT(document));

        WebKitDOMElement* element = webkit_dom_document_get_element_by_id(document, "test");
        g_assert_nonnull(element);

        webkit_dom_event_target_add_event_listener(
            WEBKIT_DOM_EVENT_TARGET(element),
            "click",
            G_CALLBACK(clickedCallback),
            false,
            this);

        // The "click" action will be issued in the uiprocess and that will
        // trigger the dom event here.
        // clickedCallback() will stop this loop
        RunLoop::run();

        return true;
    }

    bool testDispatchEvent(WebKitWebProcessExtension* extension, GVariant* args)
    {
        notify("ready", "");

#if ENABLE(2022_GLIB_API)
        WebKitWebPage* page = webkit_web_process_extension_get_page(extension, webPageFromArgs(args));
#else
        WebKitWebPage* page = webkit_web_extension_get_page(extension, webPageFromArgs(args));
#endif
        g_assert_true(WEBKIT_IS_WEB_PAGE(page));
        WebKitDOMDocument* document = webkit_web_page_get_dom_document(page);
        g_assert_true(WEBKIT_DOM_IS_DOCUMENT(document));

        WebKitDOMDOMWindow* domWindow = webkit_dom_document_get_default_view(document);
        g_assert_nonnull(domWindow);

        // The "load" WebKitDOMDOMWindow signal is issued before this test is
        // called. There's no way to capture it here. We simply assume that
        // the document is loaded and notify the uiprocess accordingly
        // notify("loaded", "");

        webkit_dom_event_target_add_event_listener(
            WEBKIT_DOM_EVENT_TARGET(domWindow),
            "load",
            G_CALLBACK(loadedCallback),
            false,
            this);

        // loadedCallback() will stop this loop
        RunLoop::run();

        document = webkit_web_page_get_dom_document(page);
        g_assert_true(WEBKIT_DOM_IS_DOCUMENT(document));

        WebKitDOMElement* element = webkit_dom_document_get_element_by_id(document, "test");
        g_assert_nonnull(element);

        WebKitDOMEvent* event = webkit_dom_document_create_event(document, "MouseEvent", 0);
        g_assert_nonnull(event);
        g_assert_true(WEBKIT_DOM_IS_EVENT(event));
        g_assert_true(WEBKIT_DOM_IS_MOUSE_EVENT(event));

        glong clientX, clientY;
        clientX = webkit_dom_element_get_client_left(element);
        clientY = webkit_dom_element_get_client_top(element);

        webkit_dom_event_target_add_event_listener(
            WEBKIT_DOM_EVENT_TARGET(element),
            "click",
            G_CALLBACK(clickedCallback),
            false,
            this);

        webkit_dom_mouse_event_init_mouse_event(WEBKIT_DOM_MOUSE_EVENT(event),
            "click", TRUE, TRUE,
            domWindow, 0, 0, 0, clientX, clientY,
            FALSE, FALSE, FALSE, FALSE,
            1, WEBKIT_DOM_EVENT_TARGET(element));

        webkit_dom_event_target_dispatch_event(WEBKIT_DOM_EVENT_TARGET(element), event, 0);

        // clickedCallback() will stop this loop
        RunLoop::run();

        return true;
    }

    bool testGetComputedStyle(WebKitWebProcessExtension* extension, GVariant* args)
    {
#if ENABLE(2022_GLIB_API)
        WebKitWebPage* page = webkit_web_process_extension_get_page(extension, webPageFromArgs(args));
#else
        WebKitWebPage* page = webkit_web_extension_get_page(extension, webPageFromArgs(args));
#endif
        g_assert_true(WEBKIT_IS_WEB_PAGE(page));
        WebKitDOMDocument* document = webkit_web_page_get_dom_document(page);
        g_assert_true(WEBKIT_DOM_IS_DOCUMENT(document));
        WebKitDOMDOMWindow* domWindow = webkit_dom_document_get_default_view(document);
        g_assert_nonnull(domWindow);
        WebKitDOMElement* element = webkit_dom_document_get_element_by_id(document, "test");
        g_assert_nonnull(element);
        g_assert_true(WEBKIT_DOM_IS_ELEMENT(element));
        WebKitDOMCSSStyleDeclaration* cssStyle = webkit_dom_dom_window_get_computed_style(domWindow, element, 0);
        gchar* fontSize = webkit_dom_css_style_declaration_get_property_value(cssStyle, "font-size");
        g_assert_cmpstr(fontSize, ==, "16px");

        return true;
    }

    virtual bool runTest(const char* testName, WebKitWebProcessExtension* extension, GVariant* args)
    {
        if (!strcmp(testName, "signals"))
            return testSignals(extension, args);
        if (!strcmp(testName, "dispatch-event"))
            return testDispatchEvent(extension, args);
        if (!strcmp(testName, "get-computed-style"))
            return testGetComputedStyle(extension, args);

        g_assert_not_reached();
        return false;
    }
};

static void __attribute__((constructor)) registerTests()
{
    REGISTER_TEST(WebKitDOMDOMWindowTest, "WebKitDOMDOMWindow/signals");
    REGISTER_TEST(WebKitDOMDOMWindowTest, "WebKitDOMDOMWindow/dispatch-event");
    REGISTER_TEST(WebKitDOMDOMWindowTest, "WebKitDOMDOMWindow/get-computed-style");
}

static gboolean loadedCallback(WebKitDOMDOMWindow* view, WebKitDOMEvent* event, WebKitDOMDOMWindowTest* test)
{
    test->notify("loaded", "");

    // Stop the loop and let testSignals() or testDispatchEvent() continue its course
    RunLoop::currentSingleton().stop();

    return FALSE;
}

static gboolean clickedCallback(WebKitDOMDOMWindow* view, WebKitDOMEvent* event, WebKitDOMDOMWindowTest* test)
{
    test->notify("clicked", "");
    test->notify("finish", "");

    // Stop the loop and let testSignals() or testDispatchEvent() continue its course
    RunLoop::currentSingleton().stop();

    return FALSE;
}
