Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Litehtml in Claws-mail takes ages parsing a specific HTML e-mail #301

Open
sven337 opened this issue Feb 24, 2024 · 5 comments
Open

Litehtml in Claws-mail takes ages parsing a specific HTML e-mail #301

sven337 opened this issue Feb 24, 2024 · 5 comments
Labels

Comments

@sven337
Copy link

sven337 commented Feb 24, 2024

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
@tordex
Copy link
Member

tordex commented Mar 31, 2024

Looks like too many tables :( I'll try to do with this something. Thank you for reporting.

@tordex tordex added the ToDo label Mar 31, 2024
@freonheat
Copy link

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.

@stasoid
Copy link
Contributor

stasoid commented Apr 25, 2024

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.

@freonheat
Copy link

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.

@freonheat
Copy link

freonheat commented May 11, 2024

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants