// not from interface void nsHtml5Parser::ParseUntilBlocked() { if (mBlocked || mExecutor->IsComplete() || mExecutor->IsBroken()) { return; } NS_ASSERTION(mExecutor->HasStarted(), "Bad life cycle."); NS_ASSERTION(!mInDocumentWrite, "ParseUntilBlocked entered while in doc.write!"); mDocWriteSpeculatorActive = false; for (;;) { if (!mFirstBuffer->hasMore()) { if (mFirstBuffer == mLastBuffer) { if (mExecutor->IsComplete()) { // something like cache manisfests stopped the parse in mid-flight return; } if (mDocumentClosed) { NS_ASSERTION(!mStreamParser, "This should only happen with script-created parser."); mTokenizer->eof(); mTreeBuilder->StreamEnded(); mTreeBuilder->Flush(); mExecutor->FlushDocumentWrite(); mTokenizer->end(); return; } // never release the last buffer. NS_ASSERTION(!mLastBuffer->getStart() && !mLastBuffer->getEnd(), "Sentinel buffer had its indeces changed."); if (mStreamParser) { if (mReturnToStreamParserPermitted && !mExecutor->IsScriptExecuting()) { mTreeBuilder->Flush(); mReturnToStreamParserPermitted = false; mStreamParser->ContinueAfterScripts(mTokenizer, mTreeBuilder, mLastWasCR); } } else { // Script-created parser mTreeBuilder->Flush(); // No need to flush the executor, because the executor is already // in a flush NS_ASSERTION(mExecutor->IsInFlushLoop(), "How did we come here without being in the flush loop?"); } return; // no more data for now but expecting more } mFirstBuffer = mFirstBuffer->next; continue; } if (mBlocked || mExecutor->IsComplete()) { return; } // now we have a non-empty buffer mFirstBuffer->adjust(mLastWasCR); mLastWasCR = false; if (mFirstBuffer->hasMore()) { bool inRootContext = (!mStreamParser && !mFirstBuffer->key); if (inRootContext) { mTokenizer->setLineNumber(mRootContextLineNumber); } mLastWasCR = mTokenizer->tokenizeBuffer(mFirstBuffer); if (inRootContext) { mRootContextLineNumber = mTokenizer->getLineNumber(); } if (mTreeBuilder->HasScript()) { mTreeBuilder->Flush(); mExecutor->FlushDocumentWrite(); } if (mBlocked) { return; } } continue; } }
// not from interface void nsHtml5Parser::ParseUntilBlocked() { NS_PRECONDITION(!mExecutor->IsFragmentMode(), "ParseUntilBlocked called in fragment mode."); if (mBlocked) { return; } if (mExecutor->IsComplete()) { return; } NS_ASSERTION(mExecutor->HasStarted(), "Bad life cycle."); for (;;) { if (!mFirstBuffer->hasMore()) { if (mFirstBuffer == mLastBuffer) { if (mExecutor->IsComplete()) { // something like cache manisfests stopped the parse in mid-flight return; } if (mDocumentClosed) { NS_ASSERTION(!mStreamParser, "This should only happen with script-created parser."); mTokenizer->eof(); mTreeBuilder->StreamEnded(); mTreeBuilder->Flush(); mExecutor->FlushDocumentWrite(); mTokenizer->end(); return; } // never release the last buffer. NS_ASSERTION(!mLastBuffer->getStart() && !mLastBuffer->getEnd(), "Sentinel buffer had its indeces changed."); if (mStreamParser && mReturnToStreamParserPermitted && !mExecutor->IsScriptExecuting()) { mTreeBuilder->Flush(); mReturnToStreamParserPermitted = PR_FALSE; mStreamParser->ContinueAfterScripts(mTokenizer, mTreeBuilder, mLastWasCR); } return; // no more data for now but expecting more } mFirstBuffer = mFirstBuffer->next; continue; } if (mBlocked || mExecutor->IsComplete()) { return; } // now we have a non-empty buffer mFirstBuffer->adjust(mLastWasCR); mLastWasCR = PR_FALSE; if (mFirstBuffer->hasMore()) { PRBool inRootContext = (!mStreamParser && (mFirstBuffer->key == mRootContextKey)); if (inRootContext) { mTokenizer->setLineNumber(mRootContextLineNumber); } mLastWasCR = mTokenizer->tokenizeBuffer(mFirstBuffer); if (inRootContext) { mRootContextLineNumber = mTokenizer->getLineNumber(); } if (mTreeBuilder->HasScript()) { mTreeBuilder->Flush(); mExecutor->FlushDocumentWrite(); } if (mBlocked) { return; } } continue; } }