Explorar o código

WebContent+headless-browser: Use document.body.innerText for text tests

This should be less fickle than the "select all & copy selected text"
trick we were doing earlier.
Andreas Kling %!s(int64=2) %!d(string=hai) anos
pai
achega
097b5e4803

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

@@ -636,6 +636,16 @@ Messages::WebContentServer::DumpLayoutTreeResponse ConnectionFromClient::dump_la
     return builder.to_deprecated_string();
     return builder.to_deprecated_string();
 }
 }
 
 
+Messages::WebContentServer::DumpTextResponse ConnectionFromClient::dump_text()
+{
+    auto* document = page().top_level_browsing_context().active_document();
+    if (!document)
+        return DeprecatedString { "(no DOM tree)" };
+    if (!document->body())
+        return DeprecatedString { "(no body)" };
+    return document->body()->inner_text();
+}
+
 void ConnectionFromClient::set_content_filters(Vector<String> const& filters)
 void ConnectionFromClient::set_content_filters(Vector<String> const& filters)
 {
 {
     Web::ContentFilter::the().set_patterns(filters).release_value_but_fixme_should_propagate_errors();
     Web::ContentFilter::the().set_patterns(filters).release_value_but_fixme_should_propagate_errors();

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

@@ -74,6 +74,7 @@ private:
     virtual void inspect_accessibility_tree() override;
     virtual void inspect_accessibility_tree() override;
     virtual Messages::WebContentServer::GetHoveredNodeIdResponse get_hovered_node_id() override;
     virtual Messages::WebContentServer::GetHoveredNodeIdResponse get_hovered_node_id() override;
     virtual Messages::WebContentServer::DumpLayoutTreeResponse dump_layout_tree() override;
     virtual Messages::WebContentServer::DumpLayoutTreeResponse dump_layout_tree() override;
+    virtual Messages::WebContentServer::DumpTextResponse dump_text() override;
     virtual void set_content_filters(Vector<String> const&) override;
     virtual void set_content_filters(Vector<String> const&) override;
     virtual void set_autoplay_allowed_on_all_websites() override;
     virtual void set_autoplay_allowed_on_all_websites() override;
     virtual void set_autoplay_allowlist(Vector<String> const& allowlist) override;
     virtual void set_autoplay_allowlist(Vector<String> const& allowlist) override;

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

@@ -50,6 +50,7 @@ endpoint WebContentServer
     run_javascript(DeprecatedString js_source) =|
     run_javascript(DeprecatedString js_source) =|
 
 
     dump_layout_tree() => (DeprecatedString dump)
     dump_layout_tree() => (DeprecatedString dump)
+    dump_text() => (DeprecatedString dump)
 
 
     get_selected_text() => (DeprecatedString selection)
     get_selected_text() => (DeprecatedString selection)
     select_all() =|
     select_all() =|

+ 7 - 4
Userland/Utilities/headless-browser.cpp

@@ -80,6 +80,11 @@ public:
         return String::from_deprecated_string(client().dump_layout_tree());
         return String::from_deprecated_string(client().dump_layout_tree());
     }
     }
 
 
+    ErrorOr<String> dump_text()
+    {
+        return String::from_deprecated_string(client().dump_text());
+    }
+
 private:
 private:
     HeadlessWebContentView() = default;
     HeadlessWebContentView() = default;
 
 
@@ -191,8 +196,7 @@ static ErrorOr<String> run_one_test(HeadlessWebContentView& view, StringView inp
         };
         };
     } else if (mode == TestMode::Text) {
     } else if (mode == TestMode::Text) {
         view.on_load_finish = [&](auto const&) {
         view.on_load_finish = [&](auto const&) {
-            view.select_all();
-            result = String::from_utf8(view.selected_text()).release_value_but_fixme_should_propagate_errors();
+            result = view.dump_text().release_value_but_fixme_should_propagate_errors();
             loop.quit(0);
             loop.quit(0);
         };
         };
     }
     }
@@ -384,8 +388,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
         };
         };
     } else if (dump_text) {
     } else if (dump_text) {
         view->on_load_finish = [&](auto const&) {
         view->on_load_finish = [&](auto const&) {
-            view->select_all();
-            auto text = view->selected_text();
+            auto text = view->dump_text().release_value_but_fixme_should_propagate_errors();
 
 
             out("{}", text);
             out("{}", text);
             fflush(stdout);
             fflush(stdout);