#pragma once

#include <LibJS/Runtime/NativeFunction.h>
#include <LibJS/Runtime/Object.h>
#include <LibWeb/Bindings/InterfaceObject.h>

namespace Web::Bindings {

struct InternalsConstructor {
public:
    static void initialize(JS::Realm&, JS::NativeFunction&);
    static JS::ThrowCompletionOr<GC::Ref<JS::Object>> construct(InterfaceConstructor&, JS::FunctionObject&);

private:
};

struct InternalsPrototype {
public:
    static void initialize(JS::Realm&, JS::Object&);
    static void define_unforgeable_attributes(JS::Realm&, JS::Object&);

private:
    JS_DECLARE_NATIVE_FUNCTION(headless_getter);
    JS_DECLARE_NATIVE_FUNCTION(screen_wake_lock_active_getter);
    JS_DECLARE_NATIVE_FUNCTION(needs_repaint_getter);
    JS_DECLARE_NATIVE_FUNCTION(signal_test_is_done);
    JS_DECLARE_NATIVE_FUNCTION(set_test_timeout);
    JS_DECLARE_NATIVE_FUNCTION(force_incompatible_visual_context_tree_rebuild);
    JS_DECLARE_NATIVE_FUNCTION(load_reference_test_metadata);
    JS_DECLARE_NATIVE_FUNCTION(set_time_zone);
    JS_DECLARE_NATIVE_FUNCTION(gc);
    JS_DECLARE_NATIVE_FUNCTION(gc_async);
    JS_DECLARE_NATIVE_FUNCTION(mark_as_garbage);
    JS_DECLARE_NATIVE_FUNCTION(hit_test);
    JS_DECLARE_NATIVE_FUNCTION(send_text);
    JS_DECLARE_NATIVE_FUNCTION(send_key);
    JS_DECLARE_NATIVE_FUNCTION(paste);
    JS_DECLARE_NATIVE_FUNCTION(commit_text);
    JS_DECLARE_NATIVE_FUNCTION(mouse_down);
    JS_DECLARE_NATIVE_FUNCTION(mouse_up);
    JS_DECLARE_NATIVE_FUNCTION(mouse_move);
    JS_DECLARE_NATIVE_FUNCTION(mouse_leave);
    JS_DECLARE_NATIVE_FUNCTION(click);
    JS_DECLARE_NATIVE_FUNCTION(click_and_hold);
    JS_DECLARE_NATIVE_FUNCTION(wheel);
    JS_DECLARE_NATIVE_FUNCTION(pinch);
    JS_DECLARE_NATIVE_FUNCTION(current_cursor);
    JS_DECLARE_NATIVE_FUNCTION(selected_text_for_clipboard);
    JS_DECLARE_NATIVE_FUNCTION(set_marked_text_from_input_method);
    JS_DECLARE_NATIVE_FUNCTION(commit_text_from_input_method);
    JS_DECLARE_NATIVE_FUNCTION(unmark_text_from_input_method);
    JS_DECLARE_NATIVE_FUNCTION(current_caret_rect);
    JS_DECLARE_NATIVE_FUNCTION(dispatch_user_activated_event);
    JS_DECLARE_NATIVE_FUNCTION(spoof_current_url);
    JS_DECLARE_NATIVE_FUNCTION(load_url);
    JS_DECLARE_NATIVE_FUNCTION(create_internal_animation_timeline);
    JS_DECLARE_NATIVE_FUNCTION(simulate_drag_start);
    JS_DECLARE_NATIVE_FUNCTION(simulate_drag_move);
    JS_DECLARE_NATIVE_FUNCTION(simulate_drop);
    JS_DECLARE_NATIVE_FUNCTION(expire_cookies_with_time_offset);
    JS_DECLARE_NATIVE_FUNCTION(delete_all_cookies);
    JS_DECLARE_NATIVE_FUNCTION(set_http_memory_cache_enabled);
    JS_DECLARE_NATIVE_FUNCTION(set_content_blockers);
    JS_DECLARE_NATIVE_FUNCTION(set_content_blocking_enabled);
    JS_DECLARE_NATIVE_FUNCTION(set_autoplay_policy);
    JS_DECLARE_NATIVE_FUNCTION(get_computed_role);
    JS_DECLARE_NATIVE_FUNCTION(get_computed_label);
    JS_DECLARE_NATIVE_FUNCTION(get_computed_aria_level);
    JS_DECLARE_NATIVE_FUNCTION(get_echo_server_port);
    JS_DECLARE_NATIVE_FUNCTION(set_hsts_policy);
    JS_DECLARE_NATIVE_FUNCTION(ingest_hsts_header);
    JS_DECLARE_NATIVE_FUNCTION(is_known_hsts_host);
    JS_DECLARE_NATIVE_FUNCTION(set_browser_zoom);
    JS_DECLARE_NATIVE_FUNCTION(set_device_pixel_ratio);
    JS_DECLARE_NATIVE_FUNCTION(dump_display_list);
    JS_DECLARE_NATIVE_FUNCTION(dump_accessibility_tree);
    JS_DECLARE_NATIVE_FUNCTION(dump_layout_tree);
    JS_DECLARE_NATIVE_FUNCTION(dump_paintable_tree);
    JS_DECLARE_NATIVE_FUNCTION(dump_stacking_context_tree);
    JS_DECLARE_NATIVE_FUNCTION(dump_gc_graph);
    JS_DECLARE_NATIVE_FUNCTION(dump_session_history);
    JS_DECLARE_NATIVE_FUNCTION(dump_ui_process_session_history);
    JS_DECLARE_NATIVE_FUNCTION(dump_site_isolation_process_tree);
    JS_DECLARE_NATIVE_FUNCTION(flush_session_history_traversal_queue);
    JS_DECLARE_NATIVE_FUNCTION(clobber_next_navigation_with_a_traversal);
    JS_DECLARE_NATIVE_FUNCTION(get_shadow_root);
    JS_DECLARE_NATIVE_FUNCTION(handle_sdl_input_events);
    JS_DECLARE_NATIVE_FUNCTION(set_environments_top_level_url);
    JS_DECLARE_NATIVE_FUNCTION(connect_virtual_gamepad);
    JS_DECLARE_NATIVE_FUNCTION(set_highlighted_node);
    JS_DECLARE_NATIVE_FUNCTION(clear_element);
    JS_DECLARE_NATIVE_FUNCTION(get_style_invalidation_counters);
    JS_DECLARE_NATIVE_FUNCTION(reset_style_invalidation_counters);
    JS_DECLARE_NATIVE_FUNCTION(update_style);
    JS_DECLARE_NATIVE_FUNCTION(set_preferred_color_scheme);
    JS_DECLARE_NATIVE_FUNCTION(set_page_focus);
    JS_DECLARE_NATIVE_FUNCTION(canvas_color_scheme);
    JS_DECLARE_NATIVE_FUNCTION(style_sheet_may_have_has_selectors);
    JS_DECLARE_NATIVE_FUNCTION(image_animation_state_for_url);
    JS_DECLARE_NATIVE_FUNCTION(async_scrolling_state);
    JS_DECLARE_NATIVE_FUNCTION(async_scrolling_state_blocks_wheel_event_at);
    JS_DECLARE_NATIVE_FUNCTION(async_scrolling_state_can_wheel_scroll_at);
    JS_DECLARE_NATIVE_FUNCTION(async_scrolling_state_wheel_routing_admission);
    JS_DECLARE_NATIVE_FUNCTION(async_scrolling_state_wheel_scroll_admission_at);
    JS_DECLARE_NATIVE_FUNCTION(async_scrolling_state_wheel_target_at);
};

} // namespace Web::Bindings
