summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Applications/Help/main.cpp5
-rw-r--r--Libraries/LibHTML/CSS/StyleResolver.cpp25
-rw-r--r--Libraries/LibHTML/CSS/StyleResolver.h3
-rw-r--r--Userland/html.cpp5
4 files changed, 26 insertions, 12 deletions
diff --git a/Applications/Help/main.cpp b/Applications/Help/main.cpp
index 8030b5fdd3..d76cbc93c2 100644
--- a/Applications/Help/main.cpp
+++ b/Applications/Help/main.cpp
@@ -46,10 +46,6 @@ int main(int argc, char* argv[])
auto html_view = HtmlView::construct(splitter);
- extern const char default_stylesheet_source[];
- String css = default_stylesheet_source;
- auto sheet = parse_css(css);
-
History history;
RefPtr<GAction> go_back_action;
@@ -86,7 +82,6 @@ int main(int argc, char* argv[])
String html = md_document.render_to_html();
auto html_document = parse_html(html);
html_document->normalize();
- html_document->add_sheet(sheet);
html_view->set_document(html_document);
String page_and_section = model->page_and_section(tree_view->selection().first());
diff --git a/Libraries/LibHTML/CSS/StyleResolver.cpp b/Libraries/LibHTML/CSS/StyleResolver.cpp
index c592574dc0..081675a945 100644
--- a/Libraries/LibHTML/CSS/StyleResolver.cpp
+++ b/Libraries/LibHTML/CSS/StyleResolver.cpp
@@ -33,10 +33,31 @@ static bool matches(const Selector& selector, const Element& element)
}
}
+static StyleSheet& default_stylesheet()
+{
+ static StyleSheet* sheet;
+ if (!sheet) {
+ extern const char default_stylesheet_source[];
+ String css = default_stylesheet_source;
+ sheet = &parse_css(css).leak_ref();
+ }
+ return *sheet;
+}
+
+template<typename Callback>
+void StyleResolver::for_each_stylesheet(Callback callback) const
+{
+ callback(default_stylesheet());
+ for (auto& sheet : document().stylesheets()) {
+ callback(sheet);
+ }
+}
+
NonnullRefPtrVector<StyleRule> StyleResolver::collect_matching_rules(const Element& element) const
{
NonnullRefPtrVector<StyleRule> matching_rules;
- for (auto& sheet : document().stylesheets()) {
+
+ for_each_stylesheet([&](auto& sheet) {
for (auto& rule : sheet.rules()) {
for (auto& selector : rule.selectors()) {
if (matches(selector, element)) {
@@ -45,7 +66,7 @@ NonnullRefPtrVector<StyleRule> StyleResolver::collect_matching_rules(const Eleme
}
}
}
- }
+ });
#ifdef HTML_DEBUG
dbgprintf("Rules matching Element{%p}\n", &element);
diff --git a/Libraries/LibHTML/CSS/StyleResolver.h b/Libraries/LibHTML/CSS/StyleResolver.h
index 077e0545e2..9056e130ba 100644
--- a/Libraries/LibHTML/CSS/StyleResolver.h
+++ b/Libraries/LibHTML/CSS/StyleResolver.h
@@ -23,5 +23,8 @@ public:
NonnullRefPtrVector<StyleRule> collect_matching_rules(const Element&) const;
private:
+ template<typename Callback>
+ void for_each_stylesheet(Callback) const;
+
Document& m_document;
};
diff --git a/Userland/html.cpp b/Userland/html.cpp
index cff3afb1b0..b2bf2ae691 100644
--- a/Userland/html.cpp
+++ b/Userland/html.cpp
@@ -33,14 +33,9 @@ int main(int argc, char** argv)
return 1;
}
- extern const char default_stylesheet_source[];
- String css = default_stylesheet_source;
- auto sheet = parse_css(css);
-
String html = String::copy(f->read_all());
auto document = parse_html(html);
document->normalize();
- document->add_sheet(*sheet);
auto window = GWindow::construct();
auto widget = HtmlView::construct();