LibWeb: Add the default user agent MathML stylesheet

We now apply MathML's default user agent style sheet along with other
default styles. This sheet is not mixed in with the other styles in
CSS/Default.css because it is a namespaced stylesheet and so has to
be its own sheet.
This commit is contained in:
Jonah 2023-07-30 17:35:10 -05:00 committed by Sam Atkins
parent fd0ee8ae7b
commit 0b2da4f8c6
Notes: sideshowbarker 2024-07-17 06:35:23 +09:00
7 changed files with 171 additions and 19 deletions

View file

@ -89,6 +89,19 @@ function (generate_css_implementation)
add_custom_target(generate_QuirksModeStyleSheetSource.cpp DEPENDS CSS/QuirksModeStyleSheetSource.cpp)
add_dependencies(all_generated generate_QuirksModeStyleSheetSource.cpp)
add_custom_command(
OUTPUT MathML/MathMLStyleSheetSource.cpp
COMMAND "${CMAKE_COMMAND}" -E make_directory CSS
COMMAND "${LIBWEB_INPUT_FOLDER}/Scripts/GenerateStyleSheetSource.sh" mathml_stylesheet_source "${LIBWEB_INPUT_FOLDER}/MathML/Default.css" > MathML/MathMLStyleSheetSource.cpp.tmp
COMMAND "${CMAKE_COMMAND}" -E copy_if_different MathML/MathMLStyleSheetSource.cpp.tmp MathML/MathMLStyleSheetSource.cpp
COMMAND "${CMAKE_COMMAND}" -E remove MathML/MathMLStyleSheetSource.cpp.tmp
VERBATIM
DEPENDS "${LIBWEB_INPUT_FOLDER}/Scripts/GenerateStyleSheetSource.sh"
MAIN_DEPENDENCY "${LIBWEB_INPUT_FOLDER}/MathML/Default.css"
)
add_custom_target(generate_MathMLStyleSheetSource.cpp DEPENDS MathML/MathMLStyleSheetSource.cpp)
add_dependencies(all_generated generate_MathMLStyleSheetSource.cpp)
set(CSS_GENERATED_TO_INSTALL
"CSS/EasingFunctions.h"
"CSS/Enums.h"

View file

@ -213,6 +213,13 @@ embed_as_string_view("generate_quirks_mode_stylesheet_source") {
namespace = "Web::CSS"
}
embed_as_string_view("generate_mathml_stylesheet_source") {
input = "MathML/Default.css"
output = "$target_gen_dir/MathML/MathMLStyleSheetSource.cpp"
variable_name = "mathml_stylesheet_source"
namespace = "Web::MathML"
}
source_set("all_generated") {
generated_deps = [
":generate_aria_roles",

View file

@ -1,41 +1,41 @@
Viewport <#document> at (0,0) content-size 800x600 children: not-inline
BlockContainer <html> at (0,0) content-size 800x600 [BFC] children: not-inline
BlockContainer <body> at (8,8) content-size 784x207.3125 children: not-inline
BlockContainer <(anonymous)> at (8,8) content-size 784x161.65625 children: inline
line 0 width: 413.453125, height: 161.65625, bottom: 161.65625, baseline: 152
BlockContainer <body> at (8,8) content-size 784x299.65625 children: not-inline
BlockContainer <(anonymous)> at (8,8) content-size 784x152 children: inline
line 0 width: 302, height: 152, bottom: 152, baseline: 152
frag 0 from SVGSVGBox start: 0, length: 0, rect: [9,9 300x150]
frag 1 from TextNode start: 0, length: 1, rect: [310,146 8x17.46875]
" "
frag 2 from TextNode start: 0, length: 5, rect: [320,126 99.453125x43.671875]
"Hello"
SVGSVGBox <svg> at (9,9) content-size 300x150 [SVG] children: inline
InlineNode <a>
SVGTextBox <text> at (9,9) content-size 0x0 children: inline
TextNode <#text>
TextNode <#text>
InlineNode <math>
InlineNode <a>
TextNode <#text>
BlockContainer <a> at (9,161) content-size 100x100 children: inline
line 0 width: 99.453125, height: 43.671875, bottom: 43.671875, baseline: 33.828125
frag 0 from TextNode start: 0, length: 5, rect: [9,161 99.453125x43.671875]
"Hello"
TextNode <#text>
BlockContainer <div> at (9,170.65625) content-size 782x43.65625 children: inline
BlockContainer <(anonymous)> at (8,262) content-size 784x0 children: inline
TextNode <#text>
BlockContainer <div> at (9,263) content-size 782x43.65625 children: inline
line 0 width: 101.453125, height: 43.65625, bottom: 43.65625, baseline: 33.828125
frag 0 from TextNode start: 0, length: 5, rect: [10,170.65625 99.453125x43.671875]
frag 0 from TextNode start: 0, length: 5, rect: [10,263 99.453125x43.671875]
"Hello"
InlineNode <a>
TextNode <#text>
BlockContainer <(anonymous)> at (8,215.3125) content-size 784x0 children: inline
BlockContainer <(anonymous)> at (8,307.65625) content-size 784x0 children: inline
TextNode <#text>
PaintableWithLines (Viewport<#document>) [0,0 800x600]
PaintableWithLines (BlockContainer<HTML>) [0,0 800x600]
PaintableWithLines (BlockContainer<BODY>) [8,8 784x207.3125]
PaintableWithLines (BlockContainer(anonymous)) [8,8 784x161.65625] overflow: [8,8 784x161.671875]
PaintableWithLines (BlockContainer<BODY>) [8,8 784x299.65625]
PaintableWithLines (BlockContainer(anonymous)) [8,8 784x152]
SVGSVGPaintable (SVGSVGBox<svg>) [8,8 302x152]
TextPaintable (TextNode<#text>)
InlinePaintable (InlineNode<math>)
InlinePaintable (InlineNode<a>)
TextPaintable (TextNode<#text>)
PaintableWithLines (BlockContainer<DIV>) [8,169.65625 784x45.65625] overflow: [9,170.65625 782x43.671875]
PaintableWithLines (BlockContainer<a>) [8,160 102x102]
TextPaintable (TextNode<#text>)
PaintableWithLines (BlockContainer(anonymous)) [8,262 784x0]
PaintableWithLines (BlockContainer<DIV>) [8,262 784x45.65625] overflow: [9,263 782x43.671875]
InlinePaintable (InlineNode<A>)
TextPaintable (TextNode<#text>)
PaintableWithLines (BlockContainer(anonymous)) [8,215.3125 784x0]
PaintableWithLines (BlockContainer(anonymous)) [8,307.65625 784x0]

View file

@ -633,6 +633,7 @@ set(GENERATED_SOURCES
CSS/QuirksModeStyleSheetSource.cpp
CSS/TransformFunctions.cpp
CSS/ValueID.cpp
MathML/MathMLStyleSheetSource.cpp
)
serenity_lib(LibWeb web)

View file

@ -195,6 +195,16 @@ static CSSStyleSheet& quirks_mode_stylesheet(DOM::Document const& document)
return *sheet;
}
static CSSStyleSheet& mathml_stylesheet(DOM::Document const& document)
{
static JS::Handle<CSSStyleSheet> sheet;
if (!sheet.cell()) {
extern StringView mathml_stylesheet_source;
sheet = JS::make_handle(parse_css_stylesheet(CSS::Parser::ParsingContext(document), mathml_stylesheet_source));
}
return *sheet;
}
template<typename Callback>
void StyleComputer::for_each_stylesheet(CascadeOrigin cascade_origin, Callback callback) const
{
@ -202,6 +212,7 @@ void StyleComputer::for_each_stylesheet(CascadeOrigin cascade_origin, Callback c
callback(default_stylesheet(document()));
if (document().in_quirks_mode())
callback(quirks_mode_stylesheet(document()));
callback(mathml_stylesheet(document()));
}
if (cascade_origin == CascadeOrigin::Author) {
for (auto const& sheet : document().style_sheets().sheets())

View file

@ -35,6 +35,7 @@
#include <LibWeb/HighResolutionTime/TimeOrigin.h>
#include <LibWeb/Infra/CharacterTypes.h>
#include <LibWeb/Infra/Strings.h>
#include <LibWeb/MathML/TagNames.h>
#include <LibWeb/Namespace.h>
#include <LibWeb/SVG/TagNames.h>

View file

@ -0,0 +1,119 @@
/* https://w3c.github.io/mathml-core/#user-agent-stylesheet */
@namespace url(http://www.w3.org/1998/Math/MathML);
/* Universal rules */
* {
font-size: math;
display: block math;
writing-mode: horizontal-tb !important;
}
/* The <math> element */
math {
direction: ltr;
text-indent: 0;
letter-spacing: normal;
line-height: normal;
word-spacing: normal;
font-family: math;
font-size: inherit;
font-style: normal;
font-weight: normal;
display: inline math;
math-shift: normal;
math-style: compact;
math-depth: 0;
}
math[display="block" i] {
display: block math;
math-style: normal;
}
math[display="inline" i] {
display: inline math;
math-style: compact;
}
/* <mrow>-like elements */
semantics > :not(:first-child) {
display: none;
}
maction > :not(:first-child) {
display: none;
}
merror {
border: 1px solid red;
background-color: lightYellow;
}
mphantom {
visibility: hidden;
}
/* Token elements */
mi {
text-transform: math-auto;
}
/* Tables */
mtable {
display: inline-table;
math-style: compact;
}
mtr {
display: table-row;
}
mtd {
display: table-cell;
/* Centering inside table cells should rely on box alignment properties.
See https://github.com/w3c/mathml-core/issues/156 */
text-align: center;
padding: 0.5ex 0.4em;
}
/* Fractions */
mfrac {
padding-inline-start: 1px;
padding-inline-end: 1px;
}
mfrac > * {
math-depth: auto-add;
math-style: compact;
}
mfrac > :nth-child(2) {
math-shift: compact;
}
/* Other rules for scriptlevel, displaystyle and math-shift */
mroot > :not(:first-child) {
math-depth: add(2);
math-style: compact;
}
mroot, msqrt {
math-shift: compact;
}
msub > :not(:first-child),
msup > :not(:first-child),
msubsup > :not(:first-child),
mmultiscripts > :not(:first-child),
munder > :not(:first-child),
mover > :not(:first-child),
munderover > :not(:first-child) {
math-depth: add(1);
math-style: compact;
}
munder[accentunder="true" i] > :nth-child(2),
mover[accent="true" i] > :nth-child(2),
munderover[accentunder="true" i] > :nth-child(2),
munderover[accent="true" i] > :nth-child(3) {
font-size: inherit;
}
msub > :nth-child(2),
msubsup > :nth-child(2),
mmultiscripts > :nth-child(even),
mmultiscripts > mprescripts ~ :nth-child(odd),
mover[accent="true" i] > :first-child,
munderover[accent="true" i] > :first-child {
math-shift: compact;
}
mmultiscripts > mprescripts ~ :nth-child(even) {
math-shift: inherit;
}