Procházet zdrojové kódy

WebContent+Friends: Add get_element_attribute IPC and plumbing

Tobias Christiansen před 2 roky
rodič
revize
3f5a620b5d

+ 4 - 0
Userland/Applications/Browser/BrowserWindow.cpp

@@ -590,6 +590,10 @@ void BrowserWindow::create_new_tab(URL url, bool activate)
         return active_tab().view().query_selector_all(start_node_id, selector);
     };
 
+    new_tab.on_get_element_attribute = [this](i32 element_id, String const& name) {
+        return active_tab().view().get_element_attribute(element_id, name);
+    };
+
     new_tab.load(url);
 
     dbgln_if(SPAM_DEBUG, "Added new tab {:p}, loading {}", &new_tab, url);

+ 1 - 0
Userland/Applications/Browser/Tab.h

@@ -70,6 +70,7 @@ public:
     Function<OrderedHashMap<String, String>()> on_get_session_storage_entries;
     Function<Optional<i32>()> on_get_document_element;
     Function<Optional<Vector<i32>>(i32 start_node_id, String const&)> on_query_selector_all;
+    Function<Optional<String>(i32 element_id, String const&)> on_get_element_attribute;
 
     enum class InspectorTarget {
         Document,

+ 5 - 0
Userland/Libraries/LibWebView/OutOfProcessWebView.cpp

@@ -525,6 +525,11 @@ Optional<Vector<i32>> OutOfProcessWebView::query_selector_all(i32 start_node_id,
     return client().query_selector_all(start_node_id, selector);
 }
 
+Optional<String> OutOfProcessWebView::get_element_attribute(i32 element_id, String const& name)
+{
+    return client().get_element_attribute(element_id, name);
+}
+
 void OutOfProcessWebView::set_content_filters(Vector<String> filters)
 {
     client().async_set_content_filters(filters);

+ 1 - 0
Userland/Libraries/LibWebView/OutOfProcessWebView.h

@@ -60,6 +60,7 @@ public:
 
     Optional<i32> get_document_element();
     Optional<Vector<i32>> query_selector_all(i32 start_node_id, String const& selector);
+    Optional<String> get_element_attribute(i32 element_id, String const& name);
 
     void set_content_filters(Vector<String>);
     void set_proxy_mappings(Vector<String> proxies, HashMap<String, size_t> mappings);

+ 17 - 0
Userland/Services/WebContent/ConnectionFromClient.cpp

@@ -473,6 +473,23 @@ Messages::WebContentServer::QuerySelectorAllResponse ConnectionFromClient::query
     return { return_list };
 }
 
+Messages::WebContentServer::GetElementAttributeResponse ConnectionFromClient::get_element_attribute(i32 element_id, String const& name)
+{
+    auto* node = Web::DOM::Node::from_id(element_id);
+    if (!node)
+        return Optional<String> {};
+
+    if (!node->is_element())
+        return Optional<String> {};
+
+    auto& element = verify_cast<Web::DOM::Element>(*node);
+
+    if (!element.has_attribute(name))
+        return Optional<String> {};
+
+    return { element.get_attribute(name) };
+}
+
 Messages::WebContentServer::GetSelectedTextResponse ConnectionFromClient::get_selected_text()
 {
     return page().focused_context().selected_text();

+ 1 - 0
Userland/Services/WebContent/ConnectionFromClient.h

@@ -81,6 +81,7 @@ private:
 
     virtual Messages::WebContentServer::GetDocumentElementResponse get_document_element() override;
     virtual Messages::WebContentServer::QuerySelectorAllResponse query_selector_all(i32 start_node_id, String const& selector) override;
+    virtual Messages::WebContentServer::GetElementAttributeResponse get_element_attribute(i32 element_id, String const& name) override;
 
     virtual Messages::WebContentServer::GetLocalStorageEntriesResponse get_local_storage_entries() override;
     virtual Messages::WebContentServer::GetSessionStorageEntriesResponse get_session_storage_entries() override;

+ 1 - 0
Userland/Services/WebContent/WebContentServer.ipc

@@ -39,6 +39,7 @@ endpoint WebContentServer
 
     get_document_element() => (Optional<i32> node_id)
     query_selector_all(i32 start_node_id, String selector) => (Optional<Vector<i32>> elements_ids)
+    get_element_attribute(i32 element_id, String name) => (Optional<String> attribute)
 
     run_javascript(String js_source) =|