Skip to content

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

@sven337

Description

@sven337

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions