Fixed the HTML scanner used by assert_tag where a infinite loop could be caused by a stray less-than sign in the input #1270 [Jamis Buck]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1297 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
David Heinemeier Hansson
2005-05-09 11:20:19 +00:00
parent 979880dd24
commit b167248b21
3 changed files with 17 additions and 4 deletions

View File

@@ -1,5 +1,7 @@
*SVN*
* Fixed the HTML scanner used by assert_tag where a infinite loop could be caused by a stray less-than sign in the input #1270 [Jamis Buck]
* Added functionality to assert_tag, so you can now do tests on the siblings of a node, to assert that some element comes before or after the element in question, or just to assert that some element exists as a sibling #1226 [Jamis Buck]
* Added better error handling for regexp caching expiration

View File

@@ -277,7 +277,10 @@ module HTML#:nodoc:
"</#{@name}>"
else
s = "<#{@name}"
@attributes.each { |k,v| s << " #{k}='#{v.to_s.gsub(/'/,"\\\\'")}'" }
@attributes.each do |k,v|
s << " #{k}"
s << "='#{v.gsub(/'/,"\\\\'")}'" if String === v
end
s << " /" if @closing == :self
s << ">"
@children.each { |child| s << child.to_s }

View File

@@ -63,7 +63,7 @@ module HTML#:nodoc:
# Scan all text up to the next < character and return it.
def scan_text
@scanner.scan(/[^<]*/)
@scanner.getch + (@scanner.scan(/[^<]*/) || "")
end
# Counts the number of newlines in the text and updates the current line
@@ -78,9 +78,17 @@ module HTML#:nodoc:
def consume_quoted_regions
text = ""
loop do
match = @scanner.scan_until(/['">]/) or break
match = @scanner.scan_until(/['"<>]/) or break
delim = @scanner.matched
if delim == "<"
match = match.chop
@scanner.pos -= 1
end
text << match
break if (delim = @scanner.matched) == ">"
break if delim == "<" || delim == ">"
# consume the conqued region
while match = @scanner.scan_until(/[\\#{delim}]/)
text << match