mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-05-27 21:42:53 +00:00
LibWeb: Move style sheet parsing into create_a_css_style_sheet()
The spec is unclear about when exactly we should parse the style sheet. Previously we'd do so before calling this algorithm, which was error-prone, as seen by the bug fixed by the previous commit. The spec for step 1 of "create a CSS style sheet" says: 1. Create a new CSS style sheet object and set its properties as specified. The definitions linked are UA-defined enough that it seems reasonable to put the parsing here. That simplifies the user code a little and makes it harder to mess up. It does raise the question of what to do if parsing fails. I've matched our previous behaviour by just logging and returning in that case. While I'm modifying this method, I've also converted the bool params to enums so they're a little clearer to read.
This commit is contained in:
parent
f29a95e2fe
commit
2a96a81e68
Notes:
github-actions[bot]
2025-04-15 08:41:41 +00:00
Author: https://github.com/AtkinsSJ
Commit: 2a96a81e68
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4352
4 changed files with 74 additions and 50 deletions
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2020-2024, Andreas Kling <andreas@ladybird.org>
|
||||
* Copyright (c) 2025, Sam Atkins <sam@ladybird.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
@ -60,23 +61,35 @@ void StyleSheetList::add_a_css_style_sheet(CSS::CSSStyleSheet& sheet)
|
|||
}
|
||||
|
||||
// https://www.w3.org/TR/cssom/#create-a-css-style-sheet
|
||||
void StyleSheetList::create_a_css_style_sheet(String type, DOM::Element* owner_node, String media, String title, bool alternate, bool origin_clean, Optional<::URL::URL> location, CSS::CSSStyleSheet* parent_style_sheet, CSS::CSSRule* owner_rule, CSS::CSSStyleSheet& sheet)
|
||||
GC::Ptr<CSSStyleSheet> StyleSheetList::create_a_css_style_sheet(String const& css_text, String type, DOM::Element* owner_node, String media, String title, Alternate alternate, OriginClean origin_clean, Optional<::URL::URL> location, CSSStyleSheet* parent_style_sheet, CSSRule* owner_rule)
|
||||
{
|
||||
// 1. Create a new CSS style sheet object and set its properties as specified.
|
||||
// FIXME: We receive `sheet` from the caller already. This is weird.
|
||||
// AD-HOC: The spec never tells us when to parse this style sheet, but the most logical place is here.
|
||||
// AD-HOC: Are we supposed to use the document's URL for the stylesheet's location during parsing? Not doing it breaks things.
|
||||
auto location_url = location.value_or(document().url());
|
||||
auto* sheet = parse_css_stylesheet(Parser::ParsingParams { document(), location_url }, css_text, location_url);
|
||||
|
||||
sheet.set_parent_css_style_sheet(parent_style_sheet);
|
||||
sheet.set_owner_css_rule(owner_rule);
|
||||
sheet.set_owner_node(owner_node);
|
||||
sheet.set_type(move(type));
|
||||
sheet.set_media(move(media));
|
||||
sheet.set_title(move(title));
|
||||
sheet.set_alternate(alternate);
|
||||
sheet.set_origin_clean(origin_clean);
|
||||
sheet.set_location(move(location));
|
||||
// AD-HOC: Exit out if parsing failed.
|
||||
// FIXME: What should we actually do here?
|
||||
if (!sheet) {
|
||||
dbgln_if(CSS_LOADER_DEBUG, "StyleSheetList::create_a_css_style_sheet(): Failed to parse stylesheet at {}", location_url);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
sheet->set_parent_css_style_sheet(parent_style_sheet);
|
||||
sheet->set_owner_css_rule(owner_rule);
|
||||
sheet->set_owner_node(owner_node);
|
||||
sheet->set_type(move(type));
|
||||
sheet->set_media(move(media));
|
||||
sheet->set_title(move(title));
|
||||
sheet->set_alternate(alternate == Alternate::Yes);
|
||||
sheet->set_origin_clean(origin_clean == OriginClean::Yes);
|
||||
sheet->set_location(move(location));
|
||||
|
||||
// 2. Then run the add a CSS style sheet steps for the newly created CSS style sheet.
|
||||
add_a_css_style_sheet(sheet);
|
||||
add_a_css_style_sheet(*sheet);
|
||||
|
||||
return sheet;
|
||||
}
|
||||
|
||||
void StyleSheetList::add_sheet(CSSStyleSheet& sheet)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue