Changeset 206337 in webkit
- Timestamp:
- Sep 23, 2016, 4:40:46 PM (9 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r206334 r206337 1 2016-09-23 Alex Christensen <achristensen@webkit.org> 2 3 Refactor URLParser 4 https://bugs.webkit.org/show_bug.cgi?id=162518 5 6 Reviewed by Brady Eidson. 7 8 Use a helper function to determine the currentPosition instead of always determining position based on the 9 size of the buffer. Soon there will be nothing in the buffer in the common case where there are no syntax errors. 10 Also make more static functions into methods. Give IPv6Addresses and IPv4Addresses names. Start adding syntaxError stubs. 11 12 No change in behavior. Covered by API tests. 13 14 * platform/URLParser.cpp: 15 (WebCore::URLParser::incrementIteratorSkippingTabAndNewLine): 16 (WebCore::URLParser::isWindowsDriveLetter): 17 (WebCore::URLParser::appendToASCIIBuffer): 18 (WebCore::URLParser::syntaxError): 19 (WebCore::URLParser::currentPosition): 20 (WebCore::URLParser::URLParser): 21 (WebCore::URLParser::parse): 22 (WebCore::URLParser::parseAuthority): 23 (WebCore::URLParser::appendNumberToASCIIBuffer): 24 (WebCore::URLParser::serializeIPv4): 25 (WebCore::URLParser::serializeIPv6Piece): 26 (WebCore::URLParser::serializeIPv6): 27 (WebCore::URLParser::parseIPv4Host): 28 (WebCore::URLParser::parseIPv6Host): 29 (WebCore::URLParser::parsePort): 30 (WebCore::URLParser::parseHostAndPort): 31 (WebCore::append): Deleted. 32 (WebCore::serializeIPv4): Deleted. 33 (WebCore::serializeIPv6Piece): Deleted. 34 (WebCore::serializeIPv6): Deleted. 35 (WebCore::parseIPv4Host): Deleted. 36 (WebCore::parseIPv6Host): Deleted. 37 * platform/URLParser.h: 38 1 39 2016-09-23 Alex Christensen <achristensen@webkit.org> 2 40 -
trunk/Source/WebCore/platform/URLParser.cpp
r206334 r206337 414 414 { 415 415 ++iterator; 416 while (!iterator.atEnd() && isTabOrNewline(*iterator)) 416 while (!iterator.atEnd() && isTabOrNewline(*iterator)) { 417 syntaxError(iterator); 417 418 ++iterator; 419 } 418 420 } 419 421 … … 428 430 if (*iterator == ':') 429 431 return true; 430 if (*iterator == '|') 432 if (*iterator == '|') { 433 syntaxError(iterator); 431 434 return true; 435 } 432 436 return false; 433 437 } … … 444 448 ASSERT(m_unicodeFragmentBuffer.isEmpty()); 445 449 ASSERT(isASCII(codePoint)); 446 m_asciiBuffer.append(codePoint); 450 if (m_seenSyntaxError) 451 m_asciiBuffer.append(codePoint); 447 452 } 448 453 … … 450 455 { 451 456 ASSERT(m_unicodeFragmentBuffer.isEmpty()); 452 m_asciiBuffer.append(characters, length); 457 if (m_seenSyntaxError) 458 m_asciiBuffer.append(characters, length); 453 459 } 454 460 … … 927 933 } 928 934 935 template<typename CharacterType> 936 void URLParser::syntaxError(const CodePointIterator<CharacterType>&) 937 { 938 // FIXME: Implement. 939 } 940 929 941 void URLParser::failure() 930 942 { … … 933 945 } 934 946 947 template<typename CharacterType> 948 size_t URLParser::currentPosition(const CodePointIterator<CharacterType>& iterator) 949 { 950 if (m_seenSyntaxError) 951 return m_asciiBuffer.size(); 952 953 return iterator.codeUnitsSince(reinterpret_cast<const CharacterType*>(m_inputBegin)); 954 } 955 935 956 URLParser::URLParser(const String& input, const URL& base, const TextEncoding& encoding) 936 957 : m_inputString(input) … … 939 960 return; 940 961 941 if (input.is8Bit()) 962 if (input.is8Bit()) { 963 m_inputBegin = input.characters8(); 942 964 parse(input.characters8(), input.length(), base, encoding); 943 else 965 } else { 966 m_inputBegin = input.characters16(); 944 967 parse(input.characters16(), input.length(), base, encoding); 968 } 945 969 } 946 970 … … 988 1012 }; 989 1013 990 #define LOG_STATE(x) LOG(URLParser, "State %s, code point %c, asciiBuffer size %zu", x, *c, m_asciiBuffer.size())1014 #define LOG_STATE(x) LOG(URLParser, "State %s, code point %c, asciiBuffer size %zu", x, *c, currentPosition(c)) 991 1015 #define LOG_FINAL_STATE(x) LOG(URLParser, "Final State: %s", x) 992 1016 … … 994 1018 while (!c.atEnd()) { 995 1019 if (isTabOrNewline(*c)) { 1020 syntaxError(c); 996 1021 ++c; 997 1022 continue; … … 1002 1027 LOG_STATE("SchemeStart"); 1003 1028 if (isASCIIAlpha(*c)) { 1004 m_asciiBuffer.uncheckedAppend(toASCIILower(*c));1029 appendToASCIIBuffer(toASCIILower(*c)); 1005 1030 incrementIteratorSkippingTabAndNewLine(c); 1006 1031 if (c.atEnd()) { … … 1018 1043 appendToASCIIBuffer(toASCIILower(*c)); 1019 1044 else if (*c == ':') { 1020 m_url.m_schemeEnd = m_asciiBuffer.size();1045 m_url.m_schemeEnd = currentPosition(c); 1021 1046 StringView urlScheme = StringView(m_asciiBuffer.data(), m_url.m_schemeEnd); 1022 1047 m_url.m_protocolIsInHTTPFamily = urlScheme == "http" || urlScheme == "https"; … … 1031 1056 if (isSpecialScheme(urlScheme)) { 1032 1057 m_urlIsSpecial = true; 1033 if (base.protocolIs(m_asciiBuffer.data(), m_asciiBuffer.size() - 1))1058 if (base.protocolIs(m_asciiBuffer.data(), currentPosition(c) - 1)) 1034 1059 state = State::SpecialRelativeOrAuthority; 1035 1060 else … … 1040 1065 if (!maybeSlash.atEnd() && *maybeSlash == '/') { 1041 1066 appendToASCIIBuffer('/'); 1042 m_url.m_userStart = m_asciiBuffer.size();1067 m_url.m_userStart = currentPosition(c); 1043 1068 state = State::PathOrAuthority; 1044 1069 c = maybeSlash; 1045 1070 ASSERT(*c == '/'); 1046 1071 } else { 1047 m_url.m_userStart = m_asciiBuffer.size();1072 m_url.m_userStart = currentPosition(c); 1048 1073 m_url.m_userEnd = m_url.m_userStart; 1049 1074 m_url.m_passwordEnd = m_url.m_userStart; … … 1113 1138 if (*c == '/') { 1114 1139 appendToASCIIBuffer('/'); 1115 m_url.m_userStart = m_asciiBuffer.size();1140 m_url.m_userStart = currentPosition(c); 1116 1141 state = State::AuthorityOrHost; 1117 1142 ++c; … … 1119 1144 } else { 1120 1145 ASSERT(m_asciiBuffer.last() == '/'); 1121 m_url.m_userStart = m_asciiBuffer.size() - 1;1146 m_url.m_userStart = currentPosition(c) - 1; 1122 1147 m_url.m_userEnd = m_url.m_userStart; 1123 1148 m_url.m_passwordEnd = m_url.m_userStart; … … 1184 1209 ++c; 1185 1210 } 1186 m_url.m_userStart = m_asciiBuffer.size();1211 m_url.m_userStart = currentPosition(c); 1187 1212 state = State::AuthorityOrHost; 1188 1213 authorityOrHostBegin = c; … … 1209 1234 bool isSlash = *c == '/' || (m_urlIsSpecial && *c == '\\'); 1210 1235 if (isSlash || *c == '?' || *c == '#') { 1211 m_url.m_userEnd = m_asciiBuffer.size();1236 m_url.m_userEnd = currentPosition(c); 1212 1237 m_url.m_passwordEnd = m_url.m_userEnd; 1213 1238 if (!parseHostAndPort(CodePointIterator<CharacterType>(authorityOrHostBegin, c))) { … … 1217 1242 if (!isSlash) { 1218 1243 appendToASCIIBuffer('/'); 1219 m_url.m_pathAfterLastSlash = m_asciiBuffer.size();1244 m_url.m_pathAfterLastSlash = currentPosition(c); 1220 1245 } 1221 1246 state = State::Path; … … 1254 1279 copyURLPartsUntil(base, URLPart::PathEnd); 1255 1280 appendToASCIIBuffer("///?", 4); 1256 m_url.m_userStart = m_asciiBuffer.size() - 2;1281 m_url.m_userStart = currentPosition(c) - 2; 1257 1282 m_url.m_userEnd = m_url.m_userStart; 1258 1283 m_url.m_passwordEnd = m_url.m_userStart; … … 1268 1293 copyURLPartsUntil(base, URLPart::QueryEnd); 1269 1294 appendToASCIIBuffer("///#", 4); 1270 m_url.m_userStart = m_asciiBuffer.size() - 2;1295 m_url.m_userStart = currentPosition(c) - 2; 1271 1296 m_url.m_userEnd = m_url.m_userStart; 1272 1297 m_url.m_passwordEnd = m_url.m_userStart; … … 1284 1309 else { 1285 1310 appendToASCIIBuffer("///", 3); 1286 m_url.m_userStart = m_asciiBuffer.size() - 1;1311 m_url.m_userStart = currentPosition(c) - 1; 1287 1312 m_url.m_userEnd = m_url.m_userStart; 1288 1313 m_url.m_passwordEnd = m_url.m_userStart; … … 1301 1326 ++c; 1302 1327 appendToASCIIBuffer('/'); 1303 m_url.m_userStart = m_asciiBuffer.size();1328 m_url.m_userStart = currentPosition(c); 1304 1329 m_url.m_userEnd = m_url.m_userStart; 1305 1330 m_url.m_passwordEnd = m_url.m_userStart; … … 1324 1349 } 1325 1350 appendToASCIIBuffer("//", 2); 1326 m_url.m_userStart = m_asciiBuffer.size() - 1;1351 m_url.m_userStart = currentPosition(c) - 1; 1327 1352 m_url.m_userEnd = m_url.m_userStart; 1328 1353 m_url.m_passwordEnd = m_url.m_userStart; … … 1341 1366 } 1342 1367 if (authorityOrHostBegin == c) { 1343 ASSERT(m_asciiBuffer[ m_asciiBuffer.size() - 1] == '/');1368 ASSERT(m_asciiBuffer[currentPosition(c) - 1] == '/'); 1344 1369 if (*c == '?') { 1345 1370 appendToASCIIBuffer("/?", 2); 1346 m_url.m_pathAfterLastSlash = m_asciiBuffer.size() - 1;1371 m_url.m_pathAfterLastSlash = currentPosition(c) - 1; 1347 1372 m_url.m_pathEnd = m_url.m_pathAfterLastSlash; 1348 1373 state = State::Query; … … 1352 1377 if (*c == '#') { 1353 1378 appendToASCIIBuffer("/#", 2); 1354 m_url.m_pathAfterLastSlash = m_asciiBuffer.size() - 1;1379 m_url.m_pathAfterLastSlash = currentPosition(c) - 1; 1355 1380 m_url.m_pathEnd = m_url.m_pathAfterLastSlash; 1356 1381 m_url.m_queryEnd = m_url.m_pathAfterLastSlash; … … 1367 1392 } 1368 1393 1369 if (StringView(m_asciiBuffer.data() + m_url.m_passwordEnd, m_asciiBuffer.size() - m_url.m_passwordEnd) == "localhost") {1394 if (StringView(m_asciiBuffer.data() + m_url.m_passwordEnd, currentPosition(c) - m_url.m_passwordEnd) == "localhost") { 1370 1395 m_asciiBuffer.shrink(m_url.m_passwordEnd); 1371 m_url.m_hostEnd = m_asciiBuffer.size();1396 m_url.m_hostEnd = currentPosition(c); 1372 1397 m_url.m_portEnd = m_url.m_hostEnd; 1373 1398 } … … 1390 1415 if (*c == '/' || (m_urlIsSpecial && *c == '\\')) { 1391 1416 appendToASCIIBuffer('/'); 1392 m_url.m_pathAfterLastSlash = m_asciiBuffer.size();1417 m_url.m_pathAfterLastSlash = currentPosition(c); 1393 1418 ++c; 1394 1419 break; 1395 1420 } 1396 if ( m_asciiBuffer.size() && m_asciiBuffer[m_asciiBuffer.size() - 1] == '/') {1421 if (currentPosition(c) && m_asciiBuffer[currentPosition(c) - 1] == '/') { 1397 1422 if (isDoubleDotPathSegment(c)) { 1398 1423 consumeDoubleDotPathSegment(c); … … 1400 1425 break; 1401 1426 } 1402 if (m_asciiBuffer[ m_asciiBuffer.size() - 1] == '/' && isSingleDotPathSegment(c)) {1427 if (m_asciiBuffer[currentPosition(c) - 1] == '/' && isSingleDotPathSegment(c)) { 1403 1428 consumeSingleDotPathSegment(c); 1404 1429 break; … … 1406 1431 } 1407 1432 if (*c == '?') { 1408 m_url.m_pathEnd = m_asciiBuffer.size();1433 m_url.m_pathEnd = currentPosition(c); 1409 1434 state = State::Query; 1410 1435 break; 1411 1436 } 1412 1437 if (*c == '#') { 1413 m_url.m_pathEnd = m_asciiBuffer.size();1438 m_url.m_pathEnd = currentPosition(c); 1414 1439 m_url.m_queryEnd = m_url.m_pathEnd; 1415 1440 state = State::Fragment; … … 1432 1457 LOG_STATE("CannotBeABaseURLPath"); 1433 1458 if (*c == '?') { 1434 m_url.m_pathEnd = m_asciiBuffer.size();1459 m_url.m_pathEnd = currentPosition(c); 1435 1460 state = State::Query; 1436 1461 } else if (*c == '#') { 1437 m_url.m_pathEnd = m_asciiBuffer.size();1462 m_url.m_pathEnd = currentPosition(c); 1438 1463 m_url.m_queryEnd = m_url.m_pathEnd; 1439 1464 state = State::Fragment; 1440 1465 } else if (*c == '/') { 1441 1466 appendToASCIIBuffer('/'); 1442 m_url.m_pathAfterLastSlash = m_asciiBuffer.size();1467 m_url.m_pathAfterLastSlash = currentPosition(c); 1443 1468 ++c; 1444 1469 } else { … … 1452 1477 if (!isUTF8Encoding) 1453 1478 encodeQuery(queryBuffer, encoding); 1454 m_url.m_queryEnd = m_asciiBuffer.size();1479 m_url.m_queryEnd = currentPosition(c); 1455 1480 state = State::Fragment; 1456 1481 break; … … 1476 1501 case State::SchemeStart: 1477 1502 LOG_FINAL_STATE("SchemeStart"); 1478 if (! m_asciiBuffer.size() && base.isValid()) {1503 if (!currentPosition(c) && base.isValid()) { 1479 1504 m_url = base; 1480 1505 return; … … 1497 1522 LOG_FINAL_STATE("PathOrAuthority"); 1498 1523 ASSERT(m_url.m_userStart); 1499 ASSERT(m_url.m_userStart == m_asciiBuffer.size());1524 ASSERT(m_url.m_userStart == currentPosition(c)); 1500 1525 ASSERT(m_asciiBuffer.last() == '/'); 1501 1526 m_url.m_userStart--; … … 1524 1549 case State::SpecialAuthoritySlashes: 1525 1550 LOG_FINAL_STATE("SpecialAuthoritySlashes"); 1526 m_url.m_userStart = m_asciiBuffer.size();1551 m_url.m_userStart = currentPosition(c); 1527 1552 m_url.m_userEnd = m_url.m_userStart; 1528 1553 m_url.m_passwordEnd = m_url.m_userStart; … … 1541 1566 case State::AuthorityOrHost: 1542 1567 LOG_FINAL_STATE("AuthorityOrHost"); 1543 m_url.m_userEnd = m_asciiBuffer.size();1568 m_url.m_userEnd = currentPosition(c); 1544 1569 m_url.m_passwordEnd = m_url.m_userEnd; 1545 1570 if (authorityOrHostBegin.atEnd()) { … … 1575 1600 } 1576 1601 appendToASCIIBuffer("///", 3); 1577 m_url.m_userStart = m_asciiBuffer.size() - 1;1602 m_url.m_userStart = currentPosition(c) - 1; 1578 1603 m_url.m_userEnd = m_url.m_userStart; 1579 1604 m_url.m_passwordEnd = m_url.m_userStart; … … 1588 1613 LOG_FINAL_STATE("FileSlash"); 1589 1614 appendToASCIIBuffer("//", 2); 1590 m_url.m_userStart = m_asciiBuffer.size() - 1;1615 m_url.m_userStart = currentPosition(c) - 1; 1591 1616 m_url.m_userEnd = m_url.m_userStart; 1592 1617 m_url.m_passwordEnd = m_url.m_userStart; … … 1602 1627 if (authorityOrHostBegin == c) { 1603 1628 appendToASCIIBuffer('/'); 1604 m_url.m_userStart = m_asciiBuffer.size() - 1;1629 m_url.m_userStart = currentPosition(c) - 1; 1605 1630 m_url.m_userEnd = m_url.m_userStart; 1606 1631 m_url.m_passwordEnd = m_url.m_userStart; … … 1619 1644 } 1620 1645 1621 if (StringView(m_asciiBuffer.data() + m_url.m_passwordEnd, m_asciiBuffer.size() - m_url.m_passwordEnd) == "localhost") {1646 if (StringView(m_asciiBuffer.data() + m_url.m_passwordEnd, currentPosition(c) - m_url.m_passwordEnd) == "localhost") { 1622 1647 m_asciiBuffer.shrink(m_url.m_passwordEnd); 1623 m_url.m_hostEnd = m_asciiBuffer.size();1648 m_url.m_hostEnd = currentPosition(c); 1624 1649 m_url.m_portEnd = m_url.m_hostEnd; 1625 1650 } … … 1635 1660 case State::Path: 1636 1661 LOG_FINAL_STATE("Path"); 1637 m_url.m_pathEnd = m_asciiBuffer.size();1662 m_url.m_pathEnd = currentPosition(c); 1638 1663 m_url.m_queryEnd = m_url.m_pathEnd; 1639 1664 m_url.m_fragmentEnd = m_url.m_pathEnd; … … 1641 1666 case State::CannotBeABaseURLPath: 1642 1667 LOG_FINAL_STATE("CannotBeABaseURLPath"); 1643 m_url.m_pathEnd = m_asciiBuffer.size();1668 m_url.m_pathEnd = currentPosition(c); 1644 1669 m_url.m_queryEnd = m_url.m_pathEnd; 1645 1670 m_url.m_fragmentEnd = m_url.m_pathEnd; … … 1649 1674 if (!isUTF8Encoding) 1650 1675 encodeQuery(queryBuffer, encoding); 1651 m_url.m_queryEnd = m_asciiBuffer.size();1676 m_url.m_queryEnd = currentPosition(c); 1652 1677 m_url.m_fragmentEnd = m_url.m_queryEnd; 1653 1678 break; 1654 1679 case State::Fragment: 1655 1680 LOG_FINAL_STATE("Fragment"); 1656 m_url.m_fragmentEnd = m_asciiBuffer.size() + m_unicodeFragmentBuffer.size();1681 m_url.m_fragmentEnd = currentPosition(c) + m_unicodeFragmentBuffer.size(); 1657 1682 break; 1658 1683 } 1659 1684 1660 if (m_unicodeFragmentBuffer.isEmpty()) 1685 if (!m_seenSyntaxError) { 1686 m_url.m_string = m_inputString; 1687 ASSERT(m_asciiBuffer.isEmpty()); 1688 ASSERT(m_unicodeFragmentBuffer.isEmpty()); 1689 } else if (m_unicodeFragmentBuffer.isEmpty()) 1661 1690 m_url.m_string = String::adopt(WTFMove(m_asciiBuffer)); 1662 1691 else { 1663 1692 Vector<UChar> buffer; 1664 buffer.reserveInitialCapacity( m_asciiBuffer.size() + m_unicodeFragmentBuffer.size());1693 buffer.reserveInitialCapacity(currentPosition(c) + m_unicodeFragmentBuffer.size()); 1665 1694 buffer.appendVector(m_asciiBuffer); 1666 1695 buffer.appendVector(m_unicodeFragmentBuffer); … … 1676 1705 { 1677 1706 if (iterator.atEnd()) { 1678 m_url.m_userEnd = m_asciiBuffer.size();1707 m_url.m_userEnd = currentPosition(iterator); 1679 1708 m_url.m_passwordEnd = m_url.m_userEnd; 1680 1709 return; … … 1683 1712 if (*iterator == ':') { 1684 1713 ++iterator; 1685 m_url.m_userEnd = m_asciiBuffer.size();1714 m_url.m_userEnd = currentPosition(iterator); 1686 1715 if (iterator.atEnd()) { 1687 1716 m_url.m_passwordEnd = m_url.m_userEnd; … … 1697 1726 for (; !iterator.atEnd(); ++iterator) 1698 1727 utf8PercentEncode<isInUserInfoEncodeSet>(*iterator); 1699 m_url.m_passwordEnd = m_asciiBuffer.size();1728 m_url.m_passwordEnd = currentPosition(iterator); 1700 1729 if (!m_url.m_userEnd) 1701 1730 m_url.m_userEnd = m_url.m_passwordEnd; … … 1704 1733 1705 1734 template<typename UnsignedIntegerType> 1706 void append(Vector<LChar>& destination,UnsignedIntegerType number)1735 void URLParser::appendNumberToASCIIBuffer(UnsignedIntegerType number) 1707 1736 { 1708 1737 LChar buf[sizeof(UnsignedIntegerType) * 3 + 1]; … … 1713 1742 number /= 10; 1714 1743 } while (number); 1715 destination.append(p, end - p);1716 } 1717 1718 inline static void serializeIPv4(uint32_t address, Vector<LChar>& buffer)1719 { 1720 append <uint8_t>(buffer,address >> 24);1721 buffer.append('.');1722 append <uint8_t>(buffer,address >> 16);1723 buffer.append('.');1724 append <uint8_t>(buffer,address >> 8);1725 buffer.append('.');1726 append <uint8_t>(buffer,address);1744 appendToASCIIBuffer(p, end - p); 1745 } 1746 1747 void URLParser::serializeIPv4(IPv4Address address) 1748 { 1749 appendNumberToASCIIBuffer<uint8_t>(address >> 24); 1750 appendToASCIIBuffer('.'); 1751 appendNumberToASCIIBuffer<uint8_t>(address >> 16); 1752 appendToASCIIBuffer('.'); 1753 appendNumberToASCIIBuffer<uint8_t>(address >> 8); 1754 appendToASCIIBuffer('.'); 1755 appendNumberToASCIIBuffer<uint8_t>(address); 1727 1756 } 1728 1757 … … 1753 1782 return longest; 1754 1783 } 1755 1756 inline static void serializeIPv6Piece(uint16_t piece, Vector<LChar>& buffer)1784 1785 void URLParser::serializeIPv6Piece(uint16_t piece) 1757 1786 { 1758 1787 bool printed = false; 1759 1788 if (auto nibble0 = piece >> 12) { 1760 buffer.append(lowerNibbleToLowercaseASCIIHexDigit(nibble0));1789 appendToASCIIBuffer(lowerNibbleToLowercaseASCIIHexDigit(nibble0)); 1761 1790 printed = true; 1762 1791 } 1763 1792 auto nibble1 = piece >> 8 & 0xF; 1764 1793 if (printed || nibble1) { 1765 buffer.append(lowerNibbleToLowercaseASCIIHexDigit(nibble1));1794 appendToASCIIBuffer(lowerNibbleToLowercaseASCIIHexDigit(nibble1)); 1766 1795 printed = true; 1767 1796 } 1768 1797 auto nibble2 = piece >> 4 & 0xF; 1769 1798 if (printed || nibble2) 1770 buffer.append(lowerNibbleToLowercaseASCIIHexDigit(nibble2));1771 buffer.append(lowerNibbleToLowercaseASCIIHexDigit(piece & 0xF));1772 } 1773 1774 inline static void serializeIPv6(std::array<uint16_t, 8> address, Vector<LChar>& buffer)1775 { 1776 buffer.append('[');1799 appendToASCIIBuffer(lowerNibbleToLowercaseASCIIHexDigit(nibble2)); 1800 appendToASCIIBuffer(lowerNibbleToLowercaseASCIIHexDigit(piece & 0xF)); 1801 } 1802 1803 void URLParser::serializeIPv6(URLParser::IPv6Address address) 1804 { 1805 appendToASCIIBuffer('['); 1777 1806 auto compressPointer = findLongestZeroSequence(address); 1778 1807 for (size_t piece = 0; piece < 8; piece++) { … … 1780 1809 ASSERT(!address[piece]); 1781 1810 if (piece) 1782 buffer.append(':');1811 appendToASCIIBuffer(':'); 1783 1812 else 1784 buffer.append("::", 2);1813 appendToASCIIBuffer("::", 2); 1785 1814 while (piece < 8 && !address[piece]) 1786 1815 piece++; … … 1788 1817 break; 1789 1818 } 1790 serializeIPv6Piece(address[piece] , buffer);1819 serializeIPv6Piece(address[piece]); 1791 1820 if (piece < 7) 1792 buffer.append(':');1793 } 1794 buffer.append(']');1821 appendToASCIIBuffer(':'); 1822 } 1823 appendToASCIIBuffer(']'); 1795 1824 } 1796 1825 … … 1864 1893 1865 1894 template<typename CharacterType> 1866 inline static Optional<uint32_t>parseIPv4Host(CodePointIterator<CharacterType> iterator)1895 Optional<URLParser::IPv4Address> URLParser::parseIPv4Host(CodePointIterator<CharacterType> iterator) 1867 1896 { 1868 1897 Vector<uint32_t, 4> items; … … 1890 1919 return Nullopt; 1891 1920 } 1892 uint32_tipv4 = items.takeLast();1921 IPv4Address ipv4 = items.takeLast(); 1893 1922 for (size_t counter = 0; counter < items.size(); ++counter) 1894 1923 ipv4 += items[counter] * pow256(3 - counter); … … 1897 1926 1898 1927 template<typename CharacterType> 1899 inline static Optional<std::array<uint16_t, 8>>parseIPv6Host(CodePointIterator<CharacterType> c)1928 Optional<URLParser::IPv6Address> URLParser::parseIPv6Host(CodePointIterator<CharacterType> c) 1900 1929 { 1901 1930 if (c.atEnd()) 1902 1931 return Nullopt; 1903 1932 1904 std::array<uint16_t, 8>address = {{0, 0, 0, 0, 0, 0, 0, 0}};1933 IPv6Address address = {{0, 0, 0, 0, 0, 0, 0, 0}}; 1905 1934 size_t piecePointer = 0; 1906 1935 Optional<size_t> compressPointer; … … 2079 2108 uint32_t port = 0; 2080 2109 if (iterator.atEnd()) { 2081 m_url.m_portEnd = m_asciiBuffer.size();2110 m_url.m_portEnd = currentPosition(iterator); 2082 2111 return true; 2083 2112 } … … 2096 2125 if (isDefaultPort(StringView(m_asciiBuffer.data(), m_url.m_schemeEnd), port)) { 2097 2126 ASSERT(m_asciiBuffer.last() == ':'); 2098 m_asciiBuffer.shrink(m_asciiBuffer.size() - 1); 2099 } else 2100 append<uint16_t>(m_asciiBuffer, static_cast<uint16_t>(port)); 2101 2102 m_url.m_portEnd = m_asciiBuffer.size(); 2127 m_asciiBuffer.shrink(currentPosition(iterator) - 1); 2128 } else { 2129 ASSERT(port <= std::numeric_limits<uint16_t>::max()); 2130 appendNumberToASCIIBuffer<uint16_t>(static_cast<uint16_t>(port)); 2131 } 2132 2133 m_url.m_portEnd = currentPosition(iterator); 2103 2134 return true; 2104 2135 } … … 2115 2146 ++ipv6End; 2116 2147 if (auto address = parseIPv6Host(CodePointIterator<CharacterType>(iterator, ipv6End))) { 2117 serializeIPv6(address.value() , m_asciiBuffer);2118 m_url.m_hostEnd = m_asciiBuffer.size();2148 serializeIPv6(address.value()); 2149 m_url.m_hostEnd = currentPosition(iterator); 2119 2150 if (!ipv6End.atEnd()) { 2120 2151 ++ipv6End; … … 2123 2154 return parsePort(ipv6End); 2124 2155 } 2125 m_url.m_portEnd = m_asciiBuffer.size();2156 m_url.m_portEnd = currentPosition(iterator); 2126 2157 return true; 2127 2158 } … … 2141 2172 } 2142 2173 if (auto address = parseIPv4Host(CodePointIterator<CharacterType>(hostIterator, iterator))) { 2143 serializeIPv4(address.value() , m_asciiBuffer);2144 m_url.m_hostEnd = m_asciiBuffer.size();2174 serializeIPv4(address.value()); 2175 m_url.m_hostEnd = currentPosition(iterator); 2145 2176 if (iterator.atEnd()) { 2146 m_url.m_portEnd = m_asciiBuffer.size();2177 m_url.m_portEnd = currentPosition(iterator); 2147 2178 return true; 2148 2179 } … … 2154 2185 appendToASCIIBuffer(toASCIILower(*hostIterator)); 2155 2186 } 2156 m_url.m_hostEnd = m_asciiBuffer.size();2187 m_url.m_hostEnd = currentPosition(iterator); 2157 2188 if (!hostIterator.atEnd()) { 2158 2189 ASSERT(*hostIterator == ':'); … … 2160 2191 return parsePort(hostIterator); 2161 2192 } 2162 m_url.m_portEnd = m_asciiBuffer.size();2193 m_url.m_portEnd = currentPosition(iterator); 2163 2194 return true; 2164 2195 } … … 2187 2218 2188 2219 if (auto address = parseIPv4Host(CodePointIterator<LChar>(asciiDomainValue.begin(), asciiDomainValue.end()))) { 2189 serializeIPv4(address.value() , m_asciiBuffer);2190 m_url.m_hostEnd = m_asciiBuffer.size();2220 serializeIPv4(address.value()); 2221 m_url.m_hostEnd = currentPosition(iterator); 2191 2222 if (iterator.atEnd()) { 2192 m_url.m_portEnd = m_asciiBuffer.size();2223 m_url.m_portEnd = currentPosition(iterator); 2193 2224 return true; 2194 2225 } … … 2198 2229 2199 2230 appendToASCIIBuffer(asciiDomainCharacters, asciiDomainValue.size()); 2200 m_url.m_hostEnd = m_asciiBuffer.size();2231 m_url.m_hostEnd = currentPosition(iterator); 2201 2232 if (!iterator.atEnd()) { 2202 2233 ASSERT(*iterator == ':'); … … 2204 2235 return parsePort(iterator); 2205 2236 } 2206 m_url.m_portEnd = m_asciiBuffer.size();2237 m_url.m_portEnd = currentPosition(iterator); 2207 2238 return true; 2208 2239 } -
trunk/Source/WebCore/platform/URLParser.h
r206334 r206337 57 57 bool m_hostHasPercentOrNonASCII { false }; 58 58 String m_inputString; 59 const void* m_inputBegin { nullptr }; 60 61 // FIXME: This should start out as false and only change to true when we see a syntax error once syntax error handling is implemented. 62 bool m_seenSyntaxError { true }; 59 63 60 64 template<typename CharacterType> void parse(const CharacterType*, const unsigned length, const URL&, const TextEncoding&); … … 69 73 template<typename CharacterType> bool shouldCopyFileURL(CodePointIterator<CharacterType>); 70 74 template<typename CharacterType> void checkWindowsDriveLetter(CodePointIterator<CharacterType>&); 75 template<typename CharacterType> size_t currentPosition(const CodePointIterator<CharacterType>&); 76 template<typename UnsignedIntegerType> void appendNumberToASCIIBuffer(UnsignedIntegerType); 71 77 template<bool(*isInCodeSet)(UChar32)> void utf8PercentEncode(UChar32); 72 78 void utf8QueryEncode(UChar32); … … 78 84 void copyASCIIStringUntil(const String&, size_t lengthIf8Bit, size_t lengthIf16Bit); 79 85 86 using IPv4Address = uint32_t; 87 void serializeIPv4(IPv4Address); 88 template<typename CharacterType> Optional<IPv4Address> parseIPv4Host(CodePointIterator<CharacterType>); 89 using IPv6Address = std::array<uint16_t, 8>; 90 template<typename CharacterType> Optional<IPv6Address> parseIPv6Host(CodePointIterator<CharacterType>); 91 void serializeIPv6Piece(uint16_t piece); 92 void serializeIPv6(URLParser::IPv6Address); 93 80 94 enum class URLPart; 81 95 void copyURLPartsUntil(const URL& base, URLPart);
Note:
See TracChangeset
for help on using the changeset viewer.