void XMLTokenizer::write(const SegmentedString& s, bool /*appendData*/) { String parseString = s.toString(); if (m_sawXSLTransform || !m_sawFirstElement) m_originalSourceForTransform += parseString; if (m_parserStopped || m_sawXSLTransform) return; if (m_parserPaused) { m_pendingSrc.append(s); return; } doWrite(s.toString()); }
void XMLDocumentParser::append(const SegmentedString& s) { String parseString = s.toString(); if (m_sawXSLTransform || !m_sawFirstElement) m_originalSourceForTransform += parseString; if (isStopped() || m_sawXSLTransform) return; if (m_parserPaused) { m_pendingSrc.append(s); return; } doWrite(s.toString()); // After parsing, go ahead and dispatch image beforeload events. ImageLoader::dispatchPendingBeforeLoadEvents(); }
void XMLDocumentParser::resumeParsing() { ASSERT(m_parserPaused); m_parserPaused = false; // First, execute any pending callbacks parse(); if (m_parserPaused) return; // Then, write any pending data SegmentedString rest = m_pendingSrc; m_pendingSrc.clear(); append(rest.toString().impl()); // Finally, if finish() has been called and append() didn't result // in any further callbacks being queued, call end() if (m_finishCalled && !m_parserPaused && !m_pendingScript) end(); }
void HTMLDocumentParser::append(const SegmentedString& source) { if (isStopped()) return; #if ENABLE(THREADED_HTML_PARSER) if (shouldUseThreading()) { if (!m_haveBackgroundParser) startBackgroundParser(); ParserIdentifier identifier = ParserMap::identifierForParser(this); const Closure& appendPartial = bind(&BackgroundHTMLParser::appendPartial, identifier, source.toString().isolatedCopy()); HTMLParserThread::shared()->postTask(appendPartial); return; } #endif // pumpTokenizer can cause this parser to be detached from the Document, // but we need to ensure it isn't deleted yet. RefPtr<HTMLDocumentParser> protect(this); if (m_preloadScanner) { if (m_input.current().isEmpty() && !isWaitingForScripts()) { // We have parsed until the end of the current input and so are now moving ahead of the preload scanner. // Clear the scanner so we know to scan starting from the current input point if we block again. m_preloadScanner.clear(); } else { m_preloadScanner->appendToEnd(source); if (isWaitingForScripts()) m_preloadScanner->scan(); } } m_input.appendToEnd(source); if (inPumpSession()) { // We've gotten data off the network in a nested write. // We don't want to consume any more of the input stream now. Do // not worry. We'll consume this data in a less-nested write(). return; } pumpTokenizerIfPossible(AllowYield); endIfDelayed(); }