2 * Copyright (C) 2010 Adam Barth. All Rights Reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #include "core/html/parser/HTMLSourceTracker.h"
29 #include "core/html/parser/HTMLTokenizer.h"
30 #include "wtf/text/StringBuilder.h"
34 HTMLSourceTracker::HTMLSourceTracker()
39 void HTMLSourceTracker::start(SegmentedString
& currentInput
, HTMLTokenizer
* tokenizer
, HTMLToken
& token
)
41 if (token
.type() == HTMLToken::Uninitialized
&& !m_isStarted
) {
42 m_previousSource
.clear();
43 if (tokenizer
->numberOfBufferedCharacters())
44 m_previousSource
= tokenizer
->bufferedCharacters();
46 m_previousSource
.append(m_currentSource
);
49 m_currentSource
= currentInput
;
50 token
.setBaseOffset(m_currentSource
.numberOfCharactersConsumed() - m_previousSource
.length());
53 void HTMLSourceTracker::end(SegmentedString
& currentInput
, HTMLTokenizer
* tokenizer
, HTMLToken
& token
)
57 m_cachedSourceForToken
= String();
59 // FIXME: This work should really be done by the HTMLTokenizer.
60 token
.end(currentInput
.numberOfCharactersConsumed() - tokenizer
->numberOfBufferedCharacters());
63 String
HTMLSourceTracker::sourceForToken(const HTMLToken
& token
)
65 if (!m_cachedSourceForToken
.isEmpty())
66 return m_cachedSourceForToken
;
69 if (token
.type() == HTMLToken::EndOfFile
) {
70 // Consume the remainder of the input, omitting the null character we use to mark the end of the file.
71 length
= m_previousSource
.length() + m_currentSource
.length() - 1;
73 ASSERT(!token
.startIndex());
74 length
= static_cast<size_t>(token
.endIndex() - token
.startIndex());
78 source
.reserveCapacity(length
);
81 for ( ; i
< length
&& !m_previousSource
.isEmpty(); ++i
) {
82 source
.append(m_previousSource
.currentChar());
83 m_previousSource
.advance();
85 for ( ; i
< length
; ++i
) {
86 ASSERT(!m_currentSource
.isEmpty());
87 source
.append(m_currentSource
.currentChar());
88 m_currentSource
.advance();
91 m_cachedSourceForToken
= source
.toString();
92 return m_cachedSourceForToken
;