void HTMLViewSourceDocument::processTagToken(const String& source, HTMLToken& token) { m_current = addSpanWithClassName("webkit-html-tag"); AtomicString tagName(token.name().data(), token.name().size()); unsigned index = 0; HTMLToken::AttributeList::const_iterator iter = token.attributes().begin(); while (index < source.length()) { if (iter == token.attributes().end()) { // We want to show the remaining characters in the token. index = addRange(source, index, source.length(), ""); ASSERT(index == source.length()); break; } AtomicString name(iter->m_name.data(), iter->m_name.size()); String value(iter->m_value.data(), iter->m_value.size()); index = addRange(source, index, iter->m_nameRange.m_start - token.startIndex(), ""); index = addRange(source, index, iter->m_nameRange.m_end - token.startIndex(), "webkit-html-attribute-name"); if (tagName == baseTag && name == hrefAttr) m_current = addBase(value); index = addRange(source, index, iter->m_valueRange.m_start - token.startIndex(), ""); bool isLink = name == srcAttr || name == hrefAttr; index = addRange(source, index, iter->m_valueRange.m_end - token.startIndex(), "webkit-html-attribute-value", isLink, tagName == aTag); ++iter; } m_current = m_td; }
CompactHTMLToken::CompactHTMLToken(const HTMLToken& token) : m_type(token.type()) { switch (m_type) { case HTMLTokenTypes::Uninitialized: ASSERT_NOT_REACHED(); break; case HTMLTokenTypes::DOCTYPE: m_data = String(token.name().data(), token.name().size()); m_publicIdentifier = String(token.publicIdentifier().data(), token.publicIdentifier().size()); m_systemIdentifier = String(token.systemIdentifier().data(), token.systemIdentifier().size()); break; case HTMLTokenTypes::EndOfFile: break; case HTMLTokenTypes::StartTag: m_attributes.reserveInitialCapacity(token.attributes().size()); for (Vector<AttributeBase>::const_iterator it = token.attributes().begin(); it != token.attributes().end(); ++it) m_attributes.append(CompactAttribute(String(it->m_name.data(), it->m_name.size()), String(it->m_value.data(), it->m_value.size()))); // Fall through! case HTMLTokenTypes::EndTag: m_selfClosing = token.selfClosing(); // Fall through! case HTMLTokenTypes::Comment: case HTMLTokenTypes::Character: if (token.isAll8BitData()) m_data = String::make8BitFrom16BitSource(token.data().data(), token.data().size()); else m_data = String(token.data().data(), token.data().size()); break; default: ASSERT_NOT_REACHED(); break; } }
explicit PreloadTask(const HTMLToken& token) : m_tagName(token.name().data(), token.name().size()) , m_linkIsStyleSheet(false) , m_linkMediaAttributeIsScreen(true) , m_inputIsImage(false) { processAttributes(token.attributes()); }
void HTMLViewSourceDocument::processTagToken(const String& source, HTMLToken& token, SourceAnnotation annotation) { maybeAddSpanForAnnotation(annotation); m_current = addSpanWithClassName("html-tag"); AtomicString tagName(token.name()); unsigned index = 0; HTMLToken::AttributeList::const_iterator iter = token.attributes().begin(); while (index < source.length()) { if (iter == token.attributes().end()) { // We want to show the remaining characters in the token. index = addRange(source, index, source.length(), emptyAtom); ASSERT(index == source.length()); break; } AtomicString name(iter->name); AtomicString value(StringImpl::create8BitIfPossible(iter->value)); index = addRange(source, index, iter->nameRange.start - token.startIndex(), emptyAtom); index = addRange(source, index, iter->nameRange.end - token.startIndex(), "html-attribute-name"); if (tagName == baseTag && name == hrefAttr) addBase(value); index = addRange(source, index, iter->valueRange.start - token.startIndex(), emptyAtom); bool isLink = name == srcAttr || name == hrefAttr; index = addRange(source, index, iter->valueRange.end - token.startIndex(), "html-attribute-value", isLink, tagName == aTag, value); ++iter; } m_current = m_td; }
void TokenPreloadScanner::scan(const HTMLToken& token, Vector<std::unique_ptr<PreloadRequest>>& requests, Document& document) { switch (token.type()) { case HTMLToken::Character: if (!m_inStyle) return; m_cssScanner.scan(token.characters(), requests); return; case HTMLToken::EndTag: { TagId tagId = tagIdFor(token.name()); #if ENABLE(TEMPLATE_ELEMENT) if (tagId == TagId::Template) { if (m_templateCount) --m_templateCount; return; } #endif if (tagId == TagId::Style) { if (m_inStyle) m_cssScanner.reset(); m_inStyle = false; } else if (tagId == TagId::Picture && !m_pictureSourceState.isEmpty()) m_pictureSourceState.removeLast(); return; } case HTMLToken::StartTag: { #if ENABLE(TEMPLATE_ELEMENT) if (m_templateCount) return; #endif TagId tagId = tagIdFor(token.name()); #if ENABLE(TEMPLATE_ELEMENT) if (tagId == TagId::Template) { ++m_templateCount; return; } #endif if (tagId == TagId::Style) { m_inStyle = true; return; } if (tagId == TagId::Base) { // The first <base> element is the one that wins. if (!m_predictedBaseElementURL.isEmpty()) return; updatePredictedBaseURL(token); return; } if (tagId == TagId::Picture) { m_pictureSourceState.append(false); return; } StartTagScanner scanner(tagId, m_deviceScaleFactor); scanner.processAttributes(token.attributes(), document, m_pictureSourceState); if (auto request = scanner.createPreloadRequest(m_predictedBaseElementURL)) requests.append(WTFMove(request)); return; } default: return; } }
String XSSAuditor::decodedSnippetForName(const HTMLToken& token) { // Grab a fixed number of characters equal to the length of the token's name plus one (to account for the "<"). return fullyDecodeString(m_parser->sourceForToken(token), m_parser->document()->decoder()).substring(0, token.name().size() + 1); }
static bool hasName(const HTMLToken& token, const QualifiedName& name) { return equalIgnoringNullity(token.name(), static_cast<const String&>(name.localName())); }
static bool hasName(const HTMLToken& token, const QualifiedName& name) { return threadSafeMatch(token.name(), name); }