1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 00:27:45 +00:00

Ladybird+WebContent: Update IPC calls to handle multiple traversables

The IPC layer between chromes and LibWeb now understands that multiple
top level traversables can live in each WebContent process.

This largely mechanical change adds a billion page_id/page_index
arguments to make sure that pages that end up opening new WebViews
through mechanisms like window.open() still work properly with those
extra windows.
This commit is contained in:
Andrew Kaster 2024-02-02 18:00:48 -07:00 committed by Tim Flynn
parent adb5c27331
commit 36cd2fb7c5
20 changed files with 1542 additions and 969 deletions

File diff suppressed because it is too large Load diff

View file

@ -34,122 +34,104 @@ public:
virtual void die() override;
void initialize_js_console(Badge<PageClient>, Web::DOM::Document& document);
void destroy_js_console(Badge<PageClient>, Web::DOM::Document& document);
void request_file(Web::FileRequest);
void request_file(u64 page_id, Web::FileRequest);
Optional<int> fd() { return socket().fd(); }
PageHost& page_host() { return *m_page_host; }
PageHost const& page_host() const { return *m_page_host; }
auto& backing_stores() { return m_backing_stores; }
private:
explicit ConnectionFromClient(NonnullOwnPtr<Core::LocalSocket>);
PageClient& page(u64 index = 0);
PageClient const& page(u64 index = 0) const;
PageClient& page(u64 index);
PageClient const& page(u64 index) const;
virtual Messages::WebContentServer::GetWindowHandleResponse get_window_handle() override;
virtual void set_window_handle(String const& handle) override;
virtual void connect_to_webdriver(ByteString const& webdriver_ipc_path) override;
virtual void update_system_theme(Core::AnonymousBuffer const&) override;
virtual void update_system_fonts(ByteString const&, ByteString const&, ByteString const&) override;
virtual void update_screen_rects(Vector<Web::DevicePixelRect> const&, u32) override;
virtual void load_url(URL const&) override;
virtual void load_html(ByteString const&) override;
virtual void set_viewport_rect(Web::DevicePixelRect const&) override;
virtual void mouse_down(Web::DevicePixelPoint, Web::DevicePixelPoint, u32, u32, u32) override;
virtual void mouse_move(Web::DevicePixelPoint, Web::DevicePixelPoint, u32, u32, u32) override;
virtual void mouse_up(Web::DevicePixelPoint, Web::DevicePixelPoint, u32, u32, u32) override;
virtual void mouse_wheel(Web::DevicePixelPoint, Web::DevicePixelPoint, u32, u32, u32, Web::DevicePixels, Web::DevicePixels) override;
virtual void doubleclick(Web::DevicePixelPoint, Web::DevicePixelPoint, u32, u32, u32) override;
virtual void key_down(i32, u32, u32) override;
virtual void key_up(i32, u32, u32) override;
virtual void add_backing_store(i32 front_bitmap_id, Gfx::ShareableBitmap const& front_bitmap, i32 back_bitmap_id, Gfx::ShareableBitmap const& back_bitmap) override;
virtual void ready_to_paint() override;
virtual void debug_request(ByteString const&, ByteString const&) override;
virtual void get_source() override;
virtual void inspect_dom_tree() override;
virtual void inspect_dom_node(i32 node_id, Optional<Web::CSS::Selector::PseudoElement::Type> const& pseudo_element) override;
virtual void inspect_accessibility_tree() override;
virtual void get_hovered_node_id() override;
virtual Messages::WebContentServer::GetWindowHandleResponse get_window_handle(u64 page_id) override;
virtual void set_window_handle(u64 page_id, String const& handle) override;
virtual void connect_to_webdriver(u64 page_id, ByteString const& webdriver_ipc_path) override;
virtual void update_system_theme(u64 page_id, Core::AnonymousBuffer const&) override;
virtual void update_system_fonts(u64 page_id, ByteString const&, ByteString const&, ByteString const&) override;
virtual void update_screen_rects(u64 page_id, Vector<Web::DevicePixelRect> const&, u32) override;
virtual void load_url(u64 page_id, URL const&) override;
virtual void load_html(u64 page_id, ByteString const&) override;
virtual void set_viewport_rect(u64 page_id, Web::DevicePixelRect const&) override;
virtual void mouse_down(u64 page_id, Web::DevicePixelPoint, Web::DevicePixelPoint, u32, u32, u32) override;
virtual void mouse_move(u64 page_id, Web::DevicePixelPoint, Web::DevicePixelPoint, u32, u32, u32) override;
virtual void mouse_up(u64 page_id, Web::DevicePixelPoint, Web::DevicePixelPoint, u32, u32, u32) override;
virtual void mouse_wheel(u64 page_id, Web::DevicePixelPoint, Web::DevicePixelPoint, u32, u32, u32, Web::DevicePixels, Web::DevicePixels) override;
virtual void doubleclick(u64 page_id, Web::DevicePixelPoint, Web::DevicePixelPoint, u32, u32, u32) override;
virtual void key_down(u64 page_id, i32, u32, u32) override;
virtual void key_up(u64 page_id, i32, u32, u32) override;
virtual void add_backing_store(u64 page_id, i32 front_bitmap_id, Gfx::ShareableBitmap const& front_bitmap, i32 back_bitmap_id, Gfx::ShareableBitmap const& back_bitmap) override;
virtual void ready_to_paint(u64 page_id) override;
virtual void debug_request(u64 page_id, ByteString const&, ByteString const&) override;
virtual void get_source(u64 page_id) override;
virtual void inspect_dom_tree(u64 page_id) override;
virtual void inspect_dom_node(u64 page_id, i32 node_id, Optional<Web::CSS::Selector::PseudoElement::Type> const& pseudo_element) override;
virtual void inspect_accessibility_tree(u64 page_id) override;
virtual void get_hovered_node_id(u64 page_id) override;
virtual void set_dom_node_text(i32 node_id, String const& text) override;
virtual void set_dom_node_tag(i32 node_id, String const& name) override;
virtual void add_dom_node_attributes(i32 node_id, Vector<WebView::Attribute> const& attributes) override;
virtual void replace_dom_node_attribute(i32 node_id, String const& name, Vector<WebView::Attribute> const& replacement_attributes) override;
virtual void create_child_element(i32 node_id) override;
virtual void create_child_text_node(i32 node_id) override;
virtual void clone_dom_node(i32 node_id) override;
virtual void remove_dom_node(i32 node_id) override;
virtual void get_dom_node_html(i32 node_id) override;
virtual void set_dom_node_text(u64 page_id, i32 node_id, String const& text) override;
virtual void set_dom_node_tag(u64 page_id, i32 node_id, String const& name) override;
virtual void add_dom_node_attributes(u64 page_id, i32 node_id, Vector<WebView::Attribute> const& attributes) override;
virtual void replace_dom_node_attribute(u64 page_id, i32 node_id, String const& name, Vector<WebView::Attribute> const& replacement_attributes) override;
virtual void create_child_element(u64 page_id, i32 node_id) override;
virtual void create_child_text_node(u64 page_id, i32 node_id) override;
virtual void clone_dom_node(u64 page_id, i32 node_id) override;
virtual void remove_dom_node(u64 page_id, i32 node_id) override;
virtual void get_dom_node_html(u64 page_id, i32 node_id) override;
virtual Messages::WebContentServer::DumpLayoutTreeResponse dump_layout_tree() override;
virtual Messages::WebContentServer::DumpPaintTreeResponse dump_paint_tree() override;
virtual Messages::WebContentServer::DumpTextResponse dump_text() override;
virtual void set_content_filters(Vector<String> const&) override;
virtual void set_autoplay_allowed_on_all_websites() override;
virtual void set_autoplay_allowlist(Vector<String> const& allowlist) override;
virtual void set_proxy_mappings(Vector<ByteString> const&, HashMap<ByteString, size_t> const&) override;
virtual void set_preferred_color_scheme(Web::CSS::PreferredColorScheme const&) override;
virtual void set_has_focus(bool) override;
virtual void set_is_scripting_enabled(bool) override;
virtual void set_device_pixels_per_css_pixel(float) override;
virtual void set_window_position(Web::DevicePixelPoint) override;
virtual void set_window_size(Web::DevicePixelSize) override;
virtual void handle_file_return(i32 error, Optional<IPC::File> const& file, i32 request_id) override;
virtual void set_system_visibility_state(bool visible) override;
virtual Messages::WebContentServer::DumpLayoutTreeResponse dump_layout_tree(u64 page_id) override;
virtual Messages::WebContentServer::DumpPaintTreeResponse dump_paint_tree(u64 page_id) override;
virtual Messages::WebContentServer::DumpTextResponse dump_text(u64 page_id) override;
virtual void set_content_filters(u64 page_id, Vector<String> const&) override;
virtual void set_autoplay_allowed_on_all_websites(u64 page_id) override;
virtual void set_autoplay_allowlist(u64 page_id, Vector<String> const& allowlist) override;
virtual void set_proxy_mappings(u64 page_id, Vector<ByteString> const&, HashMap<ByteString, size_t> const&) override;
virtual void set_preferred_color_scheme(u64 page_id, Web::CSS::PreferredColorScheme const&) override;
virtual void set_has_focus(u64 page_id, bool) override;
virtual void set_is_scripting_enabled(u64 page_id, bool) override;
virtual void set_device_pixels_per_css_pixel(u64 page_id, float) override;
virtual void set_window_position(u64 page_id, Web::DevicePixelPoint) override;
virtual void set_window_size(u64 page_id, Web::DevicePixelSize) override;
virtual void handle_file_return(u64 page_id, i32 error, Optional<IPC::File> const& file, i32 request_id) override;
virtual void set_system_visibility_state(u64 page_id, bool visible) override;
virtual void js_console_input(ByteString const&) override;
virtual void run_javascript(ByteString const&) override;
virtual void js_console_request_messages(i32) override;
virtual void js_console_input(u64 page_id, ByteString const&) override;
virtual void run_javascript(u64 page_id, ByteString const&) override;
virtual void js_console_request_messages(u64 page_id, i32) override;
virtual void alert_closed() override;
virtual void confirm_closed(bool accepted) override;
virtual void prompt_closed(Optional<String> const& response) override;
virtual void color_picker_update(Optional<Color> const& picked_color, Web::HTML::ColorPickerUpdateState const& state) override;
virtual void select_dropdown_closed(Optional<String> const& value) override;
virtual void alert_closed(u64 page_id) override;
virtual void confirm_closed(u64 page_id, bool accepted) override;
virtual void prompt_closed(u64 page_id, Optional<String> const& response) override;
virtual void color_picker_update(u64 page_id, Optional<Color> const& picked_color, Web::HTML::ColorPickerUpdateState const& state) override;
virtual void select_dropdown_closed(u64 page_id, Optional<String> const& value) override;
virtual void toggle_media_play_state() override;
virtual void toggle_media_mute_state() override;
virtual void toggle_media_loop_state() override;
virtual void toggle_media_controls_state() override;
virtual void toggle_media_play_state(u64 page_id) override;
virtual void toggle_media_mute_state(u64 page_id) override;
virtual void toggle_media_loop_state(u64 page_id) override;
virtual void toggle_media_controls_state(u64 page_id) override;
virtual void set_user_style(String const&) override;
virtual void set_user_style(u64 page_id, String const&) override;
virtual void enable_inspector_prototype() override;
virtual void enable_inspector_prototype(u64 page_id) override;
virtual void take_document_screenshot() override;
virtual void take_dom_node_screenshot(i32 node_id) override;
virtual void take_document_screenshot(u64 page_id) override;
virtual void take_dom_node_screenshot(u64 page_id, i32 node_id) override;
virtual Messages::WebContentServer::DumpGcGraphResponse dump_gc_graph() override;
virtual Messages::WebContentServer::DumpGcGraphResponse dump_gc_graph(u64 page_id) override;
virtual Messages::WebContentServer::GetLocalStorageEntriesResponse get_local_storage_entries() override;
virtual Messages::WebContentServer::GetSessionStorageEntriesResponse get_session_storage_entries() override;
virtual Messages::WebContentServer::GetLocalStorageEntriesResponse get_local_storage_entries(u64 page_id) override;
virtual Messages::WebContentServer::GetSessionStorageEntriesResponse get_session_storage_entries(u64 page_id) override;
virtual Messages::WebContentServer::GetSelectedTextResponse get_selected_text() override;
virtual void select_all() override;
virtual Messages::WebContentServer::GetSelectedTextResponse get_selected_text(u64 page_id) override;
virtual void select_all(u64 page_id) override;
void report_finished_handling_input_event(bool event_was_handled);
void report_finished_handling_input_event(u64 page_id, bool event_was_handled);
NonnullOwnPtr<PageHost> m_page_host;
struct BackingStores {
i32 front_bitmap_id { -1 };
i32 back_bitmap_id { -1 };
RefPtr<Gfx::Bitmap> front_bitmap;
RefPtr<Gfx::Bitmap> back_bitmap;
};
BackingStores m_backing_stores;
HashMap<Web::DOM::Document*, NonnullOwnPtr<WebContentConsoleClient>> m_console_clients;
WeakPtr<WebContentConsoleClient> m_top_level_document_console_client;
JS::Handle<JS::GlobalObject> m_console_global_object;
HashMap<int, Web::FileRequest> m_requested_files {};
int last_id { 0 };
@ -170,6 +152,7 @@ private:
Web::DevicePixels wheel_delta_x {};
Web::DevicePixels wheel_delta_y {};
size_t coalesced_event_count { 0 };
u64 page_id { 0 };
};
struct QueuedKeyboardEvent {
@ -181,6 +164,7 @@ private:
i32 key {};
u32 modifiers {};
u32 code_point {};
u64 page_id { 0 };
};
void enqueue_input_event(Variant<QueuedMouseEvent, QueuedKeyboardEvent>);

