Bug 482921 part 14 - Address review comments. r=Olli.Pettay.

This commit is contained in:
Henri Sivonen 2011-11-01 13:33:11 +02:00
Родитель f4d82459e5
Коммит c718393931
10 изменённых файлов: 243 добавлений и 141 удалений

Просмотреть файл

@ -868,6 +868,8 @@ public abstract class TreeBuilder<T> implements TokenHandler,
*/
public final void characters(@Const @NoLength char[] buf, int start, int length)
throws SAXException {
// Note: Can't attach error messages to EOF in C++ yet
// CPPONLY: if (tokenizer.isViewingXmlSource()) {
// CPPONLY: return;
// CPPONLY: }
@ -1271,6 +1273,7 @@ public abstract class TreeBuilder<T> implements TokenHandler,
public final void eof() throws SAXException {
flushCharacters();
// Note: Can't attach error messages to EOF in C++ yet
eofloop: for (;;) {
if (isInForeign()) {
// [NOCPP[

Просмотреть файл

@ -205,10 +205,10 @@ nsHtml5Highlighter::Transition(PRInt32 aState, bool aReconsume, PRInt32 aPos)
case NS_HTML5TOKENIZER_TAG_NAME:
switch (aState) {
case NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME:
EndInline(); // NS_HTML5TOKENIZER_TAG_NAME
EndSpanOrA(); // NS_HTML5TOKENIZER_TAG_NAME
break;
case NS_HTML5TOKENIZER_SELF_CLOSING_START_TAG:
EndInline(); // NS_HTML5TOKENIZER_TAG_NAME
EndSpanOrA(); // NS_HTML5TOKENIZER_TAG_NAME
StartSpan(); // for highlighting the slash
mSlash = CurrentNode();
break;
@ -235,10 +235,10 @@ nsHtml5Highlighter::Transition(PRInt32 aState, bool aReconsume, PRInt32 aPos)
switch (aState) {
case NS_HTML5TOKENIZER_AFTER_ATTRIBUTE_NAME:
case NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_VALUE:
EndInline(); // NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME
EndSpanOrA(); // NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME
break;
case NS_HTML5TOKENIZER_SELF_CLOSING_START_TAG:
EndInline(); // NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME
EndSpanOrA(); // NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME
StartSpan(); // for highlighting the slash
mSlash = CurrentNode();
break;
@ -266,7 +266,7 @@ nsHtml5Highlighter::Transition(PRInt32 aState, bool aReconsume, PRInt32 aPos)
case NS_HTML5TOKENIZER_ATTRIBUTE_VALUE_SINGLE_QUOTED:
switch (aState) {
case NS_HTML5TOKENIZER_AFTER_ATTRIBUTE_VALUE_QUOTED:
EndInline();
EndSpanOrA();
break;
case NS_HTML5TOKENIZER_CONSUME_CHARACTER_REFERENCE:
StartSpan();
@ -292,7 +292,7 @@ nsHtml5Highlighter::Transition(PRInt32 aState, bool aReconsume, PRInt32 aPos)
}
break;
case NS_HTML5TOKENIZER_SELF_CLOSING_START_TAG:
EndInline(); // end the slash highlight
EndSpanOrA(); // end the slash highlight
switch (aState) {
case NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME:
break;
@ -304,7 +304,7 @@ nsHtml5Highlighter::Transition(PRInt32 aState, bool aReconsume, PRInt32 aPos)
case NS_HTML5TOKENIZER_ATTRIBUTE_VALUE_UNQUOTED:
switch (aState) {
case NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME:
EndInline();
EndSpanOrA();
break;
case NS_HTML5TOKENIZER_CONSUME_CHARACTER_REFERENCE:
StartSpan();
@ -353,14 +353,14 @@ nsHtml5Highlighter::Transition(PRInt32 aState, bool aReconsume, PRInt32 aPos)
}
break;
case NS_HTML5TOKENIZER_CONSUME_CHARACTER_REFERENCE:
EndInline(); // the span for the ampersand
EndSpanOrA(); // the span for the ampersand
switch (aState) {
case NS_HTML5TOKENIZER_CONSUME_NCR:
case NS_HTML5TOKENIZER_CHARACTER_REFERENCE_HILO_LOOKUP:
break;
default:
// not actually a character reference
EndInline();
EndSpanOrA();
break;
}
break;
@ -369,13 +369,13 @@ nsHtml5Highlighter::Transition(PRInt32 aState, bool aReconsume, PRInt32 aPos)
break;
}
// not actually a character reference
EndInline();
EndSpanOrA();
break;
case NS_HTML5TOKENIZER_CHARACTER_REFERENCE_TAIL:
if (!aReconsume) {
FlushCurrent();
}
EndInline();
EndSpanOrA();
break;
case NS_HTML5TOKENIZER_DECIMAL_NRC_LOOP:
case NS_HTML5TOKENIZER_HEX_NCR_LOOP:
@ -388,7 +388,7 @@ nsHtml5Highlighter::Transition(PRInt32 aState, bool aReconsume, PRInt32 aPos)
AddClass(sEntity);
break;
}
EndInline();
EndSpanOrA();
break;
case NS_HTML5TOKENIZER_CLOSE_TAG_OPEN:
switch (aState) {
@ -406,18 +406,18 @@ nsHtml5Highlighter::Transition(PRInt32 aState, bool aReconsume, PRInt32 aPos)
StartSpan(); // don't know if it is "end-tag" yet :-(
break;
}
EndInline();
EndSpanOrA();
StartCharacters();
break;
case NS_HTML5TOKENIZER_NON_DATA_END_TAG_NAME:
switch (aState) {
case NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME:
AddClass(sEndTag);
EndInline();
EndSpanOrA();
break;
case NS_HTML5TOKENIZER_SELF_CLOSING_START_TAG:
AddClass(sEndTag);
EndInline();
EndSpanOrA();
StartSpan(); // for highlighting the slash
mSlash = CurrentNode();
break;
@ -557,7 +557,7 @@ nsHtml5Highlighter::StartSpan(const PRUnichar* aClass)
}
void
nsHtml5Highlighter::EndInline()
nsHtml5Highlighter::EndSpanOrA()
{
FlushChars();
Pop();
@ -596,10 +596,10 @@ void
nsHtml5Highlighter::FinishTag()
{
while (mInlinesOpen > 1) {
EndInline();
EndSpanOrA();
}
FlushCurrent(); // >
EndInline(); // DATA
EndSpanOrA(); // DATA
NS_ASSERTION(!mInlinesOpen, "mInlinesOpen got out of sync!");
StartCharacters();
}
@ -685,14 +685,14 @@ void
nsHtml5Highlighter::MaybeLinkifyAttributeValue(nsHtml5AttributeName* aName,
nsString* aValue)
{
if (!(nsHtml5AttributeName::ATTR_HREF == aName
|| nsHtml5AttributeName::ATTR_SRC == aName
|| nsHtml5AttributeName::ATTR_ACTION == aName
|| nsHtml5AttributeName::ATTR_CITE == aName
|| nsHtml5AttributeName::ATTR_BACKGROUND == aName
|| nsHtml5AttributeName::ATTR_LONGDESC == aName
|| nsHtml5AttributeName::ATTR_XLINK_HREF == aName
|| nsHtml5AttributeName::ATTR_DEFINITIONURL == aName)) {
if (!(nsHtml5AttributeName::ATTR_HREF == aName ||
nsHtml5AttributeName::ATTR_SRC == aName ||
nsHtml5AttributeName::ATTR_ACTION == aName ||
nsHtml5AttributeName::ATTR_CITE == aName ||
nsHtml5AttributeName::ATTR_BACKGROUND == aName ||
nsHtml5AttributeName::ATTR_LONGDESC == aName ||
nsHtml5AttributeName::ATTR_XLINK_HREF == aName ||
nsHtml5AttributeName::ATTR_DEFINITIONURL == aName)) {
return;
}
AddViewSourceHref(*aValue);

Просмотреть файл

@ -192,9 +192,9 @@ class nsHtml5Highlighter
void StartSpan(const PRUnichar* aClass);
/**
* End the current <span> or <a>.
* End the current <span> or <a> in the highlighter output.
*/
void EndInline();
void EndSpanOrA();
/**
* Starts a wrapper around a run of characters.
@ -222,8 +222,10 @@ class nsHtml5Highlighter
void FlushCurrent();
/**
* Finishes a source tag being highlighted by closing the open <span> and
* <a> elements.
* Finishes highlighting a tag in the input data by closing the open
* <span> and <a> elements in the highlighter output and then starts
* another <span> for potentially highlighting characters potentially
* appearing next.
*/
void FinishTag();
@ -238,6 +240,9 @@ class nsHtml5Highlighter
/**
* Allocates a handle for an element.
*
* See the documentation for nsHtml5TreeBuilder::AllocateContentHandle()
* in nsHtml5TreeBuilderHSupplement.h.
*
* @return the handle
*/
nsIContent** AllocateContentHandle();

Просмотреть файл

@ -516,6 +516,14 @@ nsHtml5StreamParser::FinalizeSniffing(const PRUint8* aFromSegment, // can be nul
XML_SetUserData(ud.mExpat, static_cast<void*>(&ud));
XML_Status status = XML_STATUS_OK;
// aFromSegment points to the data obtained from the current network
// event. mSniffingBuffer (if it exists) contains the data obtained before
// the current event. Thus, mSniffingLenth bytes of mSniffingBuffer
// followed by aCountToSniffingLimit bytes from aFromSegment are the
// first 1024 bytes of the file (or the file as a whole if the file is
// 1024 bytes long or shorter). Thus, we parse both buffers, but if the
// first call succeeds already, we skip parsing the second buffer.
if (mSniffingBuffer) {
status = XML_Parse(ud.mExpat,
reinterpret_cast<const char*>(mSniffingBuffer.get()),
@ -682,8 +690,8 @@ nsHtml5StreamParser::SniffStreamBytes(const PRUint8* aFromSegment,
PRUint32 countToSniffingLimit =
NS_HTML5_STREAM_PARSER_SNIFFING_BUFFER_SIZE - mSniffingLength;
if (mMode == NORMAL || mMode == VIEW_SOURCE_HTML) {
nsHtml5ByteReadable readable(aFromSegment, aFromSegment
+ countToSniffingLimit);
nsHtml5ByteReadable readable(aFromSegment, aFromSegment +
countToSniffingLimit);
mMetaScanner->sniff(&readable, getter_AddRefs(mUnicodeDecoder), mCharset);
if (mUnicodeDecoder) {
mUnicodeDecoder->SetInputErrorBehavior(

Просмотреть файл

@ -496,7 +496,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
state = P::transition(mViewSource, NS_HTML5TOKENIZER_PROCESSING_INSTRUCTION, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
if (P::viewingSource) {
if (P::reportErrors) {
errProcessingInstruction();
}
clearLongStrBufAndAppend(c);
@ -504,7 +504,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
case '>': {
if (P::viewingSource) {
if (P::reportErrors) {
errLtGt();
}
tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 2);
@ -513,7 +513,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
default: {
if (P::viewingSource) {
if (P::reportErrors) {
errBadCharAfterLt(c);
}
tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
@ -617,7 +617,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
case '\'':
case '<':
case '=': {
if (P::viewingSource) {
if (P::reportErrors) {
errBadCharBeforeAttributeNameOrNull(c);
}
}
@ -682,7 +682,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
case '\"':
case '\'':
case '<': {
if (P::viewingSource) {
if (P::reportErrors) {
errQuoteOrLtInAttributeNameOrNull(c);
}
}
@ -734,7 +734,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
case '>': {
if (P::viewingSource) {
if (P::reportErrors) {
errAttributeValueMissing();
}
addAttributeWithoutValue();
@ -750,7 +750,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
case '<':
case '=':
case '`': {
if (P::viewingSource) {
if (P::reportErrors) {
errLtOrEqualsOrGraveInUnquotedAttributeOrNull(c);
}
}
@ -839,7 +839,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
default: {
if (P::viewingSource) {
if (P::reportErrors) {
errNoSpaceBetweenAttributes();
}
state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME, reconsume, pos);
@ -864,7 +864,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
default: {
if (P::viewingSource) {
if (P::reportErrors) {
errSlashNotFollowedByGt();
}
state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME, reconsume, pos);
@ -923,7 +923,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
case '\'':
case '=':
case '`': {
if (P::viewingSource) {
if (P::reportErrors) {
errUnquotedAttributeValOrNull(c);
}
}
@ -977,7 +977,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
case '\"':
case '\'':
case '<': {
if (P::viewingSource) {
if (P::reportErrors) {
errQuoteOrLtInAttributeNameOrNull(c);
}
}
@ -1021,7 +1021,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
}
}
default: {
if (P::viewingSource) {
if (P::reportErrors) {
errBogusComment();
}
clearLongStrBuf();
@ -1049,7 +1049,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_BREAK(markupdeclarationhyphenloop);
}
default: {
if (P::viewingSource) {
if (P::reportErrors) {
errBogusComment();
}
state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_COMMENT, reconsume, pos);
@ -1073,7 +1073,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
case '>': {
if (P::viewingSource) {
if (P::reportErrors) {
errPrematureEndOfComment();
}
emitComment(0, pos);
@ -1194,7 +1194,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
case '!': {
if (P::viewingSource) {
if (P::reportErrors) {
errHyphenHyphenBang();
}
appendLongStrBuf(c);
@ -1261,7 +1261,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
case '>': {
if (P::viewingSource) {
if (P::reportErrors) {
errPrematureEndOfComment();
}
emitComment(1, pos);
@ -1298,7 +1298,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
if (c == nsHtml5Tokenizer::CDATA_LSQB[index]) {
appendLongStrBuf(c);
} else {
if (P::viewingSource) {
if (P::reportErrors) {
errBogusComment();
}
state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_COMMENT, reconsume, pos);
@ -1474,7 +1474,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
} else if (c >= 'A' && c <= 'Z') {
firstCharKey = c - 'A';
} else {
if (P::viewingSource) {
if (P::reportErrors) {
errNoNamedCharacterMatch();
}
emitOrAppendStrBuf(returnState);
@ -1507,7 +1507,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
}
}
if (!hilo) {
if (P::viewingSource) {
if (P::reportErrors) {
errNoNamedCharacterMatch();
}
emitOrAppendStrBuf(returnState);
@ -1578,7 +1578,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
}
outer_end: ;
if (candidate == -1) {
if (P::viewingSource) {
if (P::reportErrors) {
errNoNamedCharacterMatch();
}
emitOrAppendStrBuf(returnState);
@ -1599,7 +1599,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
ch = strBuf[strBufMark];
}
if (ch == '=' || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
if (P::viewingSource) {
if (P::reportErrors) {
errNoNamedCharacterMatch();
}
appendStrBufToLongStrBuf();
@ -1609,11 +1609,11 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
}
}
if ((returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
if (P::viewingSource) {
if (P::reportErrors) {
errUnescapedAmpersandInterpretedAsCharacterReference();
}
} else {
if (P::viewingSource) {
if (P::reportErrors) {
errNotSemicolonTerminated();
}
}
@ -1690,7 +1690,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
state = P::transition(mViewSource, NS_HTML5TOKENIZER_HANDLE_NCR_VALUE, reconsume, pos);
NS_HTML5_BREAK(decimalloop);
} else {
if (P::viewingSource) {
if (P::reportErrors) {
errNoDigitsInNCR();
}
appendStrBuf(';');
@ -1703,7 +1703,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
}
} else {
if (!seenDigits) {
if (P::viewingSource) {
if (P::reportErrors) {
errNoDigitsInNCR();
}
emitOrAppendStrBuf(returnState);
@ -1714,7 +1714,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
reconsume = true;
NS_HTML5_CONTINUE(stateloop);
} else {
if (P::viewingSource) {
if (P::reportErrors) {
errCharRefLacksSemicolon();
}
if (!(returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
@ -1766,7 +1766,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
state = P::transition(mViewSource, NS_HTML5TOKENIZER_HANDLE_NCR_VALUE, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
} else {
if (P::viewingSource) {
if (P::reportErrors) {
errNoDigitsInNCR();
}
appendStrBuf(';');
@ -1779,7 +1779,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
}
} else {
if (!seenDigits) {
if (P::viewingSource) {
if (P::reportErrors) {
errNoDigitsInNCR();
}
emitOrAppendStrBuf(returnState);
@ -1790,7 +1790,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
reconsume = true;
NS_HTML5_CONTINUE(stateloop);
} else {
if (P::viewingSource) {
if (P::reportErrors) {
errCharRefLacksSemicolon();
}
if (!(returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
@ -1839,7 +1839,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
c = checkChar(buf, pos);
switch(c) {
case '>': {
if (P::viewingSource) {
if (P::reportErrors) {
errLtSlashGt();
}
cstart = pos + 1;
@ -1848,7 +1848,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
}
case '\r': {
silentCarriageReturn();
if (P::viewingSource) {
if (P::reportErrors) {
errGarbageAfterLtSlash();
}
clearLongStrBufAndAppend('\n');
@ -1857,7 +1857,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
}
case '\n': {
silentLineFeed();
if (P::viewingSource) {
if (P::reportErrors) {
errGarbageAfterLtSlash();
}
clearLongStrBufAndAppend('\n');
@ -1877,7 +1877,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
state = P::transition(mViewSource, NS_HTML5TOKENIZER_TAG_NAME, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
} else {
if (P::viewingSource) {
if (P::reportErrors) {
errGarbageAfterLtSlash();
}
clearLongStrBufAndAppend(c);
@ -2625,7 +2625,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
if (folded == nsHtml5Tokenizer::OCTYPE[index]) {
appendLongStrBuf(c);
} else {
if (P::viewingSource) {
if (P::reportErrors) {
errBogusComment();
}
state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_COMMENT, reconsume, pos);
@ -2669,7 +2669,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_BREAK(doctypeloop);
}
default: {
if (P::viewingSource) {
if (P::reportErrors) {
errMissingSpaceBeforeDoctypeName();
}
state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_DOCTYPE_NAME, reconsume, pos);
@ -2704,7 +2704,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
continue;
}
case '>': {
if (P::viewingSource) {
if (P::reportErrors) {
errNamelessDoctype();
}
forceQuirks = true;
@ -2868,7 +2868,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_BREAK(afterdoctypepublickeywordloop);
}
case '\"': {
if (P::viewingSource) {
if (P::reportErrors) {
errNoSpaceBetweenDoctypePublicKeywordAndQuote();
}
clearLongStrBuf();
@ -2876,7 +2876,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
case '\'': {
if (P::viewingSource) {
if (P::reportErrors) {
errNoSpaceBetweenDoctypePublicKeywordAndQuote();
}
clearLongStrBuf();
@ -2884,7 +2884,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
case '>': {
if (P::viewingSource) {
if (P::reportErrors) {
errExpectedPublicId();
}
forceQuirks = true;
@ -2931,7 +2931,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
case '>': {
if (P::viewingSource) {
if (P::reportErrors) {
errExpectedPublicId();
}
forceQuirks = true;
@ -2961,7 +2961,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_BREAK(doctypepublicidentifierdoublequotedloop);
}
case '>': {
if (P::viewingSource) {
if (P::reportErrors) {
errGtInPublicId();
}
forceQuirks = true;
@ -3016,7 +3016,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
case '\"': {
if (P::viewingSource) {
if (P::reportErrors) {
errNoSpaceBetweenPublicAndSystemIds();
}
clearLongStrBuf();
@ -3024,7 +3024,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
case '\'': {
if (P::viewingSource) {
if (P::reportErrors) {
errNoSpaceBetweenPublicAndSystemIds();
}
clearLongStrBuf();
@ -3096,7 +3096,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
case '>': {
if (P::viewingSource) {
if (P::reportErrors) {
errGtInSystemId();
}
forceQuirks = true;
@ -3239,7 +3239,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_BREAK(afterdoctypesystemkeywordloop);
}
case '\"': {
if (P::viewingSource) {
if (P::reportErrors) {
errNoSpaceBetweenDoctypeSystemKeywordAndQuote();
}
clearLongStrBuf();
@ -3247,7 +3247,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
case '\'': {
if (P::viewingSource) {
if (P::reportErrors) {
errNoSpaceBetweenDoctypeSystemKeywordAndQuote();
}
clearLongStrBuf();
@ -3255,7 +3255,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
case '>': {
if (P::viewingSource) {
if (P::reportErrors) {
errExpectedPublicId();
}
forceQuirks = true;
@ -3302,7 +3302,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_BREAK(beforedoctypesystemidentifierloop);
}
case '>': {
if (P::viewingSource) {
if (P::reportErrors) {
errExpectedSystemId();
}
forceQuirks = true;
@ -3332,7 +3332,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
case '>': {
if (P::viewingSource) {
if (P::reportErrors) {
errGtInSystemId();
}
forceQuirks = true;
@ -3372,7 +3372,7 @@ nsHtml5Tokenizer::stateLoop(PRInt32 state, PRUnichar c, PRInt32 pos, PRUnichar*
NS_HTML5_CONTINUE(stateloop);
}
case '>': {
if (P::viewingSource) {
if (P::reportErrors) {
errGtInPublicId();
}
forceQuirks = true;

Просмотреть файл

@ -64,67 +64,79 @@ nsHtml5Tokenizer::errWarnLtSlashInRcdata()
{
}
// The null checks below annotated NS_LIKELY are not actually necessary.
void
nsHtml5Tokenizer::errUnquotedAttributeValOrNull(PRUnichar c)
{
switch (c) {
case '<':
mViewSource->AddErrorToCurrentNode("errUnquotedAttributeLt");
return;
case '`':
mViewSource->AddErrorToCurrentNode("errUnquotedAttributeGrave");
return;
case '\'':
case '"':
mViewSource->AddErrorToCurrentNode("errUnquotedAttributeQuote");
return;
case '=':
mViewSource->AddErrorToCurrentNode("errUnquotedAttributeEquals");
return;
if (NS_LIKELY(mViewSource)) {
switch (c) {
case '<':
mViewSource->AddErrorToCurrentNode("errUnquotedAttributeLt");
return;
case '`':
mViewSource->AddErrorToCurrentNode("errUnquotedAttributeGrave");
return;
case '\'':
case '"':
mViewSource->AddErrorToCurrentNode("errUnquotedAttributeQuote");
return;
case '=':
mViewSource->AddErrorToCurrentNode("errUnquotedAttributeEquals");
return;
}
}
}
void
nsHtml5Tokenizer::errLtOrEqualsOrGraveInUnquotedAttributeOrNull(PRUnichar c)
{
switch (c) {
case '=':
mViewSource->AddErrorToCurrentNode("errUnquotedAttributeStartEquals");
return;
case '<':
mViewSource->AddErrorToCurrentNode("errUnquotedAttributeStartLt");
return;
case '`':
mViewSource->AddErrorToCurrentNode("errUnquotedAttributeStartGrave");
return;
if (NS_LIKELY(mViewSource)) {
switch (c) {
case '=':
mViewSource->AddErrorToCurrentNode("errUnquotedAttributeStartEquals");
return;
case '<':
mViewSource->AddErrorToCurrentNode("errUnquotedAttributeStartLt");
return;
case '`':
mViewSource->AddErrorToCurrentNode("errUnquotedAttributeStartGrave");
return;
}
}
}
void
nsHtml5Tokenizer::errBadCharBeforeAttributeNameOrNull(PRUnichar c)
{
if (c == '<') {
mViewSource->AddErrorToCurrentNode("errBadCharBeforeAttributeNameLt");
} else if (c == '=') {
errEqualsSignBeforeAttributeName();
} else if (c != 0xFFFD) {
errQuoteBeforeAttributeName(c);
if (NS_LIKELY(mViewSource)) {
if (c == '<') {
mViewSource->AddErrorToCurrentNode("errBadCharBeforeAttributeNameLt");
} else if (c == '=') {
errEqualsSignBeforeAttributeName();
} else if (c != 0xFFFD) {
errQuoteBeforeAttributeName(c);
}
}
}
void
nsHtml5Tokenizer::errBadCharAfterLt(PRUnichar c)
{
mViewSource->AddErrorToCurrentNode("errBadCharAfterLt");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errBadCharAfterLt");
}
}
void
nsHtml5Tokenizer::errQuoteOrLtInAttributeNameOrNull(PRUnichar c)
{
if (c == '<') {
mViewSource->AddErrorToCurrentNode("errLtInAttributeName");
} else if (c != 0xFFFD) {
mViewSource->AddErrorToCurrentNode("errQuoteInAttributeName");
if (NS_LIKELY(mViewSource)) {
if (c == '<') {
mViewSource->AddErrorToCurrentNode("errLtInAttributeName");
} else if (c != 0xFFFD) {
mViewSource->AddErrorToCurrentNode("errQuoteInAttributeName");
}
}
}
@ -177,13 +189,17 @@ nsHtml5Tokenizer::errNcrControlChar(PRUnichar ch)
void
nsHtml5Tokenizer::errGarbageAfterLtSlash()
{
mViewSource->AddErrorToCurrentNode("errGarbageAfterLtSlash");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errGarbageAfterLtSlash");
}
}
void
nsHtml5Tokenizer::errLtSlashGt()
{
mViewSource->AddErrorToCurrentNode("errLtSlashGt");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errLtSlashGt");
}
}
void
@ -205,19 +221,25 @@ nsHtml5Tokenizer::errNoDigitsInNCR()
void
nsHtml5Tokenizer::errGtInSystemId()
{
mViewSource->AddErrorToCurrentNode("errGtInSystemId");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errGtInSystemId");
}
}
void
nsHtml5Tokenizer::errGtInPublicId()
{
mViewSource->AddErrorToCurrentNode("errGtInPublicId");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errGtInPublicId");
}
}
void
nsHtml5Tokenizer::errNamelessDoctype()
{
mViewSource->AddErrorToCurrentNode("errNamelessDoctype");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errNamelessDoctype");
}
}
void
@ -231,7 +253,9 @@ nsHtml5Tokenizer::errConsecutiveHyphens()
void
nsHtml5Tokenizer::errPrematureEndOfComment()
{
mViewSource->AddErrorToCurrentNode("errPrematureEndOfComment");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errPrematureEndOfComment");
}
}
void
@ -245,37 +269,49 @@ nsHtml5Tokenizer::errBogusComment()
void
nsHtml5Tokenizer::errSlashNotFollowedByGt()
{
mViewSource->AddErrorToCurrentSlash("errSlashNotFollowedByGt");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentSlash("errSlashNotFollowedByGt");
}
}
void
nsHtml5Tokenizer::errNoSpaceBetweenAttributes()
{
mViewSource->AddErrorToCurrentNode("errNoSpaceBetweenAttributes");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errNoSpaceBetweenAttributes");
}
}
void
nsHtml5Tokenizer::errAttributeValueMissing()
{
mViewSource->AddErrorToCurrentNode("errAttributeValueMissing");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errAttributeValueMissing");
}
}
void
nsHtml5Tokenizer::errEqualsSignBeforeAttributeName()
{
mViewSource->AddErrorToCurrentNode("errEqualsSignBeforeAttributeName");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errEqualsSignBeforeAttributeName");
}
}
void
nsHtml5Tokenizer::errLtGt()
{
mViewSource->AddErrorToCurrentNode("errLtGt");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errLtGt");
}
}
void
nsHtml5Tokenizer::errProcessingInstruction()
{
mViewSource->AddErrorToCurrentNode("errProcessingInstruction");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errProcessingInstruction");
}
}
void
@ -305,13 +341,17 @@ nsHtml5Tokenizer::errNoNamedCharacterMatch()
void
nsHtml5Tokenizer::errQuoteBeforeAttributeName(PRUnichar c)
{
mViewSource->AddErrorToCurrentNode("errQuoteBeforeAttributeName");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errQuoteBeforeAttributeName");
}
}
void
nsHtml5Tokenizer::errExpectedPublicId()
{
mViewSource->AddErrorToCurrentNode("errExpectedPublicId");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errExpectedPublicId");
}
}
void
@ -453,19 +493,25 @@ nsHtml5Tokenizer::errEofInSystemId()
void
nsHtml5Tokenizer::errExpectedSystemId()
{
mViewSource->AddErrorToCurrentNode("errExpectedSystemId");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errExpectedSystemId");
}
}
void
nsHtml5Tokenizer::errMissingSpaceBeforeDoctypeName()
{
mViewSource->AddErrorToCurrentNode("errMissingSpaceBeforeDoctypeName");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errMissingSpaceBeforeDoctypeName");
}
}
void
nsHtml5Tokenizer::errHyphenHyphenBang()
{
mViewSource->AddErrorToCurrentNode("errHyphenHyphenBang");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errHyphenHyphenBang");
}
}
void
@ -487,17 +533,23 @@ nsHtml5Tokenizer::errNcrZero()
void
nsHtml5Tokenizer::errNoSpaceBetweenDoctypeSystemKeywordAndQuote()
{
mViewSource->AddErrorToCurrentNode("errNoSpaceBetweenDoctypeSystemKeywordAndQuote");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errNoSpaceBetweenDoctypeSystemKeywordAndQuote");
}
}
void
nsHtml5Tokenizer::errNoSpaceBetweenPublicAndSystemIds()
{
mViewSource->AddErrorToCurrentNode("errNoSpaceBetweenPublicAndSystemIds");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errNoSpaceBetweenPublicAndSystemIds");
}
}
void
nsHtml5Tokenizer::errNoSpaceBetweenDoctypePublicKeywordAndQuote()
{
mViewSource->AddErrorToCurrentNode("errNoSpaceBetweenDoctypePublicKeywordAndQuote");
if (NS_LIKELY(mViewSource)) {
mViewSource->AddErrorToCurrentNode("errNoSpaceBetweenDoctypePublicKeywordAndQuote");
}
}

Просмотреть файл

@ -38,9 +38,13 @@
#ifndef nsHtml5TokenizerLoopPolicies_h_
#define nsHtml5TokenizerLoopPolicies_h_
/**
* This policy does not report tokenizer transitions anywhere. To be used
* when _not_ viewing source.
*/
struct nsHtml5SilentPolicy
{
static const bool viewingSource = false;
static const bool reportErrors = false;
static PRInt32 transition(nsHtml5Highlighter* aHighlighter,
PRInt32 aState,
bool aReconsume,
@ -51,9 +55,13 @@ struct nsHtml5SilentPolicy
}
};
/**
* This policy reports the tokenizer transitions to a highlighter. To be used
* when viewing source.
*/
struct nsHtml5ViewSourcePolicy
{
static const bool viewingSource = true;
static const bool reportErrors = true;
static PRInt32 transition(nsHtml5Highlighter* aHighlighter,
PRInt32 aState,
bool aReconsume,

Просмотреть файл

@ -58,6 +58,29 @@
*/
void documentMode(nsHtml5DocumentMode m);
/**
* Using nsIContent** instead of nsIContent* is the parser deals with DOM
* nodes in a way that works off the main thread. Non-main-thread code
* can't refcount or otherwise touch nsIContent objects in any way.
* Yet, the off-the-main-thread code needs to have a way to hold onto a
* particular node and repeatedly operate on the same node.
*
* The way this works is that the off-the-main-thread code has an
* nsIContent** for each DOM node and a given nsIContent** is only ever
* actually dereferenced into an actual nsIContent* on the main thread.
* When the off-the-main-thread code requests a new node, it gets an
* nsIContent** immediately and a tree op is enqueued for later allocating
* an actual nsIContent object and writing a pointer to it into the memory
* location pointed to by the nsIContent**.
*
* Since tree ops are in a queue, the node creating tree op will always
* run before tree ops that try to further operate on the node that the
* nsIContent** is a handle to.
*
* On-the-main-thread parts of the parser use the same mechanism in order
* to avoid having to have duplicate code paths for on-the-main-thread and
* off-the-main-thread tree builder instances.)
*/
nsIContent** AllocateContentHandle();
void accumulateCharactersForced(const PRUnichar* aBuf, PRInt32 aStart, PRInt32 aLength)

Просмотреть файл

@ -905,6 +905,8 @@ nsHtml5TreeOpExecutor::GetViewSourceBaseURI()
NS_ASSERTION(nested, "URI with scheme view-source didn't QI to nested!");
nested->GetInnerURI(getter_AddRefs(mViewSourceBaseURI));
} else {
// Fail gracefully if the base URL isn't a view-source: URL.
// Not sure if this can ever happen.
mViewSourceBaseURI = orig;
}
}

Просмотреть файл

@ -715,6 +715,7 @@ nsHtml5TreeOperation::Perform(nsHtml5TreeOpExecutor* aBuilder,
nsIContent* node = *(mOne.node);
PRUnichar* str = mTwo.unicharPtr;
nsDependentString depStr(str);
// See viewsource.css for the possible classes
nsAutoString klass;
node->GetAttr(kNameSpaceID_None, nsGkAtoms::_class, klass);
if (!klass.IsEmpty()) {
@ -760,8 +761,7 @@ nsHtml5TreeOperation::Perform(nsHtml5TreeOpExecutor* aBuilder,
rv = NS_URIChainHasFlags(uri,
nsIProtocolHandler::URI_OPENING_EXECUTES_SCRIPT,
&openingExecutesScript);
NS_ENSURE_SUCCESS(rv, NS_OK);
if (openingExecutesScript) {
if (NS_FAILED(rv) || openingExecutesScript) {
return NS_OK;
}
@ -795,6 +795,7 @@ nsHtml5TreeOperation::Perform(nsHtml5TreeOpExecutor* aBuilder,
char* msgId = mTwo.charPtr;
nsCOMPtr<nsIAtom> atom = Reget(mThree.atom);
nsCOMPtr<nsIAtom> otherAtom = Reget(mFour.atom);
// See viewsource.css for the possible classes in addition to "error".
nsAutoString klass;
node->GetAttr(kNameSpaceID_None, nsGkAtoms::_class, klass);
if (!klass.IsEmpty()) {