/*
 * Copyright (C) 2024 Igalia, S.L. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 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"

#if ENABLE(WK_WEB_EXTENSIONS)

#include "TestMain.h"
#include "WebExtensionUtilities.h"
#include <WebKitWebExtensionInternal.h>
#include <wtf/HashMap.h>
#include <wtf/text/StringBuilder.h>
#include <wtf/text/StringHash.h>
#include <wtf/text/WTFString.h>

using namespace TestWebKitAPI;

static GRefPtr<GBytes> createGBytes(const gchar* string)
{
    return adoptGRef(g_bytes_new_static(string, strlen(string)));
}

static void testExtensionCreationFromDirectory(Test*, gconstpointer)
{
    static const char* extensionManifest = "{ \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }";

    GUniqueOutPtr<GError> error;
    GUniquePtr<char> filePath(g_build_filename(Test::dataDirectory(), "manifest.json", nullptr));
    g_assert_true(g_file_set_contents(filePath.get(), extensionManifest, strlen(extensionManifest), &error.outPtr()));
    g_assert_no_error(error.get());

    GRefPtr<WebKitWebExtension> extension = adoptGRef(webkit_web_extension_new(Test::dataDirectory(), &error.outPtr()));
    g_assert_no_error(error.get());

    g_assert_cmpstr(webkit_web_extension_get_display_name(extension.get()), ==, "Test");
    g_assert_cmpstr(webkit_web_extension_get_display_short_name(extension.get()), ==,  "Test");
    g_assert_cmpstr(webkit_web_extension_get_display_version(extension.get()), ==,  "1.0");
    g_assert_cmpstr(webkit_web_extension_get_display_description(extension.get()), ==,  "Test description");
    g_assert_cmpstr(webkit_web_extension_get_version(extension.get()), ==,  "1.0");
    g_assert_cmpint(webkit_web_extension_get_manifest_version(extension.get()), ==, 2);
}

static void testDisplayStringParsing(Test*, gconstpointer)
{
    GUniqueOutPtr<GError> error;
    auto parse = [&](const gchar* manifestString) {
        return adoptGRef(webkitWebExtensionCreate({ { "manifest.json"_s, createGBytes(manifestString) } }, &error.outPtr()));
    };

    GRefPtr<WebKitWebExtension> extension = parse("{ \"manifest_version\": 2 }");

    g_assert_null(webkit_web_extension_get_display_name(extension.get()));
    g_assert_null(webkit_web_extension_get_display_short_name(extension.get()));
    g_assert_null(webkit_web_extension_get_display_version(extension.get()));
    g_assert_null(webkit_web_extension_get_display_description(extension.get()));
    g_assert_null(webkit_web_extension_get_version(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    extension = parse("{ \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");

    g_assert_cmpstr(webkit_web_extension_get_display_name(extension.get()), ==, "Test");
    g_assert_cmpstr(webkit_web_extension_get_display_short_name(extension.get()), ==,  "Test");
    g_assert_cmpstr(webkit_web_extension_get_display_version(extension.get()), ==,  "1.0");
    g_assert_cmpstr(webkit_web_extension_get_display_description(extension.get()), ==,  "Test description");
    g_assert_cmpstr(webkit_web_extension_get_version(extension.get()), ==,  "1.0");
    g_assert_cmpint(webkit_web_extension_get_manifest_version(extension.get()), ==, 2);
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 3, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");

    g_assert_cmpstr(webkit_web_extension_get_display_name(extension.get()), ==, "Test");
    g_assert_cmpstr(webkit_web_extension_get_display_short_name(extension.get()), ==,  "Test");
    g_assert_cmpstr(webkit_web_extension_get_display_version(extension.get()), ==,  "1.0");
    g_assert_cmpstr(webkit_web_extension_get_display_description(extension.get()), ==,  "Test description");
    g_assert_cmpstr(webkit_web_extension_get_version(extension.get()), ==,  "1.0");
    g_assert_cmpint(webkit_web_extension_get_manifest_version(extension.get()), ==, 3);
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 2, \"name\": \"Test\", \"short_name\": \"Tst\", \"version\": \"1.0\", \"version_name\": \"1.0 Final\", \"description\": \"Test description\" }");

    g_assert_cmpstr(webkit_web_extension_get_display_name(extension.get()), ==, "Test");
    g_assert_cmpstr(webkit_web_extension_get_display_short_name(extension.get()), ==,  "Tst");
    g_assert_cmpstr(webkit_web_extension_get_display_version(extension.get()), ==,  "1.0 Final");
    g_assert_cmpstr(webkit_web_extension_get_display_description(extension.get()), ==,  "Test description");
    g_assert_cmpstr(webkit_web_extension_get_version(extension.get()), ==,  "1.0");
    g_assert_no_error(error.get());
}

static void testDefaultLocaleParsing(Test*, gconstpointer)
{
    GUniqueOutPtr<GError> error;
    auto parse = [&](const gchar* manifestString, const gchar* localeFile) {
        return adoptGRef(webkitWebExtensionCreate({ { "manifest.json"_s, createGBytes(manifestString) }, { String::fromUTF8(localeFile), createGBytes("{}") } }, &error.outPtr()));
    };

    // Test no default locale
    GRefPtr<WebKitWebExtension> extension = adoptGRef(webkitWebExtensionCreate({ { "manifest.json"_s, createGBytes("{ \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }") } }, &error.outPtr()));
    g_assert_no_error(error.get());
    g_assert_null(webkit_web_extension_get_default_locale(extension.get()));

    // Test with language locale file existing
    extension = parse("{ \"manifest_version\": 2, \"default_locale\": \"en\", \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }", "_locales/en/messages.json");
    auto* defaultLocale = webkit_web_extension_get_default_locale(extension.get());
    g_assert_no_error(error.get());
    g_assert_cmpstr(webkit_web_extension_get_default_locale(extension.get()), ==, "en");

    // Test with language locale file existing
    extension = parse("{ \"manifest_version\": 2, \"default_locale\": \"en_US\", \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }", "_locales/en_US/messages.json");
    defaultLocale = webkit_web_extension_get_default_locale(extension.get());
    g_assert_no_error(error.get());
    g_assert_cmpstr(webkit_web_extension_get_default_locale(extension.get()), ==, "en_US");

    // Test with less specific locale file existing
    extension = parse("{ \"manifest_version\": 2, \"default_locale\": \"en_US\", \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }", "_locales/en/messages.json");
    defaultLocale = webkit_web_extension_get_default_locale(extension.get());
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_null(defaultLocale);

    // Test with wrong locale file existing
    extension = parse("{ \"manifest_version\": 2, \"default_locale\": \"en_US\", \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }", "_locales/zh_CN/messages.json");
    defaultLocale = webkit_web_extension_get_default_locale(extension.get());
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_null(defaultLocale);

    // Test with no locale file existing
    extension = parse("{ \"manifest_version\": 2, \"default_locale\": \"en_US\", \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }", "");
    defaultLocale = webkit_web_extension_get_default_locale(extension.get());
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_null(defaultLocale);
}

static void testDisplayStringParsingWithLocalization(Test*, gconstpointer)
{
    GUniqueOutPtr<GError> error;

    const gchar* manifest =
        "{"
        "\"manifest_version\": 2,"
        "\"default_locale\": \"en_US\","
        "\"name\": \"__MSG_default_name__\","
        "\"short_name\": \"__MSG_regional_name__\","
        "\"version\": \"1.0\","
        "\"description\": \"__MSG_default_description__\""
        "}";

    const gchar* defaultMessages =
        "{"
        "\"default_name\": {"
        "\"message\": \"Default String\","
        "\"description\": \"The test name.\""
        "},"
        "\"default_description\": {"
        "\"message\": \"Default Description\","
        "\"description\": \"The test description.\""
        "}"
        "}";

    const gchar* regionalMessages =
        "{"
        "\"regional_name\": {"
        "\"message\": \"Regional String\","
        "\"description\": \"The regional name.\""
        "}"
        "}";

    HashMap<String, GRefPtr<GBytes>> resources = {
        { "manifest.json"_s, createGBytes(manifest) },
        { "_locales/en/messages.json"_s, createGBytes(defaultMessages) },
        { "_locales/en_US/messages.json"_s, createGBytes(regionalMessages) }
    };

    GRefPtr<WebKitWebExtension> extension = adoptGRef(webkitWebExtensionCreate(WTF::move(resources), &error.outPtr()));

    g_assert_cmpstr(webkit_web_extension_get_display_name(extension.get()), ==, "Default String");
    g_assert_cmpstr(webkit_web_extension_get_display_short_name(extension.get()), ==,  "Regional String");
    g_assert_cmpstr(webkit_web_extension_get_display_version(extension.get()), ==,  "1.0");
    g_assert_cmpstr(webkit_web_extension_get_display_description(extension.get()), ==,  "Default Description");
    g_assert_cmpstr(webkit_web_extension_get_version(extension.get()), ==,  "1.0");
    g_assert_no_error(error.get());

    manifest =
        "{"
        "\"manifest_version\": 2,"
        "\"default_locale\": \"en_US\","
        "\"name\": \"__MSG_default_name__\","
        "\"short_name\": \"__MSG_default_name__\","
        "\"version\": \"1.0\","
        "\"description\": \"__MSG_default_description__\""
        "}";
    resources = {
        { "manifest.json"_s, createGBytes(manifest) },
        { "_locales/en/messages.json"_s, createGBytes(defaultMessages) },
        { "_locales/en_US/messages.json"_s, createGBytes(regionalMessages) }
    };

    extension = adoptGRef(webkitWebExtensionCreate(WTF::move(resources), &error.outPtr()));

    g_assert_cmpstr(webkit_web_extension_get_display_short_name(extension.get()), ==,  "Default String");
    g_assert_no_error(error.get());
}

#if PLATFORM(GTK)
static void testActionParsing(Test*, gconstpointer)
{
    GUniqueOutPtr<GError> error;
    auto parse = [&](const gchar* manifestString) {
        return adoptGRef(webkitWebExtensionCreate({ { "manifest.json"_s, createGBytes(manifestString) } }, &error.outPtr()));
    };
    auto parseWithIcon = [&](const gchar* manifestString, GRefPtr<GBytes> imageData) {
        return adoptGRef(webkitWebExtensionCreate({
            { "manifest.json"_s, createGBytes(manifestString) },
            { "test.png"_s, imageData }
        }, &error.outPtr()));
    };

    GRefPtr<WebKitWebExtension> extension = parse("{ \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_no_error(error.get());
    g_assert_null(webkit_web_extension_get_display_action_label(extension.get()));
    g_assert_null(webkit_web_extension_get_action_icon(extension.get(), 16, 16));

    extension = parse("{ \"manifest_version\": 2, \"browser_action\": {}, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_no_error(error.get());
    g_assert_null(webkit_web_extension_get_display_action_label(extension.get()));
    g_assert_null(webkit_web_extension_get_action_icon(extension.get(), 16, 16));

    extension = parse("{ \"manifest_version\": 2, \"page_action\": {}, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_no_error(error.get());
    g_assert_null(webkit_web_extension_get_display_action_label(extension.get()));
    g_assert_null(webkit_web_extension_get_action_icon(extension.get(), 16, 16));

    extension = parse("{ \"manifest_version\": 2, \"browser_action\": {}, \"page_action\": {}, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_no_error(error.get());
    g_assert_null(webkit_web_extension_get_display_action_label(extension.get()));
    g_assert_null(webkit_web_extension_get_action_icon(extension.get(), 16, 16));

    extension = parse("{ \"manifest_version\": 2, \"browser_action\": { \"default_title\": \"Button Title\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_no_error(error.get());
    g_assert_cmpstr(webkit_web_extension_get_display_action_label(extension.get()), ==, "Button Title");
    g_assert_null(webkit_web_extension_get_action_icon(extension.get(), 16, 16));

    extension = parse("{ \"manifest_version\": 2, \"page_action\": { \"default_title\": \"Button Title\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_no_error(error.get());
    g_assert_cmpstr(webkit_web_extension_get_display_action_label(extension.get()), ==, "Button Title");
    g_assert_null(webkit_web_extension_get_action_icon(extension.get(), 16, 16));

    // `action` should be ignored in manifest v2
    extension = parse("{ \"manifest_version\": 2, \"action\": { \"default_title\": \"Button Title\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_no_error(error.get());
    g_assert_null(webkit_web_extension_get_display_action_label(extension.get()));
    g_assert_null(webkit_web_extension_get_action_icon(extension.get(), 16, 16));

    // manifest v3 should look for an `action` key
    extension = parse("{ \"manifest_version\": 3, \"action\": { \"default_title\": \"Button Title\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_no_error(error.get());
    g_assert_cmpstr(webkit_web_extension_get_display_action_label(extension.get()), ==, "Button Title");
    g_assert_null(webkit_web_extension_get_action_icon(extension.get(), 16, 16));

    // Manifest v3 should never find a browser_action.
    extension = parse("{ \"manifest_version\": 3, \"browser_action\": { \"default_title\": \"Button Title\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_no_error(error.get());
    g_assert_null(webkit_web_extension_get_display_action_label(extension.get()));
    g_assert_null(webkit_web_extension_get_action_icon(extension.get(), 16, 16));

    // Or a page action
    extension = parse("{ \"manifest_version\": 3, \"page_action\": { \"default_title\": \"Button Title\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_no_error(error.get());
    g_assert_null(webkit_web_extension_get_display_action_label(extension.get()));
    g_assert_null(webkit_web_extension_get_action_icon(extension.get(), 16, 16));

    extension = parse("{ \"manifest_version\": 3, \"action\": { }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_no_error(error.get());
    g_assert_null(webkit_web_extension_get_display_action_label(extension.get()));
    g_assert_null(webkit_web_extension_get_action_icon(extension.get(), 16, 16));

    GRefPtr<GBytes> imageData = Util::makePNGData(16, 16, 0x008000);

    extension = parseWithIcon("{ \"manifest_version\": 3, \"action\": { \"default_icon\": \"test.png\", \"default_title\": \"Button Title\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }", imageData);
    g_assert_no_error(error.get());
    g_assert_cmpstr(webkit_web_extension_get_display_action_label(extension.get()), ==, "Button Title");
    g_assert_nonnull(webkit_web_extension_get_action_icon(extension.get(), 16, 16));

    extension = parseWithIcon("{ \"manifest_version\": 3, \"action\": { \"default_icon\": { \"16\": \"test.png\" }, \"default_title\": \"Button Title\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }", imageData);
    g_assert_no_error(error.get());
    g_assert_cmpstr(webkit_web_extension_get_display_action_label(extension.get()), ==, "Button Title");
    g_assert_nonnull(webkit_web_extension_get_action_icon(extension.get(), 16, 16));

    extension = parseWithIcon("{ \"manifest_version\": 3, \"icons\": { \"16\": \"test.png\" }, \"action\": { \"default_title\": \"Button Title\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }", imageData);
    g_assert_no_error(error.get());
    g_assert_cmpstr(webkit_web_extension_get_display_action_label(extension.get()), ==, "Button Title");
    g_assert_nonnull(webkit_web_extension_get_action_icon(extension.get(), 16, 16));
}
#endif

static void testContentScriptsParsing(Test*, gconstpointer)
{
    GUniqueOutPtr<GError> error;
    auto parse = [&](const gchar* manifestString) {
        return adoptGRef(webkitWebExtensionCreate({ { "manifest.json"_s, createGBytes(manifestString) } }, &error.outPtr()));
    };

    GRefPtr<WebKitWebExtension> extension = parse("{ \"content_scripts\": [{ \"js\": [\"\test.js\", 1, \"\"], \"css\": [false, \"test.css\", \"\"], \"matches\": [\"*://*/\"] }], \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test\" }");
    g_assert_no_error(error.get());
    g_assert_true(webkit_web_extension_get_has_injected_content(extension.get()));

    extension = parse("{ \"content_scripts\": [{ \"js\": [\"\test.js\", 1, \"\"], \"css\": [false, \"test.css\", \"\"], \"matches\": [\"*://*/\"], \"exclude_matches\": [\"*://*.example.com/\"] }], \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test\" }");
    g_assert_no_error(error.get());
    g_assert_true(webkit_web_extension_get_has_injected_content(extension.get()));

    extension = parse("{ \"content_scripts\": [{ \"js\": [\"\test.js\", 1, \"\"], \"css\": [false, \"test.css\", \"\"], \"matches\": [\"*://*.example.com/\"] }], \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test\" }");
    g_assert_no_error(error.get());
    g_assert_true(webkit_web_extension_get_has_injected_content(extension.get()));

    extension = parse("{ \"content_scripts\": [{ \"js\": [\"\test.js\"], \"matches\": [\"*://*.example.com/\"], \"world\": \"MAIN\" }], \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test\" }");
    g_assert_no_error(error.get());
    g_assert_true(webkit_web_extension_get_has_injected_content(extension.get()));

    extension = parse("{ \"content_scripts\": [{ \"css\": [false, \"test.css\", \"\"], \"matches\": [\"*://*.example.com/\"], \"css_origin\": \"user\" }], \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test\" }");
    g_assert_no_error(error.get());
    g_assert_true(webkit_web_extension_get_has_injected_content(extension.get()));

    extension = parse("{ \"content_scripts\": [{ \"css\": [false, \"test.css\", \"\"], \"matches\": [\"*://*.example.com/\"], \"css_origin\": \"author\" }], \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test\" }");
    g_assert_no_error(error.get());
    g_assert_true(webkit_web_extension_get_has_injected_content(extension.get()));

    // Invalid cases

    extension = parse("{ \"content_scripts\": [], \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_false(webkit_web_extension_get_has_injected_content(extension.get()));

    extension = parse("{ \"content_scripts\": { \"invalid\": true }, \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_false(webkit_web_extension_get_has_injected_content(extension.get()));

    extension = parse("{ \"content_scripts\": [{ \"js\": [ \"test.js\" ], \"matches\": [] }], \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_false(webkit_web_extension_get_has_injected_content(extension.get()));

    // Non-critical invalid cases

    extension = parse("{ \"content_scripts\": [{ \"js\": [ \"test.js\" ], \"matches\": [\"*://*.example.com/\"], \"run_at\": \"invalid\" }], \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_true(webkit_web_extension_get_has_injected_content(extension.get()));

    extension = parse("{ \"content_scripts\": [{ \"js\": [ \"test.js\" ], \"matches\": [\"*://*.example.com/\"], \"world\": \"INVALID\" }], \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_true(webkit_web_extension_get_has_injected_content(extension.get()));

    extension = parse("{ \"content_scripts\": [{ \"css\": [false, \"test.css\", \"\"], \"matches\": [\"*://*.example.com/\"], \"css_origin\": \"bad\" }], \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_true(webkit_web_extension_get_has_injected_content(extension.get()));
}

static void testPermissionsParsing(Test*, gconstpointer)
{
    GUniqueOutPtr<GError> error;
    auto parse = [&](const gchar* manifestString) {
        return adoptGRef(webkitWebExtensionCreate({ { "manifest.json"_s, createGBytes(manifestString) } }, &error.outPtr()));
    };

    // Failure Testing

    // Neither of the "permissions" and "optional_permissions" keys are defined.

    GRefPtr<WebKitWebExtension> extension = parse("{ \"manifest_version\": 2, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    const gchar* const* requestedPermissions = webkit_web_extension_get_requested_permissions(extension.get());
    const gchar* const* optionalPermissions = webkit_web_extension_get_optional_permissions(extension.get());
    g_assert_null(requestedPermissions);
    g_assert_null(webkit_web_extension_get_requested_permission_match_patterns(extension.get()));
    g_assert_null(optionalPermissions);
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));

    // The "permissions" key alone is defined and empty

    extension = parse("{ \"manifest_version\": 2, \"permissions\": [], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    requestedPermissions = webkit_web_extension_get_requested_permissions(extension.get());
    optionalPermissions = webkit_web_extension_get_optional_permissions(extension.get());
    g_assert_null(requestedPermissions);
    g_assert_null(webkit_web_extension_get_requested_permission_match_patterns(extension.get()));
    g_assert_null(optionalPermissions);
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));

    // The "optional_permissions" key alone is defined and empty

    extension = parse("{ \"manifest_version\": 2, \"optional_permissions\": [], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    requestedPermissions = webkit_web_extension_get_requested_permissions(extension.get());
    optionalPermissions = webkit_web_extension_get_optional_permissions(extension.get());
    g_assert_null(requestedPermissions);
    g_assert_null(webkit_web_extension_get_requested_permission_match_patterns(extension.get()));
    g_assert_null(optionalPermissions);
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));

    // The "permissions" and "optional_permissions" keys are defined as invalid types

    extension = parse("{ \"manifest_version\": 2, \"permissions\": 2, \"optional_permissions\": \"foo\", \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    requestedPermissions = webkit_web_extension_get_requested_permissions(extension.get());
    optionalPermissions = webkit_web_extension_get_optional_permissions(extension.get());
    g_assert_null(requestedPermissions);
    g_assert_null(webkit_web_extension_get_requested_permission_match_patterns(extension.get()));
    g_assert_null(optionalPermissions);
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));

    // The "permissions" keys is defined with an invalid permission.

    extension = parse("{ \"manifest_version\": 2, \"permissions\": [ \"invalid\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    requestedPermissions = webkit_web_extension_get_requested_permissions(extension.get());
    optionalPermissions = webkit_web_extension_get_optional_permissions(extension.get());
    g_assert_null(requestedPermissions);
    g_assert_null(webkit_web_extension_get_requested_permission_match_patterns(extension.get()));
    g_assert_null(optionalPermissions);
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));

    // The "permissions" key is defined with a valid permission

    extension = parse("{ \"manifest_version\": 2, \"permissions\": [ \"tabs\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    requestedPermissions = webkit_web_extension_get_requested_permissions(extension.get());
    optionalPermissions = webkit_web_extension_get_optional_permissions(extension.get());
    g_assert_nonnull(requestedPermissions);
    g_assert_null(webkit_web_extension_get_requested_permission_match_patterns(extension.get()));
    g_assert_null(optionalPermissions);
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));
    g_assert_cmpstr(requestedPermissions[0], ==, "tabs");
    g_assert_null(requestedPermissions[1]);

    // The "permissions" key is defined with a valid & invalid permission

    extension = parse("{ \"manifest_version\": 2, \"permissions\": [ \"tabs\", \"invalid\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    requestedPermissions = webkit_web_extension_get_requested_permissions(extension.get());
    optionalPermissions = webkit_web_extension_get_optional_permissions(extension.get());
    g_assert_nonnull(requestedPermissions);
    g_assert_null(webkit_web_extension_get_requested_permission_match_patterns(extension.get()));
    g_assert_null(optionalPermissions);
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));
    g_assert_cmpstr(requestedPermissions[0], ==, "tabs");
    g_assert_null(requestedPermissions[1]);

    // The "permissions" key is defined with a valid permission & origin

    extension = parse("{ \"manifest_version\": 2, \"permissions\": [ \"tabs\", \"http://www.webkit.org/\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    requestedPermissions = webkit_web_extension_get_requested_permissions(extension.get());
    optionalPermissions = webkit_web_extension_get_optional_permissions(extension.get());
    g_assert_nonnull(requestedPermissions);
    guint patternLength = 0;
    auto matchPatterns = webkit_web_extension_get_requested_permission_match_patterns(extension.get());
    for (; *matchPatterns != nullptr; matchPatterns++)
        patternLength++;
    g_assert_cmpint(patternLength, ==, 1);
    g_assert_cmpstr(webkit_web_extension_match_pattern_get_string(webkit_web_extension_get_requested_permission_match_patterns(extension.get())[0]), ==, "http://www.webkit.org/");
    g_assert_null(optionalPermissions);
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));
    g_assert_cmpstr(requestedPermissions[0], ==, "tabs");
    g_assert_null(requestedPermissions[1]);

    // The "permissions" key is defined with a valid permission & invalid origin

    extension = parse("{ \"manifest_version\": 2, \"permissions\": [ \"tabs\", \"foo://www.webkit.org/\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    requestedPermissions = webkit_web_extension_get_requested_permissions(extension.get());
    optionalPermissions = webkit_web_extension_get_optional_permissions(extension.get());
    g_assert_nonnull(requestedPermissions);
    g_assert_null(webkit_web_extension_get_requested_permission_match_patterns(extension.get()));
    g_assert_null(optionalPermissions);
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));
    g_assert_cmpstr(requestedPermissions[0], ==, "tabs");
    g_assert_null(requestedPermissions[1]);

    // The "optional_permissions" keys is defined with an invalid permission.

    extension = parse("{ \"manifest_version\": 2, \"optional_permissions\": [ \"invalid\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    requestedPermissions = webkit_web_extension_get_requested_permissions(extension.get());
    optionalPermissions = webkit_web_extension_get_optional_permissions(extension.get());
    g_assert_null(optionalPermissions);
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));
    g_assert_null(requestedPermissions);
    g_assert_null(webkit_web_extension_get_requested_permission_match_patterns(extension.get()));

    // The "optional_permissions" key is defined with a valid permission

    extension = parse("{ \"manifest_version\": 2, \"optional_permissions\": [ \"tabs\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    requestedPermissions = webkit_web_extension_get_requested_permissions(extension.get());
    optionalPermissions = webkit_web_extension_get_optional_permissions(extension.get());
    g_assert_nonnull(optionalPermissions);
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));
    g_assert_null(requestedPermissions);
    g_assert_null(webkit_web_extension_get_requested_permission_match_patterns(extension.get()));
    g_assert_cmpstr(optionalPermissions[0], ==, "tabs");
    g_assert_null(optionalPermissions[1]);

    // The "optional_permissions" key is defined with a valid & invalid permission

    extension = parse("{ \"manifest_version\": 2, \"optional_permissions\": [ \"tabs\", \"invalid\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    requestedPermissions = webkit_web_extension_get_requested_permissions(extension.get());
    optionalPermissions = webkit_web_extension_get_optional_permissions(extension.get());
    g_assert_nonnull(optionalPermissions);
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));
    g_assert_null(requestedPermissions);
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));
    g_assert_cmpstr(optionalPermissions[0], ==, "tabs");
    g_assert_null(optionalPermissions[1]);

    // The "optional_permissions" key is defined with a valid permission & origin

    extension = parse("{ \"manifest_version\": 2, \"optional_permissions\": [ \"tabs\", \"http://www.webkit.org/\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    requestedPermissions = webkit_web_extension_get_requested_permissions(extension.get());
    optionalPermissions = webkit_web_extension_get_optional_permissions(extension.get());
    g_assert_null(requestedPermissions);
    g_assert_null(webkit_web_extension_get_requested_permission_match_patterns(extension.get()));
    g_assert_nonnull(optionalPermissions);
    patternLength = 0;
    matchPatterns = webkit_web_extension_get_optional_permission_match_patterns(extension.get());
    for (; *matchPatterns != nullptr; matchPatterns++)
        patternLength++;
    g_assert_cmpint(patternLength, ==, 1);
    g_assert_cmpstr(webkit_web_extension_match_pattern_get_string(webkit_web_extension_get_optional_permission_match_patterns(extension.get())[0]), ==, "http://www.webkit.org/");
    g_assert_cmpstr(optionalPermissions[0], ==, "tabs");
    g_assert_null(optionalPermissions[1]);

    // The "optional_permissions" key is defined with a valid permission & invalid origin

    extension = parse("{ \"manifest_version\": 2, \"optional_permissions\": [ \"tabs\", \"foo://www.webkit.org/\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    requestedPermissions = webkit_web_extension_get_requested_permissions(extension.get());
    optionalPermissions = webkit_web_extension_get_optional_permissions(extension.get());
    g_assert_null(requestedPermissions);
    g_assert_null(webkit_web_extension_get_requested_permission_match_patterns(extension.get()));
    g_assert_nonnull(optionalPermissions);
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));
    g_assert_cmpstr(optionalPermissions[0], ==, "tabs");
    g_assert_null(optionalPermissions[1]);

    // The "optional_permissions" key is defined with a valid & forbidden invalid permission

    extension = parse("{ \"manifest_version\": 2, \"optional_permissions\": [ \"tabs\", \"geolocation\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    requestedPermissions = webkit_web_extension_get_requested_permissions(extension.get());
    optionalPermissions = webkit_web_extension_get_optional_permissions(extension.get());
    g_assert_nonnull(optionalPermissions);
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));
    g_assert_null(requestedPermissions);
    g_assert_null(webkit_web_extension_get_requested_permission_match_patterns(extension.get()));
    g_assert_cmpstr(optionalPermissions[0], ==, "tabs");
    g_assert_null(optionalPermissions[1]);

    // The "optional_permissions" key is defined in "permissions"

    extension = parse("{ \"manifest_version\": 2, \"permissions\": [ \"tabs\", \"geolocation\" ], \"optional_permissions\": [ \"tabs\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    requestedPermissions = webkit_web_extension_get_requested_permissions(extension.get());
    optionalPermissions = webkit_web_extension_get_optional_permissions(extension.get());
    g_assert_nonnull(requestedPermissions);
    g_assert_null(webkit_web_extension_get_requested_permission_match_patterns(extension.get()));
    g_assert_null(optionalPermissions);
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));
    g_assert_cmpstr(requestedPermissions[0], ==, "tabs");
    g_assert_null(requestedPermissions[1]);

    // The "optional_permissions" key contains an origin defined in "permissions"

    extension = parse("{ \"manifest_version\": 2, \"permissions\": [ \"http://www.webkit.org/\" ], \"optional_permissions\": [ \"http://www.webkit.org/\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    patternLength = 0;
    matchPatterns = webkit_web_extension_get_requested_permission_match_patterns(extension.get());
    for (; *matchPatterns != nullptr; matchPatterns++)
        patternLength++;
    g_assert_cmpint(patternLength, ==, 1);
    g_assert_cmpstr(webkit_web_extension_match_pattern_get_string(webkit_web_extension_get_requested_permission_match_patterns(extension.get())[0]), ==, "http://www.webkit.org/");
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));

    // Make sure manifest v2 extensions ignore hosts from host_permissions (this should only be checked for manifest v3).

    extension = parse("{ \"manifest_version\": 2, \"permissions\": [ \"http://www.webkit.org/\" ], \"optional_permissions\": [ \"http://www.example.com/\" ], \"host_permissions\": [ \"https://webkit.org/\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    patternLength = 0;
    matchPatterns = webkit_web_extension_get_requested_permission_match_patterns(extension.get());
    for (; *matchPatterns != nullptr; matchPatterns++)
        patternLength++;
    g_assert_cmpint(patternLength, ==, 1);
    g_assert_cmpstr(webkit_web_extension_match_pattern_get_string(webkit_web_extension_get_requested_permission_match_patterns(extension.get())[0]), ==, "http://www.webkit.org/");
    patternLength = 0;
    matchPatterns = webkit_web_extension_get_optional_permission_match_patterns(extension.get());
    for (; *matchPatterns != nullptr; matchPatterns++)
        patternLength++;
    g_assert_cmpint(patternLength, ==, 1);
    g_assert_cmpstr(webkit_web_extension_match_pattern_get_string(webkit_web_extension_get_optional_permission_match_patterns(extension.get())[0]), ==, "http://www.example.com/");

    // Make sure manifest v3 parses hosts from host_permissions, and ignores hosts in permissions and optional_permissions.

    extension = parse("{ \"manifest_version\": 3, \"permissions\": [ \"http://www.webkit.org/\" ], \"optional_permissions\": [ \"http://www.example.com/\" ], \"host_permissions\": [ \"https://webkit.org/\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    patternLength = 0;
    matchPatterns = webkit_web_extension_get_requested_permission_match_patterns(extension.get());
    for (; *matchPatterns != nullptr; matchPatterns++)
        patternLength++;
    g_assert_cmpint(patternLength, ==, 1);
    g_assert_cmpstr(webkit_web_extension_match_pattern_get_string(webkit_web_extension_get_requested_permission_match_patterns(extension.get())[0]), ==, "https://webkit.org/");
    g_assert_null(webkit_web_extension_get_optional_permission_match_patterns(extension.get()));

    // Make sure manifest v3 parses optional_host_permissions.

    extension = parse("{ \"manifest_version\": 3, \"optional_host_permissions\": [ \"http://www.example.com/\" ], \"host_permissions\": [ \"https://webkit.org/\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    patternLength = 0;
    matchPatterns = webkit_web_extension_get_requested_permission_match_patterns(extension.get());
    for (; *matchPatterns != nullptr; matchPatterns++)
        patternLength++;
    g_assert_cmpint(patternLength, ==, 1);
    g_assert_cmpstr(webkit_web_extension_match_pattern_get_string(webkit_web_extension_get_requested_permission_match_patterns(extension.get())[0]), ==, "https://webkit.org/");
    patternLength = 0;
    matchPatterns = webkit_web_extension_get_optional_permission_match_patterns(extension.get());
    for (; *matchPatterns != nullptr; matchPatterns++)
        patternLength++;
    g_assert_cmpint(patternLength, ==, 1);
    g_assert_cmpstr(webkit_web_extension_match_pattern_get_string(webkit_web_extension_get_optional_permission_match_patterns(extension.get())[0]), ==, "http://www.example.com/");
}

static void testBackgroundParsing(Test*, gconstpointer)
{
    GUniqueOutPtr<GError> error;
    auto parse = [&](const gchar* manifestString) {
        return adoptGRef(webkitWebExtensionCreate({ { "manifest.json"_s, createGBytes(manifestString) } }, &error.outPtr()));
    };

    GRefPtr<WebKitWebExtension> extension = parse("{ \"manifest_version\": 2, \"background\": { \"scripts\": [ \"test.js\" ] }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_true(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_modular_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{\"manifest_version\":2,\"background\":{\"page\":\"test.html\",\"persistent\":false},\"name\":\"Test\",\"version\":\"1.0\",\"description\":\"Test\"}");
    g_assert_no_error(error.get());
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_modular_background_content(extension.get()));

    extension = parse("{ \"manifest_version\": 2, \"background\": { \"scripts\": [ \"test-1.js\", \"\", \"test-2.js\" ], \"persistent\": true }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_true(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_modular_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 2, \"background\": { \"service_worker\": \"test.js\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_true(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_modular_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 2, \"background\": { \"scripts\": [ \"test-1.js\", \"test-2.js\" ], \"service_worker\": \"test.js\", \"persistent\": false }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_modular_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 2, \"background\": { \"page\": \"test.html\", \"service_worker\": \"test.js\", \"persistent\": false }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_modular_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 2, \"background\": { \"scripts\": [ \"test-1.js\", \"test-2.js\" ], \"page\": \"test.html\", \"service_worker\": \"test.js\", \"persistent\": false }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_modular_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 2, \"background\": { \"service_worker\": \"test.js\", \"persistent\": false }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_true(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_modular_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 2, \"background\": { \"service_worker\": \"test.js\", \"type\": \"module\", \"persistent\": false }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_true(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_true(webkit_web_extension_get_has_modular_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 2, \"background\": { \"scripts\": [ \"test-1.js\", \"test-2.js\" ], \"type\": \"module\", \"persistent\": false }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_true(webkit_web_extension_get_has_modular_background_content(extension.get()));
    g_assert_no_error(error.get());

    // Invalid cases

    extension = parse("{ \"manifest_version\": 3, \"background\": { \"page\": \"test.html\", \"persistent\": true }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_BACKGROUND_PERSISTENCE);

    extension = parse("{ \"manifest_version\": 2, \"background\": { \"service_worker\": \"test.js\", \"persistent\": true }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_modular_background_content(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_BACKGROUND_PERSISTENCE);

    extension = parse("{ \"manifest_version\": 2, \"background\": { }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_false(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    extension = parse("{ \"manifest_version\": 2, \"background\": [ \"invalid\" ], \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_false(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    extension = parse("{ \"manifest_version\": 2, \"background\": { \"scripts\": [], \"persistent\": false }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_false(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    extension = parse("{ \"manifest_version\": 2, \"background\": { \"page\": \"\", \"persistent\": false }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_false(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    extension = parse("{ \"manifest_version\": 2, \"background\": { \"page\": [ \"test.html\" ], \"persistent\": false }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_false(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    extension = parse("{ \"manifest_version\": 2, \"background\": { \"scripts\": [ [ \"test.js\" ] ], \"persistent\": false }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_false(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    extension = parse("{ \"manifest_version\": 2, \"background\": { \"service_worker\": \"\", \"persistent\": false }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_false(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    extension = parse("{ \"manifest_version\": 2, \"background\": { \"service_worker\": [ \"test.js\" ], \"persistent\": false }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_false(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_persistent_background_content(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
}

static void testBackgroundPreferredEnvironmentParsing(Test*, gconstpointer)
{
    GUniqueOutPtr<GError> error;
    auto parse = [&](const gchar* manifestString) {
        return adoptGRef(webkitWebExtensionCreate({ { "manifest.json"_s, createGBytes(manifestString) } }, &error.outPtr()));
    };

    GRefPtr<WebKitWebExtension> extension = parse("{ \"manifest_version\": 3, \"background\": { \"preferred_environment\": [ \"service_worker\", \"document\" ], \"service_worker\": \"background.js\", \"scripts\": [ \"background.js\" ], \"page\": \"background.html\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_true(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 3, \"background\": { \"preferred_environment\": [ \"document\", \"service_worker\" ], \"service_worker\": \"background.js\", \"scripts\": [ \"background.js\" ], \"page\": \"background.html\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 3, \"background\": { \"preferred_environment\": \"service_worker\", \"service_worker\": \"background.js\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_true(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 3, \"background\": { \"preferred_environment\": [ \"document\" ], \"page\": \"background.html\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 3, \"background\": { \"preferred_environment\": \"document\", \"scripts\": [ \"background.js\" ] }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 3, \"background\": { \"preferred_environment\": [ \"document\", \"service_worker\" ], \"scripts\": [ \"background.js\" ] }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 3, \"background\": { \"preferred_environment\": [ \"document\", 42, \"unknown\" ], \"scripts\": [ \"background.js\" ] }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 3, \"background\": { \"preferred_environment\": [ \"unknown\", 42 ], \"page\": \"background.html\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 3, \"background\": { \"preferred_environment\": \"unknown\", \"service_worker\": \"background.js\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_true(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 3, \"background\": { \"preferred_environment\": [ \"unknown\", \"document\" ], \"service_worker\": \"background.js\", \"page\": \"background.html\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_no_error(error.get());

    // Invalid cases

    extension = parse("{ \"manifest_version\": 3, \"background\": { \"preferred_environment\": [], \"service_worker\": \"background.js\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_true(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    extension = parse("{ \"manifest_version\": 3, \"background\": { \"preferred_environment\": 42, \"service_worker\": \"background.js\", \"page\": \"background.html\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_true(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_false(webkit_web_extension_get_has_service_worker_background_content(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    extension = parse("{ \"manifest_version\": 3, \"background\": { \"preferred_environment\": [ \"service_worker\", \"document\" ] }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_false(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    extension = parse("{ \"manifest_version\": 3, \"background\": { \"preferred_environment\": \"document\", \"service_worker\": \"background.js\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_false(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    extension = parse("{ \"manifest_version\": 3, \"background\": { \"preferred_environment\": \"service_worker\", \"page\": \"background.html\" }, \"name\": \"Test\", \"version\": \"1.0\", \"description\": \"Test description\" }");
    g_assert_false(webkit_web_extension_get_has_background_content(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
}

static void testOptionsPageParsing(Test*, gconstpointer)
{
    GUniqueOutPtr<GError> error;
    auto parse = [&](const gchar* manifestString) {
        return adoptGRef(webkitWebExtensionCreate({ { "manifest.json"_s, createGBytes(manifestString) } }, &error.outPtr()));
    };

    GRefPtr<WebKitWebExtension> extension = parse("{ \"manifest_version\": 3, \"options_page\": \"options.html\", \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_no_error(error.get());
    g_assert_true(webkit_web_extension_get_has_options_page(extension.get()));

    extension = parse("{ \"manifest_version\": 3, \"options_page\": \"\", \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_false(webkit_web_extension_get_has_options_page(extension.get()));

    extension = parse("{ \"manifest_version\": 3, \"options_page\": 123, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_false(webkit_web_extension_get_has_options_page(extension.get()));

    extension = parse("{ \"manifest_version\": 3, \"options_ui\": { \"page\": \"options.html\" }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_no_error(error.get());
    g_assert_true(webkit_web_extension_get_has_options_page(extension.get()));

    extension = parse("{ \"manifest_version\": 3, \"options_ui\": { \"bad\": \"options.html\" }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_false(webkit_web_extension_get_has_options_page(extension.get()));

    extension = parse("{ \"manifest_version\": 3, \"options_ui\": { \"page\": 123 }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_false(webkit_web_extension_get_has_options_page(extension.get()));

    extension = parse("{ \"manifest_version\": 3, \"options_ui\": { }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_false(webkit_web_extension_get_has_options_page(extension.get()));

    extension = parse("{ \"manifest_version\": 3, \"options_ui\": { \"page\": \"\" }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_false(webkit_web_extension_get_has_options_page(extension.get()));
}

static void testURLOverridesParsing(Test*, gconstpointer)
{
    GUniqueOutPtr<GError> error;
    auto parse = [&](const gchar* manifestString) {
        return adoptGRef(webkitWebExtensionCreate({ { "manifest.json"_s, createGBytes(manifestString) } }, &error.outPtr()));
    };

    GRefPtr<WebKitWebExtension> extension = parse("{ \"manifest_version\": 3, \"browser_url_overrides\": { \"newtab\": \"newtab.html\" }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_no_error(error.get());
    g_assert_true(webkit_web_extension_get_has_override_new_tab_page(extension.get()));

    extension = parse("{ \"manifest_version\": 3, \"browser_url_overrides\": { \"bad\": \"newtab.html\" }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_no_error(error.get());
    g_assert_false(webkit_web_extension_get_has_override_new_tab_page(extension.get()));

    extension = parse("{ \"manifest_version\": 3, \"browser_url_overrides\": { \"newtab\": 123 }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_false(webkit_web_extension_get_has_override_new_tab_page(extension.get()));

    extension = parse("{ \"manifest_version\": 3, \"browser_url_overrides\": { }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_false(webkit_web_extension_get_has_override_new_tab_page(extension.get()));

    extension = parse("{ \"manifest_version\": 3, \"browser_url_overrides\": { \"newtab\": \"\" }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_false(webkit_web_extension_get_has_override_new_tab_page(extension.get()));

    extension = parse("{ \"manifest_version\": 3, \"chrome_url_overrides\": { \"newtab\": \"newtab.html\" }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_no_error(error.get());
    g_assert_true(webkit_web_extension_get_has_override_new_tab_page(extension.get()));

    extension = parse("{ \"manifest_version\": 3, \"chrome_url_overrides\": { \"bad\": \"newtab.html\" }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_no_error(error.get());
    g_assert_false(webkit_web_extension_get_has_override_new_tab_page(extension.get()));

    extension = parse("{ \"manifest_version\": 3, \"chrome_url_overrides\": { \"newtab\": 123 }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_false(webkit_web_extension_get_has_override_new_tab_page(extension.get()));

    extension = parse("{ \"manifest_version\": 3, \"chrome_url_overrides\": { }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_false(webkit_web_extension_get_has_override_new_tab_page(extension.get()));

    extension = parse("{ \"manifest_version\": 3, \"chrome_url_overrides\": { \"newtab\": \"\" }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
    g_assert_false(webkit_web_extension_get_has_override_new_tab_page(extension.get()));
}

static void testContentSecurityPolicyParsing(Test*, gconstpointer)
{
    GUniqueOutPtr<GError> error;
    auto parse = [&](const gchar* manifestString) {
        return adoptGRef(webkitWebExtensionCreate({ { "manifest.json"_s, createGBytes(manifestString) } }, &error.outPtr()));
    };

    // Manifest V3
    parse("{ \"manifest_version\": 3, \"content_security_policy\": { \"extension_pages\": \"script-src 'self'; object-src 'self'\" }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_no_error(error.get());

    parse("{ \"manifest_version\": 3, \"content_security_policy\": { \"sandbox\": \"sandbox allow-scripts allow-forms allow-popups allow-modals; script-src 'self'\" }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_no_error(error.get());

    parse("{ \"manifest_version\": 3, \"content_security_policy\": { }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    parse("{ \"manifest_version\": 2, \"content_security_policy\": { \"extension_pages\": 123 }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    // Manifest V2
    parse("{ \"manifest_version\": 2, \"content_security_policy\": \"script-src 'self'; object-src 'self'\", \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_no_error(error.get());

    parse("{ \"manifest_version\": 2, \"content_security_policy\": [ \"invalid\", \"type\" ], \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    parse("{ \"manifest_version\": 2, \"content_security_policy\": 123, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    parse("{ \"manifest_version\": 2, \"content_security_policy\": { \"extension_pages\": \"script-src 'self'; object-src 'self'\" }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
}

static void testWebAccessibleResourcesV2(Test*, gconstpointer)
{
    GUniqueOutPtr<GError> error;
    auto parse = [&](const gchar* manifestString) {
        return adoptGRef(webkitWebExtensionCreate({ { "manifest.json"_s, createGBytes(manifestString) } }, &error.outPtr()));
    };

    parse("{ \"manifest_version\": 2, \"web_accessible_resources\": [ \"images/*.png\", \"styles/*.css\" ], \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_no_error(error.get());

    parse("{ \"manifest_version\": 2, \"web_accessible_resources\": [ ], \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_no_error(error.get());

    parse("{ \"manifest_version\": 2, \"web_accessible_resources\": \"bad\", \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    parse("{ \"manifest_version\": 2, \"web_accessible_resources\": { }, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
}

static void testWebAccessibleResourcesV3(Test*, gconstpointer)
{
    GUniqueOutPtr<GError> error;
    auto parse = [&](const gchar* manifestString) {
        return adoptGRef(webkitWebExtensionCreate({ { "manifest.json"_s, createGBytes(manifestString) } }, &error.outPtr()));
    };

    parse("{ \"web_accessible_resources\": [ { \"resources\": [ \"images/*.png\", \"styles/*.css\" ], \"matches\": [ \"<all_urls>\" ] }, { \"resources\": [ \"scripts/*.js\" ], \"matches\": [ \"*://localhost/*\" ] } ], \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_no_error(error.get());

    parse("{ \"web_accessible_resources\": [ { \"resources\": [], \"matches\": [] } ], \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_no_error(error.get());

    parse("{ \"web_accessible_resources\": [ { \"resources\": \"bad\", \"matches\": [ \"<all_urls>\" ] } ], \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    parse("{ \"web_accessible_resources\": [ { \"resources\": [ \"images/*.png\" ], \"matches\": \"bad\" } ], \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    parse("{ \"web_accessible_resources\": [ { \"matches\": [ \"<all_urls>\" ] } ], \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    parse("{ \"web_accessible_resources\": [ { \"resources\": [] } ], \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
}

static void testCommandsParsing(Test*, gconstpointer)
{
    GUniqueOutPtr<GError> error;
    auto parse = [&](const gchar* manifestString) {
        return adoptGRef(webkitWebExtensionCreate({ { "manifest.json"_s, createGBytes(manifestString) } }, &error.outPtr()));
    };

    GRefPtr<WebKitWebExtension> extension = parse("{ \"commands\": { \"show-popup\": { \"suggested_key\": { \"default\": \"Ctrl+Shift+P\", \"linux\": \"Ctrl+Shift+A\" }, \"description\": \"Show the popup\" } }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_true(webkit_web_extension_get_has_commands(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"commands\": { }, \"action\": { \"default_title\": \"Test Action\" }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_true(webkit_web_extension_get_has_commands(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"commands\": { }, \"browser_action\": { \"default_title\": \"Test Action\" }, \"manifest_version\": 2, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_true(webkit_web_extension_get_has_commands(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"commands\": { }, \"page_action\": { \"default_title\": \"Test Action\" }, \"manifest_version\": 2, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_true(webkit_web_extension_get_has_commands(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_false(webkit_web_extension_get_has_commands(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"action\": { \"default_title\": \"Test Action\" }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_true(webkit_web_extension_get_has_commands(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"browser_action\": { \"default_title\": \"Test Action\" }, \"manifest_version\": 2, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_true(webkit_web_extension_get_has_commands(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"page_action\": { \"default_title\": \"Test Action\" }, \"manifest_version\": 2, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_true(webkit_web_extension_get_has_commands(extension.get()));
    g_assert_no_error(error.get());

    extension = parse("{ \"commands\": { \"show-popup\": \"Invalid\" }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_false(webkit_web_extension_get_has_commands(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);
}

static void testDeclarativeNetRequestParsing(Test*, gconstpointer)
{
    GUniqueOutPtr<GError> error;
    auto parse = [&](const gchar* manifestString) {
        return adoptGRef(webkitWebExtensionCreate({ { "manifest.json"_s, createGBytes(manifestString) } }, &error.outPtr()));
    };

    GRefPtr<WebKitWebExtension> extension = parse("{ \"declarative_net_request\": { \"rule_resources\": [{ \"id\": \"test\", \"enabled\": true, \"path\": \"rules.json\" }] }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\", \"permissions\": [ \"declarativeNetRequest\"] }");
    g_assert_true(webkit_web_extension_get_has_content_modification_rules(extension.get()));
    g_assert_no_error(error.get());

    // Missing id
    extension = parse("{ \"declarative_net_request\": { \"rule_resources\": [{ \"enabled\": true, \"path\": \"rules.json\" }] }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\", \"permissions\": [ \"declarativeNetRequest\"] }");
    g_assert_false(webkit_web_extension_get_has_content_modification_rules(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_DECLARATIVE_NET_REQUEST_ENTRY);

    // Missing enabled
    extension = parse("{ \"declarative_net_request\": { \"rule_resources\": [{ \"id\": \"test\", \"path\": \"rules.json\" }] }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\", \"permissions\": [ \"declarativeNetRequest\"] }");
    g_assert_false(webkit_web_extension_get_has_content_modification_rules(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_DECLARATIVE_NET_REQUEST_ENTRY);

    // Missing path
    extension = parse("{ \"declarative_net_request\": { \"rule_resources\": [{ \"id\": \"test\", \"enabled\": true }] }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\", \"permissions\": [ \"declarativeNetRequest\"] }");
    g_assert_false(webkit_web_extension_get_has_content_modification_rules(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_DECLARATIVE_NET_REQUEST_ENTRY);

    // Duplicate names
    extension = parse("{ \"declarative_net_request\": { \"rule_resources\": [{ \"id\": \"test\", \"enabled\": true, \"path\": \"rules.json\" }, { \"id\": \"test\", \"enabled\": true, \"path\": \"rules2.json\" }] }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\", \"permissions\": [ \"declarativeNetRequest\"] }");
    // The first rule should be loaded
    g_assert_true(webkit_web_extension_get_has_content_modification_rules(extension.get()));
    // But an error should still be emitted
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_DECLARATIVE_NET_REQUEST_ENTRY);

    // One valid rule, one invalid rule
    extension = parse("{ \"declarative_net_request\": { \"rule_resources\": [{ \"id\": \"test\", \"enabled\": true, \"path\": \"rules.json\" }, { \"enabled\": true, \"path\": \"rules2.json\" }] }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\", \"permissions\": [ \"declarativeNetRequest\"] }");
    // The first rule should be loaded
    g_assert_true(webkit_web_extension_get_has_content_modification_rules(extension.get()));
    // But an error should still be emitted
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_DECLARATIVE_NET_REQUEST_ENTRY);

    // No rules
    extension = parse("{ \"declarative_net_request\": { \"rule_resources\": [] }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\", \"permissions\": [ \"declarativeNetRequest\"] }");
    g_assert_false(webkit_web_extension_get_has_content_modification_rules(extension.get()));
    g_assert_no_error(error.get());
}

static void testExternallyConnectableParsing(Test*, gconstpointer)
{
    GUniqueOutPtr<GError> error;
    auto parse = [&](const gchar* manifestString) {
        return adoptGRef(webkitWebExtensionCreate({ { "manifest.json"_s, createGBytes(manifestString) } }, &error.outPtr()));
    };

    GRefPtr<WebKitWebExtension> extension = parse("{ \"externally_connectable\": {}, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_null(webkit_web_extension_get_all_requested_match_patterns(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    // Expect an error since 'externally_connectable' is specified, but there are no valid match patterns or extension ids.
    extension = parse("{ \"externally_connectable\": { \"matches\": [] }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_null(webkit_web_extension_get_all_requested_match_patterns(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    extension = parse("{ \"externally_connectable\": { \"matches\": [ \"\" ] }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_null(webkit_web_extension_get_all_requested_match_patterns(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    extension = parse("{ \"externally_connectable\": { \"matches\": [], \"ids\": [ \"\" ] }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_null(webkit_web_extension_get_all_requested_match_patterns(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    // Expect an error if <all_urls> is specified.
    extension = parse("{ \"externally_connectable\": { \"matches\": [ \"<all_urls>\" ] }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_null(webkit_web_extension_get_all_requested_match_patterns(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    // Still expect the errork, but have a valid match pattern
    extension = parse("{ \"externally_connectable\": { \"matches\": [ \"*://*.example.com/\", \"<all_urls>\" ] }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    guint patternLength = 0;
    auto matchPatterns = webkit_web_extension_get_all_requested_match_patterns(extension.get());
    for (; *matchPatterns != nullptr; matchPatterns++)
        patternLength++;
    g_assert_cmpint(patternLength, ==, 1);
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    // Expect an error for not having a second level domain.
    extension = parse("{ \"externally_connectable\": { \"matches\": [ \"*://*.com/\" ] }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_null(webkit_web_extension_get_all_requested_match_patterns(extension.get()));
    g_assert_error(error.get(), WEBKIT_WEB_EXTENSION_ERROR, WEBKIT_WEB_EXTENSION_ERROR_INVALID_MANIFEST_ENTRY);

    // Match for *://*.example.com/*
    auto* matchingPattern = webkit_web_extension_match_pattern_new_with_string("*://*.example.com/", nullptr);
    extension = parse("{ \"externally_connectable\": { \"matches\": [ \"*://*.example.com/\" ] }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    patternLength = 0;
    matchPatterns = webkit_web_extension_get_all_requested_match_patterns(extension.get());
    for (; *matchPatterns != nullptr; matchPatterns++)
        patternLength++;
    g_assert_cmpint(patternLength, ==, 1);
    g_assert_no_error(error.get());
    g_assert_true(webkit_web_extension_match_pattern_matches_pattern(webkit_web_extension_get_all_requested_match_patterns(extension.get())[0], matchingPattern, WEBKIT_WEB_EXTENSION_MATCH_PATTERN_OPTIONS_NONE));

    extension = parse("{ \"externally_connectable\": { \"matches\": [ \"*://*.example.com/\" ], \"ids\": [ \"*\"] }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    patternLength = 0;
    matchPatterns = webkit_web_extension_get_all_requested_match_patterns(extension.get());
    for (; *matchPatterns != nullptr; matchPatterns++)
        patternLength++;
    g_assert_cmpint(patternLength, ==, 1);
    g_assert_no_error(error.get());

    extension = parse("{ \"externally_connectable\": { \"ids\": [ \"*\"] }, \"manifest_version\": 3, \"name\": \"Test\", \"description\": \"Test\", \"version\": \"1.0\" }");
    g_assert_null(webkit_web_extension_get_all_requested_match_patterns(extension.get()));
    g_assert_no_error(error.get());

    // FIXME: <https://webkit.org/b/269299> Add more tests for externally_connectable "ids" keys.
}

void beforeAll()
{
    Test::add("WebKitWebExtension", "creation-from-directory", testExtensionCreationFromDirectory);
    Test::add("WebKitWebExtension", "display-string-parsing", testDisplayStringParsing);
    Test::add("WebKitWebExtension", "default-locale-parsing", testDefaultLocaleParsing);
    Test::add("WebKitWebExtension", "display-string-parsing-with-localization", testDisplayStringParsingWithLocalization);
#if PLATFORM(GTK)
    Test::add("WebKitWebExtension", "action-parsing", testActionParsing);
#endif
    Test::add("WebKitWebExtension", "content-scripts-parsing", testContentScriptsParsing);
    Test::add("WebKitWebExtension", "permissions-parsing", testPermissionsParsing);
    Test::add("WebKitWebExtension", "background-parsing", testBackgroundParsing);
    Test::add("WebKitWebExtension", "background-preferred-environment-parsing", testBackgroundPreferredEnvironmentParsing);
    Test::add("WebKitWebExtension", "options-page-parsing", testOptionsPageParsing);
    Test::add("WebKitWebExtension", "url-overrides-parsing", testURLOverridesParsing);
    Test::add("WebKitWebExtension", "content-security-policy-parsing", testContentSecurityPolicyParsing);
    Test::add("WebKitWebExtension", "web-accessible-resources-v2", testWebAccessibleResourcesV2);
    Test::add("WebKitWebExtension", "web-accessible-resources-v3", testWebAccessibleResourcesV3);
    Test::add("WebKitWebExtension", "commands", testCommandsParsing);
    Test::add("WebKitWebExtension", "declarative-net-request", testDeclarativeNetRequestParsing);
    Test::add("WebKitWebExtension", "externally-connectable", testExternallyConnectableParsing);
}

void afterAll()
{
}

#endif // ENABLE(WK_WEB_EXTENSIONS)
