mirror of
https://github.com/RGBCube/serenity
synced 2025-05-15 10:14:58 +00:00
LibWeb+LibWebView+WebContent: Add support for meta theme-color
This commit is contained in:
parent
3c27843cfe
commit
a5b01689f1
8 changed files with 61 additions and 0 deletions
|
@ -6,8 +6,14 @@
|
|||
*/
|
||||
|
||||
#include <LibWeb/Bindings/Intrinsics.h>
|
||||
#include <LibWeb/CSS/Parser/Parser.h>
|
||||
#include <LibWeb/CSS/Parser/ParsingContext.h>
|
||||
#include <LibWeb/CSS/PropertyID.h>
|
||||
#include <LibWeb/CSS/StyleValues/ColorStyleValue.h>
|
||||
#include <LibWeb/DOM/Document.h>
|
||||
#include <LibWeb/HTML/HTMLMetaElement.h>
|
||||
#include <LibWeb/Infra/CharacterTypes.h>
|
||||
#include <LibWeb/Page/Page.h>
|
||||
|
||||
namespace Web::HTML {
|
||||
|
||||
|
@ -41,6 +47,43 @@ void HTMLMetaElement::inserted()
|
|||
{
|
||||
Base::inserted();
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/semantics.html#meta-theme-color
|
||||
// 1. To obtain a page's theme color, user agents must run the following steps:
|
||||
// * The element is in a document tree
|
||||
// * The element has a name attribute, whose value is an ASCII case-insensitive match for theme-color
|
||||
// * The element has a content attribute
|
||||
auto name = attribute(AttributeNames::name);
|
||||
auto content = attribute(AttributeNames::content);
|
||||
if (name.has_value() && name->bytes_as_string_view().equals_ignoring_ascii_case("theme-color"sv) && content.has_value()) {
|
||||
auto* page = document().page();
|
||||
if (!page)
|
||||
return;
|
||||
auto context = CSS::Parser::ParsingContext { document() };
|
||||
|
||||
// 2. For each element in candidate elements:
|
||||
|
||||
// 1. If element has a media attribute and the value of element's media attribute does not match the environment, then continue.
|
||||
auto media = attribute(AttributeNames::media);
|
||||
if (media.has_value()) {
|
||||
auto query = parse_media_query(context, media.value());
|
||||
if (!query->evaluate(document().window()))
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. Let value be the result of stripping leading and trailing ASCII whitespace from the value of element's content attribute.
|
||||
auto value = content->bytes_as_string_view().trim(Infra::ASCII_WHITESPACE);
|
||||
|
||||
// 3. Let color be the result of parsing value.
|
||||
auto css_value = parse_css_value(context, value, CSS::PropertyID::Color);
|
||||
if (css_value.is_null() || !css_value->is_color())
|
||||
return;
|
||||
auto color = css_value->as_color().color();
|
||||
|
||||
// 4. If color is not failure, then return color.
|
||||
page->client().page_did_change_theme_color(color);
|
||||
return;
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/semantics.html#pragma-directives
|
||||
// When a meta element is inserted into the document, if its http-equiv attribute is present and represents one of
|
||||
// the above states, then the user agent must run the algorithm appropriate for that state, as described in the
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue