litehtml
litehtml copied to clipboard
Litehtml in Claws-mail takes ages parsing a specific HTML e-mail
The following file is HTML (github won't let me attach as .html) extracted from an e-mail. a.txt
When opening it in claws-mail with the litehtml viewer, it takes ages (several minutes!) to show anything, and the mail client looks like it's hung. When opening it in litebrowser, it's faster, but still seems to take a long time. Is there a chance that you could investigate on your end if anything might explain why it's so slow?
The claws-mail stack trace looks as follows:
#1 0x00007cb77410aef2 in litehtml::render_item_inline_context::place_inline
(this=this@entry=0x61f5674ae310, item=std::unique_ptr<litehtml::line_box_item> = {...}, self_size=..., fmt_ctx=fmt_ctx@entry=0x7ffcda7c3a10)
at litehtml/render_inline_context.cpp:286
#2 0x00007cb77410f04a in operator() (item_type=<optimized out>, el=<optimized out>, __closure=<optimized out>)
at litehtml/render_inline_context.cpp:52
#3 std::__invoke_impl<void, litehtml::render_item_inline_context::_render_content(int, int, bool, const litehtml::containing_block_context&, litehtml
::formatting_context*)::<lambda(const std::shared_ptr<litehtml::render_item>&, litehtml::iterator_item_type)>&, std::shared_ptr<litehtml::render_item>
&, litehtml::iterator_item_type> (__f=<optimized out>) at /usr/include/c++/13.2.1/bits/invoke.h:61
#4 std::__invoke_r<void, litehtml::render_item_inline_context::_render_content(int, int, bool, const litehtml::containing_block_context&, litehtml::f
ormatting_context*)::<lambda(const std::shared_ptr<litehtml::render_item>&, litehtml::iterator_item_type)>&, std::shared_ptr<litehtml::render_item>&,
litehtml::iterator_item_type> (__fn=<optimized out>) at /usr/include/c++/13.2.1/bits/invoke.h:150
#5 std::_Function_handler<void(std::shared_ptr<litehtml::render_item>&, litehtml::iterator_item_type), litehtml::render_item_inline_context::_render_
content(int, int, bool, const litehtml::containing_block_context&, litehtml::formatting_context*)::<lambda(const std::shared_ptr<litehtml::render_item
>&, litehtml::iterator_item_type)> >::_M_invoke(const std::_Any_data &, std::shared_ptr<litehtml::render_item> &, litehtml::iterator_item_type &&)
(__functor=<optimized out>, __args#0=<optimized out>, __args#1=<optimized out>) at /usr/include/c++/13.2.1/bits/std_function.h:290
#6 0x00007cb7740ff9e1 in std::function<void (std::shared_ptr<litehtml::render_item>&, litehtml::iterator_item_type)>::operator()(std::shared_ptr<lite
html::render_item>&, litehtml::iterator_item_type) const
(__args#1=<optimized out>, __args#0=std::shared_ptr<litehtml::render_item> (use count 3, weak count 2) = {...}, this=0x7ffcda7c3860)
at /usr/include/c++/13.2.1/bits/std_function.h:591
#7 litehtml::elements_iterator::process(std::shared_ptr<litehtml::render_item> const&, std::function<void (std::shared_ptr<litehtml::render_item>&, l
itehtml::iterator_item_type)> const&) (this=0x7ffcda7c3820, container=<optimized out>, func=...) at litehtml/iterators.cpp:42
#8 0x00007cb77410ecee in litehtml::render_item_inline_context::_render_content
(this=0x61f5674ae310, x=<optimized out>, y=<optimized out>, second_pass=<optimized out>, self_size=..., fmt_ctx=<optimized out>)
at litehtml/render_inline_context.cpp:26
#9 0x00007cb77410e7d4 in litehtml::render_item_block::_render
(this=0x61f5674ae310, x=0, y=0, containing_block_size=<optimized out>, fmt_ctx=0x7ffcda7c3a10, second_pass=true) at litehtml/render_block.cpp:205
#10 0x00007cb774109e65 in litehtml::render_item::render
(this=0x61f5674ae310, x=0, y=0, containing_block_size=..., fmt_ctx=<optimized out>, second_pass=true) at litehtml/render_item.cpp:50
#11 0x00007cb77411449c in litehtml::render_item_table::_render [770/1006]
(this=<optimized out>, x=0, y=0, containing_block_size=..., fmt_ctx=0x7ffcda7c3ee0, second_pass=<optimized out>) at litehtml/types.h:258
#12 0x00007cb774109db1 in litehtml::render_item::render
(this=0x61f56746e660, x=x@entry=0, y=y@entry=0, containing_block_size=..., fmt_ctx=fmt_ctx@entry=0x7ffcda7c3ee0, second_pass=second_pass@entry=fal
se) at litehtml/render_item.cpp:55
#13 0x00007cb77410a6fc in litehtml::render_item_block_context::_render_content
(this=0x61f5674ae100, x=<optimized out>, y=<optimized out>, second_pass=false, self_size=..., fmt_ctx=0x7ffcda7c3ee0) at litehtml/types.h:258
#14 0x00007cb77410e7d4 in litehtml::render_item_block::_render
(this=0x61f5674ae100, x=0, y=0, containing_block_size=<optimized out>, fmt_ctx=0x7ffcda7c3ee0, second_pass=false)
at litehtml/render_block.cpp:205
#15 0x00007cb774109e65 in litehtml::render_item::render
(this=0x61f5674ae100, x=0, y=0, containing_block_size=..., fmt_ctx=<optimized out>, second_pass=false) at litehtml/render_item.cpp:50
#16 0x00007cb774113c87 in litehtml::render_item_table::_render
(this=0x61f56746e250, x=0, y=0, containing_block_size=..., fmt_ctx=0x7ffcda7c43b0, second_pass=<optimized out>) at litehtml/types.h:258
#17 0x00007cb774109db1 in litehtml::render_item::render
(this=0x61f56746e250, x=x@entry=0, y=y@entry=0, containing_block_size=..., fmt_ctx=fmt_ctx@entry=0x7ffcda7c43b0, second_pass=second_pass@entry=fal
se) at litehtml/render_item.cpp:55
#18 0x00007cb77410a6fc in litehtml::render_item_block_context::_render_content
(this=0x61f5674ad040, x=<optimized out>, y=<optimized out>, second_pass=false, self_size=..., fmt_ctx=0x7ffcda7c43b0) at litehtml/types.h:258
#19 0x00007cb77410e7d4 in litehtml::render_item_block::_render
(this=0x61f5674ad040, x=0, y=0, containing_block_size=<optimized out>, fmt_ctx=0x7ffcda7c43b0, second_pass=false)
at litehtml/render_block.cpp:205
#20 0x00007cb774109e65 in litehtml::render_item::render
(this=0x61f5674ad040, x=0, y=0, containing_block_size=..., fmt_ctx=<optimized out>, second_pass=false) at litehtml/render_item.cpp:50
#21 0x00007cb774113d0b in litehtml::render_item_table::_render
(this=0x61f56749c8d0, x=0, y=0, containing_block_size=..., fmt_ctx=0x7ffcda7c4880, second_pass=<optimized out>) at litehtml/types.h:258
#22 0x00007cb774109db1 in litehtml::render_item::render
(this=0x61f56749c8d0, x=x@entry=0, y=y@entry=0, containing_block_size=..., fmt_ctx=fmt_ctx@entry=0x7ffcda7c4880, second_pass=second_pass@entry=fal
se) at litehtml/render_item.cpp:55
#23 0x00007cb77410a6fc in litehtml::render_item_block_context::_render_content
(this=0x61f5674ac1b0, x=<optimized out>, y=<optimized out>, second_pass=false, self_size=..., fmt_ctx=0x7ffcda7c4880) at litehtml/types.h:258
#24 0x00007cb77410e7d4 in litehtml::render_item_block::_render
(this=0x61f5674ac1b0, x=0, y=0, containing_block_size=<optimized out>, fmt_ctx=0x7ffcda7c4880, second_pass=false)
at litehtml/render_block.cpp:205
#25 0x00007cb774109e65 in litehtml::render_item::render
(this=0x61f5674ac1b0, x=0, y=0, containing_block_size=..., fmt_ctx=<optimized out>, second_pass=false) at litehtml/render_item.cpp:50
#26 0x00007cb774113d0b in litehtml::render_item_table::_render
(this=0x61f56746ca30, x=0, y=0, containing_block_size=..., fmt_ctx=0x7ffcda7c4d50, second_pass=<optimized out>) at litehtml/types.h:258
#27 0x00007cb774109db1 in litehtml::render_item::render
(this=0x61f56746ca30, x=x@entry=0, y=y@entry=0, containing_block_size=..., fmt_ctx=fmt_ctx@entry=0x7ffcda7c4d50, second_pass=second_pass@entry=fal
se) at litehtml/render_item.cpp:55
#28 0x00007cb77410a6fc in litehtml::render_item_block_context::_render_content
(this=0x61f5674abf10, x=<optimized out>, y=<optimized out>, second_pass=false, self_size=..., fmt_ctx=0x7ffcda7c4d50) at litehtml/types.h:258
#29 0x00007cb77410e7d4 in litehtml::render_item_block::_render
(this=0x61f5674abf10, x=0, y=0, containing_block_size=<optimized out>, fmt_ctx=0x7ffcda7c4d50, second_pass=false)
at litehtml/render_block.cpp:205
#30 0x00007cb774109e65 in litehtml::render_item::render
(this=0x61f5674abf10, x=0, y=0, containing_block_size=..., fmt_ctx=<optimized out>, second_pass=false) at litehtml/render_item.cpp:50
#31 0x00007cb774113c87 in litehtml::render_item_table::_render
(this=0x61f567462ce0, x=0, y=0, containing_block_size=..., fmt_ctx=0x7ffcda7c5220, second_pass=<optimized out>) at litehtml/types.h:258
#32 0x00007cb774109db1 in litehtml::render_item::render
(this=0x61f567462ce0, x=x@entry=0, y=y@entry=0, containing_block_size=..., fmt_ctx=fmt_ctx@entry=0x7ffcda7c5220, second_pass=second_pass@entry=fal
se) at litehtml/render_item.cpp:55
#33 0x00007cb77410a6fc in litehtml::render_item_block_context::_render_content
(this=0x61f5674a42c0, x=<optimized out>, y=<optimized out>, second_pass=false, self_size=..., fmt_ctx=0x7ffcda7c5220) at litehtml/types.h:258
#34 0x00007cb77410e7d4 in litehtml::render_item_block::_render
(this=0x61f5674a42c0, x=0, y=0, containing_block_size=<optimized out>, fmt_ctx=0x7ffcda7c5220, second_pass=false)
at litehtml/render_block.cpp:205
#35 0x00007cb774109e65 in litehtml::render_item::render
(this=0x61f5674a42c0, x=0, y=0, containing_block_size=..., fmt_ctx=<optimized out>, second_pass=false) at litehtml/render_item.cpp:50
#36 0x00007cb774113d0b in litehtml::render_item_table::_render
(this=0x61f5674618c0, x=0, y=0, containing_block_size=..., fmt_ctx=0x7ffcda7c56f0, second_pass=<optimized out>) at litehtml/types.h:258
#37 0x00007cb774109db1 in litehtml::render_item::render
(this=0x61f5674618c0, x=x@entry=0, y=y@entry=0, containing_block_size=..., fmt_ctx=fmt_ctx@entry=0x7ffcda7c56f0, second_pass=second_pass@entry=fal
se) at litehtml/render_item.cpp:55
#38 0x00007cb77410a6fc in litehtml::render_item_block_context::_render_content
(this=0x61f5674a37c0, x=<optimized out>, y=<optimized out>, second_pass=true, self_size=..., fmt_ctx=0x7ffcda7c56f0) at litehtml/types.h:258
#39 0x00007cb77410e7d4 in litehtml::render_item_block::_render
(this=0x61f5674a37c0, x=0, y=0, containing_block_size=<optimized out>, fmt_ctx=0x7ffcda7c56f0, second_pass=true) at litehtml/render_block.cpp:205
#40 0x00007cb774109e65 in litehtml::render_item::render
(this=0x61f5674a37c0, x=0, y=0, containing_block_size=..., fmt_ctx=<optimized out>, second_pass=true) at litehtml/render_item.cpp:50
#41 0x00007cb77411449c in litehtml::render_item_table::_render
(this=<optimized out>, x=0, y=0, containing_block_size=..., fmt_ctx=0x7ffcda7c5bc0, second_pass=<optimized out>) at litehtml/types.h:258
#42 0x00007cb774109db1 in litehtml::render_item::render
(this=0x61f567451950, x=x@entry=0, y=y@entry=0, containing_block_size=..., fmt_ctx=fmt_ctx@entry=0x7ffcda7c5bc0, second_pass=second_pass@entry=fal
se) at litehtml/render_item.cpp:55
#43 0x00007cb77410a6fc in litehtml::render_item_block_context::_render_content
(this=0x61f5674a2370, x=<optimized out>, y=<optimized out>, second_pass=false, self_size=..., fmt_ctx=0x7ffcda7c5bc0) at litehtml/types.h:258
#44 0x00007cb77410e7d4 in litehtml::render_item_block::_render
(this=0x61f5674a2370, x=0, y=0, containing_block_size=<optimized out>, fmt_ctx=0x7ffcda7c5bc0, second_pass=false)
at litehtml/render_block.cpp:205
#45 0x00007cb774109e65 in litehtml::render_item::render
(this=0x61f5674a2370, x=0, y=0, containing_block_size=..., fmt_ctx=<optimized out>, second_pass=false) at litehtml/render_item.cpp:50
#46 0x00007cb774113c87 in litehtml::render_item_table::_render
(this=0x61f567451410, x=0, y=0, containing_block_size=..., fmt_ctx=0x7ffcda7c6090, second_pass=<optimized out>) at litehtml/types.h:258
#47 0x00007cb774109db1 in litehtml::render_item::render
(this=0x61f567451410, x=x@entry=0, y=y@entry=0, containing_block_size=..., fmt_ctx=fmt_ctx@entry=0x7ffcda7c6090, second_pass=second_pass@entry=fal
se) at litehtml/render_item.cpp:55
#48 0x00007cb77410a6fc in litehtml::render_item_block_context::_render_content
(this=0x61f5674a1580, x=<optimized out>, y=<optimized out>, second_pass=false, self_size=..., fmt_ctx=0x7ffcda7c6090) at litehtml/types.h:258
#49 0x00007cb77410e7d4 in litehtml::render_item_block::_render
(this=0x61f5674a1580, x=0, y=0, containing_block_size=<optimized out>, fmt_ctx=0x7ffcda7c6090, second_pass=false)
at litehtml/render_block.cpp:205
#50 0x00007cb774109e65 in litehtml::render_item::render
(this=0x61f5674a1580, x=0, y=0, containing_block_size=..., fmt_ctx=<optimized out>, second_pass=false) at litehtml/render_item.cpp:50
#51 0x00007cb774113d0b in litehtml::render_item_table::_render
(this=0x61f567450ed0, x=0, y=0, containing_block_size=..., fmt_ctx=0x7ffcda7c6560, second_pass=<optimized out>) at litehtml/types.h:258
#52 0x00007cb774109db1 in litehtml::render_item::render
(this=0x61f567450ed0, x=x@entry=0, y=y@entry=0, containing_block_size=..., fmt_ctx=fmt_ctx@entry=0x7ffcda7c6560, second_pass=second_pass@entry=fal
se) at litehtml/render_item.cpp:55
#53 0x00007cb77410a6fc in litehtml::render_item_block_context::_render_content
(this=0x61f5674a1d20, x=<optimized out>, y=<optimized out>, second_pass=true, self_size=..., fmt_ctx=0x7ffcda7c6560) at litehtml/types.h:258
#54 0x00007cb77410e7d4 in litehtml::render_item_block::_render
(this=0x61f5674a1d20, x=0, y=0, containing_block_size=<optimized out>, fmt_ctx=0x7ffcda7c6560, second_pass=true) at litehtml/render_block.cpp:205
#55 0x00007cb774109e65 in litehtml::render_item::render
(this=0x61f5674a1d20, x=0, y=0, containing_block_size=..., fmt_ctx=<optimized out>, second_pass=true) at litehtml/render_item.cpp:50
#56 0x00007cb77411449c in litehtml::render_item_table::_render
(this=<optimized out>, x=0, y=0, containing_block_size=..., fmt_ctx=0x7ffcda7c6a30, second_pass=<optimized out>) at litehtml/types.h:258
#57 0x00007cb774109db1 in litehtml::render_item::render
(this=0x61f56744da20, x=x@entry=0, y=y@entry=0, containing_block_size=..., fmt_ctx=fmt_ctx@entry=0x7ffcda7c6a30, second_pass=second_pass@entry=fal
se) at litehtml/render_item.cpp:55
#58 0x00007cb77410a6fc in litehtml::render_item_block_context::_render_content
(this=0x61f5674a0350, x=<optimized out>, y=<optimized out>, second_pass=true, self_size=..., fmt_ctx=0x7ffcda7c6a30) at litehtml/types.h:258
#59 0x00007cb77410e7d4 in litehtml::render_item_block::_render
(this=0x61f5674a0350, x=0, y=0, containing_block_size=<optimized out>, fmt_ctx=0x7ffcda7c6a30, second_pass=true) at litehtml/render_block.cpp:205
#60 0x00007cb774109e65 in litehtml::render_item::render
(this=0x61f5674a0350, x=0, y=0, containing_block_size=..., fmt_ctx=<optimized out>, second_pass=true) at litehtml/render_item.cpp:50
#61 0x00007cb77411449c in litehtml::render_item_table::_render
(this=<optimized out>, x=0, y=0, containing_block_size=..., fmt_ctx=0x7ffcda7c6f00, second_pass=<optimized out>) at litehtml/types.h:258
#62 0x00007cb774109db1 in litehtml::render_item::render
(this=0x61f5670218e0, x=x@entry=0, y=y@entry=0, containing_block_size=..., fmt_ctx=fmt_ctx@entry=0x7ffcda7c6f00, second_pass=second_pass@entry=fal
se) at litehtml/render_item.cpp:55
#63 0x00007cb77410a6fc in litehtml::render_item_block_context::_render_content
(this=0x61f56749fbd0, x=<optimized out>, y=<optimized out>, second_pass=true, self_size=..., fmt_ctx=0x7ffcda7c6f00) at litehtml/types.h:258
#64 0x00007cb77410e7d4 in litehtml::render_item_block::_render
(this=0x61f56749fbd0, x=0, y=0, containing_block_size=<optimized out>, fmt_ctx=0x7ffcda7c6f00, second_pass=true) at litehtml/render_block.cpp:205
#65 0x00007cb774109e65 in litehtml::render_item::render
(this=0x61f56749fbd0, x=0, y=0, containing_block_size=..., fmt_ctx=<optimized out>, second_pass=true) at litehtml/render_item.cpp:50
#66 0x00007cb77411449c in litehtml::render_item_table::_render
(this=<optimized out>, x=0, y=0, containing_block_size=..., fmt_ctx=0x7ffcda7c73d0, second_pass=<optimized out>) at litehtml/types.h:258
#67 0x00007cb774109db1 in litehtml::render_item::render
(this=0x61f5673b7350, x=x@entry=0, y=y@entry=0, containing_block_size=..., fmt_ctx=fmt_ctx@entry=0x7ffcda7c73d0, second_pass=second_pass@entry=fal
se) at litehtml/render_item.cpp:55
#68 0x00007cb77410a6fc in litehtml::render_item_block_context::_render_content
(this=0x61f56749fac0, x=<optimized out>, y=<optimized out>, second_pass=true, self_size=..., fmt_ctx=0x7ffcda7c73d0) at litehtml/types.h:258
#69 0x00007cb77410e7d4 in litehtml::render_item_block::_render
(this=0x61f56749fac0, x=0, y=0, containing_block_size=<optimized out>, fmt_ctx=0x7ffcda7c73d0, second_pass=true) at litehtml/render_block.cpp:205
#70 0x00007cb774109e65 in litehtml::render_item::render
(this=0x61f56749fac0, x=0, y=0, containing_block_size=..., fmt_ctx=<optimized out>, second_pass=true) at litehtml/render_item.cpp:50
#71 0x00007cb77411449c in litehtml::render_item_table::_render
(this=<optimized out>, x=0, y=0, containing_block_size=..., fmt_ctx=0x7ffcda7c7b60, second_pass=<optimized out>) at litehtml/types.h:258
#72 0x00007cb774109db1 in litehtml::render_item::render
(this=0x61f56733a9f0, x=x@entry=0, y=y@entry=0, containing_block_size=..., fmt_ctx=fmt_ctx@entry=0x7ffcda7c7b60, second_pass=second_pass@entry=fal
se) at litehtml/render_item.cpp:55
#73 0x00007cb77410a6fc in litehtml::render_item_block_context::_render_content
(this=0x61f56749f110, x=<optimized out>, y=<optimized out>, second_pass=false, self_size=..., fmt_ctx=0x7ffcda7c7b60) at litehtml/types.h:258
#74 0x00007cb77410e7d4 in litehtml::render_item_block::_render
(this=0x61f56749f110, x=0, y=0, containing_block_size=<optimized out>, fmt_ctx=0x7ffcda7c7b60, second_pass=false)
at litehtml/render_block.cpp:205
#75 0x00007cb774109db1 in litehtml::render_item::render
(this=0x61f56749f110, x=x@entry=0, y=y@entry=0, containing_block_size=..., fmt_ctx=fmt_ctx@entry=0x7ffcda7c7b60, second_pass=second_pass@entry=fal
se) at litehtml/render_item.cpp:55
#76 0x00007cb77410a6fc in litehtml::render_item_block_context::_render_content
(this=0x61f56749efe0, x=<optimized out>, y=<optimized out>, second_pass=false, self_size=..., fmt_ctx=0x7ffcda7c7b60) at litehtml/types.h:258
#77 0x00007cb77410e7d4 in litehtml::render_item_block::_render
(this=0x61f56749efe0, x=0, y=0, containing_block_size=<optimized out>, fmt_ctx=0x7ffcda7c7b60, second_pass=false)
at litehtml/render_block.cpp:205
#78 0x00007cb774109e65 in litehtml::render_item::render
(this=0x61f56749efe0, x=0, y=0, containing_block_size=..., fmt_ctx=<optimized out>, second_pass=false) at litehtml/render_item.cpp:50
#79 0x00007cb7740e46b1 in litehtml::document::render (this=0x61f566925e20, max_width=1480, rt=litehtml::render_all) at litehtml/document.cpp:309
#80 0x00007cb7740dbc24 in lh_widget::redraw (this=this@entry=0x61f5667c9be0) at /usr/include/c++/13.2.1/bits/shared_ptr_base.h:1665
#81 0x00007cb7740dbe0a in draw_cb (widget=<optimized out>, cr=cr@entry=0x61f566fb4370, user_data=user_data@entry=0x61f5667c9be0)
at /usr/src/debug/claws-mail/claws-mail-4.2.0/src/plugins/litehtml_viewer/lh_widget.cpp:479```
Thanks
Looks like too many tables :( I'll try to do with this something. Thank you for reporting.
I just discovered your thread about this same problem that we are having in multiple versions of claws that has been haunting us for many months, including 3.20 (latest) I tried today. They are still using v0.7 and not v0.9, although I was told 0.9 is included in the GIT version. Here is more information where I posted on claws bugzilla: https://www.thewildbeast.co.uk/claws-mail/bugzilla/show_bug.cgi?id=4801
On that thread, I did post/attach one of the problematic mail messages I discovered, that others can use to see the problem on their own systems, which might be helpful. I can certainly provide others if needed.
I believe this is the reduction of broken_deident_email:
<table width="100%"><td>
<table width="100%"><td>
<table width="100%"><td>
<table width="100%"><td>
<table width="100%"><td>
<table width="100%"><td>
<table width="100%"><td>
<table width="100%"><td>
<table width="100%"><td>
<table width="100%"><td>
<table width="100%"><td>
Please bring your valid driver's license when you pick up the vehicle. If your driver's license is not issued in the US, then you must present your passport in addition to your driver's license.
doc->render
takes 48 ms on my machine, which is too much for such a simple layout. Table layout algorithm is too ineffective for deeply nested tables.
It is much worse without width="100%"
- 16 sec. (But all tables in broken_deident_email do have width="100%"
).
Original broken_deident_email takes 4 sec to doc->render.
So yeah, too many tables indeed.
I just discovered your thread about this same problem that we are having in multiple versions of claws that has been haunting us for many months, including 3.20 (latest) I tried today. They are still using v0.7 and not v0.9, although I was told 0.9 is included in the GIT version. Here is more information where I posted on claws bugzilla: https://www.thewildbeast.co.uk/claws-mail/bugzilla/show_bug.cgi?id=4801
On that thread, I did post/attach one of the problematic mail messages I discovered, that others can use to see the problem on their own systems, which might be helpful. I can certainly provide others if needed.
Just an update- we did compile the claws "git" version (master) and that does include litehtml v0.9 instead of v0.7 and it makes a HUGE improvement in rendering speed for the sample Email I provided (and that [stasoid] analyzed, above). More like 5 seconds instead of minutes. I agree that is still too slow, but it is way more tolerable :)
In our case, we likely can't really use the git version in production, so we probably have to wait for the next official release of claws. But better times await us, so that is great !
Anyway, I do want to thank the litehtml team for the good work they do.
Another update- A week ago we took our compiled litehtml plugin binaries (based on v0.9) from the git version of Claws and placed them into our production version of Claws 3.20... and it worked! So now things are rendering SO much faster, and yet inside a stable/released version of Claws. Testing over a week with 10 users has been perfect, so we will likely roll that change out for all users next week.