Browse Source

LibWeb: Add a separate UA style sheet for documents in quirks mode

We need to make some additional tweaks to the default UA style when
displaying documents in quirks mode.
Andreas Kling 4 years ago
parent
commit
96fc476107

+ 9 - 0
Libraries/LibWeb/CMakeLists.txt

@@ -16,6 +16,7 @@ set(SOURCES
     CSS/Parser/CSSParser.cpp
     CSS/Parser/CSSParser.cpp
     CSS/PropertyID.cpp
     CSS/PropertyID.cpp
     CSS/PropertyID.h
     CSS/PropertyID.h
+    CSS/QuirksModeStyleSheetSource.cpp
     CSS/Selector.cpp
     CSS/Selector.cpp
     CSS/SelectorEngine.cpp
     CSS/SelectorEngine.cpp
     CSS/StyleDeclaration.cpp
     CSS/StyleDeclaration.cpp
@@ -329,5 +330,13 @@ add_custom_command(
     MAIN_DEPENDENCY CSS/Default.css
     MAIN_DEPENDENCY CSS/Default.css
 )
 )
 
 
+add_custom_command(
+    OUTPUT CSS/QuirksModeStyleSheetSource.cpp
+    COMMAND ${write_if_different} CSS/QuirksModeStyleSheetSource.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Scripts/GenerateStyleSheetSource.sh quirks_mode_stylesheet_source ${CMAKE_CURRENT_SOURCE_DIR}/CSS/QuirksMode.css
+    VERBATIM
+    DEPENDS Scripts/GenerateStyleSheetSource.sh
+    MAIN_DEPENDENCY CSS/Default.css
+)
+
 serenity_lib(LibWeb web)
 serenity_lib(LibWeb web)
 target_link_libraries(LibWeb LibCore LibJS LibMarkdown LibGemini LibGUI LibGfx LibTextCodec LibProtocol LibImageDecoderClient)
 target_link_libraries(LibWeb LibCore LibJS LibMarkdown LibGemini LibGUI LibGfx LibTextCodec LibProtocol LibImageDecoderClient)

+ 0 - 5
Libraries/LibWeb/CSS/Default.css

@@ -147,8 +147,3 @@ blockquote {
     margin-left: 25px;
     margin-left: 25px;
     margin-right: 25px;
     margin-right: 25px;
 }
 }
-
-/* FIXME: I think this should only apply in quirks mode. */
-table {
-    text-align: left;
-}

+ 3 - 0
Libraries/LibWeb/CSS/QuirksMode.css

@@ -0,0 +1,3 @@
+table {
+    text-align: left;
+}

+ 13 - 0
Libraries/LibWeb/CSS/StyleResolver.cpp

@@ -57,10 +57,23 @@ static StyleSheet& default_stylesheet()
     return *sheet;
     return *sheet;
 }
 }
 
 
+static StyleSheet& quirks_mode_stylesheet()
+{
+    static StyleSheet* sheet;
+    if (!sheet) {
+        extern const char quirks_mode_stylesheet_source[];
+        String css = quirks_mode_stylesheet_source;
+        sheet = parse_css(CSS::ParsingContext(), css).leak_ref();
+    }
+    return *sheet;
+}
+
 template<typename Callback>
 template<typename Callback>
 void StyleResolver::for_each_stylesheet(Callback callback) const
 void StyleResolver::for_each_stylesheet(Callback callback) const
 {
 {
     callback(default_stylesheet());
     callback(default_stylesheet());
+    if (document().in_quirks_mode())
+        callback(quirks_mode_stylesheet());
     for (auto& sheet : document().style_sheets().sheets()) {
     for (auto& sheet : document().style_sheets().sheets()) {
         callback(sheet);
         callback(sheet);
     }
     }