Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / third_party / WebKit / Source / core / html / parser / HTMLSourceTracker.cpp
blob3f7742615919519e4769687d417f463a85f5f2a9
1 /*
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
6 * are met:
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.
26 #include "config.h"
27 #include "core/html/parser/HTMLSourceTracker.h"
29 #include "core/html/parser/HTMLTokenizer.h"
30 #include "wtf/text/StringBuilder.h"
32 namespace blink {
34 HTMLSourceTracker::HTMLSourceTracker()
35 : m_isStarted(false)
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();
45 } else
46 m_previousSource.append(m_currentSource);
48 m_isStarted = true;
49 m_currentSource = currentInput;
50 token.setBaseOffset(m_currentSource.numberOfCharactersConsumed() - m_previousSource.length());
53 void HTMLSourceTracker::end(SegmentedString& currentInput, HTMLTokenizer* tokenizer, HTMLToken& token)
55 m_isStarted = false;
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;
68 size_t length;
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;
72 } else {
73 ASSERT(!token.startIndex());
74 length = static_cast<size_t>(token.endIndex() - token.startIndex());
77 StringBuilder source;
78 source.reserveCapacity(length);
80 size_t i = 0;
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;