From a9d5a99568b41c83d724a9d8f81c1fdfe10a830e Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Wed, 4 Sep 2024 17:29:01 +0200 Subject: [PATCH] LibGfx+LibWeb: Replace remaining OpenType implementation with Skia This change should move us forward toward emoji support, as we are no longer limited by our own OpenType implementation, which was failing to parse the TrueType Collection format used to store emoji fonts (at least on macOS). --- AK/LsanSuppressions.h | 22 + Meta/Lagom/CMakeLists.txt | 1 - Meta/Lagom/Fuzzers/FuzzTTF.cpp | 16 - Meta/Lagom/Fuzzers/fuzzers.cmake | 1 - Tests/LibTTF/CMakeLists.txt | 7 - Tests/LibTTF/TestCmap.cpp | 88 --- .../Layout/expected/css-line-height-zero.txt | 14 +- .../css-pseudo-element-blockification.txt | 12 +- .../LibWeb/Layout/expected/font-size-zero.txt | 14 +- .../Layout/expected/input-image-to-text.txt | 14 +- .../expected/input-password-to-text.txt | 14 +- .../expected/input-text-to-password.txt | 14 +- .../LibWeb/Layout/expected/textarea-reset.txt | 14 +- .../images/input-placeholder-ref.png | Bin 4541 -> 4542 bytes Userland/Libraries/LibGfx/CMakeLists.txt | 5 - .../Libraries/LibGfx/Font/FontDatabase.cpp | 3 +- .../Libraries/LibGfx/Font/OpenType/Cmap.cpp | 216 ------ .../Libraries/LibGfx/Font/OpenType/Cmap.h | 137 ---- .../LibGfx/Font/OpenType/DataTypes.h | 74 -- .../Libraries/LibGfx/Font/OpenType/Glyf.cpp | 59 -- .../Libraries/LibGfx/Font/OpenType/Glyf.h | 99 --- .../LibGfx/Font/OpenType/Hinting/Opcodes.cpp | 136 ---- .../LibGfx/Font/OpenType/Hinting/Opcodes.h | 240 ------ .../Libraries/LibGfx/Font/OpenType/Tables.cpp | 701 ------------------ .../Libraries/LibGfx/Font/OpenType/Tables.h | 660 ----------------- .../LibGfx/Font/OpenType/Typeface.cpp | 489 ------------ .../Libraries/LibGfx/Font/OpenType/Typeface.h | 156 ---- Userland/Libraries/LibGfx/Font/ScaledFont.cpp | 46 +- Userland/Libraries/LibGfx/Font/ScaledFont.h | 2 +- .../Libraries/LibGfx/Font/ScaledFontSkia.cpp | 10 +- Userland/Libraries/LibGfx/Font/Typeface.cpp | 21 +- Userland/Libraries/LibGfx/Font/Typeface.h | 17 +- .../Libraries/LibGfx/Font/TypefaceSkia.cpp | 92 ++- Userland/Libraries/LibGfx/Font/TypefaceSkia.h | 43 ++ .../Libraries/LibGfx/Font/WOFF/Loader.cpp | 49 +- Userland/Libraries/LibGfx/Font/WOFF/Loader.h | 6 +- .../Libraries/LibGfx/Font/WOFF2/Loader.cpp | 6 +- Userland/Libraries/LibGfx/Font/WOFF2/Loader.h | 4 +- Userland/Libraries/LibWeb/CSS/FontFace.cpp | 3 +- .../Libraries/LibWeb/CSS/StyleComputer.cpp | 5 +- 40 files changed, 309 insertions(+), 3201 deletions(-) create mode 100644 AK/LsanSuppressions.h delete mode 100644 Meta/Lagom/Fuzzers/FuzzTTF.cpp delete mode 100644 Tests/LibTTF/CMakeLists.txt delete mode 100644 Tests/LibTTF/TestCmap.cpp delete mode 100644 Userland/Libraries/LibGfx/Font/OpenType/Cmap.cpp delete mode 100644 Userland/Libraries/LibGfx/Font/OpenType/Cmap.h delete mode 100644 Userland/Libraries/LibGfx/Font/OpenType/DataTypes.h delete mode 100644 Userland/Libraries/LibGfx/Font/OpenType/Glyf.cpp delete mode 100644 Userland/Libraries/LibGfx/Font/OpenType/Glyf.h delete mode 100644 Userland/Libraries/LibGfx/Font/OpenType/Hinting/Opcodes.cpp delete mode 100644 Userland/Libraries/LibGfx/Font/OpenType/Hinting/Opcodes.h delete mode 100644 Userland/Libraries/LibGfx/Font/OpenType/Tables.cpp delete mode 100644 Userland/Libraries/LibGfx/Font/OpenType/Tables.h delete mode 100644 Userland/Libraries/LibGfx/Font/OpenType/Typeface.cpp delete mode 100644 Userland/Libraries/LibGfx/Font/OpenType/Typeface.h create mode 100644 Userland/Libraries/LibGfx/Font/TypefaceSkia.h diff --git a/AK/LsanSuppressions.h b/AK/LsanSuppressions.h new file mode 100644 index 0000000000..4049f7d454 --- /dev/null +++ b/AK/LsanSuppressions.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2024, Aliaksandr Kalenik + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +#ifdef HAS_ADDRESS_SANITIZER +extern "C" { +char const* __lsan_default_suppressions(); +char const* __lsan_default_suppressions() +{ + // Both Skia and Chromium suppress false positive FontConfig leaks + // https://github.com/google/skia/blob/main/tools/LsanSuppressions.cpp#L20 + // https://chromium.googlesource.com/chromium/src/build/+/master/sanitizers/lsan_suppressions.cc#25 + return "leak:FcPatternObjectInsertElt"; +} +} +#endif diff --git a/Meta/Lagom/CMakeLists.txt b/Meta/Lagom/CMakeLists.txt index 2919155ddd..1cd1b66093 100644 --- a/Meta/Lagom/CMakeLists.txt +++ b/Meta/Lagom/CMakeLists.txt @@ -523,7 +523,6 @@ if (BUILD_TESTING) list(APPEND TEST_DIRECTORIES LibGfx LibMedia - LibTTF LibWeb LibWebView ) diff --git a/Meta/Lagom/Fuzzers/FuzzTTF.cpp b/Meta/Lagom/Fuzzers/FuzzTTF.cpp deleted file mode 100644 index a194c74f2f..0000000000 --- a/Meta/Lagom/Fuzzers/FuzzTTF.cpp +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (c) 2021, the SerenityOS developers. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include -#include -#include - -extern "C" int LLVMFuzzerTestOneInput(u8 const* data, size_t size) -{ - AK::set_debug_enabled(false); - (void)OpenType::Typeface::try_load_from_externally_owned_memory({ data, size }); - return 0; -} diff --git a/Meta/Lagom/Fuzzers/fuzzers.cmake b/Meta/Lagom/Fuzzers/fuzzers.cmake index 57550252d8..39aae6ec97 100644 --- a/Meta/Lagom/Fuzzers/fuzzers.cmake +++ b/Meta/Lagom/Fuzzers/fuzzers.cmake @@ -36,7 +36,6 @@ set(FUZZER_TARGETS Tar TextDecoder TIFFLoader - TTF TinyVGLoader URL WasmParser diff --git a/Tests/LibTTF/CMakeLists.txt b/Tests/LibTTF/CMakeLists.txt deleted file mode 100644 index a88509d8cb..0000000000 --- a/Tests/LibTTF/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -set(TEST_SOURCES - TestCmap.cpp -) - -foreach(source IN LISTS TEST_SOURCES) - serenity_test("${source}" LibTTF LIBS LibGfx) -endforeach() diff --git a/Tests/LibTTF/TestCmap.cpp b/Tests/LibTTF/TestCmap.cpp deleted file mode 100644 index 50918efaf0..0000000000 --- a/Tests/LibTTF/TestCmap.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2022, Nico Weber - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include -#include - -TEST_CASE(test_cmap_format_4) -{ - // clang-format off - // Big endian. - Array const cmap_table = - { - // https://docs.microsoft.com/en-us/typography/opentype/spec/cmap#cmap-header - 0, 0, // uint16 version - 0, 1, // uint16 numTables - - // https://docs.microsoft.com/en-us/typography/opentype/spec/cmap#encoding-records-and-encodings - 0, 0, // uint16 platformID, 0 means "Unicode" - 0, 3, // uint16 encodingID, 3 means "BMP only" for platformID==0. - 0, 0, 0, 12, // Offset32 to encoding subtable. - - // https://docs.microsoft.com/en-us/typography/opentype/spec/cmap#format-4-segment-mapping-to-delta-values - 0, 4, // uint16 format = 4 - 0, 42, // uint16 length in bytes - 0, 0, // uint16 language, must be 0 - 0, 6, // segCount * 2 - 0, 4, // searchRange - 0, 1, // entrySelector - 0, 2, // rangeShift - - // endCode array, last entry must be 0xffff. - 0, 128, - 1, 0, - 0xff, 0xff, - - 0, 0, // uint16 reservedPad - - // startCode array - 0, 16, - 1, 0, - 0xff, 0xff, - - // delta array - 0, 0, - 0, 10, - 0, 0, - - // glyphID array - 0, 0, - 0, 0, - 0, 0, - }; - // clang-format on - auto cmap = OpenType::Cmap::from_slice(cmap_table.span()).value(); - cmap.set_active_index(0); - - // Format 4 can't handle code points > 0xffff. - - // First range is 16..128. - EXPECT_EQ(cmap.glyph_id_for_code_point(15), 0u); - EXPECT_EQ(cmap.glyph_id_for_code_point(16), 16u); - EXPECT_EQ(cmap.glyph_id_for_code_point(128), 128u); - EXPECT_EQ(cmap.glyph_id_for_code_point(129), 0u); - - // Second range is 256..256, with delta 10. - EXPECT_EQ(cmap.glyph_id_for_code_point(255), 0u); - EXPECT_EQ(cmap.glyph_id_for_code_point(256), 266u); - EXPECT_EQ(cmap.glyph_id_for_code_point(257), 0u); - - // Third range is 0xffff..0xffff. - // From https://docs.microsoft.com/en-us/typography/opentype/spec/cmap#format-4-segment-mapping-to-delta-values: - // "the final start code and endCode values must be 0xFFFF. This segment need not contain any valid mappings. - // (It can just map the single character code 0xFFFF to missingGlyph). However, the segment must be present." - // FIXME: Make OpenType::Cmap::from_slice() reject inputs where this isn't true. - EXPECT_EQ(cmap.glyph_id_for_code_point(0xfeff), 0u); - EXPECT_EQ(cmap.glyph_id_for_code_point(0xffff), 0xffffu); - EXPECT_EQ(cmap.glyph_id_for_code_point(0x1'0000), 0u); - - // Set the number of subtables to a value, where the record offset for the last subtable is greater than the - // total table size. We should not crash if a Cmap table is truncated in this way. - auto malformed_cmap_table = cmap_table; - malformed_cmap_table[3] = 13; - auto cmap_with_invalid_subtable_offset = OpenType::Cmap::from_slice(malformed_cmap_table.span()).value(); - EXPECT(!cmap_with_invalid_subtable_offset.subtable(12).has_value()); -} diff --git a/Tests/LibWeb/Layout/expected/css-line-height-zero.txt b/Tests/LibWeb/Layout/expected/css-line-height-zero.txt index 09edc7d5db..1148afdbe1 100644 --- a/Tests/LibWeb/Layout/expected/css-line-height-zero.txt +++ b/Tests/LibWeb/Layout/expected/css-line-height-zero.txt @@ -1,10 +1,10 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline BlockContainer at (0,0) content-size 800x37 [BFC] children: not-inline BlockContainer at (8,8) content-size 784x21 children: inline - frag 0 from BlockContainer start: 0, length: 0, rect: [9,9 191.875x19] baseline: 14.296875 - BlockContainer at (9,9) content-size 191.875x19 inline-block [BFC] children: not-inline - Box
at (11,10) content-size 187.875x17 flex-container(row) [FFC] children: not-inline - BlockContainer
at (11,10) content-size 187.875x17 flex-item [BFC] children: inline + frag 0 from BlockContainer start: 0, length: 0, rect: [9,9 200x19] baseline: 14.296875 + BlockContainer at (9,9) content-size 200x19 inline-block [BFC] children: not-inline + Box
at (11,10) content-size 196x17 flex-container(row) [FFC] children: not-inline + BlockContainer
at (11,10) content-size 196x17 flex-item [BFC] children: inline frag 0 from TextNode start: 0, length: 11, rect: [11,10 91.953125x17] baseline: 13.296875 "Hello World" TextNode <#text> @@ -13,7 +13,7 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline ViewportPaintable (Viewport<#document>) [0,0 800x600] PaintableWithLines (BlockContainer) [0,0 800x37] PaintableWithLines (BlockContainer) [8,8 784x21] - PaintableWithLines (BlockContainer) [8,8 193.875x21] - PaintableBox (Box
) [9,9 191.875x19] - PaintableWithLines (BlockContainer
) [11,10 187.875x17] + PaintableWithLines (BlockContainer) [8,8 202x21] + PaintableBox (Box
) [9,9 200x19] + PaintableWithLines (BlockContainer
) [11,10 196x17] TextPaintable (TextNode<#text>) diff --git a/Tests/LibWeb/Layout/expected/css-pseudo-element-blockification.txt b/Tests/LibWeb/Layout/expected/css-pseudo-element-blockification.txt index 95f1003fac..91ebfa94a2 100644 --- a/Tests/LibWeb/Layout/expected/css-pseudo-element-blockification.txt +++ b/Tests/LibWeb/Layout/expected/css-pseudo-element-blockification.txt @@ -6,12 +6,12 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline frag 0 from TextNode start: 0, length: 4, rect: [8,8 28.40625x17] baseline: 13.296875 "well" TextNode <#text> - BlockContainer <(anonymous)> at (46,8) content-size 36.84375x17 flex-item [BFC] children: inline - frag 0 from TextNode start: 0, length: 5, rect: [46,8 36.84375x17] baseline: 13.296875 + BlockContainer <(anonymous)> at (46.40625,8) content-size 36.84375x17 flex-item [BFC] children: inline + frag 0 from TextNode start: 0, length: 5, rect: [46.40625,8 36.84375x17] baseline: 13.296875 "hello" TextNode <#text> - BlockContainer <(anonymous)> at (92.4375,8) content-size 55.359375x17 flex-item [BFC] children: inline - frag 0 from TextNode start: 0, length: 7, rect: [92.4375,8 55.359375x17] baseline: 13.296875 + BlockContainer <(anonymous)> at (93.25,8) content-size 55.359375x17 flex-item [BFC] children: inline + frag 0 from TextNode start: 0, length: 7, rect: [93.25,8 55.359375x17] baseline: 13.296875 "friends" TextNode <#text> @@ -21,7 +21,7 @@ ViewportPaintable (Viewport<#document>) [0,0 800x600] PaintableBox (Box
.foo) [8,8 784x17] PaintableWithLines (BlockContainer(anonymous)) [8,8 28.40625x17] TextPaintable (TextNode<#text>) - PaintableWithLines (BlockContainer(anonymous)) [46,8 36.84375x17] + PaintableWithLines (BlockContainer(anonymous)) [46.40625,8 36.84375x17] TextPaintable (TextNode<#text>) - PaintableWithLines (BlockContainer(anonymous)) [92.4375,8 55.359375x17] + PaintableWithLines (BlockContainer(anonymous)) [93.25,8 55.359375x17] TextPaintable (TextNode<#text>) diff --git a/Tests/LibWeb/Layout/expected/font-size-zero.txt b/Tests/LibWeb/Layout/expected/font-size-zero.txt index 4caf892bac..30a2b5ab2d 100644 --- a/Tests/LibWeb/Layout/expected/font-size-zero.txt +++ b/Tests/LibWeb/Layout/expected/font-size-zero.txt @@ -1,13 +1,13 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline - BlockContainer at (0,0) content-size 800x16 [BFC] children: not-inline - BlockContainer at (8,8) content-size 784x0 children: not-inline - BlockContainer
at (8,8) content-size 784x0 children: inline - frag 0 from TextNode start: 0, length: 21, rect: [8,8 0x0] baseline: 0 + BlockContainer at (0,0) content-size 800x17 [BFC] children: not-inline + BlockContainer at (8,8) content-size 784x1 children: not-inline + BlockContainer
at (8,8) content-size 784x1 children: inline + frag 0 from TextNode start: 0, length: 21, rect: [8,8 0x1] baseline: 0.796875 "should not be visible" TextNode <#text> ViewportPaintable (Viewport<#document>) [0,0 800x600] - PaintableWithLines (BlockContainer) [0,0 800x16] - PaintableWithLines (BlockContainer) [8,8 784x0] - PaintableWithLines (BlockContainer
) [8,8 784x0] + PaintableWithLines (BlockContainer) [0,0 800x17] + PaintableWithLines (BlockContainer) [8,8 784x1] + PaintableWithLines (BlockContainer
) [8,8 784x1] TextPaintable (TextNode<#text>) diff --git a/Tests/LibWeb/Layout/expected/input-image-to-text.txt b/Tests/LibWeb/Layout/expected/input-image-to-text.txt index ffe2e0538e..c0616c0061 100644 --- a/Tests/LibWeb/Layout/expected/input-image-to-text.txt +++ b/Tests/LibWeb/Layout/expected/input-image-to-text.txt @@ -1,10 +1,10 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline BlockContainer at (0,0) content-size 800x600 [BFC] children: not-inline BlockContainer at (8,8) content-size 784x21 children: inline - frag 0 from BlockContainer start: 0, length: 0, rect: [9,9 189.875x19] baseline: 14.296875 - BlockContainer at (9,9) content-size 189.875x19 inline-block [BFC] children: not-inline - Box
at (11,10) content-size 185.875x17 flex-container(row) [FFC] children: not-inline - BlockContainer
at (11,10) content-size 185.875x17 flex-item [BFC] children: inline + frag 0 from BlockContainer start: 0, length: 0, rect: [9,9 198x19] baseline: 14.296875 + BlockContainer at (9,9) content-size 198x19 inline-block [BFC] children: not-inline + Box
at (11,10) content-size 194x17 flex-container(row) [FFC] children: not-inline + BlockContainer
at (11,10) content-size 194x17 flex-item [BFC] children: inline frag 0 from TextNode start: 0, length: 7, rect: [11,10 55.6875x17] baseline: 13.296875 "120.png" TextNode <#text> @@ -14,7 +14,7 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline ViewportPaintable (Viewport<#document>) [0,0 800x600] PaintableWithLines (BlockContainer) [0,0 800x600] PaintableWithLines (BlockContainer) [8,8 784x21] - PaintableWithLines (BlockContainer) [8,8 191.875x21] - PaintableBox (Box
) [9,9 189.875x19] - PaintableWithLines (BlockContainer
) [11,10 185.875x17] + PaintableWithLines (BlockContainer) [8,8 200x21] + PaintableBox (Box
) [9,9 198x19] + PaintableWithLines (BlockContainer
) [11,10 194x17] TextPaintable (TextNode<#text>) diff --git a/Tests/LibWeb/Layout/expected/input-password-to-text.txt b/Tests/LibWeb/Layout/expected/input-password-to-text.txt index d76b40bd16..4c71a0be7c 100644 --- a/Tests/LibWeb/Layout/expected/input-password-to-text.txt +++ b/Tests/LibWeb/Layout/expected/input-password-to-text.txt @@ -1,10 +1,10 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline BlockContainer at (0,0) content-size 800x600 [BFC] children: not-inline BlockContainer at (8,8) content-size 784x21 children: inline - frag 0 from BlockContainer start: 0, length: 0, rect: [9,9 189.875x19] baseline: 14.296875 - BlockContainer at (9,9) content-size 189.875x19 inline-block [BFC] children: not-inline - Box
at (11,10) content-size 185.875x17 flex-container(row) [FFC] children: not-inline - BlockContainer
at (11,10) content-size 185.875x17 flex-item [BFC] children: inline + frag 0 from BlockContainer start: 0, length: 0, rect: [9,9 198x19] baseline: 14.296875 + BlockContainer at (9,9) content-size 198x19 inline-block [BFC] children: not-inline + Box
at (11,10) content-size 194x17 flex-container(row) [FFC] children: not-inline + BlockContainer
at (11,10) content-size 194x17 flex-item [BFC] children: inline frag 0 from TextNode start: 0, length: 7, rect: [11,10 61.890625x17] baseline: 13.296875 "hunter2" TextNode <#text> @@ -14,7 +14,7 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline ViewportPaintable (Viewport<#document>) [0,0 800x600] PaintableWithLines (BlockContainer) [0,0 800x600] PaintableWithLines (BlockContainer) [8,8 784x21] - PaintableWithLines (BlockContainer) [8,8 191.875x21] - PaintableBox (Box
) [9,9 189.875x19] - PaintableWithLines (BlockContainer
) [11,10 185.875x17] + PaintableWithLines (BlockContainer) [8,8 200x21] + PaintableBox (Box
) [9,9 198x19] + PaintableWithLines (BlockContainer
) [11,10 194x17] TextPaintable (TextNode<#text>) diff --git a/Tests/LibWeb/Layout/expected/input-text-to-password.txt b/Tests/LibWeb/Layout/expected/input-text-to-password.txt index 1d9745779a..38c00270d3 100644 --- a/Tests/LibWeb/Layout/expected/input-text-to-password.txt +++ b/Tests/LibWeb/Layout/expected/input-text-to-password.txt @@ -1,10 +1,10 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline BlockContainer at (0,0) content-size 800x600 [BFC] children: not-inline BlockContainer at (8,8) content-size 784x21 children: inline - frag 0 from BlockContainer start: 0, length: 0, rect: [9,9 189.875x19] baseline: 14.296875 - BlockContainer at (9,9) content-size 189.875x19 inline-block [BFC] children: not-inline - Box
at (11,10) content-size 185.875x17 flex-container(row) [FFC] children: not-inline - BlockContainer
at (11,10) content-size 185.875x17 flex-item [BFC] children: inline + frag 0 from BlockContainer start: 0, length: 0, rect: [9,9 198x19] baseline: 14.296875 + BlockContainer at (9,9) content-size 198x19 inline-block [BFC] children: not-inline + Box
at (11,10) content-size 194x17 flex-container(row) [FFC] children: not-inline + BlockContainer
at (11,10) content-size 194x17 flex-item [BFC] children: inline frag 0 from TextNode start: 0, length: 7, rect: [11,10 55.5625x17] baseline: 13.296875 "*******" TextNode <#text> @@ -14,7 +14,7 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline ViewportPaintable (Viewport<#document>) [0,0 800x600] PaintableWithLines (BlockContainer) [0,0 800x600] PaintableWithLines (BlockContainer) [8,8 784x21] - PaintableWithLines (BlockContainer) [8,8 191.875x21] - PaintableBox (Box
) [9,9 189.875x19] - PaintableWithLines (BlockContainer
) [11,10 185.875x17] + PaintableWithLines (BlockContainer) [8,8 200x21] + PaintableBox (Box
) [9,9 198x19] + PaintableWithLines (BlockContainer
) [11,10 194x17] TextPaintable (TextNode<#text>) diff --git a/Tests/LibWeb/Layout/expected/textarea-reset.txt b/Tests/LibWeb/Layout/expected/textarea-reset.txt index 840f3f926d..5dd248b4a7 100644 --- a/Tests/LibWeb/Layout/expected/textarea-reset.txt +++ b/Tests/LibWeb/Layout/expected/textarea-reset.txt @@ -2,11 +2,11 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline BlockContainer at (0,0) content-size 800x600 [BFC] children: not-inline BlockContainer at (8,8) content-size 784x34 children: not-inline BlockContainer at (8,8) content-size 784x34 children: inline - frag 0 from BlockContainer start: 0, length: 0, rect: [11,11 185.875x28] baseline: 16.296875 + frag 0 from BlockContainer start: 0, length: 0, rect: [11,11 194x28] baseline: 16.296875 TextNode <#text> - BlockContainer at (11,11) content-size 185.875x28 inline-block [BFC] children: not-inline - BlockContainer
at (11,11) content-size 185.875x17 children: not-inline - BlockContainer
at (11,11) content-size 185.875x17 children: inline + BlockContainer at (11,11) content-size 194x28 inline-block [BFC] children: not-inline + BlockContainer
at (11,11) content-size 194x17 children: not-inline + BlockContainer
at (11,11) content-size 194x17 children: inline frag 0 from TextNode start: 0, length: 14, rect: [11,11 108.453125x17] baseline: 13.296875 "Original value" TextNode <#text> @@ -19,8 +19,8 @@ ViewportPaintable (Viewport<#document>) [0,0 800x600] PaintableWithLines (BlockContainer) [0,0 800x600] PaintableWithLines (BlockContainer) [8,8 784x34] overflow: [8,8 784x50] PaintableWithLines (BlockContainer
#form) [8,8 784x34] - PaintableWithLines (BlockContainer