    # File lib/action_controller/vendor/html-scanner/html/selector.rb, line 363
        def match(element, first_only = false)
          # Match element if no element name or element name same as element name
          if matched = (!@tag_name || @tag_name == element.name)
            # No match if one of the attribute matches failed
            for attr in @attributes
              if element.attributes[attr[0]] !~ attr[1]
                matched = false
                break
              end
            end
          end

          # Pseudo class matches (nth-child, empty, etc).
          if matched
            for pseudo in @pseudo
              unless pseudo.call(element)
                matched = false
                break
              end
            end
          end

          # Negation. Same rules as above, but we fail if a match is made.
          if matched && @negation
            for negation in @negation
              if negation[:tag_name] == element.name
                matched = false
              else
                for attr in negation[:attributes]
                  if element.attributes[attr[0]] =~ attr[1]
                    matched = false
                    break
                  end
                end
              end
              if matched
                for pseudo in negation[:pseudo]
                  if pseudo.call(element)
                    matched = false
                    break
                  end
                end
              end
              break unless matched
            end
          end

          # If element matched but depends on another element (child,
          # sibling, etc), apply the dependent matches instead.
          if matched && @depends
            matches = @depends.call(element, first_only)
          else
            matches = matched ? [element] : nil
          end

          # If this selector is part of the group, try all the alternative
          # selectors (unless first_only).
          if !first_only || !matches
            @alternates.each do |alternate|
              break if matches && first_only
              if subset = alternate.match(element, first_only)
                if matches
                  matches.concat subset
                else
                  matches = subset
                end
              end
            end
          end

          matches
        end