Changeset 21704 in webkit
- Timestamp:
- May 24, 2007 1:56:35 AM (17 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r21698 r21704 1 2007-05-24 David Hyatt <hyatt@apple.com> 2 3 Rework how HTML handles line numbering so that it is not fooled by 4 \r without a following \n and so that document.write doesn't lead 5 to line numbering confusion. 6 7 Reviewed by aroben 8 9 * html/HTMLParser.cpp: 10 (WebCore::HTMLParser::reportErrorToConsole): 11 * html/HTMLTokenizer.cpp: 12 (WebCore::HTMLTokenizer::processListing): 13 (WebCore::HTMLTokenizer::parseSpecial): 14 (WebCore::HTMLTokenizer::parseComment): 15 (WebCore::HTMLTokenizer::parseServer): 16 (WebCore::HTMLTokenizer::parseProcessingInstruction): 17 (WebCore::HTMLTokenizer::parseText): 18 (WebCore::HTMLTokenizer::parseEntity): 19 (WebCore::HTMLTokenizer::parseTag): 20 (WebCore::HTMLTokenizer::write): 21 (WebCore::HTMLTokenizer::processToken): 22 (WebCore::HTMLTokenizer::setSrc): 23 * html/HTMLTokenizer.h: 24 (WebCore::HTMLTokenizer::lineNumberPtr): 25 * html/HTMLViewSourceDocument.cpp: 26 (WebCore::HTMLViewSourceDocument::addLine): 27 * loader/TextDocument.cpp: 28 (WebCore::TextTokenizer::write): 29 * platform/SegmentedString.cpp: 30 (WebCore::SegmentedString::SegmentedString): 31 (WebCore::SegmentedString::operator=): 32 (WebCore::SegmentedString::clear): 33 * platform/SegmentedString.h: 34 (WebCore::SegmentedString::SegmentedString): 35 (WebCore::SegmentedString::advance): 36 (WebCore::SegmentedString::escaped): 37 1 38 2007-05-23 David Hyatt <hyatt@apple.com> 2 39 -
trunk/WebCore/html/HTMLParser.cpp
r21522 r21704 1418 1418 1419 1419 HTMLTokenizer* htmlTokenizer = static_cast<HTMLTokenizer*>(document->tokenizer()); 1420 int lineNumber = htmlTokenizer-> tagStartLineNumber() + 1;1420 int lineNumber = htmlTokenizer->lineNumber() + 1; 1421 1421 1422 1422 AtomicString tag1; -
trunk/WebCore/html/HTMLTokenizer.cpp
r21680 r21704 257 257 state.setSkipLF(false); 258 258 if (*list == '\n') { 259 ++list;259 list.advance(0); 260 260 continue; 261 261 } … … 275 275 state.setSkipLF(true); 276 276 277 ++list;277 list.advance(0); 278 278 } else { 279 279 state.setDiscardLF(false); 280 280 *dest++ = *list; 281 ++list;281 list.advance(0); 282 282 } 283 283 } … … 292 292 ASSERT(state.inXmp() + state.inTextArea() + state.inTitle() + state.inStyle() + state.inScript() == 1 ); 293 293 if (state.inScript()) 294 scriptStartLineno = lineno + src.lineCount();294 scriptStartLineno = lineno; 295 295 296 296 if (state.inComment()) … … 307 307 } 308 308 if (scriptCodeResync && !tquote && ch == '>') { 309 ++src;309 src.advance(lineNumberPtr()); 310 310 scriptCodeSize = scriptCodeResync-1; 311 311 scriptCodeResync = 0; … … 359 359 if (!scriptCodeResync && (state.inTextArea() || state.inTitle()) && !src.escaped() && ch == '&') { 360 360 UChar* scriptCodeDest = scriptCode+scriptCodeSize; 361 ++src;361 src.advance(lineNumberPtr()); 362 362 state = parseEntity(src, scriptCodeDest, state, m_cBufferPos, true, false); 363 363 scriptCodeSize = scriptCodeDest-scriptCode; 364 364 } else { 365 365 scriptCode[scriptCodeSize++] = *src; 366 ++src;366 src.advance(lineNumberPtr()); 367 367 } 368 368 } … … 573 573 } 574 574 if (handleBrokenComments || endCharsCount > 1) { 575 ++src;575 src.advance(lineNumberPtr()); 576 576 if (!(state.inTitle() || state.inScript() || state.inXmp() || state.inTextArea() || state.inStyle())) { 577 577 checkScriptBuffer(); … … 591 591 } 592 592 } 593 ++src;593 src.advance(lineNumberPtr()); 594 594 } 595 595 … … 604 604 if (*src == '>' && 605 605 scriptCodeSize > 1 && scriptCode[scriptCodeSize-2] == '%') { 606 ++src;606 src.advance(lineNumberPtr()); 607 607 state.setInServer(false); 608 608 scriptCodeSize = 0; 609 609 return state; // Finished parsing server include 610 610 } 611 ++src;611 src.advance(lineNumberPtr()); 612 612 } 613 613 return state; … … 629 629 // We got a '?>' sequence 630 630 state.setInProcessingInstruction(false); 631 ++src;631 src.advance(lineNumberPtr()); 632 632 state.setDiscardLF(true); 633 633 return state; // Finished parsing comment! 634 634 } 635 ++src;635 src.advance(lineNumberPtr()); 636 636 oldchar = chbegin; 637 637 } … … 648 648 state.setSkipLF(false); 649 649 if (cc == '\n') { 650 ++src;650 src.advance(lineNumberPtr()); 651 651 continue; 652 652 } … … 661 661 } else 662 662 *dest++ = cc; 663 ++src;663 src.advance(lineNumberPtr()); 664 664 } 665 665 … … 688 688 if(cc == '#') { 689 689 cBuffer[cBufferPos++] = cc; 690 ++src;690 src.advance(lineNumberPtr()); 691 691 state.setEntityState(NumericSearch); 692 692 } … … 699 699 if (cc == 'x' || cc == 'X') { 700 700 cBuffer[cBufferPos++] = cc; 701 ++src;701 src.advance(lineNumberPtr()); 702 702 state.setEntityState(Hexadecimal); 703 703 } else if (cc >= '0' && cc <= '9') … … 722 722 EntityUnicodeValue = EntityUnicodeValue * 16 + digit; 723 723 cBuffer[cBufferPos++] = cc; 724 ++src;724 src.advance(lineNumberPtr()); 725 725 } 726 726 if (cBufferPos == 10) … … 741 741 EntityUnicodeValue = EntityUnicodeValue * 10 + (cc - '0'); 742 742 cBuffer[cBufferPos++] = cc; 743 ++src;743 src.advance(lineNumberPtr()); 744 744 } 745 745 if (cBufferPos == 9) … … 759 759 760 760 cBuffer[cBufferPos++] = cc; 761 ++src;761 src.advance(lineNumberPtr()); 762 762 } 763 763 if (cBufferPos == 9) … … 782 782 if (!inViewSourceMode()) { 783 783 if (*src == ';') 784 ++src;784 src.advance(lineNumberPtr()); 785 785 if (EntityUnicodeValue <= 0xFFFF) { 786 786 checkBuffer(); … … 801 801 if (*src == ';') { 802 802 *dest++ = ';'; 803 ++src;803 src.advance(lineNumberPtr()); 804 804 } 805 805 } … … 827 827 unsigned cBufferPos = m_cBufferPos; 828 828 829 while (!src.isEmpty()) 830 { 829 int* lineNoPtr = lineNumberPtr(); 830 831 while (!src.isEmpty()) { 831 832 checkBuffer(); 832 833 switch(state.tagState()) { … … 852 853 #endif 853 854 // Found '<!--' sequence 854 ++src;855 src.advance(lineNoPtr); 855 856 dest = buffer; // ignore the previous part of this tag 856 857 state.setInComment(true); … … 862 863 if (!src.isEmpty() && *src == '>' && m_doc->inCompatMode()) { 863 864 state.setInComment(false); 864 ++src;865 src.advance(lineNoPtr); 865 866 if (!src.isEmpty()) 866 867 // cuts off high bits, which is okay … … 875 876 // cuts off high bits, which is okay 876 877 cBuffer[cBufferPos++] = *src; 877 ++src;878 src.advance(lineNoPtr); 878 879 break; 879 880 } … … 896 897 else 897 898 cBuffer[cBufferPos++] = curchar; 898 ++src;899 src.advance(lineNoPtr); 899 900 } 900 901 … … 950 951 if (inViewSourceMode()) 951 952 currToken.addViewSourceChar(curchar); 952 ++src;953 src.advance(lineNoPtr); 953 954 } 954 955 break; … … 980 981 cBuffer[cBufferPos++] = curchar; 981 982 982 ++src;983 src.advance(lineNoPtr); 983 984 } 984 985 if ( cBufferPos == CBUFLEN ) { … … 1008 1009 if (inViewSourceMode()) 1009 1010 currToken.addViewSourceChar(curchar); 1010 ++src;1011 src.advance(lineNoPtr); 1011 1012 } 1012 1013 else { … … 1025 1026 currToken.flat = true; 1026 1027 1027 ++src;1028 src.advance(lineNoPtr); 1028 1029 } 1029 1030 break; … … 1037 1038 if (inViewSourceMode()) 1038 1039 currToken.addViewSourceChar(curchar); 1039 ++src;1040 src.advance(lineNoPtr); 1040 1041 } else 1041 1042 state.setTagState(Value); … … 1045 1046 if (inViewSourceMode()) 1046 1047 currToken.addViewSourceChar(curchar); 1047 ++src;1048 src.advance(lineNoPtr); 1048 1049 } 1049 1050 break; … … 1081 1082 if ( curchar == '&' ) 1082 1083 { 1083 ++src;1084 src.advance(lineNoPtr); 1084 1085 state = parseEntity(src, dest, state, cBufferPos, true, true); 1085 1086 break; … … 1104 1105 if (inViewSourceMode()) 1105 1106 currToken.addViewSourceChar(curchar); 1106 ++src;1107 src.advance(lineNoPtr); 1107 1108 break; 1108 1109 } 1109 1110 } 1110 1111 *dest++ = *src; 1111 ++src;1112 src.advance(lineNoPtr); 1112 1113 } 1113 1114 break; … … 1123 1124 if ( curchar == '&' ) 1124 1125 { 1125 ++src;1126 src.advance(lineNoPtr); 1126 1127 state = parseEntity(src, dest, state, cBufferPos, true, true); 1127 1128 break; … … 1142 1143 1143 1144 *dest++ = *src; 1144 ++src;1145 src.advance(lineNoPtr); 1145 1146 } 1146 1147 break; … … 1159 1160 if (inViewSourceMode()) 1160 1161 currToken.addViewSourceChar(*src); 1161 ++src;1162 src.advance(lineNoPtr); 1162 1163 } 1163 1164 if (src.isEmpty()) break; … … 1168 1169 1169 1170 if (*src != '<') 1170 ++src;1171 src.advance(lineNoPtr); 1171 1172 1172 1173 if (currToken.tagName == nullAtom) { //stop if tag is unknown … … 1346 1347 State state = m_state; 1347 1348 1349 int* lineNoPtr = lineNumberPtr(); 1350 1348 1351 while (!src.isEmpty() && (!frame || !frame->loader()->isScheduledLocationChangePending())) { 1349 1352 if (!continueProcessing(processedCount, startTime, state)) … … 1360 1363 1361 1364 if (wasSkipLF && (cc == '\n')) 1362 ++src;1365 src.advance(0); 1363 1366 else if (state.needsSpecialWriteHandling()) { 1364 1367 // it's important to keep needsSpecialWriteHandling with the flags this block tests … … 1427 1430 } 1428 1431 } else if (cc == '&' && !src.escaped()) { 1429 ++src;1432 src.advance(lineNoPtr); 1430 1433 state = parseEntity(src, dest, state, m_cBufferPos, true, state.hasTagState()); 1431 1434 } else if (cc == '<' && !src.escaped()) { 1432 tagStartLineno = lineno +src.lineCount();1433 ++src;1435 tagStartLineno = lineno; 1436 src.advance(lineNoPtr); 1434 1437 state.setStartTag(true); 1435 1438 } else if (cc == '\n' || cc == '\r') { … … 1437 1440 // Ignore this LF 1438 1441 state.setDiscardLF(false); // We have discarded 1 LF 1439 else 1442 else { 1440 1443 // Process this LF 1441 1444 *dest++ = '\n'; 1442 1445 if (cc == '\r') 1446 lineno++; 1447 } 1448 1443 1449 /* Check for MS-DOS CRLF sequence */ 1444 1450 if (cc == '\r') 1445 1451 state.setSkipLF(true); 1446 ++src;1452 src.advance(lineNoPtr); 1447 1453 } else { 1448 1454 state.setDiscardLF(false); 1449 1455 *dest++ = cc; 1450 ++src;1456 src.advance(lineNoPtr); 1451 1457 } 1452 1458 } … … 1589 1595 currToken.reset(); 1590 1596 if (jsProxy) 1591 jsProxy->setEventHandlerLineno(lineno +src.lineCount());1597 jsProxy->setEventHandlerLineno(lineno); 1592 1598 return 0; 1593 1599 } … … 1731 1737 void HTMLTokenizer::setSrc(const SegmentedString &source) 1732 1738 { 1733 lineno += src.lineCount();1734 1739 src = source; 1735 src.resetLineCount();1736 1740 } 1737 1741 -
trunk/WebCore/html/HTMLTokenizer.h
r21526 r21704 102 102 virtual int columnNumber() const { return 1; } 103 103 104 int tagStartLineNumber() const { return tagStartLineno; }104 int* lineNumberPtr() { return m_executingScript ? 0 : &lineno; } 105 105 106 106 private: -
trunk/WebCore/html/HTMLViewSourceDocument.cpp
r21630 r21704 227 227 m_current = m_td = td; 228 228 229 #ifdef DEBUG_LINE_NUMBERS 230 Text* lineNumberText = new Text(this, String::number(tokenizer()->lineNumber() + 1) + " "); 231 td->addChild(lineNumberText); 232 lineNumberText->attach(); 233 #endif 234 229 235 // Open up the needed spans. 230 236 if (!className.isEmpty()) { -
trunk/WebCore/loader/TextDocument.cpp
r21599 r21704 88 88 } 89 89 90 ++str;90 str.advance(0); 91 91 92 92 // Maybe enlarge the buffer -
trunk/WebCore/platform/SegmentedString.cpp
r20495 r21704 27 27 SegmentedString::SegmentedString(const SegmentedString &other) : 28 28 m_pushedChar1(other.m_pushedChar1), m_pushedChar2(other.m_pushedChar2), m_currentString(other.m_currentString), 29 m_substrings(other.m_substrings), m_ lines(other.m_lines), m_composite(other.m_composite)29 m_substrings(other.m_substrings), m_composite(other.m_composite) 30 30 { 31 31 if (other.m_currentChar == &other.m_pushedChar1) … … 43 43 m_currentString = other.m_currentString; 44 44 m_substrings = other.m_substrings; 45 m_lines = other.m_lines;46 45 m_composite = other.m_composite; 47 46 if (other.m_currentChar == &other.m_pushedChar1) … … 78 77 m_currentString.clear(); 79 78 m_substrings.clear(); 80 m_lines = 0;81 79 m_composite = false; 82 80 } -
trunk/WebCore/platform/SegmentedString.h
r20496 r21704 62 62 public: 63 63 SegmentedString() 64 : m_pushedChar1(0), m_pushedChar2(0), m_currentChar(0) 65 , m_lines(0), m_composite(false) {} 64 : m_pushedChar1(0), m_pushedChar2(0), m_currentChar(0), m_composite(false) {} 66 65 SegmentedString(const UChar* str, int length) : m_pushedChar1(0), m_pushedChar2(0) 67 , m_currentString(str, length), m_currentChar(m_currentString.m_current) 68 , m_lines(0), m_composite(false) {} 66 , m_currentString(str, length), m_currentChar(m_currentString.m_current), m_composite(false) {} 69 67 SegmentedString(const String& str) 70 68 : m_pushedChar1(0), m_pushedChar2(0), m_currentString(str) 71 , m_currentChar(m_currentString.m_current) 72 , m_lines(0), m_composite(false) {} 69 , m_currentChar(m_currentString.m_current), m_composite(false) {} 73 70 SegmentedString(const SegmentedString&); 74 71 … … 93 90 unsigned length() const; 94 91 95 void advance( ) {92 void advance(int* lineNumber = 0) { 96 93 if (m_pushedChar1) { 97 94 m_pushedChar1 = m_pushedChar2; 98 95 m_pushedChar2 = 0; 99 96 } else if (m_currentString.m_current) { 100 m_lines += *m_currentString.m_current++ == '\n'; 97 if (*m_currentString.m_current++ == '\n' && lineNumber) 98 *lineNumber = *lineNumber + 1; 101 99 if (--m_currentString.m_length == 0) 102 100 advanceSubstring(); … … 106 104 107 105 bool escaped() const { return m_pushedChar1; } 108 109 int lineCount() const { return m_lines; }110 void resetLineCount() { m_lines = 0; }111 106 112 107 String toString() const; 113 108 114 void operator++() { advance(); }115 109 const UChar& operator*() const { return *current(); } 116 110 const UChar* operator->() const { return current(); } … … 128 122 const UChar* m_currentChar; 129 123 DeprecatedValueList<SegmentedSubstring> m_substrings; 130 int m_lines;131 124 bool m_composite; 132 125 };
Note: See TracChangeset
for help on using the changeset viewer.