Modified: trunk/LayoutTests/platform/gtk/inspector/timeline/line-column-expected.txt (293766 => 293767)
--- trunk/LayoutTests/platform/gtk/inspector/timeline/line-column-expected.txt 2022-05-04 08:33:48 UTC (rev 293766)
+++ trunk/LayoutTests/platform/gtk/inspector/timeline/line-column-expected.txt 2022-05-04 09:12:15 UTC (rev 293767)
@@ -60,7 +60,7 @@
"functionName": "",
"url": "",
"scriptId": "<filtered>",
- "lineNumber": 142,
+ "lineNumber": 141,
"columnNumber": 97
}
],
@@ -113,7 +113,7 @@
"functionName": "",
"url": "",
"scriptId": "<filtered>",
- "lineNumber": 142,
+ "lineNumber": 141,
"columnNumber": 97
}
],
@@ -165,7 +165,7 @@
"functionName": "",
"url": "",
"scriptId": "<filtered>",
- "lineNumber": 142,
+ "lineNumber": 141,
"columnNumber": 97
}
],
Modified: trunk/Source/_javascript_Core/Scripts/jsmin.py (293766 => 293767)
--- trunk/Source/_javascript_Core/Scripts/jsmin.py 2022-05-04 08:33:48 UTC (rev 293766)
+++ trunk/Source/_javascript_Core/Scripts/jsmin.py 2022-05-04 09:12:15 UTC (rev 293767)
@@ -1,3 +1,5 @@
+# vim: set fileencoding=utf-8 :
+
# This code is original from jsmin by Douglas Crockford, it was translated to
# Python by Baruch Even. It was rewritten by Dave St.Germain for speed.
#
@@ -24,40 +26,21 @@
# THE SOFTWARE.
+import io
import sys
-is_3 = sys.version_info >= (3, 0)
-if is_3:
- import io
- python_text_type = str
-else:
- import StringIO
- try:
- import cStringIO
- except ImportError:
- cStringIO = None
- python_text_type = basestring
-
__all__ = ['jsmin', '_javascript_Minify']
-__version__ = '2.0.9'
+__version__ = '3.0.1'
-def jsmin(js):
+def jsmin(js, **kwargs):
"""
returns a minified version of the _javascript_ string
"""
- if not is_3:
- if cStringIO and not isinstance(js, unicode):
- # strings can use cStringIO for a 3x performance
- # improvement, but unicode (in python2) cannot
- klass = cStringIO.StringIO
- else:
- klass = StringIO.StringIO
- else:
- klass = io.StringIO
+ klass = io.StringIO
ins = klass(js)
outs = klass()
- _javascript_Minify(ins, outs).minify()
+ _javascript_Minify(ins, outs, **kwargs).minify()
return outs.getvalue()
@@ -67,9 +50,10 @@
to an output stream
"""
- def __init__(self, instream=None, outstream=None):
+ def __init__(self, instream=None, outstream=None, quote_chars="'\"`"):
self.ins = instream
self.outs = outstream
+ self.quote_chars = quote_chars
def minify(self, instream=None, outstream=None):
if instream and outstream:
@@ -81,85 +65,40 @@
def write(char):
# all of this is to support literal regular expressions.
# sigh
- if str(char) in 'return':
+ if char in 'return':
self.return_buf += char
self.is_return = self.return_buf == 'return'
+ else:
+ self.return_buf = ''
+ self.is_return = self.is_return and char < '!'
self.outs.write(char)
if self.is_return:
self.return_buf = ''
- def read(n):
- char = self.ins.read(n)
- if not isinstance(char, python_text_type):
- raise ValueError("ERROR: The script jsmin.py can only handle text input, but it received input of type %s" % type(char))
- return char
+ read = self.ins.read
space_strings = "abcdefghijklmnopqrstuvwxyz"\
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$\\"
- starters, enders = '{[(+-', '}])+-"\''
- newlinestart_strings = starters + space_strings
- newlineend_strings = enders + space_strings
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$\\"
+ self.space_strings = space_strings
+ starters, enders = '{[(+-', '}])+-/' + self.quote_chars
+ newlinestart_strings = starters + space_strings + self.quote_chars
+ newlineend_strings = enders + space_strings + self.quote_chars
+ self.newlinestart_strings = newlinestart_strings
+ self.newlineend_strings = newlineend_strings
+
do_newline = False
do_space = False
escape_slash_count = 0
- doing_single_comment = False
- previous_before_comment = ''
- doing_multi_comment = False
- in_re = False
in_quote = ''
quote_buf = []
- previous = read(1)
- if previous == '\\':
- escape_slash_count += 1
+ previous = ';'
+ previous_non_space = ';'
next1 = read(1)
- if previous == '/':
- if next1 == '/':
- doing_single_comment = True
- elif next1 == '*':
- doing_multi_comment = True
- previous = next1
- next1 = read(1)
- else:
- write(previous)
- elif not previous:
- return
- elif str(previous) >= "!":
- if str(previous) in "'\"":
- in_quote = previous
- write(previous)
- previous_non_space = previous
- else:
- previous_non_space = ' '
- if not next1:
- return
- while 1:
+ while next1:
next2 = read(1)
- if not next2:
- last = next1.strip()
- if not (doing_single_comment or doing_multi_comment)\
- and last not in ('', '/'):
- if in_quote:
- write(''.join(quote_buf))
- write(last)
- break
- if doing_multi_comment:
- if next1 == '*' and next2 == '/':
- doing_multi_comment = False
- next2 = read(1)
- elif doing_single_comment:
- if next1 in '\r\n':
- doing_single_comment = False
- while next2 in '\r\n':
- next2 = read(1)
- if not next2:
- break
- if previous_before_comment in ')}]':
- do_newline = True
- elif previous_before_comment in space_strings:
- write('\n')
- elif in_quote:
+ if in_quote:
quote_buf.append(next1)
if next1 == in_quote:
@@ -172,23 +111,12 @@
if numslashes % 2 == 0:
in_quote = ''
write(''.join(quote_buf))
- elif str(next1) in '\r\n':
- if previous_non_space in newlineend_strings \
- or previous_non_space > '~':
- while 1:
- if next2 < '!':
- next2 = read(1)
- if not next2:
- break
- else:
- if next2 in newlinestart_strings \
- or next2 > '~' or next2 == '/':
- do_newline = True
- break
- elif str(next1) < '!' and not in_re:
- if (previous_non_space in space_strings \
- or previous_non_space > '~') \
- and (next2 in space_strings or next2 > '~'):
+ elif next1 in '\r\n':
+ next2, do_newline = self.newline(
+ previous_non_space, next2, do_newline)
+ elif next1 < '!':
+ if (previous_non_space in space_strings or previous_non_space > '~') \
+ and (next2 in space_strings or next2 > '~'):
do_space = True
elif previous_non_space in '-+' and next2 == previous_non_space:
# protect against + ++ or - -- sequences
@@ -199,45 +127,128 @@
elif next1 == '/':
if do_space:
write(' ')
- if in_re:
- if previous != '\\' or (not escape_slash_count % 2) or next2 in 'gimy':
- in_re = False
- write('/')
- elif next2 == '/':
- doing_single_comment = True
- previous_before_comment = previous_non_space
+ if next2 == '/':
+ # Line comment: treat it as a newline, but skip it
+ next2 = self.line_comment(next1, next2)
+ next1 = '\n'
+ next2, do_newline = self.newline(
+ previous_non_space, next2, do_newline)
elif next2 == '*':
- doing_multi_comment = True
- previous = next1
- next1 = next2
+ self.block_comment(next1, next2)
next2 = read(1)
+ if previous_non_space in space_strings:
+ do_space = True
+ next1 = previous
else:
- in_re = previous_non_space in '(,=:[?!&|' or self.is_return # literal regular _expression_
- write('/')
+ if previous_non_space in '{(,=:[?!&|;' or self.is_return:
+ self.regex_literal(next1, next2)
+ # hackish: after regex literal next1 is still /
+ # (it was the initial /, now it's the last /)
+ next2 = read(1)
+ else:
+ write('/')
else:
+ if do_newline:
+ write('\n')
+ do_newline = False
+ do_space = False
if do_space:
do_space = False
write(' ')
- if do_newline:
- write('\n')
- do_newline = False
write(next1)
- if not in_re and str(next1) in "'\"`":
+ if next1 in self.quote_chars:
in_quote = next1
quote_buf = []
- previous = next1
- next1 = next2
+ if next1 >= '!':
+ previous_non_space = next1
- if str(previous) >= '!':
- previous_non_space = previous
-
- if previous == '\\':
+ if next1 == '\\':
escape_slash_count += 1
else:
escape_slash_count = 0
+ previous = next1
+ next1 = next2
+
+ def regex_literal(self, next1, next2):
+ assert next1 == '/' # otherwise we should not be called!
+
+ self.return_buf = ''
+
+ read = self.ins.read
+ write = self.outs.write
+
+ in_char_class = False
+
+ write('/')
+
+ next = next2
+ while next and (next != '/' or in_char_class):
+ write(next)
+ if next == '\\':
+ write(read(1)) # whatever is next is escaped
+ elif next == '[':
+ write(read(1)) # character class cannot be empty
+ in_char_class = True
+ elif next == ']':
+ in_char_class = False
+ next = read(1)
+
+ write('/')
+
+ def line_comment(self, next1, next2):
+ assert next1 == next2 == '/'
+
+ read = self.ins.read
+
+ while next1 and next1 not in '\r\n':
+ next1 = read(1)
+ while next1 and next1 in '\r\n':
+ next1 = read(1)
+
+ return next1
+
+ def block_comment(self, next1, next2):
+ assert next1 == '/'
+ assert next2 == '*'
+
+ read = self.ins.read
+
+ # Skip past first /* and avoid catching on /*/...*/
+ next1 = read(1)
+ next2 = read(1)
+
+ comment_buffer = '/*'
+ while next1 != '*' or next2 != '/':
+ comment_buffer += next1
+ next1 = next2
+ next2 = read(1)
+
+ if comment_buffer.startswith("/*!"):
+ # comment needs preserving
+ self.outs.write(comment_buffer)
+ self.outs.write("*/\n")
+
+ def newline(self, previous_non_space, next2, do_newline):
+ read = self.ins.read
+
+ if previous_non_space and (previous_non_space in self.newlineend_strings or previous_non_space > '~'):
+ while 1:
+ if next2 < '!':
+ next2 = read(1)
+ if not next2:
+ break
+ else:
+ if next2 in self.newlinestart_strings \
+ or next2 > '~' or next2 == '/':
+ do_newline = True
+ break
+
+ return next2, do_newline
+
+
if __name__ == '__main__':
minifier = _javascript_Minify(sys.stdin, sys.stdout)
minifier.minify()