2 * Copyright (C) 2013 Google, Inc. 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 GOOGLE 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 GOOGLE 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/BackgroundHTMLInputStream.h"
31 BackgroundHTMLInputStream::BackgroundHTMLInputStream()
32 : m_firstValidCheckpointIndex(0)
33 , m_firstValidSegmentIndex(0)
34 , m_totalCheckpointTokenCount(0)
38 void BackgroundHTMLInputStream::append(const String
& input
)
40 m_current
.append(SegmentedString(input
));
41 m_segments
.append(input
);
44 void BackgroundHTMLInputStream::close()
49 HTMLInputCheckpoint
BackgroundHTMLInputStream::createCheckpoint(size_t tokensExtractedSincePreviousCheckpoint
)
51 HTMLInputCheckpoint checkpoint
= m_checkpoints
.size();
52 m_checkpoints
.append(Checkpoint(m_current
, m_segments
.size(), tokensExtractedSincePreviousCheckpoint
));
53 m_totalCheckpointTokenCount
+= tokensExtractedSincePreviousCheckpoint
;
57 void BackgroundHTMLInputStream::invalidateCheckpointsBefore(HTMLInputCheckpoint newFirstValidCheckpointIndex
)
59 ASSERT(newFirstValidCheckpointIndex
< m_checkpoints
.size());
60 // There is nothing to do for the first valid checkpoint.
61 if (m_firstValidCheckpointIndex
== newFirstValidCheckpointIndex
)
64 ASSERT(newFirstValidCheckpointIndex
> m_firstValidCheckpointIndex
);
65 const Checkpoint
& lastInvalidCheckpoint
= m_checkpoints
[newFirstValidCheckpointIndex
- 1];
67 ASSERT(m_firstValidSegmentIndex
<= lastInvalidCheckpoint
.numberOfSegmentsAlreadyAppended
);
68 for (size_t i
= m_firstValidSegmentIndex
; i
< lastInvalidCheckpoint
.numberOfSegmentsAlreadyAppended
; ++i
)
69 m_segments
[i
] = String();
70 m_firstValidSegmentIndex
= lastInvalidCheckpoint
.numberOfSegmentsAlreadyAppended
;
72 for (size_t i
= m_firstValidCheckpointIndex
; i
< newFirstValidCheckpointIndex
; ++i
)
73 m_checkpoints
[i
].clear();
74 m_firstValidCheckpointIndex
= newFirstValidCheckpointIndex
;
76 updateTotalCheckpointTokenCount();
79 void BackgroundHTMLInputStream::rewindTo(HTMLInputCheckpoint checkpointIndex
, const String
& unparsedInput
)
81 ASSERT(checkpointIndex
< m_checkpoints
.size()); // If this ASSERT fires, checkpointIndex is invalid.
82 const Checkpoint
& checkpoint
= m_checkpoints
[checkpointIndex
];
83 ASSERT(!checkpoint
.isNull());
85 bool isClosed
= m_current
.isClosed();
87 m_current
= checkpoint
.input
;
89 for (size_t i
= checkpoint
.numberOfSegmentsAlreadyAppended
; i
< m_segments
.size(); ++i
) {
90 ASSERT(!m_segments
[i
].isNull());
91 m_current
.append(SegmentedString(m_segments
[i
]));
94 if (!unparsedInput
.isEmpty())
95 m_current
.prepend(SegmentedString(unparsedInput
));
97 if (isClosed
&& !m_current
.isClosed())
100 ASSERT(m_current
.isClosed() == isClosed
);
103 m_checkpoints
.clear();
104 m_firstValidCheckpointIndex
= 0;
105 m_firstValidSegmentIndex
= 0;
107 updateTotalCheckpointTokenCount();
110 void BackgroundHTMLInputStream::updateTotalCheckpointTokenCount()
112 m_totalCheckpointTokenCount
= 0;
113 size_t lastCheckpointIndex
= m_checkpoints
.size();
114 for (size_t i
= 0; i
< lastCheckpointIndex
; ++i
)
115 m_totalCheckpointTokenCount
+= m_checkpoints
[i
].tokensExtractedSincePreviousCheckpoint
;