mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 05:27:45 +00:00
LibWebView+WebContent: Make the DOM node editing IPCs async
All DOM node mutation IPCs now invoke an async completion IPC after the DOM is mutated. This allows consolidating where the Inspector updates its view and the selected DOM node. This also allows improving the response to removing a DOM node. We would previously just select the <body> tag after removing a DOM node because the Inspector client had no idea what node preceded the removed node. Now the WebContent process can just indicate what that node is. So now after removing a DOM node, we inspect either its previous sibling (if it had one) or its parent.
This commit is contained in:
parent
1eba170d03
commit
3572a047d1
9 changed files with 91 additions and 69 deletions
|
@ -93,6 +93,13 @@ InspectorClient::InspectorClient(ViewImplementation& content_web_view, ViewImple
|
|||
select_node(node_id);
|
||||
};
|
||||
|
||||
m_content_web_view.on_finshed_editing_dom_node = [this](auto const& node_id) {
|
||||
m_pending_selection = node_id;
|
||||
m_dom_tree_loaded = false;
|
||||
|
||||
inspect();
|
||||
};
|
||||
|
||||
m_content_web_view.on_received_console_message = [this](auto message_index) {
|
||||
handle_console_message(message_index);
|
||||
};
|
||||
|
@ -136,28 +143,18 @@ InspectorClient::InspectorClient(ViewImplementation& content_web_view, ViewImple
|
|||
|
||||
m_inspector_web_view.on_inspector_set_dom_node_text = [this](auto node_id, auto const& text) {
|
||||
m_content_web_view.set_dom_node_text(node_id, text);
|
||||
|
||||
m_pending_selection = node_id;
|
||||
inspect();
|
||||
};
|
||||
|
||||
m_inspector_web_view.on_inspector_set_dom_node_tag = [this](auto node_id, auto const& tag) {
|
||||
m_pending_selection = m_content_web_view.set_dom_node_tag(node_id, tag);
|
||||
inspect();
|
||||
m_content_web_view.set_dom_node_tag(node_id, tag);
|
||||
};
|
||||
|
||||
m_inspector_web_view.on_inspector_added_dom_node_attributes = [this](auto node_id, auto const& attributes) {
|
||||
m_content_web_view.add_dom_node_attributes(node_id, attributes);
|
||||
|
||||
m_pending_selection = node_id;
|
||||
inspect();
|
||||
};
|
||||
|
||||
m_inspector_web_view.on_inspector_replaced_dom_node_attribute = [this](auto node_id, auto const& name, auto const& replacement_attributes) {
|
||||
m_content_web_view.replace_dom_node_attribute(node_id, name, replacement_attributes);
|
||||
|
||||
m_pending_selection = node_id;
|
||||
inspect();
|
||||
};
|
||||
|
||||
m_inspector_web_view.on_inspector_executed_console_script = [this](auto const& script) {
|
||||
|
@ -268,9 +265,7 @@ void InspectorClient::context_menu_create_child_element()
|
|||
{
|
||||
VERIFY(m_context_menu_data.has_value());
|
||||
|
||||
m_pending_selection = m_content_web_view.create_child_element(m_context_menu_data->dom_node_id);
|
||||
inspect();
|
||||
|
||||
m_content_web_view.create_child_element(m_context_menu_data->dom_node_id);
|
||||
m_context_menu_data.clear();
|
||||
}
|
||||
|
||||
|
@ -278,9 +273,7 @@ void InspectorClient::context_menu_create_child_text_node()
|
|||
{
|
||||
VERIFY(m_context_menu_data.has_value());
|
||||
|
||||
m_pending_selection = m_content_web_view.create_child_text_node(m_context_menu_data->dom_node_id);
|
||||
inspect();
|
||||
|
||||
m_content_web_view.create_child_text_node(m_context_menu_data->dom_node_id);
|
||||
m_context_menu_data.clear();
|
||||
}
|
||||
|
||||
|
@ -288,9 +281,7 @@ void InspectorClient::context_menu_clone_dom_node()
|
|||
{
|
||||
VERIFY(m_context_menu_data.has_value());
|
||||
|
||||
m_pending_selection = m_content_web_view.clone_dom_node(m_context_menu_data->dom_node_id);
|
||||
inspect();
|
||||
|
||||
m_content_web_view.clone_dom_node(m_context_menu_data->dom_node_id);
|
||||
m_context_menu_data.clear();
|
||||
}
|
||||
|
||||
|
@ -299,10 +290,6 @@ void InspectorClient::context_menu_remove_dom_node()
|
|||
VERIFY(m_context_menu_data.has_value());
|
||||
|
||||
m_content_web_view.remove_dom_node(m_context_menu_data->dom_node_id);
|
||||
|
||||
m_pending_selection = m_body_node_id;
|
||||
inspect();
|
||||
|
||||
m_context_menu_data.clear();
|
||||
}
|
||||
|
||||
|
@ -322,10 +309,6 @@ void InspectorClient::context_menu_remove_dom_node_attribute()
|
|||
VERIFY(m_context_menu_data->attribute.has_value());
|
||||
|
||||
m_content_web_view.replace_dom_node_attribute(m_context_menu_data->dom_node_id, m_context_menu_data->attribute->name, {});
|
||||
|
||||
m_pending_selection = m_context_menu_data->dom_node_id;
|
||||
inspect();
|
||||
|
||||
m_context_menu_data.clear();
|
||||
}
|
||||
|
||||
|
|
|
@ -156,9 +156,9 @@ void ViewImplementation::set_dom_node_text(i32 node_id, String text)
|
|||
client().async_set_dom_node_text(node_id, move(text));
|
||||
}
|
||||
|
||||
Optional<i32> ViewImplementation::set_dom_node_tag(i32 node_id, String name)
|
||||
void ViewImplementation::set_dom_node_tag(i32 node_id, String name)
|
||||
{
|
||||
return client().set_dom_node_tag(node_id, move(name));
|
||||
client().async_set_dom_node_tag(node_id, move(name));
|
||||
}
|
||||
|
||||
void ViewImplementation::add_dom_node_attributes(i32 node_id, Vector<Attribute> attributes)
|
||||
|
@ -171,19 +171,19 @@ void ViewImplementation::replace_dom_node_attribute(i32 node_id, String name, Ve
|
|||
client().async_replace_dom_node_attribute(node_id, move(name), move(replacement_attributes));
|
||||
}
|
||||
|
||||
Optional<i32> ViewImplementation::create_child_element(i32 node_id)
|
||||
void ViewImplementation::create_child_element(i32 node_id)
|
||||
{
|
||||
return client().create_child_element(node_id);
|
||||
client().async_create_child_element(node_id);
|
||||
}
|
||||
|
||||
Optional<i32> ViewImplementation::create_child_text_node(i32 node_id)
|
||||
void ViewImplementation::create_child_text_node(i32 node_id)
|
||||
{
|
||||
return client().create_child_text_node(node_id);
|
||||
client().async_create_child_text_node(node_id);
|
||||
}
|
||||
|
||||
Optional<i32> ViewImplementation::clone_dom_node(i32 node_id)
|
||||
void ViewImplementation::clone_dom_node(i32 node_id)
|
||||
{
|
||||
return client().clone_dom_node(node_id);
|
||||
client().async_clone_dom_node(node_id);
|
||||
}
|
||||
|
||||
void ViewImplementation::remove_dom_node(i32 node_id)
|
||||
|
|
|
@ -65,12 +65,12 @@ public:
|
|||
void get_hovered_node_id();
|
||||
|
||||
void set_dom_node_text(i32 node_id, String text);
|
||||
Optional<i32> set_dom_node_tag(i32 node_id, String name);
|
||||
void set_dom_node_tag(i32 node_id, String name);
|
||||
void add_dom_node_attributes(i32 node_id, Vector<Attribute> attributes);
|
||||
void replace_dom_node_attribute(i32 node_id, String name, Vector<Attribute> replacement_attributes);
|
||||
Optional<i32> create_child_element(i32 node_id);
|
||||
Optional<i32> create_child_text_node(i32 node_id);
|
||||
Optional<i32> clone_dom_node(i32 node_id);
|
||||
void create_child_element(i32 node_id);
|
||||
void create_child_text_node(i32 node_id);
|
||||
void clone_dom_node(i32 node_id);
|
||||
void remove_dom_node(i32 node_id);
|
||||
Optional<String> get_dom_node_html(i32 node_id);
|
||||
|
||||
|
@ -144,6 +144,7 @@ public:
|
|||
Function<void(Optional<DOMNodeProperties>)> on_received_dom_node_properties;
|
||||
Function<void(ByteString const&)> on_received_accessibility_tree;
|
||||
Function<void(i32 node_id)> on_received_hovered_node_id;
|
||||
Function<void(Optional<i32> const& node_id)> on_finshed_editing_dom_node;
|
||||
Function<void(i32 message_id)> on_received_console_message;
|
||||
Function<void(i32 start_index, Vector<ByteString> const& message_types, Vector<ByteString> const& messages)> on_received_console_messages;
|
||||
Function<Vector<Web::Cookie::Cookie>(AK::URL const& url)> on_get_all_cookies;
|
||||
|
|
|
@ -219,6 +219,12 @@ void WebContentClient::did_get_hovered_node_id(i32 node_id)
|
|||
m_view.on_received_hovered_node_id(node_id);
|
||||
}
|
||||
|
||||
void WebContentClient::did_finish_editing_dom_node(Optional<i32> const& node_id)
|
||||
{
|
||||
if (m_view.on_finshed_editing_dom_node)
|
||||
m_view.on_finshed_editing_dom_node(node_id);
|
||||
}
|
||||
|
||||
void WebContentClient::did_output_js_console_message(i32 message_index)
|
||||
{
|
||||
if (m_view.on_received_console_message)
|
||||
|
|
|
@ -56,6 +56,7 @@ private:
|
|||
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_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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue