srctree

Robin Linden parent ab3b7af8 79584d0c
engine: Add plumbing for toggling whitespace collapsing

inlinesplit
engine/BUILD added: 46, removed: 5, total 41
@@ -27,6 +27,7 @@ cc_test(
copts = HASTUR_COPTS,
deps = [
":engine",
"//dom",
"//etest",
"//protocol",
"//uri",
 
engine/engine.cpp added: 46, removed: 5, total 41
@@ -63,6 +63,16 @@ void Engine::set_layout_width(int width) {
on_layout_update_();
}
 
void Engine::set_whitespace_mode(layout::WhitespaceMode mode) {
whitespace_mode_ = mode;
if (!styled_) {
return;
}
 
layout_ = layout::create_layout(*styled_, layout_width_, mode);
on_layout_update_();
}
 
void Engine::on_navigation_success() {
dom_ = html::parse(response_.body);
stylesheet_ = css::default_style();
@@ -147,7 +157,7 @@ void Engine::on_navigation_success() {
 
spdlog::info("Styling dom w/ {} rules", stylesheet_.size());
styled_ = style::style_tree(dom_.html_node, stylesheet_, {.window_width = layout_width_});
layout_ = layout::create_layout(*styled_, layout_width_);
layout_ = layout::create_layout(*styled_, layout_width_, whitespace_mode_);
on_page_loaded_();
}
 
 
engine/engine.h added: 46, removed: 5, total 41
@@ -29,6 +29,8 @@ public:
protocol::Error navigate(uri::Uri uri);
 
void set_layout_width(int width);
void set_whitespace_mode(layout::WhitespaceMode);
layout::WhitespaceMode whitespace_mode() const { return whitespace_mode_; }
 
void set_on_navigation_failure(auto cb) { on_navigation_failure_ = std::move(cb); }
void set_on_page_loaded(auto cb) { on_page_loaded_ = std::move(cb); }
@@ -49,6 +51,7 @@ private:
}};
 
int layout_width_{};
layout::WhitespaceMode whitespace_mode_{layout::WhitespaceMode::Collapse};
 
std::unique_ptr<protocol::IProtocolHandler> protocol_handler_{};
 
 
engine/engine_test.cpp added: 46, removed: 5, total 41
@@ -4,6 +4,7 @@
 
#include "engine/engine.h"
 
#include "dom/dom.h"
#include "etest/etest.h"
#include "protocol/iprotocol_handler.h"
#include "protocol/response.h"
@@ -393,5 +394,31 @@ int main() {
expect_eq(e.navigate(uri::Uri::parse("hax://example.com")), protocol::Error::InvalidResponse);
});
 
etest::test("whitespace mode", [] {
engine::Engine e{std::make_unique<FakeProtocolHandler>(std::map<std::string, Response>{
{"hax://example.com", Response{Error::Ok, {.status_code = 200}, {}, "<p> hello </p>"}},
})};
 
// Check that the engine is happy changing this even without a page loaded.
e.set_whitespace_mode(layout::WhitespaceMode::Preserve);
expect_eq(e.whitespace_mode(), layout::WhitespaceMode::Preserve);
 
e.navigate(uri::Uri::parse("hax://example.com"));
 
e.set_whitespace_mode(layout::WhitespaceMode::Collapse);
expect_eq(e.whitespace_mode(), layout::WhitespaceMode::Collapse);
 
auto const *p = dom::nodes_by_xpath(*e.layout(), "/html/body/p").at(0);
auto text = p->children.at(0).children.at(0).layout_text; // anon block -> text
expect_eq(std::get<std::string_view>(text), "hello"sv);
 
e.set_whitespace_mode(layout::WhitespaceMode::Preserve);
expect_eq(e.whitespace_mode(), layout::WhitespaceMode::Preserve);
 
p = dom::nodes_by_xpath(*e.layout(), "/html/body/p").at(0);
text = p->children.at(0).children.at(0).layout_text; // anon block -> text
expect_eq(std::get<std::string_view>(text), " hello "sv);
});
 
return etest::run_all_tests();
}