1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 09:04:59 +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

View file

@ -42,9 +42,9 @@ OutOfProcessWebView::OutOfProcessWebView()
auto file = FileSystemAccessClient::Client::the().request_file_read_only_approved(window(), path);
if (file.is_error())
client().async_handle_file_return(file.error().code(), {}, request_id);
client().async_handle_file_return(m_client_state.page_index, file.error().code(), {}, request_id);
else
client().async_handle_file_return(0, IPC::File(file.value().stream()), request_id);
client().async_handle_file_return(m_client_state.page_index, 0, IPC::File(file.value().stream()), request_id);
};
on_scroll_by_delta = [this](auto x_delta, auto y_delta) {
@ -95,16 +95,16 @@ void OutOfProcessWebView::initialize_client(WebView::ViewImplementation::CreateN
};
m_client_state.client_handle = Web::Crypto::generate_random_uuid().release_value_but_fixme_should_propagate_errors();
client().async_set_window_handle(m_client_state.client_handle);
client().async_set_window_handle(m_client_state.page_index, m_client_state.client_handle);
client().async_update_system_theme(Gfx::current_system_theme_buffer());
client().async_update_system_fonts(Gfx::FontDatabase::default_font_query(), Gfx::FontDatabase::fixed_width_font_query(), Gfx::FontDatabase::window_title_font_query());
client().async_update_system_theme(m_client_state.page_index, Gfx::current_system_theme_buffer());
client().async_update_system_fonts(m_client_state.page_index, Gfx::FontDatabase::default_font_query(), Gfx::FontDatabase::fixed_width_font_query(), Gfx::FontDatabase::window_title_font_query());
Vector<Web::DevicePixelRect> screen_rects;
for (auto const& screen_rect : GUI::Desktop::the().rects()) {
screen_rects.append(screen_rect.to_type<Web::DevicePixels>());
}
client().async_update_screen_rects(screen_rects, GUI::Desktop::the().main_screen_index());
client().async_update_screen_rects(m_client_state.page_index, screen_rects, GUI::Desktop::the().main_screen_index());
}
void OutOfProcessWebView::paint_event(GUI::PaintEvent& event)
@ -141,7 +141,7 @@ void OutOfProcessWebView::paint_event(GUI::PaintEvent& event)
void OutOfProcessWebView::resize_event(GUI::ResizeEvent& event)
{
Super::resize_event(event);
client().async_set_viewport_rect(Web::DevicePixelRect({ horizontal_scrollbar().value(), vertical_scrollbar().value() }, available_size()));
client().async_set_viewport_rect(m_client_state.page_index, Web::DevicePixelRect({ horizontal_scrollbar().value(), vertical_scrollbar().value() }, available_size()));
handle_resize();
}
@ -162,7 +162,7 @@ Gfx::IntPoint OutOfProcessWebView::to_widget_position(Gfx::IntPoint content_posi
void OutOfProcessWebView::update_zoom()
{
client().async_set_device_pixels_per_css_pixel(m_device_pixel_ratio * m_zoom_level);
client().async_set_device_pixels_per_css_pixel(m_client_state.page_index, m_device_pixel_ratio * m_zoom_level);
// FIXME: Refactor this into separate update_viewport_rect() + request_repaint() like in Ladybird
handle_resize();
}
@ -213,7 +213,7 @@ void OutOfProcessWebView::doubleclick_event(GUI::MouseEvent& event)
void OutOfProcessWebView::theme_change_event(GUI::ThemeChangeEvent& event)
{
Super::theme_change_event(event);
client().async_update_system_theme(Gfx::current_system_theme_buffer());
client().async_update_system_theme(m_client_state.page_index, Gfx::current_system_theme_buffer());
}
void OutOfProcessWebView::screen_rects_change_event(GUI::ScreenRectsChangeEvent& event)
@ -222,77 +222,77 @@ void OutOfProcessWebView::screen_rects_change_event(GUI::ScreenRectsChangeEvent&
for (auto const& screen_rect : event.rects()) {
screen_rects.append(screen_rect.to_type<Web::DevicePixels>());
}
client().async_update_screen_rects(screen_rects, event.main_screen_index());
client().async_update_screen_rects(m_client_state.page_index, screen_rects, event.main_screen_index());
}
void OutOfProcessWebView::did_scroll()
{
client().async_set_viewport_rect(visible_content_rect().to_type<Web::DevicePixels>());
client().async_set_viewport_rect(m_client_state.page_index, visible_content_rect().to_type<Web::DevicePixels>());
}
ByteString OutOfProcessWebView::dump_layout_tree()
{
return client().dump_layout_tree();
return client().dump_layout_tree(m_client_state.page_index);
}
OrderedHashMap<String, String> OutOfProcessWebView::get_local_storage_entries()
{
return client().get_local_storage_entries();
return client().get_local_storage_entries(m_client_state.page_index);
}
OrderedHashMap<String, String> OutOfProcessWebView::get_session_storage_entries()
{
return client().get_session_storage_entries();
return client().get_session_storage_entries(m_client_state.page_index);
}
void OutOfProcessWebView::set_content_filters(Vector<String> filters)
{
client().async_set_content_filters(move(filters));
client().async_set_content_filters(m_client_state.page_index, move(filters));
}
void OutOfProcessWebView::set_autoplay_allowed_on_all_websites()
{
client().async_set_autoplay_allowed_on_all_websites();
client().async_set_autoplay_allowed_on_all_websites(m_client_state.page_index);
}
void OutOfProcessWebView::set_autoplay_allowlist(Vector<String> allowlist)
{
client().async_set_autoplay_allowlist(move(allowlist));
client().async_set_autoplay_allowlist(m_client_state.page_index, move(allowlist));
}
void OutOfProcessWebView::set_proxy_mappings(Vector<ByteString> proxies, HashMap<ByteString, size_t> mappings)
{
client().async_set_proxy_mappings(move(proxies), move(mappings));
client().async_set_proxy_mappings(m_client_state.page_index, move(proxies), move(mappings));
}
void OutOfProcessWebView::connect_to_webdriver(ByteString const& webdriver_ipc_path)
{
client().async_connect_to_webdriver(webdriver_ipc_path);
client().async_connect_to_webdriver(m_client_state.page_index, webdriver_ipc_path);
}
void OutOfProcessWebView::set_window_position(Gfx::IntPoint position)
{
client().async_set_window_position(position.to_type<Web::DevicePixels>());
client().async_set_window_position(m_client_state.page_index, position.to_type<Web::DevicePixels>());
}
void OutOfProcessWebView::set_window_size(Gfx::IntSize size)
{
client().async_set_window_size(size.to_type<Web::DevicePixels>());
client().async_set_window_size(m_client_state.page_index, size.to_type<Web::DevicePixels>());
}
void OutOfProcessWebView::focusin_event(GUI::FocusEvent&)
{
client().async_set_has_focus(true);
client().async_set_has_focus(m_client_state.page_index, true);
}
void OutOfProcessWebView::focusout_event(GUI::FocusEvent&)
{
client().async_set_has_focus(false);
client().async_set_has_focus(m_client_state.page_index, false);
}
void OutOfProcessWebView::set_system_visibility_state(bool visible)
{
client().async_set_system_visibility_state(visible);
client().async_set_system_visibility_state(m_client_state.page_index, visible);
}
void OutOfProcessWebView::show_event(GUI::ShowEvent&)
@ -328,10 +328,10 @@ void OutOfProcessWebView::process_next_input_event()
[this](GUI::KeyEvent const& event) {
switch (event.type()) {
case GUI::Event::Type::KeyDown:
client().async_key_down(event.key(), event.modifiers(), event.code_point());
client().async_key_down(m_client_state.page_index, event.key(), event.modifiers(), event.code_point());
break;
case GUI::Event::Type::KeyUp:
client().async_key_up(event.key(), event.modifiers(), event.code_point());
client().async_key_up(m_client_state.page_index, event.key(), event.modifiers(), event.code_point());
break;
default:
dbgln("Unrecognized key event type in OOPWV input event queue: {}", event.type());
@ -343,22 +343,22 @@ void OutOfProcessWebView::process_next_input_event()
auto screen_position = (event.position() + (window()->position() + relative_position())).to_type<Web::DevicePixels>();
switch (event.type()) {
case GUI::Event::Type::MouseDown:
client().async_mouse_down(position, screen_position, event.button(), event.buttons(), event.modifiers());
client().async_mouse_down(m_client_state.page_index, position, screen_position, event.button(), event.buttons(), event.modifiers());
break;
case GUI::Event::Type::MouseUp:
client().async_mouse_up(position, screen_position, event.button(), event.buttons(), event.modifiers());
client().async_mouse_up(m_client_state.page_index, position, screen_position, event.button(), event.buttons(), event.modifiers());
break;
case GUI::Event::Type::MouseMove:
client().async_mouse_move(position, screen_position, event.button(), event.buttons(), event.modifiers());
client().async_mouse_move(m_client_state.page_index, position, screen_position, event.button(), event.buttons(), event.modifiers());
break;
case GUI::Event::Type::MouseWheel: {
// FIXME: This wheel delta step size multiplier is used to remain the old scroll behaviour, in future use system step size.
constexpr int scroll_step_size = 24;
client().async_mouse_wheel(position, screen_position, event.button(), event.buttons(), event.modifiers(), event.wheel_delta_x() * scroll_step_size, event.wheel_delta_y() * scroll_step_size);
client().async_mouse_wheel(m_client_state.page_index, position, screen_position, event.button(), event.buttons(), event.modifiers(), event.wheel_delta_x() * scroll_step_size, event.wheel_delta_y() * scroll_step_size);
break;
}
case GUI::Event::Type::MouseDoubleClick:
client().async_doubleclick(position, screen_position, event.button(), event.buttons(), event.modifiers());
client().async_doubleclick(m_client_state.page_index, position, screen_position, event.button(), event.buttons(), event.modifiers());
break;
default:
dbgln("Unrecognized mouse event type in OOPWV input event queue: {}", event.type());

View file

@ -30,12 +30,18 @@ ViewImplementation::ViewImplementation()
auto file = Core::File::open(path, Core::File::OpenMode::Read);
if (file.is_error())
client().async_handle_file_return(file.error().code(), {}, request_id);
client().async_handle_file_return(page_id(), file.error().code(), {}, request_id);
else
client().async_handle_file_return(0, IPC::File(*file.value()), request_id);
client().async_handle_file_return(page_id(), 0, IPC::File(*file.value()), request_id);
};
}
ViewImplementation::~ViewImplementation()
{
if (m_client_state.client)
m_client_state.client->unregister_view(m_client_state.page_index);
}
WebContentClient& ViewImplementation::client()
{
VERIFY(m_client_state.client);
@ -48,6 +54,12 @@ WebContentClient const& ViewImplementation::client() const
return *m_client_state.client;
}
u64 ViewImplementation::page_id() const
{
VERIFY(m_client_state.client);
return m_client_state.page_index;
}
void ViewImplementation::server_did_paint(Badge<WebContentClient>, i32 bitmap_id, Gfx::IntSize size)
{
if (m_client_state.back_bitmap.id == bitmap_id) {
@ -59,18 +71,18 @@ void ViewImplementation::server_did_paint(Badge<WebContentClient>, i32 bitmap_id
on_ready_to_paint();
}
client().async_ready_to_paint();
client().async_ready_to_paint(page_id());
}
void ViewImplementation::load(AK::URL const& url)
{
m_url = url;
client().async_load_url(url);
client().async_load_url(page_id(), url);
}
void ViewImplementation::load_html(StringView html)
{
client().async_load_html(html);
client().async_load_html(page_id(), html);
}
void ViewImplementation::load_empty_document()
@ -102,12 +114,12 @@ void ViewImplementation::reset_zoom()
void ViewImplementation::set_preferred_color_scheme(Web::CSS::PreferredColorScheme color_scheme)
{
client().async_set_preferred_color_scheme(color_scheme);
client().async_set_preferred_color_scheme(page_id(), color_scheme);
}
ByteString ViewImplementation::selected_text()
{
return client().get_selected_text();
return client().get_selected_text(page_id());
}
Optional<String> ViewImplementation::selected_text_with_whitespace_collapsed()
@ -120,27 +132,27 @@ Optional<String> ViewImplementation::selected_text_with_whitespace_collapsed()
void ViewImplementation::select_all()
{
client().async_select_all();
client().async_select_all(page_id());
}
void ViewImplementation::get_source()
{
client().async_get_source();
client().async_get_source(page_id());
}
void ViewImplementation::inspect_dom_tree()
{
client().async_inspect_dom_tree();
client().async_inspect_dom_tree(page_id());
}
void ViewImplementation::inspect_dom_node(i32 node_id, Optional<Web::CSS::Selector::PseudoElement::Type> pseudo_element)
{
client().async_inspect_dom_node(node_id, move(pseudo_element));
client().async_inspect_dom_node(page_id(), node_id, move(pseudo_element));
}
void ViewImplementation::inspect_accessibility_tree()
{
client().async_inspect_accessibility_tree();
client().async_inspect_accessibility_tree(page_id());
}
void ViewImplementation::clear_inspected_dom_node()
@ -150,117 +162,117 @@ void ViewImplementation::clear_inspected_dom_node()
void ViewImplementation::get_hovered_node_id()
{
client().async_get_hovered_node_id();
client().async_get_hovered_node_id(page_id());
}
void ViewImplementation::set_dom_node_text(i32 node_id, String text)
{
client().async_set_dom_node_text(node_id, move(text));
client().async_set_dom_node_text(page_id(), node_id, move(text));
}
void ViewImplementation::set_dom_node_tag(i32 node_id, String name)
{
client().async_set_dom_node_tag(node_id, move(name));
client().async_set_dom_node_tag(page_id(), node_id, move(name));
}
void ViewImplementation::add_dom_node_attributes(i32 node_id, Vector<Attribute> attributes)
{
client().async_add_dom_node_attributes(node_id, move(attributes));
client().async_add_dom_node_attributes(page_id(), node_id, move(attributes));
}
void ViewImplementation::replace_dom_node_attribute(i32 node_id, String name, Vector<Attribute> replacement_attributes)
{
client().async_replace_dom_node_attribute(node_id, move(name), move(replacement_attributes));
client().async_replace_dom_node_attribute(page_id(), node_id, move(name), move(replacement_attributes));
}
void ViewImplementation::create_child_element(i32 node_id)
{
client().async_create_child_element(node_id);
client().async_create_child_element(page_id(), node_id);
}
void ViewImplementation::create_child_text_node(i32 node_id)
{
client().async_create_child_text_node(node_id);
client().async_create_child_text_node(page_id(), node_id);
}
void ViewImplementation::clone_dom_node(i32 node_id)
{
client().async_clone_dom_node(node_id);
client().async_clone_dom_node(page_id(), node_id);
}
void ViewImplementation::remove_dom_node(i32 node_id)
{
client().async_remove_dom_node(node_id);
client().async_remove_dom_node(page_id(), node_id);
}
void ViewImplementation::get_dom_node_html(i32 node_id)
{
client().async_get_dom_node_html(node_id);
client().async_get_dom_node_html(page_id(), node_id);
}
void ViewImplementation::debug_request(ByteString const& request, ByteString const& argument)
{
client().async_debug_request(request, argument);
client().async_debug_request(page_id(), request, argument);
}
void ViewImplementation::run_javascript(StringView js_source)
{
client().async_run_javascript(js_source);
client().async_run_javascript(page_id(), js_source);
}
void ViewImplementation::js_console_input(ByteString const& js_source)
{
client().async_js_console_input(js_source);
client().async_js_console_input(page_id(), js_source);
}
void ViewImplementation::js_console_request_messages(i32 start_index)
{
client().async_js_console_request_messages(start_index);
client().async_js_console_request_messages(page_id(), start_index);
}
void ViewImplementation::alert_closed()
{
client().async_alert_closed();
client().async_alert_closed(page_id());
}
void ViewImplementation::confirm_closed(bool accepted)
{
client().async_confirm_closed(accepted);
client().async_confirm_closed(page_id(), accepted);
}
void ViewImplementation::prompt_closed(Optional<String> response)
{
client().async_prompt_closed(move(response));
client().async_prompt_closed(page_id(), move(response));
}
void ViewImplementation::color_picker_update(Optional<Color> picked_color, Web::HTML::ColorPickerUpdateState state)
{
client().async_color_picker_update(picked_color, state);
client().async_color_picker_update(page_id(), picked_color, state);
}
void ViewImplementation::select_dropdown_closed(Optional<String> value)
{
client().async_select_dropdown_closed(value);
client().async_select_dropdown_closed(page_id(), value);
}
void ViewImplementation::toggle_media_play_state()
{
client().async_toggle_media_play_state();
client().async_toggle_media_play_state(page_id());
}
void ViewImplementation::toggle_media_mute_state()
{
client().async_toggle_media_mute_state();
client().async_toggle_media_mute_state(page_id());
}
void ViewImplementation::toggle_media_loop_state()
{
client().async_toggle_media_loop_state();
client().async_toggle_media_loop_state(page_id());
}
void ViewImplementation::toggle_media_controls_state()
{
client().async_toggle_media_controls_state();
client().async_toggle_media_controls_state(page_id());
}
void ViewImplementation::handle_resize()
@ -315,9 +327,9 @@ void ViewImplementation::resize_backing_stores_if_needed(WindowResizeInProgress
auto& back_bitmap = m_client_state.back_bitmap;
if (front_bitmap.id != old_front_bitmap_id || back_bitmap.id != old_back_bitmap_id) {
client().async_add_backing_store(front_bitmap.id, front_bitmap.bitmap->to_shareable_bitmap(), back_bitmap.id,
client().async_add_backing_store(page_id(), front_bitmap.id, front_bitmap.bitmap->to_shareable_bitmap(), back_bitmap.id,
back_bitmap.bitmap->to_shareable_bitmap());
client().async_set_viewport_rect(viewport_rect);
client().async_set_viewport_rect(page_id(), viewport_rect);
}
}
@ -397,7 +409,7 @@ NonnullRefPtr<Core::Promise<LexicalPath>> ViewImplementation::take_screenshot(Sc
case ScreenshotType::Full:
m_pending_screenshot = promise;
client().async_take_document_screenshot();
client().async_take_document_screenshot(page_id());
break;
}
@ -416,7 +428,7 @@ NonnullRefPtr<Core::Promise<LexicalPath>> ViewImplementation::take_dom_node_scre
}
m_pending_screenshot = promise;
client().async_take_dom_node_screenshot(node_id);
client().async_take_dom_node_screenshot(page_id(), node_id);
return promise;
}
@ -435,7 +447,7 @@ void ViewImplementation::did_receive_screenshot(Badge<WebContentClient>, Gfx::Sh
ErrorOr<LexicalPath> ViewImplementation::dump_gc_graph()
{
auto gc_graph_json = client().dump_gc_graph();
auto gc_graph_json = client().dump_gc_graph(page_id());
LexicalPath path { Core::StandardPaths::tempfile_directory() };
path = path.append(TRY(Core::DateTime::now().to_string("gc-graph-%Y-%m-%d-%H-%M-%S.json"sv)));
@ -448,7 +460,7 @@ ErrorOr<LexicalPath> ViewImplementation::dump_gc_graph()
void ViewImplementation::set_user_style_sheet(String source)
{
client().async_set_user_style(move(source));
client().async_set_user_style(page_id(), move(source));
}
void ViewImplementation::use_native_user_style_sheet()
@ -459,7 +471,7 @@ void ViewImplementation::use_native_user_style_sheet()
void ViewImplementation::enable_inspector_prototype()
{
client().async_enable_inspector_prototype();
client().async_enable_inspector_prototype(page_id());
}
}

View file

@ -25,7 +25,7 @@ namespace WebView {
class ViewImplementation {
public:
virtual ~ViewImplementation() { }
virtual ~ViewImplementation();
struct DOMNodeProperties {
String computed_style_json;
@ -192,6 +192,7 @@ protected:
WebContentClient& client();
WebContentClient const& client() const;
u64 page_id() const;
virtual void update_zoom() = 0;
enum class WindowResizeInProgress {

File diff suppressed because it is too large Load diff

View file

@ -26,82 +26,86 @@ class WebContentClient final
public:
WebContentClient(NonnullOwnPtr<Core::LocalSocket>, ViewImplementation&);
void register_view(u64 page_id, ViewImplementation&);
void unregister_view(u64 page_id);
Function<void()> on_web_content_process_crash;
private:
virtual void die() override;
virtual void did_paint(Gfx::IntRect const&, i32) override;
virtual void did_finish_loading(AK::URL const&) override;
virtual void did_request_navigate_back() override;
virtual void did_request_navigate_forward() override;
virtual void did_request_refresh() override;
virtual void did_request_cursor_change(i32) override;
virtual void did_layout(Gfx::IntSize) override;
virtual void did_change_title(ByteString const&) override;
virtual void did_request_scroll(i32, i32) override;
virtual void did_request_scroll_to(Gfx::IntPoint) override;
virtual void did_enter_tooltip_area(Gfx::IntPoint, ByteString const&) override;
virtual void did_leave_tooltip_area() override;
virtual void did_hover_link(AK::URL const&) override;
virtual void did_unhover_link() override;
virtual void did_click_link(AK::URL const&, ByteString const&, unsigned) override;
virtual void did_middle_click_link(AK::URL const&, ByteString const&, unsigned) override;
virtual void did_start_loading(AK::URL const&, bool) override;
virtual void did_request_context_menu(Gfx::IntPoint) override;
virtual void did_request_link_context_menu(Gfx::IntPoint, AK::URL const&, ByteString const&, unsigned) override;
virtual void did_request_image_context_menu(Gfx::IntPoint, AK::URL const&, ByteString const&, unsigned, Gfx::ShareableBitmap const&) override;
virtual void did_request_media_context_menu(Gfx::IntPoint, ByteString const&, unsigned, Web::Page::MediaContextMenu const&) override;
virtual void did_get_source(AK::URL const&, ByteString const&) override;
virtual void did_inspect_dom_tree(ByteString const&) override;
virtual void did_inspect_dom_node(bool has_style, ByteString const& computed_style, ByteString const& resolved_style, ByteString const& custom_properties, ByteString const& node_box_sizing, ByteString const& aria_properties_state) override;
virtual void did_inspect_accessibility_tree(ByteString const&) override;
virtual void did_get_hovered_node_id(i32 node_id) override;
virtual void did_finish_editing_dom_node(Optional<i32> const& node_id) override;
virtual void did_get_dom_node_html(String const& html) override;
virtual void did_take_screenshot(Gfx::ShareableBitmap const& screenshot) override;
virtual void did_output_js_console_message(i32 message_index) override;
virtual void did_get_js_console_messages(i32 start_index, Vector<ByteString> const& message_types, Vector<ByteString> const& messages) override;
virtual void did_change_favicon(Gfx::ShareableBitmap const&) override;
virtual void did_request_alert(String const&) override;
virtual void did_request_confirm(String const&) override;
virtual void did_request_prompt(String const&, String const&) override;
virtual void did_request_set_prompt_text(String const& message) override;
virtual void did_request_accept_dialog() override;
virtual void did_request_dismiss_dialog() override;
virtual Messages::WebContentClient::DidRequestAllCookiesResponse did_request_all_cookies(AK::URL const&) override;
virtual Messages::WebContentClient::DidRequestNamedCookieResponse did_request_named_cookie(AK::URL const&, String const&) override;
virtual Messages::WebContentClient::DidRequestCookieResponse did_request_cookie(AK::URL const&, Web::Cookie::Source) override;
virtual void did_set_cookie(AK::URL const&, Web::Cookie::ParsedCookie const&, Web::Cookie::Source) override;
virtual void did_update_cookie(Web::Cookie::Cookie const&) override;
virtual Messages::WebContentClient::DidRequestNewWebViewResponse did_request_new_web_view(Web::HTML::ActivateTab const&, Web::HTML::WebViewHints const&, Optional<u64> const& page_index) override;
virtual void did_request_activate_tab() override;
virtual void did_close_browsing_context() override;
virtual void did_update_resource_count(i32 count_waiting) override;
virtual void did_request_restore_window() override;
virtual Messages::WebContentClient::DidRequestRepositionWindowResponse did_request_reposition_window(Gfx::IntPoint) override;
virtual Messages::WebContentClient::DidRequestResizeWindowResponse did_request_resize_window(Gfx::IntSize) override;
virtual Messages::WebContentClient::DidRequestMaximizeWindowResponse did_request_maximize_window() override;
virtual Messages::WebContentClient::DidRequestMinimizeWindowResponse did_request_minimize_window() override;
virtual Messages::WebContentClient::DidRequestFullscreenWindowResponse did_request_fullscreen_window() override;
virtual void did_request_file(ByteString const& path, i32) override;
virtual void did_request_color_picker(Color const& current_color) override;
virtual void did_request_select_dropdown(Gfx::IntPoint content_position, i32 minimum_width, Vector<Web::HTML::SelectItem> const& items) override;
virtual void did_finish_handling_input_event(bool event_was_accepted) override;
virtual void did_finish_text_test() override;
virtual void did_change_theme_color(Gfx::Color color) override;
virtual void did_insert_clipboard_entry(String const& data, String const& presentation_style, String const& mime_type) override;
virtual void inspector_did_load() override;
virtual void inspector_did_select_dom_node(i32 node_id, Optional<Web::CSS::Selector::PseudoElement::Type> const& pseudo_element) override;
virtual void inspector_did_set_dom_node_text(i32 node_id, String const& text) override;
virtual void inspector_did_set_dom_node_tag(i32 node_id, String const& tag) override;
virtual void inspector_did_add_dom_node_attributes(i32 node_id, Vector<Attribute> const& attributes) override;
virtual void inspector_did_replace_dom_node_attribute(i32 node_id, String const& name, Vector<Attribute> const& replacement_attributes) override;
virtual void inspector_did_request_dom_tree_context_menu(i32 node_id, Gfx::IntPoint position, String const& type, Optional<String> const& tag, Optional<Attribute> const& attribute) override;
virtual void inspector_did_execute_console_script(String const& script) override;
virtual Messages::WebContentClient::RequestWorkerAgentResponse request_worker_agent() override;
virtual void did_paint(u64 page_id, Gfx::IntRect const&, i32) override;
virtual void did_finish_loading(u64 page_id, AK::URL const&) override;
virtual void did_request_navigate_back(u64 page_id) override;
virtual void did_request_navigate_forward(u64 page_id) override;
virtual void did_request_refresh(u64 page_id) override;
virtual void did_request_cursor_change(u64 page_id, i32) override;
virtual void did_layout(u64 page_id, Gfx::IntSize) override;
virtual void did_change_title(u64 page_id, ByteString const&) override;
virtual void did_request_scroll(u64 page_id, i32, i32) override;
virtual void did_request_scroll_to(u64 page_id, Gfx::IntPoint) override;
virtual void did_enter_tooltip_area(u64 page_id, Gfx::IntPoint, ByteString const&) override;
virtual void did_leave_tooltip_area(u64 page_id) override;
virtual void did_hover_link(u64 page_id, AK::URL const&) override;
virtual void did_unhover_link(u64 page_id) override;
virtual void did_click_link(u64 page_id, AK::URL const&, ByteString const&, unsigned) override;
virtual void did_middle_click_link(u64 page_id, AK::URL const&, ByteString const&, unsigned) override;
virtual void did_start_loading(u64 page_id, AK::URL const&, bool) override;
virtual void did_request_context_menu(u64 page_id, Gfx::IntPoint) override;
virtual void did_request_link_context_menu(u64 page_id, Gfx::IntPoint, AK::URL const&, ByteString const&, unsigned) override;
virtual void did_request_image_context_menu(u64 page_id, Gfx::IntPoint, AK::URL const&, ByteString const&, unsigned, Gfx::ShareableBitmap const&) override;
virtual void did_request_media_context_menu(u64 page_id, Gfx::IntPoint, ByteString const&, unsigned, Web::Page::MediaContextMenu const&) override;
virtual void did_get_source(u64 page_id, AK::URL const&, ByteString const&) override;
virtual void did_inspect_dom_tree(u64 page_id, ByteString const&) override;
virtual void did_inspect_dom_node(u64 page_id, bool has_style, ByteString const& computed_style, ByteString const& resolved_style, ByteString const& custom_properties, ByteString const& node_box_sizing, ByteString const& aria_properties_state) override;
virtual void did_inspect_accessibility_tree(u64 page_id, ByteString const&) override;
virtual void did_get_hovered_node_id(u64 page_id, i32 node_id) override;
virtual void did_finish_editing_dom_node(u64 page_id, Optional<i32> const& node_id) override;
virtual void did_get_dom_node_html(u64 page_id, String const& html) override;
virtual void did_take_screenshot(u64 page_id, Gfx::ShareableBitmap const& screenshot) override;
virtual void did_output_js_console_message(u64 page_id, i32 message_index) override;
virtual void did_get_js_console_messages(u64 page_id, i32 start_index, Vector<ByteString> const& message_types, Vector<ByteString> const& messages) override;
virtual void did_change_favicon(u64 page_id, Gfx::ShareableBitmap const&) override;
virtual void did_request_alert(u64 page_id, String const&) override;
virtual void did_request_confirm(u64 page_id, String const&) override;
virtual void did_request_prompt(u64 page_id, String const&, String const&) override;
virtual void did_request_set_prompt_text(u64 page_id, String const& message) override;
virtual void did_request_accept_dialog(u64 page_id) override;
virtual void did_request_dismiss_dialog(u64 page_id) override;
virtual Messages::WebContentClient::DidRequestAllCookiesResponse did_request_all_cookies(u64 page_id, AK::URL const&) override;
virtual Messages::WebContentClient::DidRequestNamedCookieResponse did_request_named_cookie(u64 page_id, AK::URL const&, String const&) override;
virtual Messages::WebContentClient::DidRequestCookieResponse did_request_cookie(u64 page_id, AK::URL const&, Web::Cookie::Source) override;
virtual void did_set_cookie(u64 page_id, AK::URL const&, Web::Cookie::ParsedCookie const&, Web::Cookie::Source) override;
virtual void did_update_cookie(u64 page_id, Web::Cookie::Cookie const&) override;
virtual Messages::WebContentClient::DidRequestNewWebViewResponse did_request_new_web_view(u64 page_id, Web::HTML::ActivateTab const&, Web::HTML::WebViewHints const&, Optional<u64> const& page_index) override;
virtual void did_request_activate_tab(u64 page_id) override;
virtual void did_close_browsing_context(u64 page_id) override;
virtual void did_update_resource_count(u64 page_id, i32 count_waiting) override;
virtual void did_request_restore_window(u64 page_id) override;
virtual Messages::WebContentClient::DidRequestRepositionWindowResponse did_request_reposition_window(u64 page_id, Gfx::IntPoint) override;
virtual Messages::WebContentClient::DidRequestResizeWindowResponse did_request_resize_window(u64 page_id, Gfx::IntSize) override;
virtual Messages::WebContentClient::DidRequestMaximizeWindowResponse did_request_maximize_window(u64 page_id) override;
virtual Messages::WebContentClient::DidRequestMinimizeWindowResponse did_request_minimize_window(u64 page_id) override;
virtual Messages::WebContentClient::DidRequestFullscreenWindowResponse did_request_fullscreen_window(u64 page_id) override;
virtual void did_request_file(u64 page_id, ByteString const& path, i32) override;
virtual void did_request_color_picker(u64 page_id, Color const& current_color) override;
virtual void did_request_select_dropdown(u64 page_id, Gfx::IntPoint content_position, i32 minimum_width, Vector<Web::HTML::SelectItem> const& items) override;
virtual void did_finish_handling_input_event(u64 page_id, bool event_was_accepted) override;
virtual void did_finish_text_test(u64 page_id) override;
virtual void did_change_theme_color(u64 page_id, Gfx::Color color) override;
virtual void did_insert_clipboard_entry(u64 page_id, String const& data, String const& presentation_style, String const& mime_type) override;
virtual void inspector_did_load(u64 page_id) override;
virtual void inspector_did_select_dom_node(u64 page_id, i32 node_id, Optional<Web::CSS::Selector::PseudoElement::Type> const& pseudo_element) override;
virtual void inspector_did_set_dom_node_text(u64 page_id, i32 node_id, String const& text) override;
virtual void inspector_did_set_dom_node_tag(u64 page_id, i32 node_id, String const& tag) override;
virtual void inspector_did_add_dom_node_attributes(u64 page_id, i32 node_id, Vector<Attribute> const& attributes) override;
virtual void inspector_did_replace_dom_node_attribute(u64 page_id, i32 node_id, String const& name, Vector<Attribute> const& replacement_attributes) override;
virtual void inspector_did_request_dom_tree_context_menu(u64 page_id, i32 node_id, Gfx::IntPoint position, String const& type, Optional<String> const& tag, Optional<Attribute> const& attribute) override;
virtual void inspector_did_execute_console_script(u64 page_id, String const& script) override;
virtual Messages::WebContentClient::RequestWorkerAgentResponse request_worker_agent(u64 page_id) override;
ViewImplementation& m_view;
// FIXME: Does a HashMap holding references make sense?
HashMap<u64, ViewImplementation*> m_views;
};
}