mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 06:17:35 +00:00
LibWeb: Make Paintable ref-counted
This will allow us to use a protective NonnullRefPtr to keep paintables alive while running arbitrary JavaScript in response to events.
This commit is contained in:
parent
702cee3d7c
commit
ed84fbce47
58 changed files with 94 additions and 75 deletions
|
@ -85,7 +85,7 @@ Painting::PaintableWithLines const* BlockContainer::paint_box() const
|
|||
return static_cast<Painting::PaintableWithLines const*>(Box::paint_box());
|
||||
}
|
||||
|
||||
OwnPtr<Painting::Paintable> BlockContainer::create_paintable() const
|
||||
RefPtr<Painting::Paintable> BlockContainer::create_paintable() const
|
||||
{
|
||||
return Painting::PaintableWithLines::create(*this);
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ public:
|
|||
|
||||
Painting::PaintableWithLines const* paint_box() const;
|
||||
|
||||
virtual OwnPtr<Painting::Paintable> create_paintable() const override;
|
||||
virtual RefPtr<Painting::Paintable> create_paintable() const override;
|
||||
|
||||
private:
|
||||
virtual bool is_block_container() const final { return true; }
|
||||
|
|
|
@ -86,7 +86,7 @@ bool Box::is_body() const
|
|||
return dom_node() && dom_node() == document().body();
|
||||
}
|
||||
|
||||
OwnPtr<Painting::Paintable> Box::create_paintable() const
|
||||
RefPtr<Painting::Paintable> Box::create_paintable() const
|
||||
{
|
||||
return Painting::PaintableBox::create(*this);
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ public:
|
|||
|
||||
virtual void did_set_rect() { }
|
||||
|
||||
virtual OwnPtr<Painting::Paintable> create_paintable() const override;
|
||||
virtual RefPtr<Painting::Paintable> create_paintable() const override;
|
||||
|
||||
protected:
|
||||
Box(DOM::Document&, DOM::Node*, NonnullRefPtr<CSS::StyleProperties>);
|
||||
|
|
|
@ -106,7 +106,7 @@ void ButtonBox::handle_associated_label_mousemove(Badge<Label>, bool is_inside_n
|
|||
set_needs_display();
|
||||
}
|
||||
|
||||
OwnPtr<Painting::Paintable> ButtonBox::create_paintable() const
|
||||
RefPtr<Painting::Paintable> ButtonBox::create_paintable() const
|
||||
{
|
||||
return Painting::ButtonPaintable::create(*this);
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@ public:
|
|||
|
||||
bool being_pressed() const { return m_being_pressed; }
|
||||
|
||||
virtual OwnPtr<Painting::Paintable> create_paintable() const override;
|
||||
virtual RefPtr<Painting::Paintable> create_paintable() const override;
|
||||
|
||||
private:
|
||||
virtual bool wants_mouse_events() const override { return true; }
|
||||
|
|
|
@ -25,7 +25,7 @@ void CanvasBox::prepare_for_replaced_layout()
|
|||
set_intrinsic_height(dom_node().height());
|
||||
}
|
||||
|
||||
OwnPtr<Painting::Paintable> CanvasBox::create_paintable() const
|
||||
RefPtr<Painting::Paintable> CanvasBox::create_paintable() const
|
||||
{
|
||||
return Painting::CanvasPaintable::create(*this);
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ public:
|
|||
|
||||
const HTML::HTMLCanvasElement& dom_node() const { return static_cast<const HTML::HTMLCanvasElement&>(ReplacedBox::dom_node()); }
|
||||
|
||||
virtual OwnPtr<Painting::Paintable> create_paintable() const override;
|
||||
virtual RefPtr<Painting::Paintable> create_paintable() const override;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -108,7 +108,7 @@ void CheckBox::handle_associated_label_mousemove(Badge<Label>, bool is_inside_no
|
|||
set_needs_display();
|
||||
}
|
||||
|
||||
OwnPtr<Painting::Paintable> CheckBox::create_paintable() const
|
||||
RefPtr<Painting::Paintable> CheckBox::create_paintable() const
|
||||
{
|
||||
return Painting::CheckBoxPaintable::create(*this);
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ public:
|
|||
|
||||
bool being_pressed() const { return m_being_pressed; }
|
||||
|
||||
virtual OwnPtr<Painting::Paintable> create_paintable() const override;
|
||||
virtual RefPtr<Painting::Paintable> create_paintable() const override;
|
||||
|
||||
private:
|
||||
virtual bool wants_mouse_events() const override { return true; }
|
||||
|
|
|
@ -40,7 +40,7 @@ void FrameBox::did_set_rect()
|
|||
dom_node().nested_browsing_context()->set_size(paint_box()->content_size().to_type<int>());
|
||||
}
|
||||
|
||||
OwnPtr<Painting::Paintable> FrameBox::create_paintable() const
|
||||
RefPtr<Painting::Paintable> FrameBox::create_paintable() const
|
||||
{
|
||||
return Painting::NestedBrowsingContextPaintable::create(*this);
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ public:
|
|||
const HTML::HTMLIFrameElement& dom_node() const { return verify_cast<HTML::HTMLIFrameElement>(ReplacedBox::dom_node()); }
|
||||
HTML::HTMLIFrameElement& dom_node() { return verify_cast<HTML::HTMLIFrameElement>(ReplacedBox::dom_node()); }
|
||||
|
||||
virtual OwnPtr<Painting::Paintable> create_paintable() const override;
|
||||
virtual RefPtr<Painting::Paintable> create_paintable() const override;
|
||||
|
||||
private:
|
||||
virtual void did_set_rect() override;
|
||||
|
|
|
@ -84,7 +84,7 @@ void ImageBox::browsing_context_did_set_viewport_rect(Gfx::IntRect const& viewpo
|
|||
m_image_loader.set_visible_in_viewport(viewport_rect.to_type<float>().intersects(paint_box()->absolute_rect()));
|
||||
}
|
||||
|
||||
OwnPtr<Painting::Paintable> ImageBox::create_paintable() const
|
||||
RefPtr<Painting::Paintable> ImageBox::create_paintable() const
|
||||
{
|
||||
return Painting::ImagePaintable::create(*this);
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ public:
|
|||
|
||||
bool renders_as_alt_text() const;
|
||||
|
||||
virtual OwnPtr<Painting::Paintable> create_paintable() const override;
|
||||
virtual RefPtr<Painting::Paintable> create_paintable() const override;
|
||||
|
||||
auto const& image_loader() const { return m_image_loader; }
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ InlineNode::~InlineNode()
|
|||
{
|
||||
}
|
||||
|
||||
OwnPtr<Painting::Paintable> InlineNode::create_paintable() const
|
||||
RefPtr<Painting::Paintable> InlineNode::create_paintable() const
|
||||
{
|
||||
return Painting::InlinePaintable::create(*this);
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@ public:
|
|||
InlineNode(DOM::Document&, DOM::Element*, NonnullRefPtr<CSS::StyleProperties>);
|
||||
virtual ~InlineNode() override;
|
||||
|
||||
virtual OwnPtr<Painting::Paintable> create_paintable() const override;
|
||||
virtual RefPtr<Painting::Paintable> create_paintable() const override;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -60,7 +60,7 @@ Gfx::Bitmap const* ListItemMarkerBox::list_style_image_bitmap() const
|
|||
return list_style_image() ? list_style_image()->bitmap() : nullptr;
|
||||
}
|
||||
|
||||
OwnPtr<Painting::Paintable> ListItemMarkerBox::create_paintable() const
|
||||
RefPtr<Painting::Paintable> ListItemMarkerBox::create_paintable() const
|
||||
{
|
||||
return Painting::MarkerPaintable::create(*this);
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ public:
|
|||
Gfx::Bitmap const* list_style_image_bitmap() const;
|
||||
String const& text() const { return m_text; }
|
||||
|
||||
virtual OwnPtr<Painting::Paintable> create_paintable() const override;
|
||||
virtual RefPtr<Painting::Paintable> create_paintable() const override;
|
||||
|
||||
CSS::ListStyleType list_style_type() const { return m_list_style_type; }
|
||||
|
||||
|
|
|
@ -584,12 +584,12 @@ NonnullRefPtr<NodeWithStyle> NodeWithStyle::create_anonymous_wrapper() const
|
|||
return wrapper;
|
||||
}
|
||||
|
||||
void Node::set_paintable(OwnPtr<Painting::Paintable> paintable)
|
||||
void Node::set_paintable(RefPtr<Painting::Paintable> paintable)
|
||||
{
|
||||
m_paintable = move(paintable);
|
||||
}
|
||||
|
||||
OwnPtr<Painting::Paintable> Node::create_paintable() const
|
||||
RefPtr<Painting::Paintable> Node::create_paintable() const
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
|
|
@ -54,10 +54,11 @@ public:
|
|||
const DOM::Node* dom_node() const { return m_dom_node; }
|
||||
DOM::Node* dom_node() { return m_dom_node; }
|
||||
|
||||
Painting::Paintable* paintable() { return m_paintable; }
|
||||
Painting::Paintable const* paintable() const { return m_paintable; }
|
||||
void set_paintable(OwnPtr<Painting::Paintable>);
|
||||
void set_paintable(RefPtr<Painting::Paintable>);
|
||||
|
||||
virtual OwnPtr<Painting::Paintable> create_paintable() const;
|
||||
virtual RefPtr<Painting::Paintable> create_paintable() const;
|
||||
|
||||
DOM::Document& document() { return m_document; }
|
||||
const DOM::Document& document() const { return m_document; }
|
||||
|
@ -224,7 +225,7 @@ private:
|
|||
|
||||
NonnullRefPtr<DOM::Document> m_document;
|
||||
RefPtr<DOM::Node> m_dom_node;
|
||||
OwnPtr<Painting::Paintable> m_paintable;
|
||||
RefPtr<Painting::Paintable> m_paintable;
|
||||
|
||||
bool m_inline { false };
|
||||
bool m_has_style { false };
|
||||
|
|
|
@ -21,7 +21,7 @@ Progress::~Progress()
|
|||
{
|
||||
}
|
||||
|
||||
OwnPtr<Painting::Paintable> Progress::create_paintable() const
|
||||
RefPtr<Painting::Paintable> Progress::create_paintable() const
|
||||
{
|
||||
return Painting::ProgressPaintable::create(*this);
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ public:
|
|||
const HTML::HTMLProgressElement& dom_node() const { return static_cast<const HTML::HTMLProgressElement&>(LabelableNode::dom_node()); }
|
||||
HTML::HTMLProgressElement& dom_node() { return static_cast<HTML::HTMLProgressElement&>(LabelableNode::dom_node()); }
|
||||
|
||||
virtual OwnPtr<Painting::Paintable> create_paintable() const override;
|
||||
virtual RefPtr<Painting::Paintable> create_paintable() const override;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -114,7 +114,7 @@ void RadioButton::set_checked_within_group()
|
|||
});
|
||||
}
|
||||
|
||||
OwnPtr<Painting::Paintable> RadioButton::create_paintable() const
|
||||
RefPtr<Painting::Paintable> RadioButton::create_paintable() const
|
||||
{
|
||||
return Painting::RadioButtonPaintable::create(*this);
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ public:
|
|||
const HTML::HTMLInputElement& dom_node() const { return static_cast<const HTML::HTMLInputElement&>(LabelableNode::dom_node()); }
|
||||
HTML::HTMLInputElement& dom_node() { return static_cast<HTML::HTMLInputElement&>(LabelableNode::dom_node()); }
|
||||
|
||||
virtual OwnPtr<Painting::Paintable> create_paintable() const override;
|
||||
virtual RefPtr<Painting::Paintable> create_paintable() const override;
|
||||
|
||||
bool being_pressed() const { return m_being_pressed; }
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
#include <LibGfx/AntiAliasingPainter.h>
|
||||
#include <LibGfx/Painter.h>
|
||||
#include <LibWeb/Layout/SVGGeometryBox.h>
|
||||
#include <LibWeb/Painting/Paintable.h>
|
||||
#include <LibWeb/Painting/SVGGeometryPaintable.h>
|
||||
#include <LibWeb/SVG/SVGPathElement.h>
|
||||
#include <LibWeb/SVG/SVGSVGElement.h>
|
||||
|
||||
|
@ -47,4 +47,9 @@ Gfx::FloatPoint SVGGeometryBox::viewbox_origin() const
|
|||
return { svg_box->view_box().value().min_x, svg_box->view_box().value().min_y };
|
||||
}
|
||||
|
||||
RefPtr<Painting::Paintable> SVGGeometryBox::create_paintable() const
|
||||
{
|
||||
return Painting::SVGGeometryPaintable::create(*this);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -22,6 +22,8 @@ public:
|
|||
float viewbox_scaling() const;
|
||||
Gfx::FloatPoint viewbox_origin() const;
|
||||
|
||||
virtual RefPtr<Painting::Paintable> create_paintable() const override;
|
||||
|
||||
private:
|
||||
virtual bool is_svg_geometry_box() const final { return true; }
|
||||
};
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*/
|
||||
|
||||
#include <LibWeb/Layout/SVGSVGBox.h>
|
||||
#include <LibWeb/Painting/Paintable.h>
|
||||
#include <LibWeb/Painting/SVGSVGPaintable.h>
|
||||
|
||||
namespace Web::Layout {
|
||||
|
||||
|
@ -14,4 +14,9 @@ SVGSVGBox::SVGSVGBox(DOM::Document& document, SVG::SVGSVGElement& element, Nonnu
|
|||
{
|
||||
}
|
||||
|
||||
RefPtr<Painting::Paintable> SVGSVGBox::create_paintable() const
|
||||
{
|
||||
return Painting::SVGSVGPaintable::create(*this);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -19,6 +19,8 @@ public:
|
|||
SVG::SVGSVGElement& dom_node() { return verify_cast<SVG::SVGSVGElement>(SVGGraphicsBox::dom_node()); }
|
||||
|
||||
virtual bool can_have_children() const override { return true; }
|
||||
|
||||
virtual RefPtr<Painting::Paintable> create_paintable() const override;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -367,7 +367,7 @@ Optional<TextNode::Chunk> TextNode::ChunkIterator::try_commit_chunk(Utf8View::It
|
|||
return {};
|
||||
}
|
||||
|
||||
OwnPtr<Painting::Paintable> TextNode::create_paintable() const
|
||||
RefPtr<Painting::Paintable> TextNode::create_paintable() const
|
||||
{
|
||||
return Painting::TextPaintable::create(*this);
|
||||
}
|
||||
|
|
|
@ -52,7 +52,7 @@ public:
|
|||
|
||||
void compute_text_for_rendering(bool collapse, bool previous_is_empty_or_ends_in_whitespace);
|
||||
|
||||
virtual OwnPtr<Painting::Paintable> create_paintable() const override;
|
||||
virtual RefPtr<Painting::Paintable> create_paintable() const override;
|
||||
|
||||
private:
|
||||
virtual bool is_text_node() const final { return true; }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue