Changeset 65382 in webkit
- Timestamp:
- Aug 15, 2010 12:43:17 PM (14 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r65381 r65382 1 2010-08-15 Adam Barth <abarth@webkit.org> 2 3 Reviewed by Eric Seidel. 4 5 document.write() doesn't flush plain text 6 https://bugs.webkit.org/show_bug.cgi?id=8961 7 8 Add test cases for flushing character tokens. 9 10 * fast/tokenizer/flush-characters-in-document-write-evil-expected.txt: Added. 11 * fast/tokenizer/flush-characters-in-document-write-evil.html: Added. 12 * fast/tokenizer/flush-characters-in-document-write-expected.txt: Added. 13 * fast/tokenizer/flush-characters-in-document-write.html: Added. 14 1 15 2010-08-15 Adam Barth <abarth@webkit.org> 2 16 -
trunk/WebCore/ChangeLog
r65381 r65382 1 2010-08-15 Adam Barth <abarth@webkit.org> 2 3 Reviewed by Eric Seidel. 4 5 document.write() doesn't flush plain text 6 https://bugs.webkit.org/show_bug.cgi?id=8961 7 8 Originally I thought we should buffer the character tokens until we've 9 reached the end of the input stream, but that's not how the spec 10 handles things (it emits the character tokens one-by-one). 11 12 Tests: fast/tokenizer/flush-characters-in-document-write-evil.html 13 fast/tokenizer/flush-characters-in-document-write.html 14 15 * html/HTMLTokenizer.cpp: 16 (WebCore::HTMLTokenizer::emitEndOfFile): 17 (WebCore::HTMLTokenizer::nextToken): 18 (WebCore::HTMLTokenizer::haveBufferedCharacterToken): 19 - Renamed this function now that it's simplier. 20 * html/HTMLTokenizer.h: 21 1 22 2010-08-15 Adam Barth <abarth@webkit.org> 2 23 -
trunk/WebCore/html/HTMLTokenizer.cpp
r65110 r65382 153 153 m_state = stateName; \ 154 154 if (!m_inputStreamPreprocessor.advance(source, m_lineNumber)) \ 155 return shouldEmitBufferedCharacterToken(source);\155 return haveBufferedCharacterToken(); \ 156 156 cc = m_inputStreamPreprocessor.nextInputCharacter(); \ 157 157 goto stateName; \ … … 166 166 m_state = stateName; \ 167 167 if (source.isEmpty() || !m_inputStreamPreprocessor.peek(source, m_lineNumber)) \ 168 return shouldEmitBufferedCharacterToken(source);\168 return haveBufferedCharacterToken(); \ 169 169 cc = m_inputStreamPreprocessor.nextInputCharacter(); \ 170 170 goto stateName; \ … … 203 203 bool HTMLTokenizer::emitEndOfFile(SegmentedString& source) 204 204 { 205 if ( shouldEmitBufferedCharacterToken(source))205 if (haveBufferedCharacterToken()) 206 206 return true; 207 207 m_state = DataState; … … 230 230 if (source.isEmpty() \ 231 231 || !m_inputStreamPreprocessor.peek(source, m_lineNumber)) \ 232 return shouldEmitBufferedCharacterToken(source);\232 return haveBufferedCharacterToken(); \ 233 233 cc = m_inputStreamPreprocessor.nextInputCharacter(); \ 234 234 goto stateName; \ … … 261 261 262 262 if (source.isEmpty() || !m_inputStreamPreprocessor.peek(source, m_lineNumber)) 263 return shouldEmitBufferedCharacterToken(source);263 return haveBufferedCharacterToken(); 264 264 UChar cc = m_inputStreamPreprocessor.nextInputCharacter(); 265 265 … … 309 309 BEGIN_STATE(CharacterReferenceInDataState) { 310 310 if (!processEntity(source)) 311 return shouldEmitBufferedCharacterToken(source);311 return haveBufferedCharacterToken(); 312 312 SWITCH_TO(DataState); 313 313 } … … 330 330 BEGIN_STATE(CharacterReferenceInRCDATAState) { 331 331 if (!processEntity(source)) 332 return shouldEmitBufferedCharacterToken(source);332 return haveBufferedCharacterToken(); 333 333 SWITCH_TO(RCDATAState); 334 334 } … … 1030 1030 unsigned value = consumeHTMLEntity(source, notEnoughCharacters, m_additionalAllowedCharacter); 1031 1031 if (notEnoughCharacters) 1032 return shouldEmitBufferedCharacterToken(source);1032 return haveBufferedCharacterToken(); 1033 1033 if (!value) 1034 1034 m_token->appendToAttributeValue('&'); … … 1114 1114 SWITCH_TO(CommentStartState); 1115 1115 } else if (result == SegmentedString::NotEnoughCharacters) 1116 return shouldEmitBufferedCharacterToken(source);1116 return haveBufferedCharacterToken(); 1117 1117 } else if (cc == 'D' || cc == 'd') { 1118 1118 SegmentedString::LookAheadResult result = source.lookAheadIgnoringCase(doctypeString); … … 1121 1121 SWITCH_TO(DOCTYPEState); 1122 1122 } else if (result == SegmentedString::NotEnoughCharacters) 1123 return shouldEmitBufferedCharacterToken(source);1123 return haveBufferedCharacterToken(); 1124 1124 } 1125 1125 notImplemented(); … … 1334 1334 SWITCH_TO(AfterDOCTYPEPublicKeywordState); 1335 1335 } else if (result == SegmentedString::NotEnoughCharacters) 1336 return shouldEmitBufferedCharacterToken(source);1336 return haveBufferedCharacterToken(); 1337 1337 } else if (cc == 'S' || cc == 's') { 1338 1338 SegmentedString::LookAheadResult result = source.lookAheadIgnoringCase(systemString); … … 1341 1341 SWITCH_TO(AfterDOCTYPESystemKeywordState); 1342 1342 } else if (result == SegmentedString::NotEnoughCharacters) 1343 return shouldEmitBufferedCharacterToken(source);1343 return haveBufferedCharacterToken(); 1344 1344 } 1345 1345 parseError(); … … 1650 1650 } 1651 1651 1652 inline bool HTMLTokenizer::shouldEmitBufferedCharacterToken(const SegmentedString& source) 1653 { 1654 return source.isClosed() && m_token->type() == HTMLToken::Character; 1655 } 1656 1657 } 1658 1652 inline bool HTMLTokenizer::haveBufferedCharacterToken() 1653 { 1654 return m_token->type() == HTMLToken::Character; 1655 } 1656 1657 } -
trunk/WebCore/html/HTMLTokenizer.h
r65077 r65382 255 255 inline bool isAppropriateEndTag(); 256 256 257 inline bool shouldEmitBufferedCharacterToken(const SegmentedString&);257 inline bool haveBufferedCharacterToken(); 258 258 259 259 State m_state;
Note: See TracChangeset
for help on using the changeset viewer.