Explorar o código

LibWeb+LibWebView+WebContent: Add an Inspector IPC to execute JavaScript

The Inspector will have an <input> element to execute user-provided JS.
This adds an IDL method and IPC to forward that JS from the Inspector
WebView to the Inspector client.
Timothy Flynn hai 1 ano
pai
achega
9f374a5d2a

+ 6 - 0
Userland/Libraries/LibWeb/Internals/Inspector.cpp

@@ -47,4 +47,10 @@ void Inspector::inspect_dom_node(i32 node_id, Optional<i32> const& pseudo_elemen
     }
 }
 
+void Inspector::execute_console_script(String const& script)
+{
+    if (auto* page = global_object().browsing_context()->page())
+        page->client().inspector_did_execute_console_script(script);
+}
+
 }

+ 2 - 0
Userland/Libraries/LibWeb/Internals/Inspector.h

@@ -21,6 +21,8 @@ public:
     void inspector_loaded();
     void inspect_dom_node(i32 node_id, Optional<i32> const& pseudo_element);
 
+    void execute_console_script(String const& script);
+
 private:
     explicit Inspector(JS::Realm&);
 

+ 2 - 0
Userland/Libraries/LibWeb/Internals/Inspector.idl

@@ -3,4 +3,6 @@
     undefined inspectorLoaded();
     undefined inspectDOMNode(long nodeID, optional long pseudoElement);
 
+    undefined executeConsoleScript(DOMString script);
+
 };

+ 1 - 0
Userland/Libraries/LibWeb/Page/Page.h

@@ -265,6 +265,7 @@ public:
 
     virtual void inspector_did_load() { }
     virtual void inspector_did_select_dom_node([[maybe_unused]] i32 node_id, [[maybe_unused]] Optional<CSS::Selector::PseudoElement> const& pseudo_element) { }
+    virtual void inspector_did_execute_console_script([[maybe_unused]] String const& script) { }
 
 protected:
     virtual ~PageClient() = default;

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

@@ -149,6 +149,7 @@ public:
     Function<void(String const&, String const&, String const&)> on_insert_clipboard_entry;
     Function<void()> on_inspector_loaded;
     Function<void(i32, Optional<Web::CSS::Selector::PseudoElement> const&)> on_inspector_selected_dom_node;
+    Function<void(String const&)> on_inspector_executed_console_script;
 
     virtual Gfx::IntRect viewport_rect() const = 0;
     virtual Gfx::IntPoint to_content_position(Gfx::IntPoint widget_position) const = 0;

+ 6 - 0
Userland/Libraries/LibWebView/WebContentClient.cpp

@@ -414,4 +414,10 @@ void WebContentClient::inspector_did_select_dom_node(i32 node_id, Optional<Web::
         m_view.on_inspector_selected_dom_node(node_id, pseudo_element);
 }
 
+void WebContentClient::inspector_did_execute_console_script(String const& script)
+{
+    if (m_view.on_inspector_executed_console_script)
+        m_view.on_inspector_executed_console_script(script);
+}
+
 }

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

@@ -88,6 +88,7 @@ private:
     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> const& pseudo_element) override;
+    virtual void inspector_did_execute_console_script(String const& script) override;
 
     ViewImplementation& m_view;
 };

+ 5 - 0
Userland/Services/WebContent/PageClient.cpp

@@ -508,6 +508,11 @@ void PageClient::inspector_did_select_dom_node(i32 node_id, Optional<Web::CSS::S
     client().async_inspector_did_select_dom_node(node_id, pseudo_element);
 }
 
+void PageClient::inspector_did_execute_console_script(String const& script)
+{
+    client().async_inspector_did_execute_console_script(script);
+}
+
 ErrorOr<void> PageClient::connect_to_webdriver(DeprecatedString const& webdriver_ipc_path)
 {
     VERIFY(!m_webdriver);

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

@@ -120,6 +120,7 @@ private:
     virtual void page_did_insert_clipboard_entry(String data, String presentation_style, String mime_type) override;
     virtual void inspector_did_load() override;
     virtual void inspector_did_select_dom_node(i32 node_id, Optional<Web::CSS::Selector::PseudoElement> const& pseudo_element) override;
+    virtual void inspector_did_execute_console_script(String const& script) override;
 
     Web::Layout::Viewport* layout_root();
     void setup_palette();

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

@@ -72,5 +72,6 @@ endpoint WebContentClient
 
     inspector_did_load() =|
     inspector_did_select_dom_node(i32 node_id, Optional<Web::CSS::Selector::PseudoElement> pseudo_element) =|
+    inspector_did_execute_console_script(String script) =|
 
 }