diff --git a/src/share/classes/javax/swing/text/html/parser/Parser.java b/src/share/classes/javax/swing/text/html/parser/Parser.java index 79124461f9c92b75d8bda11e01cd1794d2e3b959..21f570372e451b0a8ff1c10aae5b5e56f3891727 100644 --- a/src/share/classes/javax/swing/text/html/parser/Parser.java +++ b/src/share/classes/javax/swing/text/html/parser/Parser.java @@ -1986,57 +1986,69 @@ class Parser implements DTDConstants { while (true) { int i = 0; while (!insideComment && i < SCRIPT_END_TAG.length - && (SCRIPT_END_TAG[i] == ch - || SCRIPT_END_TAG_UPPER_CASE[i] == ch)) { + && (SCRIPT_END_TAG[i] == ch + || SCRIPT_END_TAG_UPPER_CASE[i] == ch)) { charsToAdd[i] = (char) ch; ch = readCh(); i++; } if (i == SCRIPT_END_TAG.length) { - - /* '' tag detected */ - /* Here, ch == the first character after */ return; - } else { - - /* To account for extra read()'s that happened */ - for (int j = 0; j < i; j++) { - addString(charsToAdd[j]); - } + } - switch (ch) { - case -1: - error("eof.script"); - return; - case '\n': - ln++; + if (!insideComment && i == 1 && charsToAdd[0] == START_COMMENT.charAt(0)) { + // it isn't end script tag, but may be it's start comment tag? + while (i < START_COMMENT.length() + && START_COMMENT.charAt(i) == ch) { + charsToAdd[i] = (char) ch; ch = readCh(); - lfCount++; - addString('\n'); - break; - case '\r': - ln++; - if ((ch = readCh()) == '\n') { - ch = readCh(); - crlfCount++; - } else { - crCount++; - } - addString('\n'); - break; - default: - addString(ch); - String str = new String(getChars(0, strpos)); - if (!insideComment && str.endsWith(START_COMMENT)) { - insideComment = true; - } - if (insideComment && str.endsWith(END_COMMENT)) { - insideComment = false; - } + i++; + } + if (i == START_COMMENT.length()) { + insideComment = true; + } + } + if (insideComment) { + while (i < END_COMMENT.length() + && END_COMMENT.charAt(i) == ch) { + charsToAdd[i] = (char) ch; ch = readCh(); - break; - } // switch + i++; + } + if (i == END_COMMENT.length()) { + insideComment = false; + } + } + + /* To account for extra read()'s that happened */ + for (int j = 0; j < i; j++) { + addString(charsToAdd[j]); } + switch (ch) { + case -1: + error("eof.script"); + return; + case '\n': + ln++; + ch = readCh(); + lfCount++; + addString('\n'); + break; + case '\r': + ln++; + if ((ch = readCh()) == '\n') { + ch = readCh(); + crlfCount++; + } else { + crCount++; + } + addString('\n'); + break; + default: + addString(ch); + ch = readCh(); + break; + } // switch } // while } diff --git a/test/javax/swing/text/html/parser/Parser/8078268/bug8078268.java b/test/javax/swing/text/html/parser/Parser/8078268/bug8078268.java new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/test/javax/swing/text/html/parser/Parser/8078268/slowparse.html b/test/javax/swing/text/html/parser/Parser/8078268/slowparse.html new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391