1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 11:38:11 +00:00

LibWeb: Fix null dereference when assigning an ImageStyleValue via JS

When parsing a CSS value in the context of a CSSStyleDeclaration
camelCase property setter, we don't necessarily have a Document to
provide the CSS parser for context.

So the parser can't go assuming that there's always a Document in the
ParsingContext. And ImageStyleValue can't go assuming that there's
always a Document either. This will require some more work to get things
right, I'm just patching up the null dereference for now.
This commit is contained in:
Andreas Kling 2021-09-30 02:18:30 +02:00
parent 3006e15c94
commit 198bb322ef
4 changed files with 8 additions and 7 deletions

View file

@ -1727,7 +1727,7 @@ RefPtr<StyleValue> Parser::parse_image_value(ParsingContext const& context, Styl
{ {
auto url = parse_url_function(context, component_value); auto url = parse_url_function(context, component_value);
if (url.has_value()) if (url.has_value())
return ImageStyleValue::create(url.value(), *context.document()); return ImageStyleValue::create(url.value(), context.document());
// FIXME: Handle gradients. // FIXME: Handle gradients.
return {}; return {};

View file

@ -368,12 +368,13 @@ Color IdentifierStyleValue::to_color(Layout::NodeWithStyle const& node) const
} }
} }
ImageStyleValue::ImageStyleValue(const AK::URL& url, DOM::Document& document) ImageStyleValue::ImageStyleValue(const AK::URL& url, DOM::Document* document)
: StyleValue(Type::Image) : StyleValue(Type::Image)
, m_url(url) , m_url(url)
, m_document(document) , m_document(document)
{ {
auto request = LoadRequest::create_for_url_on_page(url, document.page()); // FIXME: This doesn't work right without a document.
auto request = LoadRequest::create_for_url_on_page(url, document ? document->page() : nullptr);
set_resource(ResourceLoader::the().load_resource(Resource::Type::Image, request)); set_resource(ResourceLoader::the().load_resource(Resource::Type::Image, request));
} }
@ -383,7 +384,7 @@ void ImageStyleValue::resource_did_load()
return; return;
m_bitmap = resource()->bitmap(); m_bitmap = resource()->bitmap();
// FIXME: Do less than a full repaint if possible? // FIXME: Do less than a full repaint if possible?
if (m_document->browsing_context()) if (m_document && m_document->browsing_context())
m_document->browsing_context()->set_needs_display({}); m_document->browsing_context()->set_needs_display({});
} }
} }

View file

@ -897,7 +897,7 @@ class ImageStyleValue final
: public StyleValue : public StyleValue
, public ImageResourceClient { , public ImageResourceClient {
public: public:
static NonnullRefPtr<ImageStyleValue> create(const AK::URL& url, DOM::Document& document) { return adopt_ref(*new ImageStyleValue(url, document)); } static NonnullRefPtr<ImageStyleValue> create(const AK::URL& url, DOM::Document* document) { return adopt_ref(*new ImageStyleValue(url, document)); }
virtual ~ImageStyleValue() override { } virtual ~ImageStyleValue() override { }
String to_string() const override { return String::formatted("Image({})", m_url.to_string()); } String to_string() const override { return String::formatted("Image({})", m_url.to_string()); }
@ -905,7 +905,7 @@ public:
const Gfx::Bitmap* bitmap() const { return m_bitmap; } const Gfx::Bitmap* bitmap() const { return m_bitmap; }
private: private:
ImageStyleValue(const AK::URL&, DOM::Document&); ImageStyleValue(const AK::URL&, DOM::Document*);
// ^ResourceClient // ^ResourceClient
virtual void resource_did_load() override; virtual void resource_did_load() override;

View file

@ -55,7 +55,7 @@ void HTMLBodyElement::parse_attribute(const FlyString& name, const String& value
if (color.has_value()) if (color.has_value())
document().set_visited_link_color(color.value()); document().set_visited_link_color(color.value());
} else if (name.equals_ignoring_case("background")) { } else if (name.equals_ignoring_case("background")) {
m_background_style_value = CSS::ImageStyleValue::create(document().parse_url(value), const_cast<DOM::Document&>(document())); m_background_style_value = CSS::ImageStyleValue::create(document().parse_url(value), &document());
} }
} }