View file

@ -8,12 +8,15 @@
#include <LibGfx/ShareableBitmap.h>
#include <LibGfx/SystemTheme.h>
#include <LibJS/Console.h>
#include <LibJS/Runtime/ConsoleObject.h>
#include <LibWeb/Bindings/MainThreadVM.h>
#include <LibWeb/CSS/SystemColor.h>
#include <LibWeb/Cookie/ParsedCookie.h>
#include <LibWeb/DOM/Attr.h>
#include <LibWeb/DOM/NamedNodeMap.h>
#include <LibWeb/HTML/BrowsingContext.h>
#include <LibWeb/HTML/Scripting/ClassicScript.h>
#include <LibWeb/HTML/TraversableNavigable.h>
#include <LibWeb/Layout/Viewport.h>
#include <LibWeb/Painting/PaintableBox.h>
@ -54,20 +57,20 @@ PageClient::PageClient(PageHost& owner, u64 id)
setup_palette();
m_repaint_timer = Web::Platform::Timer::create_single_shot(0, [this] {
if (!client().backing_stores().back_bitmap) {
if (!m_backing_stores.back_bitmap) {
return;
}
auto& back_bitmap = *client().backing_stores().back_bitmap;
auto& back_bitmap = *m_backing_stores.back_bitmap;
auto viewport_rect = page().css_to_device_rect(page().top_level_traversable()->viewport_rect());
paint(viewport_rect, back_bitmap);
auto& backing_stores = client().backing_stores();
auto& backing_stores = m_backing_stores;
swap(backing_stores.front_bitmap, backing_stores.back_bitmap);
swap(backing_stores.front_bitmap_id, backing_stores.back_bitmap_id);
m_paint_state = PaintState::WaitingForClient;
client().async_did_paint(viewport_rect.to_type<int>(), backing_stores.front_bitmap_id);
client().async_did_paint(m_id, viewport_rect.to_type<int>(), backing_stores.front_bitmap_id);
});
#ifdef HAS_ACCELERATED_GRAPHICS
@ -101,6 +104,14 @@ void PageClient::ready_to_paint()
schedule_repaint();
}
void PageClient::add_backing_store(i32 front_bitmap_id, Gfx::ShareableBitmap const& front_bitmap, i32 back_bitmap_id, Gfx::ShareableBitmap const& back_bitmap)
{
m_backing_stores.front_bitmap_id = front_bitmap_id;
m_backing_stores.back_bitmap_id = back_bitmap_id;
m_backing_stores.front_bitmap = *const_cast<Gfx::ShareableBitmap&>(front_bitmap).bitmap();
m_backing_stores.back_bitmap = *const_cast<Gfx::ShareableBitmap&>(back_bitmap).bitmap();
}
void PageClient::visit_edges(JS::Cell::Visitor& visitor)
{
Base::visit_edges(visitor);
@ -220,7 +231,7 @@ void PageClient::page_did_invalidate(Web::CSSPixelRect const&)
void PageClient::page_did_request_cursor_change(Gfx::StandardCursor cursor)
{
client().async_did_request_cursor_change((u32)cursor);
client().async_did_request_cursor_change(m_id, (u32)cursor);
}
void PageClient::page_did_layout()
@ -231,62 +242,62 @@ void PageClient::page_did_layout()
m_content_size = page().enclosing_device_rect(layout_root->paintable_box()->scrollable_overflow_rect().value()).size();
else
m_content_size = page().enclosing_device_rect(layout_root->paintable_box()->absolute_rect()).size();
client().async_did_layout(m_content_size.to_type<int>());
client().async_did_layout(m_id, m_content_size.to_type<int>());
}
void PageClient::page_did_change_title(ByteString const& title)
{
client().async_did_change_title(title);
client().async_did_change_title(m_id, title);
}
void PageClient::page_did_request_navigate_back()
{
client().async_did_request_navigate_back();
client().async_did_request_navigate_back(m_id);
}
void PageClient::page_did_request_navigate_forward()
{
client().async_did_request_navigate_forward();
client().async_did_request_navigate_forward(m_id);
}
void PageClient::page_did_request_refresh()
{
client().async_did_request_refresh();
client().async_did_request_refresh(m_id);
}
Gfx::IntSize PageClient::page_did_request_resize_window(Gfx::IntSize size)
{
return client().did_request_resize_window(size);
return client().did_request_resize_window(m_id, size);
}
Gfx::IntPoint PageClient::page_did_request_reposition_window(Gfx::IntPoint position)
{
return client().did_request_reposition_window(position);
return client().did_request_reposition_window(m_id, position);
}
void PageClient::page_did_request_restore_window()
{
client().async_did_request_restore_window();
client().async_did_request_restore_window(m_id);
}
Gfx::IntRect PageClient::page_did_request_maximize_window()
{
return client().did_request_maximize_window();
return client().did_request_maximize_window(m_id);
}
Gfx::IntRect PageClient::page_did_request_minimize_window()
{
return client().did_request_minimize_window();
return client().did_request_minimize_window(m_id);
}
Gfx::IntRect PageClient::page_did_request_fullscreen_window()
{
return client().did_request_fullscreen_window();
return client().did_request_fullscreen_window(m_id);
}
void PageClient::page_did_request_scroll(i32 x_delta, i32 y_delta)
{
client().async_did_request_scroll(x_delta, y_delta);
client().async_did_request_scroll(m_id, x_delta, y_delta);
}
void PageClient::page_did_request_scroll_to(Web::CSSPixelPoint scroll_position)
@ -299,83 +310,83 @@ void PageClient::page_did_request_scroll_to(Web::CSSPixelPoint scroll_position)
page().top_level_traversable()->set_viewport_rect(viewport);
auto device_scroll_position = page().css_to_device_point(scroll_position);
client().async_did_request_scroll_to(device_scroll_position.to_type<int>());
client().async_did_request_scroll_to(m_id, device_scroll_position.to_type<int>());
}
void PageClient::page_did_enter_tooltip_area(Web::CSSPixelPoint content_position, ByteString const& title)
{
client().async_did_enter_tooltip_area({ content_position.x().to_int(), content_position.y().to_int() }, title);
client().async_did_enter_tooltip_area(m_id, { content_position.x().to_int(), content_position.y().to_int() }, title);
}
void PageClient::page_did_leave_tooltip_area()
{
client().async_did_leave_tooltip_area();
client().async_did_leave_tooltip_area(m_id);
}
void PageClient::page_did_hover_link(const URL& url)
{
client().async_did_hover_link(url);
client().async_did_hover_link(m_id, url);
}
void PageClient::page_did_unhover_link()
{
client().async_did_unhover_link();
client().async_did_unhover_link(m_id);
}
void PageClient::page_did_middle_click_link(const URL& url, [[maybe_unused]] ByteString const& target, [[maybe_unused]] unsigned modifiers)
{
client().async_did_middle_click_link(url, target, modifiers);
client().async_did_middle_click_link(m_id, url, target, modifiers);
}
void PageClient::page_did_start_loading(const URL& url, bool is_redirect)
{
client().async_did_start_loading(url, is_redirect);
client().async_did_start_loading(m_id, url, is_redirect);
}
void PageClient::page_did_create_new_document(Web::DOM::Document& document)
{
client().initialize_js_console({}, document);
initialize_js_console(document);
}
void PageClient::page_did_destroy_document(Web::DOM::Document& document)
{
client().destroy_js_console({}, document);
destroy_js_console(document);
}
void PageClient::page_did_finish_loading(const URL& url)
{
client().async_did_finish_loading(url);
client().async_did_finish_loading(m_id, url);
}
void PageClient::page_did_finish_text_test()
{
client().async_did_finish_text_test();
client().async_did_finish_text_test(m_id);
}
void PageClient::page_did_request_context_menu(Web::CSSPixelPoint content_position)
{
client().async_did_request_context_menu(page().css_to_device_point(content_position).to_type<int>());
client().async_did_request_context_menu(m_id, page().css_to_device_point(content_position).to_type<int>());
}
void PageClient::page_did_request_link_context_menu(Web::CSSPixelPoint content_position, URL const& url, ByteString const& target, unsigned modifiers)
{
client().async_did_request_link_context_menu(page().css_to_device_point(content_position).to_type<int>(), url, target, modifiers);
client().async_did_request_link_context_menu(m_id, page().css_to_device_point(content_position).to_type<int>(), url, target, modifiers);
}
void PageClient::page_did_request_image_context_menu(Web::CSSPixelPoint content_position, URL const& url, ByteString const& target, unsigned modifiers, Gfx::Bitmap const* bitmap_pointer)
{
auto bitmap = bitmap_pointer ? bitmap_pointer->to_shareable_bitmap() : Gfx::ShareableBitmap();
client().async_did_request_image_context_menu(page().css_to_device_point(content_position).to_type<int>(), url, target, modifiers, bitmap);
client().async_did_request_image_context_menu(m_id, page().css_to_device_point(content_position).to_type<int>(), url, target, modifiers, bitmap);
}
void PageClient::page_did_request_media_context_menu(Web::CSSPixelPoint content_position, ByteString const& target, unsigned modifiers, Web::Page::MediaContextMenu menu)
{
client().async_did_request_media_context_menu(page().css_to_device_point(content_position).to_type<int>(), target, modifiers, move(menu));
client().async_did_request_media_context_menu(m_id, page().css_to_device_point(content_position).to_type<int>(), target, modifiers, move(menu));
}
void PageClient::page_did_request_alert(String const& message)
{
client().async_did_request_alert(message);
client().async_did_request_alert(m_id, message);
}
void PageClient::alert_closed()
@ -385,7 +396,7 @@ void PageClient::alert_closed()
void PageClient::page_did_request_confirm(String const& message)
{
client().async_did_request_confirm(message);
client().async_did_request_confirm(m_id, message);
}
void PageClient::confirm_closed(bool accepted)
@ -395,12 +406,12 @@ void PageClient::confirm_closed(bool accepted)
void PageClient::page_did_request_prompt(String const& message, String const& default_)
{
client().async_did_request_prompt(message, default_);
client().async_did_request_prompt(m_id, message, default_);
}
void PageClient::page_did_request_set_prompt_text(String const& text)
{
client().async_did_request_set_prompt_text(text);
client().async_did_request_set_prompt_text(m_id, text);
}
void PageClient::prompt_closed(Optional<String> response)
@ -445,32 +456,32 @@ void PageClient::set_user_style(String source)
void PageClient::page_did_request_accept_dialog()
{
client().async_did_request_accept_dialog();
client().async_did_request_accept_dialog(m_id);
}
void PageClient::page_did_request_dismiss_dialog()
{
client().async_did_request_dismiss_dialog();
client().async_did_request_dismiss_dialog(m_id);
}
void PageClient::page_did_change_favicon(Gfx::Bitmap const& favicon)
{
client().async_did_change_favicon(favicon.to_shareable_bitmap());
client().async_did_change_favicon(m_id, favicon.to_shareable_bitmap());
}
Vector<Web::Cookie::Cookie> PageClient::page_did_request_all_cookies(URL const& url)
{
return client().did_request_all_cookies(url);
return client().did_request_all_cookies(m_id, url);
}
Optional<Web::Cookie::Cookie> PageClient::page_did_request_named_cookie(URL const& url, String const& name)
{
return client().did_request_named_cookie(url, name);
return client().did_request_named_cookie(m_id, url, name);
}
String PageClient::page_did_request_cookie(const URL& url, Web::Cookie::Source source)
{
auto response = client().send_sync_but_allow_failure<Messages::WebContentClient::DidRequestCookie>(move(url), source);
auto response = client().send_sync_but_allow_failure<Messages::WebContentClient::DidRequestCookie>(m_id, move(url), source);
if (!response) {
dbgln("WebContent client disconnected during DidRequestCookie. Exiting peacefully.");
exit(0);
@ -480,7 +491,7 @@ String PageClient::page_did_request_cookie(const URL& url, Web::Cookie::Source s
void PageClient::page_did_set_cookie(const URL& url, Web::Cookie::ParsedCookie const& cookie, Web::Cookie::Source source)
{
auto response = client().send_sync_but_allow_failure<Messages::WebContentClient::DidSetCookie>(url, cookie, source);
auto response = client().send_sync_but_allow_failure<Messages::WebContentClient::DidSetCookie>(m_id, url, cookie, source);
if (!response) {
dbgln("WebContent client disconnected during DidSetCookie. Exiting peacefully.");
exit(0);
@ -489,12 +500,12 @@ void PageClient::page_did_set_cookie(const URL& url, Web::Cookie::ParsedCookie c
void PageClient::page_did_update_cookie(Web::Cookie::Cookie cookie)
{
client().async_did_update_cookie(move(cookie));
client().async_did_update_cookie(m_id, move(cookie));
}
void PageClient::page_did_update_resource_count(i32 count_waiting)
{
client().async_did_update_resource_count(count_waiting);
client().async_did_update_resource_count(m_id, count_waiting);
}
PageClient::NewWebViewResult PageClient::page_did_request_new_web_view(Web::HTML::ActivateTab activate_tab, Web::HTML::WebViewHints hints, Web::HTML::TokenizedFeature::NoOpener no_opener)
@ -509,7 +520,7 @@ PageClient::NewWebViewResult PageClient::page_did_request_new_web_view(Web::HTML
page_id = new_client.m_id;
auto response = client().send_sync_but_allow_failure<Messages::WebContentClient::DidRequestNewWebView>(activate_tab, hints, page_id);
auto response = client().send_sync_but_allow_failure<Messages::WebContentClient::DidRequestNewWebView>(m_id, activate_tab, hints, page_id);
if (!response) {
dbgln("WebContent client disconnected during DidRequestNewWebView. Exiting peacefully.");
exit(0);
@ -520,42 +531,47 @@ PageClient::NewWebViewResult PageClient::page_did_request_new_web_view(Web::HTML
void PageClient::page_did_request_activate_tab()
{
client().async_did_request_activate_tab();
client().async_did_request_activate_tab(m_id);
}
void PageClient::page_did_close_browsing_context(Web::HTML::BrowsingContext const&)
void PageClient::page_did_close_top_level_traversable()
{
client().async_did_close_browsing_context();
// FIXME: Rename this IPC call
client().async_did_close_browsing_context(m_id);
// NOTE: This only removes the strong reference the PageHost has for this PageClient.
// It will be GC'd 'later'.
m_owner.remove_page({}, m_id);
}
void PageClient::request_file(Web::FileRequest file_request)
{
client().request_file(move(file_request));
client().request_file(m_id, move(file_request));
}
void PageClient::page_did_request_color_picker(Color current_color)
{
client().async_did_request_color_picker(current_color);
client().async_did_request_color_picker(m_id, current_color);
}
void PageClient::page_did_request_select_dropdown(Web::CSSPixelPoint content_position, Web::CSSPixels minimum_width, Vector<Web::HTML::SelectItem> items)
{
client().async_did_request_select_dropdown(page().css_to_device_point(content_position).to_type<int>(), minimum_width * device_pixels_per_css_pixel(), items);
client().async_did_request_select_dropdown(m_id, page().css_to_device_point(content_position).to_type<int>(), minimum_width * device_pixels_per_css_pixel(), items);
}
void PageClient::page_did_change_theme_color(Gfx::Color color)
{
client().async_did_change_theme_color(color);
client().async_did_change_theme_color(m_id, color);
}
void PageClient::page_did_insert_clipboard_entry(String data, String presentation_style, String mime_type)
{
client().async_did_insert_clipboard_entry(move(data), move(presentation_style), move(mime_type));
client().async_did_insert_clipboard_entry(m_id, move(data), move(presentation_style), move(mime_type));
}
WebView::SocketPair PageClient::request_worker_agent()
{
auto response = client().send_sync_but_allow_failure<Messages::WebContentClient::RequestWorkerAgent>();
auto response = client().send_sync_but_allow_failure<Messages::WebContentClient::RequestWorkerAgent>(m_id);
if (!response) {
dbgln("WebContent client disconnected during RequestWorkerAgent. Exiting peacefully.");
exit(0);
@ -566,22 +582,22 @@ WebView::SocketPair PageClient::request_worker_agent()
void PageClient::inspector_did_load()
{
client().async_inspector_did_load();
client().async_inspector_did_load(m_id);
}
void PageClient::inspector_did_select_dom_node(i32 node_id, Optional<Web::CSS::Selector::PseudoElement::Type> const& pseudo_element)
{
client().async_inspector_did_select_dom_node(node_id, pseudo_element);
client().async_inspector_did_select_dom_node(m_id, node_id, pseudo_element);
}
void PageClient::inspector_did_set_dom_node_text(i32 node_id, String const& text)
{
client().async_inspector_did_set_dom_node_text(node_id, text);
client().async_inspector_did_set_dom_node_text(m_id, node_id, text);
}
void PageClient::inspector_did_set_dom_node_tag(i32 node_id, String const& tag)
{
client().async_inspector_did_set_dom_node_tag(node_id, tag);
client().async_inspector_did_set_dom_node_tag(m_id, node_id, tag);
}
static Vector<WebView::Attribute> named_node_map_to_vector(JS::NonnullGCPtr<Web::DOM::NamedNodeMap> map)
@ -601,12 +617,12 @@ static Vector<WebView::Attribute> named_node_map_to_vector(JS::NonnullGCPtr<Web:
void PageClient::inspector_did_add_dom_node_attributes(i32 node_id, JS::NonnullGCPtr<Web::DOM::NamedNodeMap> attributes)
{
client().async_inspector_did_add_dom_node_attributes(node_id, named_node_map_to_vector(attributes));
client().async_inspector_did_add_dom_node_attributes(m_id, node_id, named_node_map_to_vector(attributes));
}
void PageClient::inspector_did_replace_dom_node_attribute(i32 node_id, String const& name, JS::NonnullGCPtr<Web::DOM::NamedNodeMap> replacement_attributes)
{
client().async_inspector_did_replace_dom_node_attribute(node_id, name, named_node_map_to_vector(replacement_attributes));
client().async_inspector_did_replace_dom_node_attribute(m_id, node_id, name, named_node_map_to_vector(replacement_attributes));
}
void PageClient::inspector_did_request_dom_tree_context_menu(i32 node_id, Web::CSSPixelPoint position, String const& type, Optional<String> const& tag, Optional<String> const& attribute_name, Optional<String> const& attribute_value)
@ -615,12 +631,12 @@ void PageClient::inspector_did_request_dom_tree_context_menu(i32 node_id, Web::C
if (attribute_name.has_value() && attribute_value.has_value())
attribute = WebView::Attribute { *attribute_name, *attribute_value };
client().async_inspector_did_request_dom_tree_context_menu(node_id, page().css_to_device_point(position).to_type<int>(), type, tag, move(attribute));
client().async_inspector_did_request_dom_tree_context_menu(m_id, node_id, page().css_to_device_point(position).to_type<int>(), type, tag, move(attribute));
}
void PageClient::inspector_did_execute_console_script(String const& script)
{
client().async_inspector_did_execute_console_script(script);
client().async_inspector_did_execute_console_script(m_id, script);
}
ErrorOr<void> PageClient::connect_to_webdriver(ByteString const& webdriver_ipc_path)
@ -634,4 +650,78 @@ ErrorOr<void> PageClient::connect_to_webdriver(ByteString const& webdriver_ipc_p
return {};
}
void PageClient::initialize_js_console(Web::DOM::Document& document)
{
auto& realm = document.realm();
auto console_object = realm.intrinsics().console_object();
auto console_client = make<WebContentConsoleClient>(console_object->console(), document.realm(), *this);
console_object->console().set_client(*console_client);
VERIFY(document.browsing_context());
if (document.browsing_context()->is_top_level()) {
m_top_level_document_console_client = console_client->make_weak_ptr();
}
m_console_clients.set(&document, move(console_client));
}
void PageClient::destroy_js_console(Web::DOM::Document& document)
{
m_console_clients.remove(&document);
}
void PageClient::js_console_input(ByteString const& js_source)
{
if (m_top_level_document_console_client)
m_top_level_document_console_client->handle_input(js_source);
}
void PageClient::run_javascript(ByteString const& js_source)
{
auto* active_document = page().top_level_browsing_context().active_document();
if (!active_document)
return;
// This is partially based on "execute a javascript: URL request" https://html.spec.whatwg.org/multipage/browsing-the-web.html#javascript-protocol
// Let settings be browsingContext's active document's relevant settings object.
auto& settings = active_document->relevant_settings_object();
// Let baseURL be settings's API base URL.
auto base_url = settings.api_base_url();
// Let script be the result of creating a classic script given scriptSource, settings, baseURL, and the default classic script fetch options.
// FIXME: This doesn't pass in "default classic script fetch options"
// FIXME: What should the filename be here?
auto script = Web::HTML::ClassicScript::create("(client connection run_javascript)", js_source, settings, move(base_url));
// Let evaluationStatus be the result of running the classic script script.
auto evaluation_status = script->run();
if (evaluation_status.is_error())
dbgln("Exception :(");
}
void PageClient::js_console_request_messages(i32 start_index)
{
if (m_top_level_document_console_client)
m_top_level_document_console_client->send_messages(start_index);
}
void PageClient::did_output_js_console_message(i32 message_index)
{
client().async_did_output_js_console_message(m_id, message_index);
}
void PageClient::console_peer_did_misbehave(char const* reason)
{
client().did_misbehave(reason);
}
void PageClient::did_get_js_console_messages(i32 start_index, Vector<ByteString> message_types, Vector<ByteString> messages)
{
client().async_did_get_js_console_messages(m_id, start_index, move(message_types), move(messages));
}
}

View file

@ -65,6 +65,17 @@ public:
void ready_to_paint();
void add_backing_store(i32 front_bitmap_id, Gfx::ShareableBitmap const& front_bitmap, i32 back_bitmap_id, Gfx::ShareableBitmap const& back_bitmap);
void initialize_js_console(Web::DOM::Document& document);
void destroy_js_console(Web::DOM::Document& document);
void js_console_input(ByteString const& js_source);
void run_javascript(ByteString const& js_source);
void js_console_request_messages(i32 start_index);
void did_output_js_console_message(i32 message_index);
void console_peer_did_misbehave(char const* reason);
void did_get_js_console_messages(i32 start_index, Vector<ByteString> message_types, Vector<ByteString> messages);
virtual double device_pixels_per_css_pixel() const override { return m_device_pixels_per_css_pixel; }
private:
@ -120,7 +131,7 @@ private:
virtual void page_did_update_resource_count(i32) override;
virtual NewWebViewResult page_did_request_new_web_view(Web::HTML::ActivateTab, Web::HTML::WebViewHints, Web::HTML::TokenizedFeature::NoOpener) override;
virtual void page_did_request_activate_tab() override;
virtual void page_did_close_browsing_context(Web::HTML::BrowsingContext const&) override;
virtual void page_did_close_top_level_traversable() override;
virtual void request_file(Web::FileRequest) override;
virtual void page_did_request_color_picker(Color current_color) override;
virtual void page_did_request_select_dropdown(Web::CSSPixelPoint content_position, Web::CSSPixels minimum_width, Vector<Web::HTML::SelectItem> items) override;
@ -167,6 +178,19 @@ private:
#ifdef HAS_ACCELERATED_GRAPHICS
OwnPtr<AccelGfx::Context> m_accelerated_graphics_context;
#endif
struct BackingStores {
i32 front_bitmap_id { -1 };
i32 back_bitmap_id { -1 };
RefPtr<Gfx::Bitmap> front_bitmap;
RefPtr<Gfx::Bitmap> back_bitmap;
};
BackingStores m_backing_stores;
HashMap<Web::DOM::Document*, NonnullOwnPtr<WebContentConsoleClient>> m_console_clients;
WeakPtr<WebContentConsoleClient> m_top_level_document_console_client;
JS::Handle<JS::GlobalObject> m_console_global_object;
};
}

View file

@ -29,6 +29,11 @@ PageClient& PageHost::create_page()
return *m_pages.get(m_next_id - 1).value();
}
void PageHost::remove_page(Badge<PageClient>, u64 index)
{
m_pages.remove(index);
}
PageHost::~PageHost() = default;
}

View file

@ -28,6 +28,7 @@ public:
PageClient& page(u64 index) { return *m_pages.find(index)->value; }
PageClient& create_page();
void remove_page(Badge<PageClient>, u64 index);
ConnectionFromClient& client() const { return m_client; }

View file

@ -14,81 +14,81 @@
endpoint WebContentClient
{
did_start_loading(URL url, bool is_redirect) =|
did_finish_loading(URL url) =|
did_request_navigate_back() =|
did_request_navigate_forward() =|
did_request_refresh() =|
did_paint(Gfx::IntRect content_rect, i32 bitmap_id) =|
did_request_cursor_change(i32 cursor_type) =|
did_layout(Gfx::IntSize content_size) =|
did_change_title(ByteString title) =|
did_request_scroll(i32 x_delta, i32 y_delta) =|
did_request_scroll_to(Gfx::IntPoint scroll_position) =|
did_enter_tooltip_area(Gfx::IntPoint content_position, ByteString title) =|
did_leave_tooltip_area() =|
did_hover_link(URL url) =|
did_unhover_link() =|
did_click_link(URL url, ByteString target, unsigned modifiers) =|
did_middle_click_link(URL url, ByteString target, unsigned modifiers) =|
did_request_context_menu(Gfx::IntPoint content_position) =|
did_request_link_context_menu(Gfx::IntPoint content_position, URL url, ByteString target, unsigned modifiers) =|
did_request_image_context_menu(Gfx::IntPoint content_position, URL url, ByteString target, unsigned modifiers, Gfx::ShareableBitmap bitmap) =|
did_request_media_context_menu(Gfx::IntPoint content_position, ByteString target, unsigned modifiers, Web::Page::MediaContextMenu menu) =|
did_request_alert(String message) =|
did_request_confirm(String message) =|
did_request_prompt(String message, String default_) =|
did_request_set_prompt_text(String message) =|
did_request_accept_dialog() =|
did_request_dismiss_dialog() =|
did_get_source(URL url, ByteString source) =|
did_start_loading(u64 page_id, URL url, bool is_redirect) =|
did_finish_loading(u64 page_id, URL url) =|
did_request_navigate_back(u64 page_id) =|
did_request_navigate_forward(u64 page_id) =|
did_request_refresh(u64 page_id) =|
did_paint(u64 page_id, Gfx::IntRect content_rect, i32 bitmap_id) =|
did_request_cursor_change(u64 page_id, i32 cursor_type) =|
did_layout(u64 page_id, Gfx::IntSize content_size) =|
did_change_title(u64 page_id, ByteString title) =|
did_request_scroll(u64 page_id, i32 x_delta, i32 y_delta) =|
did_request_scroll_to(u64 page_id, Gfx::IntPoint scroll_position) =|
did_enter_tooltip_area(u64 page_id, Gfx::IntPoint content_position, ByteString title) =|
did_leave_tooltip_area(u64 page_id) =|
did_hover_link(u64 page_id, URL url) =|
did_unhover_link(u64 page_id) =|
did_click_link(u64 page_id, URL url, ByteString target, unsigned modifiers) =|
did_middle_click_link(u64 page_id, URL url, ByteString target, unsigned modifiers) =|
did_request_context_menu(u64 page_id, Gfx::IntPoint content_position) =|
did_request_link_context_menu(u64 page_id, Gfx::IntPoint content_position, URL url, ByteString target, unsigned modifiers) =|
did_request_image_context_menu(u64 page_id, Gfx::IntPoint content_position, URL url, ByteString target, unsigned modifiers, Gfx::ShareableBitmap bitmap) =|
did_request_media_context_menu(u64 page_id, Gfx::IntPoint content_position, ByteString target, unsigned modifiers, Web::Page::MediaContextMenu menu) =|
did_request_alert(u64 page_id, String message) =|
did_request_confirm(u64 page_id, String message) =|
did_request_prompt(u64 page_id, String message, String default_) =|
did_request_set_prompt_text(u64 page_id, String message) =|
did_request_accept_dialog(u64 page_id) =|
did_request_dismiss_dialog(u64 page_id) =|
did_get_source(u64 page_id, URL url, ByteString source) =|
did_inspect_dom_tree(ByteString dom_tree) =|
did_inspect_dom_node(bool has_style, ByteString computed_style, ByteString resolved_style, ByteString custom_properties, ByteString node_box_sizing, ByteString aria_properties_state) =|
did_inspect_accessibility_tree(ByteString accessibility_tree) =|
did_get_hovered_node_id(i32 node_id) =|
did_finish_editing_dom_node(Optional<i32> node_id) =|
did_get_dom_node_html(String html) =|
did_inspect_dom_tree(u64 page_id, ByteString dom_tree) =|
did_inspect_dom_node(u64 page_id, bool has_style, ByteString computed_style, ByteString resolved_style, ByteString custom_properties, ByteString node_box_sizing, ByteString aria_properties_state) =|
did_inspect_accessibility_tree(u64 page_id, ByteString accessibility_tree) =|
did_get_hovered_node_id(u64 page_id, i32 node_id) =|
did_finish_editing_dom_node(u64 page_id, Optional<i32> node_id) =|
did_get_dom_node_html(u64 page_id, String html) =|
did_take_screenshot(Gfx::ShareableBitmap screenshot) =|
did_take_screenshot(u64 page_id, Gfx::ShareableBitmap screenshot) =|
did_change_favicon(Gfx::ShareableBitmap favicon) =|
did_request_all_cookies(URL url) => (Vector<Web::Cookie::Cookie> cookies)
did_request_named_cookie(URL url, String name) => (Optional<Web::Cookie::Cookie> cookie)
did_request_cookie(URL url, Web::Cookie::Source source) => (String cookie)
did_set_cookie(URL url, Web::Cookie::ParsedCookie cookie, Web::Cookie::Source source) => ()
did_update_cookie(Web::Cookie::Cookie cookie) =|
did_update_resource_count(i32 count_waiting) =|
did_request_new_web_view(Web::HTML::ActivateTab activate_tab, Web::HTML::WebViewHints hints, Optional<u64> page_index) => (String handle)
did_request_activate_tab() =|
did_close_browsing_context() =|
did_request_restore_window() =|
did_request_reposition_window(Gfx::IntPoint position) => (Gfx::IntPoint window_position)
did_request_resize_window(Gfx::IntSize size) => (Gfx::IntSize window_size)
did_request_maximize_window() => (Gfx::IntRect window_rect)
did_request_minimize_window() => (Gfx::IntRect window_rect)
did_request_fullscreen_window() => (Gfx::IntRect window_rect)
did_request_file(ByteString path, i32 request_id) =|
did_request_color_picker(Color current_color) =|
did_request_select_dropdown(Gfx::IntPoint content_position, i32 minimum_width, Vector<Web::HTML::SelectItem> items) =|
did_finish_handling_input_event(bool event_was_accepted) =|
did_change_theme_color(Gfx::Color color) =|
did_insert_clipboard_entry(String data, String presentation_style, String mime_type) =|
did_change_favicon(u64 page_id, Gfx::ShareableBitmap favicon) =|
did_request_all_cookies(u64 page_id, URL url) => (Vector<Web::Cookie::Cookie> cookies)
did_request_named_cookie(u64 page_id, URL url, String name) => (Optional<Web::Cookie::Cookie> cookie)
did_request_cookie(u64 page_id, URL url, Web::Cookie::Source source) => (String cookie)
did_set_cookie(u64 page_id, URL url, Web::Cookie::ParsedCookie cookie, Web::Cookie::Source source) => ()
did_update_cookie(u64 page_id, Web::Cookie::Cookie cookie) =|
did_update_resource_count(u64 page_id, i32 count_waiting) =|
did_request_new_web_view(u64 page_id, Web::HTML::ActivateTab activate_tab, Web::HTML::WebViewHints hints, Optional<u64> page_index) => (String handle)
did_request_activate_tab(u64 page_id) =|
did_close_browsing_context(u64 page_id) =|
did_request_restore_window(u64 page_id) =|
did_request_reposition_window(u64 page_id, Gfx::IntPoint position) => (Gfx::IntPoint window_position)
did_request_resize_window(u64 page_id, Gfx::IntSize size) => (Gfx::IntSize window_size)
did_request_maximize_window(u64 page_id) => (Gfx::IntRect window_rect)
did_request_minimize_window(u64 page_id) => (Gfx::IntRect window_rect)
did_request_fullscreen_window(u64 page_id) => (Gfx::IntRect window_rect)
did_request_file(u64 page_id, ByteString path, i32 request_id) =|
did_request_color_picker(u64 page_id, Color current_color) =|
did_request_select_dropdown(u64 page_id, Gfx::IntPoint content_position, i32 minimum_width, Vector<Web::HTML::SelectItem> items) =|
did_finish_handling_input_event(u64 page_id, bool event_was_accepted) =|
did_change_theme_color(u64 page_id, Gfx::Color color) =|
did_insert_clipboard_entry(u64 page_id, String data, String presentation_style, String mime_type) =|
did_output_js_console_message(i32 message_index) =|
did_get_js_console_messages(i32 start_index, Vector<ByteString> message_types, Vector<ByteString> messages) =|
did_output_js_console_message(u64 page_id, i32 message_index) =|
did_get_js_console_messages(u64 page_id, i32 start_index, Vector<ByteString> message_types, Vector<ByteString> messages) =|
did_finish_text_test() =|
did_finish_text_test(u64 page_id) =|
request_worker_agent() => (WebView::SocketPair sockets) // FIXME: Add required attributes to select a SharedWorker Agent
request_worker_agent(u64 page_id) => (WebView::SocketPair sockets) // FIXME: Add required attributes to select a SharedWorker Agent
inspector_did_load() =|
inspector_did_select_dom_node(i32 node_id, Optional<Web::CSS::Selector::PseudoElement::Type> pseudo_element) =|
inspector_did_set_dom_node_text(i32 node_id, String text) =|
inspector_did_set_dom_node_tag(i32 node_id, String tag) =|
inspector_did_add_dom_node_attributes(i32 node_id, Vector<WebView::Attribute> attributes) =|
inspector_did_replace_dom_node_attribute(i32 node_id, String name, Vector<WebView::Attribute> replacement_attributes) =|
inspector_did_request_dom_tree_context_menu(i32 node_id, Gfx::IntPoint position, String type, Optional<String> tag, Optional<WebView::Attribute> attribute) =|
inspector_did_execute_console_script(String script) =|
inspector_did_load(u64 page_id) =|
inspector_did_select_dom_node(u64 page_id, i32 node_id, Optional<Web::CSS::Selector::PseudoElement::Type> pseudo_element) =|
inspector_did_set_dom_node_text(u64 page_id, i32 node_id, String text) =|
inspector_did_set_dom_node_tag(u64 page_id, i32 node_id, String tag) =|
inspector_did_add_dom_node_attributes(u64 page_id, i32 node_id, Vector<WebView::Attribute> attributes) =|
inspector_did_replace_dom_node_attribute(u64 page_id, i32 node_id, String name, Vector<WebView::Attribute> replacement_attributes) =|
inspector_did_request_dom_tree_context_menu(u64 page_id, i32 node_id, Gfx::IntPoint position, String type, Optional<String> tag, Optional<WebView::Attribute> attribute) =|
inspector_did_execute_console_script(u64 page_id, String script) =|
}

View file

@ -6,7 +6,6 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "WebContentConsoleClient.h"
#include <AK/StringBuilder.h>
#include <AK/TemporaryChange.h>
#include <LibJS/MarkupGenerator.h>
@ -20,10 +19,12 @@
#include <LibWeb/HTML/Scripting/Environments.h>
#include <LibWeb/HTML/Window.h>
#include <WebContent/ConsoleGlobalEnvironmentExtensions.h>
#include <WebContent/PageClient.h>
#include <WebContent/WebContentConsoleClient.h>
namespace WebContent {
WebContentConsoleClient::WebContentConsoleClient(JS::Console& console, JS::Realm& realm, ConnectionFromClient& client)
WebContentConsoleClient::WebContentConsoleClient(JS::Console& console, JS::Realm& realm, PageClient& client)
: ConsoleClient(console)
, m_client(client)
{
@ -58,25 +59,25 @@ void WebContentConsoleClient::report_exception(JS::Error const& exception, bool
void WebContentConsoleClient::print_html(ByteString const& line)
{
m_message_log.append({ .type = ConsoleOutput::Type::HTML, .data = line });
m_client.async_did_output_js_console_message(m_message_log.size() - 1);
m_client.did_output_js_console_message(m_message_log.size() - 1);
}
void WebContentConsoleClient::clear_output()
{
m_message_log.append({ .type = ConsoleOutput::Type::Clear, .data = "" });
m_client.async_did_output_js_console_message(m_message_log.size() - 1);
m_client.did_output_js_console_message(m_message_log.size() - 1);
}
void WebContentConsoleClient::begin_group(ByteString const& label, bool start_expanded)
{
m_message_log.append({ .type = start_expanded ? ConsoleOutput::Type::BeginGroup : ConsoleOutput::Type::BeginGroupCollapsed, .data = label });
m_client.async_did_output_js_console_message(m_message_log.size() - 1);
m_client.did_output_js_console_message(m_message_log.size() - 1);
}
void WebContentConsoleClient::end_group()
{
m_message_log.append({ .type = ConsoleOutput::Type::EndGroup, .data = "" });
m_client.async_did_output_js_console_message(m_message_log.size() - 1);
m_client.did_output_js_console_message(m_message_log.size() - 1);
}
void WebContentConsoleClient::send_messages(i32 start_index)
@ -88,7 +89,7 @@ void WebContentConsoleClient::send_messages(i32 start_index)
// then, by requesting with start_index=0. If we don't have any messages at all, that
// is still a valid request, and we can just ignore it.
if (start_index != 0)
m_client.did_misbehave("Requested non-existent console message index.");
m_client.console_peer_did_misbehave("Requested non-existent console message index.");
return;
}
@ -121,7 +122,7 @@ void WebContentConsoleClient::send_messages(i32 start_index)
messages.append(message.data);
}
m_client.async_did_get_js_console_messages(start_index, message_types, messages);
m_client.did_get_js_console_messages(start_index, message_types, messages);
}
void WebContentConsoleClient::clear()

View file

@ -8,10 +8,12 @@
#pragma once
#include "ConnectionFromClient.h"
#include <AK/Vector.h>
#include <AK/Weakable.h>
#include <LibJS/Console.h>
#include <LibJS/Forward.h>
#include <LibWeb/Forward.h>
#include <WebContent/ConsoleGlobalEnvironmentExtensions.h>
#include <WebContent/Forward.h>
namespace WebContent {
@ -19,7 +21,7 @@ namespace WebContent {
class WebContentConsoleClient final : public JS::ConsoleClient
, public Weakable<WebContentConsoleClient> {
public:
WebContentConsoleClient(JS::Console&, JS::Realm&, ConnectionFromClient&);
WebContentConsoleClient(JS::Console&, JS::Realm&, PageClient&);
void handle_input(ByteString const& js_source);
void send_messages(i32 start_index);
@ -35,7 +37,7 @@ private:
m_current_message_style.append(';');
}
ConnectionFromClient& m_client;
PageClient& m_client;
JS::Handle<ConsoleGlobalEnvironmentExtensions> m_console_global_environment_extensions;
void clear_output();

View file

@ -11,96 +11,96 @@
endpoint WebContentServer
{
get_window_handle() => (String handle)
set_window_handle(String handle) =|
get_window_handle(u64 page_id) => (String handle)
set_window_handle(u64 page_id, String handle) =|
connect_to_webdriver(ByteString webdriver_ipc_path) =|
connect_to_webdriver(u64 page_id, ByteString webdriver_ipc_path) =|
update_system_theme(Core::AnonymousBuffer theme_buffer) =|
update_system_fonts(ByteString default_font_query, ByteString fixed_width_font_query, ByteString window_title_font_query) =|
update_screen_rects(Vector<Web::DevicePixelRect> rects, u32 main_screen_index) =|
update_system_theme(u64 page_id, Core::AnonymousBuffer theme_buffer) =|
update_system_fonts(u64 page_id, ByteString default_font_query, ByteString fixed_width_font_query, ByteString window_title_font_query) =|
update_screen_rects(u64 page_id, Vector<Web::DevicePixelRect> rects, u32 main_screen_index) =|
load_url(URL url) =|
load_html(ByteString html) =|
load_url(u64 page_id, URL url) =|
load_html(u64 page_id, ByteString html) =|
add_backing_store(i32 front_bitmap_id, Gfx::ShareableBitmap front_bitmap, i32 back_bitmap_id, Gfx::ShareableBitmap back_bitmap) =|
ready_to_paint() =|
add_backing_store(u64 page_id, i32 front_bitmap_id, Gfx::ShareableBitmap front_bitmap, i32 back_bitmap_id, Gfx::ShareableBitmap back_bitmap) =|
ready_to_paint(u64 page_id) =|
set_viewport_rect(Web::DevicePixelRect rect) =|
set_viewport_rect(u64 page_id, Web::DevicePixelRect rect) =|
mouse_down(Web::DevicePixelPoint position, Web::DevicePixelPoint screen_position, u32 button, u32 buttons, u32 modifiers) =|
mouse_move(Web::DevicePixelPoint position, Web::DevicePixelPoint screen_position, u32 button, u32 buttons, u32 modifiers) =|
mouse_up(Web::DevicePixelPoint position, Web::DevicePixelPoint screen_position, u32 button, u32 buttons, u32 modifiers) =|
mouse_wheel(Web::DevicePixelPoint position, Web::DevicePixelPoint screen_position, u32 button, u32 buttons, u32 modifiers, Web::DevicePixels wheel_delta_x, Web::DevicePixels wheel_delta_y) =|
doubleclick(Web::DevicePixelPoint position, Web::DevicePixelPoint screen_position, u32 button, u32 buttons, u32 modifiers) =|
mouse_down(u64 page_id, Web::DevicePixelPoint position, Web::DevicePixelPoint screen_position, u32 button, u32 buttons, u32 modifiers) =|
mouse_move(u64 page_id, Web::DevicePixelPoint position, Web::DevicePixelPoint screen_position, u32 button, u32 buttons, u32 modifiers) =|
mouse_up(u64 page_id, Web::DevicePixelPoint position, Web::DevicePixelPoint screen_position, u32 button, u32 buttons, u32 modifiers) =|
mouse_wheel(u64 page_id, Web::DevicePixelPoint position, Web::DevicePixelPoint screen_position, u32 button, u32 buttons, u32 modifiers, Web::DevicePixels wheel_delta_x, Web::DevicePixels wheel_delta_y) =|
doubleclick(u64 page_id, Web::DevicePixelPoint position, Web::DevicePixelPoint screen_position, u32 button, u32 buttons, u32 modifiers) =|
key_down(i32 key, u32 modifiers, u32 code_point) =|
key_up(i32 key, u32 modifiers, u32 code_point) =|
key_down(u64 page_id, i32 key, u32 modifiers, u32 code_point) =|
key_up(u64 page_id, i32 key, u32 modifiers, u32 code_point) =|
debug_request(ByteString request, ByteString argument) =|
get_source() =|
inspect_dom_tree() =|
inspect_dom_node(i32 node_id, Optional<Web::CSS::Selector::PseudoElement::Type> pseudo_element) =|
inspect_accessibility_tree() =|
get_hovered_node_id() =|
js_console_input(ByteString js_source) =|
js_console_request_messages(i32 start_index) =|
debug_request(u64 page_id, ByteString request, ByteString argument) =|
get_source(u64 page_id) =|
inspect_dom_tree(u64 page_id) =|
inspect_dom_node(u64 page_id, i32 node_id, Optional<Web::CSS::Selector::PseudoElement::Type> pseudo_element) =|
inspect_accessibility_tree(u64 page_id) =|
get_hovered_node_id(u64 page_id) =|
js_console_input(u64 page_id, ByteString js_source) =|
js_console_request_messages(u64 page_id, i32 start_index) =|
set_dom_node_text(i32 node_id, String text) =|
set_dom_node_tag(i32 node_id, String name) =|
add_dom_node_attributes(i32 node_id, Vector<WebView::Attribute> attributes) =|
replace_dom_node_attribute(i32 node_id, String name, Vector<WebView::Attribute> replacement_attributes) =|
create_child_element(i32 node_id) =|
create_child_text_node(i32 node_id) =|
clone_dom_node(i32 node_id) =|
remove_dom_node(i32 node_id) =|
get_dom_node_html(i32 node_id) =|
set_dom_node_text(u64 page_id, i32 node_id, String text) =|
set_dom_node_tag(u64 page_id, i32 node_id, String name) =|
add_dom_node_attributes(u64 page_id, i32 node_id, Vector<WebView::Attribute> attributes) =|
replace_dom_node_attribute(u64 page_id, i32 node_id, String name, Vector<WebView::Attribute> replacement_attributes) =|
create_child_element(u64 page_id, i32 node_id) =|
create_child_text_node(u64 page_id, i32 node_id) =|
clone_dom_node(u64 page_id, i32 node_id) =|
remove_dom_node(u64 page_id, i32 node_id) =|
get_dom_node_html(u64 page_id, i32 node_id) =|
take_document_screenshot() =|
take_dom_node_screenshot(i32 node_id) =|
take_document_screenshot(u64 page_id) =|
take_dom_node_screenshot(u64 page_id, i32 node_id) =|
dump_gc_graph() => (String json)
dump_gc_graph(u64 page_id) => (String json)
run_javascript(ByteString js_source) =|
run_javascript(u64 page_id, ByteString js_source) =|
dump_layout_tree() => (ByteString dump)
dump_paint_tree() => (ByteString dump)
dump_text() => (ByteString dump)
dump_layout_tree(u64 page_id) => (ByteString dump)
dump_paint_tree(u64 page_id) => (ByteString dump)
dump_text(u64 page_id) => (ByteString dump)
get_selected_text() => (ByteString selection)
select_all() =|
get_selected_text(u64 page_id) => (ByteString selection)
select_all(u64 page_id) =|
set_content_filters(Vector<String> filters) =|
set_autoplay_allowed_on_all_websites() =|
set_autoplay_allowlist(Vector<String> allowlist) =|
set_proxy_mappings(Vector<ByteString> proxies, HashMap<ByteString,size_t> mappings) =|
set_preferred_color_scheme(Web::CSS::PreferredColorScheme color_scheme) =|
set_has_focus(bool has_focus) =|
set_is_scripting_enabled(bool is_scripting_enabled) =|
set_device_pixels_per_css_pixel(float device_pixels_per_css_pixel) =|
set_content_filters(u64 page_id, Vector<String> filters) =|
set_autoplay_allowed_on_all_websites(u64 page_id) =|
set_autoplay_allowlist(u64 page_id, Vector<String> allowlist) =|
set_proxy_mappings(u64 page_id, Vector<ByteString> proxies, HashMap<ByteString,size_t> mappings) =|
set_preferred_color_scheme(u64 page_id, Web::CSS::PreferredColorScheme color_scheme) =|
set_has_focus(u64 page_id, bool has_focus) =|
set_is_scripting_enabled(u64 page_id, bool is_scripting_enabled) =|
set_device_pixels_per_css_pixel(u64 page_id, float device_pixels_per_css_pixel) =|
set_window_position(Web::DevicePixelPoint position) =|
set_window_size(Web::DevicePixelSize size) =|
set_window_position(u64 page_id, Web::DevicePixelPoint position) =|
set_window_size(u64 page_id, Web::DevicePixelSize size) =|
get_local_storage_entries() => (OrderedHashMap<String,String> entries)
get_session_storage_entries() => (OrderedHashMap<String,String> entries)
get_local_storage_entries(u64 page_id) => (OrderedHashMap<String,String> entries)
get_session_storage_entries(u64 page_id) => (OrderedHashMap<String,String> entries)
handle_file_return(i32 error, Optional<IPC::File> file, i32 request_id) =|
handle_file_return(u64 page_id, i32 error, Optional<IPC::File> file, i32 request_id) =|
set_system_visibility_state(bool visible) =|
set_system_visibility_state(u64 page_id, bool visible) =|
alert_closed() =|
confirm_closed(bool accepted) =|
prompt_closed(Optional<String> response) =|
color_picker_update(Optional<Color> picked_color, Web::HTML::ColorPickerUpdateState state) =|
select_dropdown_closed(Optional<String> value) =|
alert_closed(u64 page_id) =|
confirm_closed(u64 page_id, bool accepted) =|
prompt_closed(u64 page_id, Optional<String> response) =|
color_picker_update(u64 page_id, Optional<Color> picked_color, Web::HTML::ColorPickerUpdateState state) =|
select_dropdown_closed(u64 page_id, Optional<String> value) =|
toggle_media_play_state() =|
toggle_media_mute_state() =|
toggle_media_loop_state() =|
toggle_media_controls_state() =|
toggle_media_play_state(u64 page_id) =|
toggle_media_mute_state(u64 page_id) =|
toggle_media_loop_state(u64 page_id) =|
toggle_media_controls_state(u64 page_id) =|
set_user_style(String source) =|
set_user_style(u64 page_id, String source) =|
enable_inspector_prototype() =|
enable_inspector_prototype(u64 page_id) =|
}