From cc447c9c8053c91f9b6446336f67f0d6bf55b984 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Mon, 15 Jan 2024 11:28:21 +0100 Subject: [PATCH] LibWeb+WebContent: Move paint recording init into Navigable This refactoring makes WebContent less aware of LibWeb internals. The code that initializes paint recording commands now resides in `Navigable::paint()`. Additionally, we no longer need to reuse PaintContext across iframes, allowing us to avoid saving and restoring its state before recursing into an iframe. --- .../images/css-background-repeat-ref.png | Bin 4726 -> 42652 bytes Userland/Libraries/LibWeb/HTML/Navigable.cpp | 42 +++++++++++++++++ Userland/Libraries/LibWeb/HTML/Navigable.h | 7 +++ .../NestedBrowsingContextPaintable.cpp | 14 +++--- Userland/Services/WebContent/PageClient.cpp | 44 +++--------------- Userland/Services/WebContent/PageClient.h | 5 +- 6 files changed, 65 insertions(+), 47 deletions(-) diff --git a/Tests/LibWeb/Ref/reference/images/css-background-repeat-ref.png b/Tests/LibWeb/Ref/reference/images/css-background-repeat-ref.png index 6472b658db6513e8b5dbfac0fb3b7580502472a0..80a21b736a0db64d41e1b0f53ed91ba4dec91b16 100644 GIT binary patch literal 42652 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
    5m9*T?&X(~na2;U?d_dm z_}(6t^eu$2XNf_E}B_hBoId^;Ez82Xp5 zc)e?%#iP9)6}=s0)~g@hew1t>bF6H4?mS}+v)N~la-6jMTW5dlap9V<)wkoWWVz1q z6U-O<7!;k$!0;ond_QxMoc!dID$`CswRikvFR3Xh|N5)dx8HlGGBY%=mt2>f@cF`t z4>SChpZ#9BN9*w-jjnEMMN7Ts=hHUNIRE^5dP|2+^7vvi`cg?PnYRK#@!vxz%^`=Kt9qqqq8IPS)Gf9*&?uS%+uhXM z!)8lBJvfEgM%NiP9{hYVWzo-?ck>t*f=in_c?=sL2kyS>w>9dlEZ@15!_Q}*bz7G! z44OG>kmgqqvwG9ED*tTyoP&Mwp<1F_qjaB_!gpe7f76{&;CC%6d73<7#8?m_pT{Z1bG#YTJ}mu|N68(?}38v+O2ha zKW0pdp0v*U+SeR8;X}9{t_}gHn^Rf6DZkwcyx``)(3K4EOqA7U6MoP96k(4@SZaR*D5L5JS^K;GY%KIw8V zx&1k~bNInJW`V#b%rG$2Tz8JFdy%y@Xl+>V>Z?iDLGnyb z{>$*O`z{YIzx(bz`8oT{(9H(}b*m$jCQkqcce*aP!TQ z_1>{U@;9q*zb#7yU5y^Me)nbtP|9Hl(EA>EQRAWVw0o*Q_ldOa^k#2vd}L7u-iz6` z5Vnh|*UkBE-gWR^%-!GK&P>1ddaK#&UhWx(4uft*xAOF#B&Q5=`<+Yb)u2_u0>=XX z_)lW$WO6g$cF9SoW(v>}?@Z}`(09(y`7Fn_N%ssI6IqNJ_cDs|wk}R)=o1h;{p7FI ztjX_|te*GgJV(QqFX7U<)4gBMI+?QQYF29O=D77+Z{~=!DZ=(*&RX{JrfB^8AjOsU zr#~ysmSJ&JIRDv1syDAFL0Ing+izQ@-+aF2sFRi4QgP4o;AG0MWzBUH-{P{P>Hbxd zO=P@&*S=;qV|?^`-z1fZYv-Csc(gZvQGB`e;Wp4-P^Ks8n{Zzi@MzV__KcmLv;a4UsMNjLL0*$QpPD{B&^F(_j2paWJqmU zg0z>r)W}iD(cj21NG+UyVGvNL-+ceQsZ{Ts*I}!tN{NXnY^&RScb5Pt z;Y|P!U_R>N_ph29q7h;GC%VQ&iWfA1d9NvHV}uH50CR2F)x7PdGkx@S2iob&_Fvk) zIxq(K<@l4uHJL% z(V@?Kj(B#g-TeCZ-+fIA9{UyHJBtrJ0-sE<j&&i)@;zgF3rI^_rjX-&NoDF8|l z3@4@?SIC|6LDXyhq$10c--V}_S;@90zEC=t1l~lYSXOsS*3rs z*$f@OTq5Tt&$HyRXVt_nG8@2yuf4Hv<2SS&PJAUbyXs8Z<}0S3f8KFD^-}~?6z?d$ z54w>>Dp2P5$N7_wP2x6Y(h=CmXuzl;>Z){*qvYKVlXa4eQ@(6qG+>&^U{>(-*iqN? zlez**DRVy~@4zhmzEh*?(TlG8_LEX4-M;g=HsLZ(csg7`)Wfd_e@K;*y!Sdf&ccWnlPs zb=9go^>fqyOzN3<=I7eCRsPq!`c$fanlUi!$tfnPYJQL@{=2M$O@V_sp#-|mYObSk zr_sLeTr6D5e;XMXrdjqt2Qm+oMWsFaa^$koy88RoYj5{{TwCrk=jB$EV&Vxm@w-$@E%;=<`Pc^?=P+*l;JS5rxj5*iGzL#sKbLh* G2~7Z2|NSxm literal 4726 zcmeAS@N?(olHy`uVBq!ia0y~yV7SS^!1;lLnSp^pKe{B7fq@|*z$e6&;s1XI1_sek z5ct2C;Xebze@4dt{QUp_|Nqa$wSWKq^XJdMfB(Lrp`pIMUO+&=z`%f?pFci6e*XOV z_wV07aNvM~f`YxheSUtvzrVk}zJ7my|N8ao<>lpt!^4B3qOxX1IWjN^Ui5Tv45_&F z_V&fFTRGcVAM6WT?RH?&g{WJ zl`mtpXGy5PX50VzxPQ-NT`0YEspOA!^7bEBt(k3pe*dxapAKzZwx}~O{cmXGeI9FN ze*;6WZ>#^v{a7dL)AMVdtsUQ9?KufaJ!`bj9w?uil+?2(xBcFGKf{NX9B|J^+`Rg> zA*VV=)Nf8Gw?Te!uzIL^sQT5fJuslt;iDd^{xa@fq4ohtzVj%Li>)hJrnIau=`)y`!r0T@nguBmPZ>?EmnkpDm_C0rN zd+xtG7pL8CJ}tLx{@MQaXX{J$-kWEA?e}5BEpIHk-?mHq$jAxPKPl!}-)xeZ8XFaP zZ}CQ5-<(ME{CV?#MHa=J@7tvHdda5vr{$Nd&mTX&qzCfKznFH~tT%@_ zd$;Xc-PJ0ac-P#n**ndD%QBs&)9?1J{kGxkeCu1Estax&{9upORNOb7d!@i=ZU{U+=7!9@vML2+ zlIY2jpxE=Uy|GCp*J+WnXN%9jyhQ)^d;fVgLV|*VGi|1O ze(K5jVCyqi`25MXJfo|YALrz}*xY2L4tM;Cd){R`PKG=`5}mp}7o@=L=IYr#rG9&S zzx`4Ro-3R`>2LDnmFGIcQ}gentSWvKdQ;kb=Bqgs-ES=Z`Yy9lkF%G$zYU~+$9;vf z-tVI>9;A?pDiximYx61F;Z=V-SUV&lX{0pA8JG5Rc z@v~Ss`BuN*t0}@(EBC%w;%BvR@-1ujmrJS+IYUzkDEL=RhQL=q=3Os-UQ@$m=IlAY3%U+3ULlCoP{s!^lg3vAE#t&Qe&Zv8H z)W&n@#fv_EdJYnb}rW4&pzEY$9}dv|JnGLReNpA*L-hJ&bV19 zcAMYu!^InG;wI@%`p1@e>C~<*oA$UTN6)&kDes<*{nyP;cFdDa4ZY@>y8qPsCFS$_ z`#s;=?7pNjb?aKBL^?Ayd^@wys=#U6SZ8e8Svgq+9yYvk z_D2r5CvUFu+~)C1dWom@>r1CT$@S)DCY|0@`T5V4^OGJ|l}!naRG<1+YyaeXm3DS& zdq2PNnjCU%+q`CY>mqep>|H*O6>gEY;2D0i9XvsT@_QD?OusCXnSNO^GySp-EDlsR z?e|ePo#&%&dM7eo-SpmfA9d3?KI&6ptwKe6l3y@Z7JZL62+CmjoR?SrPAB-%y|!tpxrKvSzdd u9xZ_ #include #include +#include #include #include @@ -2032,4 +2033,45 @@ void Navigable::inform_the_navigation_api_about_aborting_navigation() }); } +void Navigable::paint(Painting::RecordingPainter& recording_painter, PaintConfig config) +{ + auto document = active_document(); + if (!document) + return; + + auto const& page = traversable_navigable()->page(); + auto viewport_rect = page.css_to_device_rect(this->viewport_rect()); + Gfx::IntRect bitmap_rect { {}, viewport_rect.size().to_type() }; + + document->update_layout(); + auto background_color = document->background_color(); + + recording_painter.fill_rect(bitmap_rect, background_color); + if (!document->paintable()) + return; + + Web::PaintContext context(recording_painter, page.palette(), page.client().device_pixels_per_css_pixel()); + context.set_device_viewport_rect(viewport_rect); + context.set_should_show_line_box_borders(config.should_show_line_box_borders); + context.set_should_paint_overlay(config.paint_overlay); + context.set_has_focus(config.has_focus); + + if (is_traversable()) { + document->paintable()->collect_scroll_frames(context); + } + + document->paintable()->paint_all_phases(context); + + // FIXME: Support scrollable frames inside iframes. + if (is_traversable()) { + Vector scroll_offsets_by_frame_id; + scroll_offsets_by_frame_id.resize(context.scroll_frames().size()); + for (auto [_, scrollable_frame] : context.scroll_frames()) + scroll_offsets_by_frame_id[scrollable_frame.id] = context.rounded_device_point( + scrollable_frame.offset) + .to_type(); + recording_painter.apply_scroll_offsets(scroll_offsets_by_frame_id); + } +} + } diff --git a/Userland/Libraries/LibWeb/HTML/Navigable.h b/Userland/Libraries/LibWeb/HTML/Navigable.h index 94827f7fa7..7de25ca6c9 100644 --- a/Userland/Libraries/LibWeb/HTML/Navigable.h +++ b/Userland/Libraries/LibWeb/HTML/Navigable.h @@ -170,6 +170,13 @@ public: [[nodiscard]] TargetSnapshotParams snapshot_target_snapshot_params(); + struct PaintConfig { + bool paint_overlay { false }; + bool should_show_line_box_borders { false }; + bool has_focus { false }; + }; + void paint(Painting::RecordingPainter&, PaintConfig); + protected: Navigable(); diff --git a/Userland/Libraries/LibWeb/Painting/NestedBrowsingContextPaintable.cpp b/Userland/Libraries/LibWeb/Painting/NestedBrowsingContextPaintable.cpp index c819a70a91..6850da2c69 100644 --- a/Userland/Libraries/LibWeb/Painting/NestedBrowsingContextPaintable.cpp +++ b/Userland/Libraries/LibWeb/Painting/NestedBrowsingContextPaintable.cpp @@ -41,25 +41,25 @@ void NestedBrowsingContextPaintable::paint(PaintContext& context, PaintPhase pha auto clip_rect = context.rounded_device_rect(absolute_rect); ScopedCornerRadiusClip corner_clip { context, clip_rect, normalized_border_radii_data(ShrinkRadiiForBorders::Yes) }; - auto* hosted_document = layout_box().dom_node().content_document_without_origin_check(); + auto const* hosted_document = layout_box().dom_node().content_document_without_origin_check(); if (!hosted_document) return; - auto* hosted_paint_tree = hosted_document->paintable(); + auto const* hosted_paint_tree = hosted_document->paintable(); if (!hosted_paint_tree) return; context.recording_painter().save(); - auto old_viewport_rect = context.device_viewport_rect(); context.recording_painter().add_clip_rect(clip_rect.to_type()); - auto absolute_device_rect = context.enclosing_device_rect(absolute_rect); context.recording_painter().translate(absolute_device_rect.x().value(), absolute_device_rect.y().value()); - context.set_device_viewport_rect({ {}, context.enclosing_device_size(layout_box().dom_node().content_navigable()->size()) }); - const_cast(hosted_paint_tree)->paint_all_phases(context); + HTML::Navigable::PaintConfig paint_config; + paint_config.paint_overlay = context.should_paint_overlay(); + paint_config.should_show_line_box_borders = context.should_show_line_box_borders(); + paint_config.has_focus = context.has_focus(); + const_cast(hosted_document)->navigable()->paint(context.recording_painter(), paint_config); - context.set_device_viewport_rect(old_viewport_rect); context.recording_painter().restore(); if constexpr (HIGHLIGHT_FOCUSED_FRAME_DEBUG) { diff --git a/Userland/Services/WebContent/PageClient.cpp b/Userland/Services/WebContent/PageClient.cpp index b15f9b4ec4..77d3255464 100644 --- a/Userland/Services/WebContent/PageClient.cpp +++ b/Userland/Services/WebContent/PageClient.cpp @@ -171,48 +171,18 @@ Web::Layout::Viewport* PageClient::layout_root() return document->layout_node(); } -Gfx::Color PageClient::background_color() const -{ - auto document = page().top_level_browsing_context().active_document(); - if (!document) - return Gfx::Color::Transparent; - return document->background_color(); -} - void PageClient::paint(Web::DevicePixelRect const& content_rect, Gfx::Bitmap& target, Web::PaintOptions paint_options) { - Gfx::IntRect bitmap_rect { {}, content_rect.size().to_type() }; - - auto document = page().top_level_browsing_context().active_document(); - if (document) { - document->update_layout(); - } - - auto background_color = this->background_color(); - Web::Painting::RecordingPainter recording_painter; - Web::PaintContext context(recording_painter, palette(), device_pixels_per_css_pixel()); - if (background_color.alpha() < 255) - recording_painter.fill_rect(bitmap_rect, Web::CSS::SystemColor::canvas()); - recording_painter.fill_rect(bitmap_rect, background_color); + Gfx::IntRect bitmap_rect { {}, content_rect.size().to_type() }; + recording_painter.fill_rect(bitmap_rect, Web::CSS::SystemColor::canvas()); - if (!document->paintable()) - return; - - context.set_should_show_line_box_borders(m_should_show_line_box_borders); - context.set_should_paint_overlay(paint_options.paint_overlay == Web::PaintOptions::PaintOverlay::Yes); - context.set_device_viewport_rect(content_rect); - context.set_has_focus(m_has_focus); - - document->paintable()->collect_scroll_frames(context); - document->paintable()->paint_all_phases(context); - - Vector scroll_offsets_by_frame_id; - scroll_offsets_by_frame_id.resize(context.scroll_frames().size()); - for (auto [_, scrollable_frame] : context.scroll_frames()) - scroll_offsets_by_frame_id[scrollable_frame.id] = context.rounded_device_point(scrollable_frame.offset).to_type(); - recording_painter.apply_scroll_offsets(scroll_offsets_by_frame_id); + Web::HTML::Navigable::PaintConfig paint_config; + paint_config.paint_overlay = paint_options.paint_overlay == Web::PaintOptions::PaintOverlay::Yes; + paint_config.should_show_line_box_borders = m_should_show_line_box_borders; + paint_config.has_focus = m_has_focus; + page().top_level_traversable()->paint(recording_painter, paint_config); if (s_use_gpu_painter) { #ifdef HAS_ACCELERATED_GRAPHICS diff --git a/Userland/Services/WebContent/PageClient.h b/Userland/Services/WebContent/PageClient.h index 2c0589c353..2b6b167f92 100644 --- a/Userland/Services/WebContent/PageClient.h +++ b/Userland/Services/WebContent/PageClient.h @@ -61,12 +61,12 @@ public: void color_picker_update(Optional picked_color, Web::HTML::ColorPickerUpdateState state); void select_dropdown_closed(Optional value); - [[nodiscard]] Gfx::Color background_color() const; - void set_user_style(String source); void ready_to_paint(); + virtual double device_pixels_per_css_pixel() const override { return m_device_pixels_per_css_pixel; } + private: PageClient(PageHost&, u64 id); @@ -76,7 +76,6 @@ private: virtual bool is_connection_open() const override; virtual Gfx::Palette palette() const override; virtual Web::DevicePixelRect screen_rect() const override { return m_screen_rect; } - virtual double device_pixels_per_css_pixel() const override { return m_device_pixels_per_css_pixel; } virtual Web::CSS::PreferredColorScheme preferred_color_scheme() const override { return m_preferred_color_scheme; } virtual void page_did_invalidate(Web::CSSPixelRect const&) override; virtual void page_did_request_cursor_change(Gfx::StandardCursor) override;