소스 검색

LibWeb: Implement the `:target` selector pseudo-class

We don't yet set the Document's target element in most cases, so this
does not function very well. But that will improve once we *do* set it,
which involves a more complete Navigables implementation.
Sam Atkins 1 년 전
부모
커밋
a9620d8784

+ 2 - 0
Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp

@@ -587,6 +587,8 @@ Parser::ParseErrorOr<Selector::SimpleSelector> Parser::parse_pseudo_simple_selec
             return make_pseudo_class_selector(Selector::SimpleSelector::PseudoClass::Type::Seeking);
         if (pseudo_name.equals_ignoring_ascii_case("stalled"sv))
             return make_pseudo_class_selector(Selector::SimpleSelector::PseudoClass::Type::Stalled);
+        if (pseudo_name.equals_ignoring_ascii_case("target"sv))
+            return make_pseudo_class_selector(Selector::SimpleSelector::PseudoClass::Type::Target);
         if (pseudo_name.equals_ignoring_ascii_case("host"sv))
             return make_pseudo_class_selector(Selector::SimpleSelector::PseudoClass::Type::Host);
         if (pseudo_name.equals_ignoring_ascii_case("visited"sv))

+ 1 - 0
Userland/Libraries/LibWeb/CSS/Selector.cpp

@@ -258,6 +258,7 @@ ErrorOr<String> Selector::SimpleSelector::serialize() const
         case Selector::SimpleSelector::PseudoClass::Type::VolumeLocked:
         case Selector::SimpleSelector::PseudoClass::Type::Buffering:
         case Selector::SimpleSelector::PseudoClass::Type::Stalled:
+        case Selector::SimpleSelector::PseudoClass::Type::Target:
             // If the pseudo-class does not accept arguments append ":" (U+003A), followed by the name of the pseudo-class, to s.
             TRY(s.try_append(':'));
             TRY(s.try_append(pseudo_class_name(pseudo_class.type)));

+ 3 - 0
Userland/Libraries/LibWeb/CSS/Selector.h

@@ -123,6 +123,7 @@ public:
                 VolumeLocked,
                 Buffering,
                 Stalled,
+                Target,
             };
             Type type;
 
@@ -344,6 +345,8 @@ constexpr StringView pseudo_class_name(Selector::SimpleSelector::PseudoClass::Ty
         return "buffering"sv;
     case Selector::SimpleSelector::PseudoClass::Type::Stalled:
         return "stalled"sv;
+    case Selector::SimpleSelector::PseudoClass::Type::Target:
+        return "target"sv;
     }
     VERIFY_NOT_REACHED();
 }

+ 2 - 0
Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp

@@ -425,6 +425,8 @@ static inline bool matches_pseudo_class(CSS::Selector::SimpleSelector::PseudoCla
         auto const& media_element = static_cast<HTML::HTMLMediaElement const&>(element);
         return media_element.stalled();
     }
+    case CSS::Selector::SimpleSelector::PseudoClass::Type::Target:
+        return element.is_target();
     }
 
     return false;

+ 3 - 0
Userland/Libraries/LibWeb/Dump.cpp

@@ -590,6 +590,9 @@ void dump_selector(StringBuilder& builder, CSS::Selector const& selector)
                 case CSS::Selector::SimpleSelector::PseudoClass::Type::Stalled:
                     pseudo_class_description = "Stalled";
                     break;
+                case CSS::Selector::SimpleSelector::PseudoClass::Type::Target:
+                    pseudo_class_description = "Target";
+                    break;
                 }
 
                 builder.appendff(" pseudo_class={}", pseudo_class_description);