Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 4.59 KB | None | 0 0
  1. diff --git a/servo/components/selectors/parser.rs b/servo/components/selectors/parser.rs
  2. --- a/servo/components/selectors/parser.rs
  3. +++ b/servo/components/selectors/parser.rs
  4. @@ -1706,34 +1706,25 @@ where
  5.  
  6.          AttrSelectorOperator::Includes => value.is_empty() || value.contains(SELECTOR_WHITESPACE),
  7.  
  8.          AttrSelectorOperator::Prefix |
  9.          AttrSelectorOperator::Substring |
  10.          AttrSelectorOperator::Suffix => value.is_empty(),
  11.      };
  12.  
  13. -    let mut case_sensitivity = parse_attribute_flags(input)?;
  14. +    let mut attribute_flags = parse_attribute_flags(input)?;
  15.  
  16.      let value = value.as_ref().into();
  17.      let local_name_lower;
  18.      let local_name_is_ascii_lowercase;
  19. +    let case_sensitivity;
  20.      {
  21.          let local_name_lower_cow = to_ascii_lowercase(&local_name);
  22. -        if let ParsedCaseSensitivity::CaseSensitive = case_sensitivity {
  23. -            if namespace.is_none() && include!(concat!(
  24. -                env!("OUT_DIR"),
  25. -                "/ascii_case_insensitive_html_attributes.rs"
  26. -            ))
  27. -            .contains(&*local_name_lower_cow)
  28. -            {
  29. -                case_sensitivity =
  30. -                    ParsedCaseSensitivity::AsciiCaseInsensitiveIfInHtmlElementInHtmlDocument
  31. -            }
  32. -        }
  33. +        case_sensitivity = attribute_flags.to_case_sensitivity(local_name_lower_cow.as_ref(), &namespace);
  34.          local_name_lower = local_name_lower_cow.as_ref().into();
  35.          local_name_is_ascii_lowercase = matches!(local_name_lower_cow, Cow::Borrowed(..));
  36.      }
  37.      let local_name = local_name.as_ref().into();
  38.      if namespace.is_some() || !local_name_is_ascii_lowercase {
  39.          Ok(Component::AttributeOther(Box::new(
  40.              AttrSelectorWithOptionalNamespace {
  41.                  namespace,
  42. @@ -1753,27 +1744,71 @@ where
  43.              operator: operator,
  44.              value: value,
  45.              case_sensitivity: case_sensitivity,
  46.              never_matches: never_matches,
  47.          })
  48.      }
  49.  }
  50.  
  51. +/// An attribute selector can have 's' or 'i' as flags, or no flags at all.
  52. +enum AttributeFlags {
  53. +    // Matching should be case-sensitive ('s' flag).
  54. +    CaseSensitive,
  55. +    // Matching should be case-insensitive ('i' flag).
  56. +    AsciiCaseInsensitive,
  57. +    // No flags.  Matching behavior depends on the name of the attribute.
  58. +    DependsOnName
  59. +}
  60. +
  61. +impl AttributeFlags {
  62. +    fn to_case_sensitivity<Impl>(
  63. +        self,
  64. +        local_name: &str,
  65. +        namespace: &Option<NamespaceConstraint<(Impl::NamespacePrefix,
  66. +                                                Impl::NamespaceUrl)>>
  67. +    ) -> ParsedCaseSensitivity
  68. +        where Impl: SelectorImpl
  69. +    {
  70. +        match self {
  71. +            AttributeFlags::CaseSensitive =>
  72. +                ParsedCaseSensitivity::CaseSensitive,
  73. +            AttributeFlags::AsciiCaseInsensitive =>
  74. +                ParsedCaseSensitivity::AsciiCaseInsensitive,
  75. +            DependsOnName => {
  76. +                if namespace.is_none() && include!(concat!(
  77. +                    env!("OUT_DIR"),
  78. +                    "/ascii_case_insensitive_html_attributes.rs"
  79. +                ))
  80. +                    .contains(local_name)
  81. +                {
  82. +                    ParsedCaseSensitivity::AsciiCaseInsensitiveIfInHtmlElementInHtmlDocument
  83. +                } else {
  84. +                    ParsedCaseSensitivity::CaseSensitive
  85. +                }
  86. +            }
  87. +        }
  88. +    }
  89. +}
  90. +
  91.  fn parse_attribute_flags<'i, 't>(
  92.      input: &mut CssParser<'i, 't>,
  93. -) -> Result<ParsedCaseSensitivity, BasicParseError<'i>> {
  94. +) -> Result<AttributeFlags, BasicParseError<'i>> {
  95.      let location = input.current_source_location();
  96.      match input.next() {
  97.          Err(_) => {
  98. -            // Selectors spec says language-defined, but HTML says sensitive.
  99. -            Ok(ParsedCaseSensitivity::CaseSensitive)
  100. +            // Selectors spec says language-defined; HTML says it depends on the
  101. +            // exact attribute name.
  102. +            Ok(AttributeFlags::DependsOnName)
  103.          },
  104.          Ok(&Token::Ident(ref value)) if value.eq_ignore_ascii_case("i") => {
  105. -            Ok(ParsedCaseSensitivity::AsciiCaseInsensitive)
  106. +            Ok(AttributeFlags::AsciiCaseInsensitive)
  107. +        },
  108. +        Ok(&Token::Ident(ref value)) if value.eq_ignore_ascii_case("s") => {
  109. +            Ok(AttributeFlags::CaseSensitive)
  110.          },
  111.          Ok(t) => Err(location.new_basic_unexpected_token_error(t.clone())),
  112.      }
  113.  }
  114.  
  115.  /// Level 3: Parse **one** simple_selector.  (Though we might insert a second
  116.  /// implied "<defaultns>|*" type selector.)
  117.  fn parse_negation<'i, 't, P, Impl>(
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement