diff options
-rw-r--r-- | Applications/Help/main.cpp | 5 | ||||
-rw-r--r-- | Libraries/LibHTML/CSS/StyleResolver.cpp | 25 | ||||
-rw-r--r-- | Libraries/LibHTML/CSS/StyleResolver.h | 3 | ||||
-rw-r--r-- | Userland/html.cpp | 5 |
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(); |