diff options
Diffstat (limited to 'Source/WebCore/html/parser/HTMLSourceTracker.cpp')
-rw-r--r-- | Source/WebCore/html/parser/HTMLSourceTracker.cpp | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/Source/WebCore/html/parser/HTMLSourceTracker.cpp b/Source/WebCore/html/parser/HTMLSourceTracker.cpp index bf1a8c466..22dba90a5 100644 --- a/Source/WebCore/html/parser/HTMLSourceTracker.cpp +++ b/Source/WebCore/html/parser/HTMLSourceTracker.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2010 Adam Barth. All Rights Reserved. + * Copyright (C) 2015 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -25,58 +26,60 @@ #include "config.h" #include "HTMLSourceTracker.h" + #include "HTMLTokenizer.h" #include <wtf/text/StringBuilder.h> namespace WebCore { -HTMLSourceTracker::HTMLSourceTracker() +void HTMLSourceTracker::startToken(SegmentedString& currentInput, HTMLTokenizer& tokenizer) { -} - -void HTMLSourceTracker::start(SegmentedString& currentInput, HTMLTokenizer* tokenizer, HTMLToken& token) -{ - if (token.type() == HTMLToken::Uninitialized) { - m_previousSource.clear(); - if (tokenizer->numberOfBufferedCharacters()) - m_previousSource = tokenizer->bufferedCharacters(); + if (!m_started) { + if (tokenizer.numberOfBufferedCharacters()) + m_previousSource = tokenizer.bufferedCharacters(); + else + m_previousSource.clear(); + m_started = true; } else m_previousSource.append(m_currentSource); m_currentSource = currentInput; - token.setBaseOffset(m_currentSource.numberOfCharactersConsumed() - m_previousSource.length()); + m_tokenStart = m_currentSource.numberOfCharactersConsumed() - m_previousSource.length(); + tokenizer.setTokenAttributeBaseOffset(m_tokenStart); } -void HTMLSourceTracker::end(SegmentedString& currentInput, HTMLTokenizer* tokenizer, HTMLToken& token) +void HTMLSourceTracker::endToken(SegmentedString& currentInput, HTMLTokenizer& tokenizer) { - m_cachedSourceForToken = String(); + ASSERT(m_started); + m_started = false; - // FIXME: This work should really be done by the HTMLTokenizer. - token.end(currentInput.numberOfCharactersConsumed() - tokenizer->numberOfBufferedCharacters()); + m_tokenEnd = currentInput.numberOfCharactersConsumed() - tokenizer.numberOfBufferedCharacters(); + m_cachedSourceForToken = String(); } -String HTMLSourceTracker::sourceForToken(const HTMLToken& token) +String HTMLSourceTracker::source(const HTMLToken& token) { + ASSERT(!m_started); + if (token.type() == HTMLToken::EndOfFile) return String(); // Hides the null character we use to mark the end of file. if (!m_cachedSourceForToken.isEmpty()) return m_cachedSourceForToken; - ASSERT(!token.startIndex()); - size_t length = static_cast<size_t>(token.endIndex() - token.startIndex()); + unsigned length = m_tokenEnd - m_tokenStart; StringBuilder source; source.reserveCapacity(length); - size_t i = 0; + unsigned i = 0; for ( ; i < length && !m_previousSource.isEmpty(); ++i) { - source.append(m_previousSource.currentChar()); + source.append(m_previousSource.currentCharacter()); m_previousSource.advance(); } for ( ; i < length; ++i) { ASSERT(!m_currentSource.isEmpty()); - source.append(m_currentSource.currentChar()); + source.append(m_currentSource.currentCharacter()); m_currentSource.advance(); } @@ -84,4 +87,9 @@ String HTMLSourceTracker::sourceForToken(const HTMLToken& token) return m_cachedSourceForToken; } +String HTMLSourceTracker::source(const HTMLToken& token, unsigned attributeStart, unsigned attributeEnd) +{ + return source(token).substring(attributeStart, attributeEnd - attributeStart); +} + } |