/* * Copyright (c) 2022, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #define AK_DONT_REPLACE_STD #include #include #include #include #include #include #include #include #include #include #include #include class QTextEdit; class QLineEdit; namespace Ladybird { class ConsoleWidget; } namespace WebView { class WebContentClient; } using WebView::WebContentClient; enum class ColorScheme { Auto, Light, Dark, }; class Tab; class WebContentView final : public QAbstractScrollArea , public WebView::ViewImplementation { Q_OBJECT public: explicit WebContentView(int webdriver_fd_passing_socket); virtual ~WebContentView() override; void load(AK::URL const&); void load_html(StringView html, AK::URL const&); Function on_context_menu_request; Function on_link_click; Function on_link_context_menu_request; Function on_image_context_menu_request; Function on_link_middle_click; Function on_link_hover; Function on_title_change; Function on_load_start; Function on_load_finish; Function on_favicon_change; Function on_url_drop; Function on_set_document; Function on_get_source; Function on_get_dom_tree; Function on_get_dom_node_properties; Function on_js_console_new_message; Function const& message_types, Vector const& messages)> on_get_js_console_messages; Function on_get_cookie; Function on_set_cookie; Function on_resource_status_change; virtual void paintEvent(QPaintEvent*) override; virtual void resizeEvent(QResizeEvent*) override; virtual void mouseMoveEvent(QMouseEvent*) override; virtual void mousePressEvent(QMouseEvent*) override; virtual void mouseReleaseEvent(QMouseEvent*) override; virtual void keyPressEvent(QKeyEvent* event) override; virtual void keyReleaseEvent(QKeyEvent* event) override; virtual void showEvent(QShowEvent*) override; virtual void hideEvent(QHideEvent*) override; virtual void focusInEvent(QFocusEvent*) override; virtual void focusOutEvent(QFocusEvent*) override; virtual bool event(QEvent*) override; void debug_request(String const& request, String const& argument); void get_source(); void run_javascript(String const& js_source); void did_output_js_console_message(i32 message_index); void did_get_js_console_messages(i32 start_index, Vector message_types, Vector messages); void show_js_console(); void show_inspector(); Gfx::IntPoint to_content(Gfx::IntPoint) const; Gfx::IntPoint to_widget(Gfx::IntPoint) const; void set_color_scheme(ColorScheme); virtual void notify_server_did_layout(Badge, Gfx::IntSize const& content_size) override; virtual void notify_server_did_paint(Badge, i32 bitmap_id) override; virtual void notify_server_did_invalidate_content_rect(Badge, Gfx::IntRect const&) override; virtual void notify_server_did_change_selection(Badge) override; virtual void notify_server_did_request_cursor_change(Badge, Gfx::StandardCursor cursor) override; virtual void notify_server_did_change_title(Badge, String const&) override; virtual void notify_server_did_request_scroll(Badge, i32, i32) override; virtual void notify_server_did_request_scroll_to(Badge, Gfx::IntPoint const&) override; virtual void notify_server_did_request_scroll_into_view(Badge, Gfx::IntRect const&) override; virtual void notify_server_did_enter_tooltip_area(Badge, Gfx::IntPoint const&, String const&) override; virtual void notify_server_did_leave_tooltip_area(Badge) override; virtual void notify_server_did_hover_link(Badge, const AK::URL&) override; virtual void notify_server_did_unhover_link(Badge) override; virtual void notify_server_did_click_link(Badge, const AK::URL&, String const& target, unsigned modifiers) override; virtual void notify_server_did_middle_click_link(Badge, const AK::URL&, String const& target, unsigned modifiers) override; virtual void notify_server_did_start_loading(Badge, const AK::URL&) override; virtual void notify_server_did_finish_loading(Badge, const AK::URL&) override; virtual void notify_server_did_request_navigate_back(Badge) override; virtual void notify_server_did_request_navigate_forward(Badge) override; virtual void notify_server_did_request_refresh(Badge) override; virtual void notify_server_did_request_context_menu(Badge, Gfx::IntPoint const&) override; virtual void notify_server_did_request_link_context_menu(Badge, Gfx::IntPoint const&, const AK::URL&, String const& target, unsigned modifiers) override; virtual void notify_server_did_request_image_context_menu(Badge, Gfx::IntPoint const&, const AK::URL&, String const& target, unsigned modifiers, Gfx::ShareableBitmap const&) override; virtual void notify_server_did_request_alert(Badge, String const& message) override; virtual bool notify_server_did_request_confirm(Badge, String const& message) override; virtual String notify_server_did_request_prompt(Badge, String const& message, String const& default_) override; virtual void notify_server_did_get_source(const AK::URL& url, String const& source) override; virtual void notify_server_did_get_dom_tree(String const& dom_tree) override; virtual void notify_server_did_get_dom_node_properties(i32 node_id, String const& specified_style, String const& computed_style, String const& custom_properties, String const& node_box_sizing) override; virtual void notify_server_did_output_js_console_message(i32 message_index) override; virtual void notify_server_did_get_js_console_messages(i32 start_index, Vector const& message_types, Vector const& messages) override; virtual void notify_server_did_change_favicon(Gfx::Bitmap const& favicon) override; virtual Vector notify_server_did_request_all_cookies(Badge, AK::URL const& url) override; virtual Optional notify_server_did_request_named_cookie(Badge, AK::URL const& url, String const& name) override; virtual String notify_server_did_request_cookie(Badge, const AK::URL& url, Web::Cookie::Source source) override; virtual void notify_server_did_set_cookie(Badge, const AK::URL& url, Web::Cookie::ParsedCookie const& cookie, Web::Cookie::Source source) override; virtual void notify_server_did_update_cookie(Badge, AK::URL const& url, Web::Cookie::Cookie const& cookie) override; virtual void notify_server_did_update_resource_count(i32 count_waiting) override; virtual void notify_server_did_request_restore_window() override; virtual Gfx::IntPoint notify_server_did_request_reposition_window(Gfx::IntPoint const&) override; virtual Gfx::IntSize notify_server_did_request_resize_window(Gfx::IntSize const&) override; virtual Gfx::IntRect notify_server_did_request_maximize_window() override; virtual Gfx::IntRect notify_server_did_request_minimize_window() override; virtual Gfx::IntRect notify_server_did_request_fullscreen_window() override; virtual void notify_server_did_request_file(Badge, String const& path, i32) override; signals: void link_hovered(QString, int timeout = 0); void link_unhovered(); void back_mouse_button(); void forward_mouse_button(); void load_started(const URL&); void title_changed(QString); void favicon_changed(QIcon); void got_source(URL, QString); void navigate_back(); void navigate_forward(); void refresh(); void restore_window(); Gfx::IntPoint reposition_window(Gfx::IntPoint const&); Gfx::IntSize resize_window(Gfx::IntSize const&); Gfx::IntRect maximize_window(); Gfx::IntRect minimize_window(); Gfx::IntRect fullscreen_window(); private: void request_repaint(); void update_viewport_rect(); void handle_resize(); void ensure_js_console_widget(); void ensure_inspector_widget(); qreal m_inverse_pixel_scaling_ratio { 1.0 }; bool m_should_show_line_box_borders { false }; QPointer m_inspector_widget; Ladybird::ConsoleWidget* m_console_widget { nullptr }; Gfx::IntRect m_viewport_rect; void create_client(); WebContentClient& client(); void handle_web_content_process_crash(); AK::URL m_url; struct SharedBitmap { i32 id { -1 }; i32 pending_paints { 0 }; RefPtr bitmap; }; struct ClientState { RefPtr client; SharedBitmap front_bitmap; SharedBitmap back_bitmap; i32 next_bitmap_id { 0 }; bool has_usable_bitmap { false }; bool got_repaint_requests_while_painting { false }; } m_client_state; RefPtr m_backup_bitmap; int m_webdriver_fd_passing_socket { -1 }; };