summaryrefslogtreecommitdiff
path: root/Source/WebCore/html/parser/HTMLSourceTracker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/html/parser/HTMLSourceTracker.cpp')
-rw-r--r--Source/WebCore/html/parser/HTMLSourceTracker.cpp48
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);
+}
+
}