Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
338dd144b8 | ||
|
|
c719552317 | ||
|
|
855964a87a | ||
|
|
a438e2fca9 | ||
|
|
00833e893a |
@@ -114,7 +114,7 @@ function Compressor(options, false_by_default) {
|
|||||||
};
|
};
|
||||||
} else if (Array.isArray(pure_funcs)) {
|
} else if (Array.isArray(pure_funcs)) {
|
||||||
this.pure_funcs = function(node) {
|
this.pure_funcs = function(node) {
|
||||||
return pure_funcs.indexOf(node.expression.print_to_string()) < 0;
|
return !member(node.expression.print_to_string(), pure_funcs);
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
this.pure_funcs = return_true;
|
this.pure_funcs = return_true;
|
||||||
@@ -131,7 +131,7 @@ function Compressor(options, false_by_default) {
|
|||||||
top_retain = top_retain.split(/,/);
|
top_retain = top_retain.split(/,/);
|
||||||
}
|
}
|
||||||
this.top_retain = function(def) {
|
this.top_retain = function(def) {
|
||||||
return top_retain.indexOf(def.name) >= 0;
|
return member(def.name, top_retain);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
var toplevel = this.options["toplevel"];
|
var toplevel = this.options["toplevel"];
|
||||||
@@ -312,8 +312,22 @@ merge(Compressor.prototype, {
|
|||||||
return value instanceof AST_SymbolRef && value.fixed_value() || value;
|
return value instanceof AST_SymbolRef && value.fixed_value() || value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function is_read_only_fn(value, name) {
|
||||||
|
if (value instanceof AST_Boolean) return native_fns.Boolean[name];
|
||||||
|
if (value instanceof AST_Number) return native_fns.Number[name];
|
||||||
|
if (value instanceof AST_String) return native_fns.String[name];
|
||||||
|
if (name == "valueOf") return false;
|
||||||
|
if (value instanceof AST_Array) return native_fns.Array[name];
|
||||||
|
if (value instanceof AST_Function) return native_fns.Function[name];
|
||||||
|
if (value instanceof AST_Object) return native_fns.Object[name];
|
||||||
|
if (value instanceof AST_RegExp) return native_fns.RegExp[name];
|
||||||
|
}
|
||||||
|
|
||||||
function is_modified(compressor, tw, node, value, level, immutable) {
|
function is_modified(compressor, tw, node, value, level, immutable) {
|
||||||
var parent = tw.parent(level);
|
var parent = tw.parent(level);
|
||||||
|
if (compressor.option("unsafe") && parent instanceof AST_Dot && is_read_only_fn(value, parent.property)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
var lhs = is_lhs(node, parent);
|
var lhs = is_lhs(node, parent);
|
||||||
if (lhs) return lhs;
|
if (lhs) return lhs;
|
||||||
if (!immutable
|
if (!immutable
|
||||||
@@ -344,7 +358,7 @@ merge(Compressor.prototype, {
|
|||||||
def.assignments = 0;
|
def.assignments = 0;
|
||||||
def.chained = false;
|
def.chained = false;
|
||||||
def.direct_access = false;
|
def.direct_access = false;
|
||||||
def.escaped = false;
|
def.escaped = [];
|
||||||
def.fixed = !def.scope.pinned()
|
def.fixed = !def.scope.pinned()
|
||||||
&& !compressor.exposed(def)
|
&& !compressor.exposed(def)
|
||||||
&& !(def.init instanceof AST_Function && def.init !== def.scope)
|
&& !(def.init instanceof AST_Function && def.init !== def.scope)
|
||||||
@@ -483,8 +497,9 @@ merge(Compressor.prototype, {
|
|||||||
|| parent instanceof AST_Call && (node !== parent.expression || parent instanceof AST_New)
|
|| parent instanceof AST_Call && (node !== parent.expression || parent instanceof AST_New)
|
||||||
|| parent instanceof AST_Exit && node === parent.value && node.scope !== d.scope
|
|| parent instanceof AST_Exit && node === parent.value && node.scope !== d.scope
|
||||||
|| parent instanceof AST_VarDef && node === parent.value) {
|
|| parent instanceof AST_VarDef && node === parent.value) {
|
||||||
|
d.escaped.push(parent);
|
||||||
if (depth > 1 && !(value && value.is_constant_expression(scope))) depth = 1;
|
if (depth > 1 && !(value && value.is_constant_expression(scope))) depth = 1;
|
||||||
if (!d.escaped || d.escaped > depth) d.escaped = depth;
|
if (!d.escaped.depth || d.escaped.depth > depth) d.escaped.depth = depth;
|
||||||
return;
|
return;
|
||||||
} else if (parent instanceof AST_Array
|
} else if (parent instanceof AST_Array
|
||||||
|| parent instanceof AST_Binary && lazy_op[parent.operator]
|
|| parent instanceof AST_Binary && lazy_op[parent.operator]
|
||||||
@@ -742,8 +757,8 @@ merge(Compressor.prototype, {
|
|||||||
d.fixed = false;
|
d.fixed = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
mark_escaped(tw, d, this.scope, this, value, 0, 1);
|
mark_escaped(tw, d, this.scope, this, value, 0, 1);
|
||||||
|
}
|
||||||
var parent;
|
var parent;
|
||||||
if (d.fixed instanceof AST_Defun
|
if (d.fixed instanceof AST_Defun
|
||||||
&& !((parent = tw.parent()) instanceof AST_Call && parent.expression === this)) {
|
&& !((parent = tw.parent()) instanceof AST_Call && parent.expression === this)) {
|
||||||
@@ -1579,9 +1594,14 @@ merge(Compressor.prototype, {
|
|||||||
lvalues[candidate.name.name] = lhs;
|
lvalues[candidate.name.name] = lhs;
|
||||||
}
|
}
|
||||||
var tw = new TreeWalker(function(node) {
|
var tw = new TreeWalker(function(node) {
|
||||||
var sym = root_expr(node);
|
var value;
|
||||||
if (sym instanceof AST_SymbolRef || sym instanceof AST_This) {
|
if (node instanceof AST_SymbolRef) {
|
||||||
lvalues[sym.name] = lvalues[sym.name] || is_modified(compressor, tw, node, node, 0);
|
value = node.fixed_value() || node;
|
||||||
|
} else if (node instanceof AST_This) {
|
||||||
|
value = node;
|
||||||
|
}
|
||||||
|
if (value && !lvalues[node.name]) {
|
||||||
|
lvalues[node.name] = is_modified(compressor, tw, node, value, 0);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
expr.walk(tw);
|
expr.walk(tw);
|
||||||
@@ -1691,7 +1711,7 @@ merge(Compressor.prototype, {
|
|||||||
CHANGED = true;
|
CHANGED = true;
|
||||||
statements.splice(i, 1);
|
statements.splice(i, 1);
|
||||||
} else if (stat instanceof AST_Directive) {
|
} else if (stat instanceof AST_Directive) {
|
||||||
if (seen_dirs.indexOf(stat.value) < 0) {
|
if (!member(stat.value, seen_dirs)) {
|
||||||
i++;
|
i++;
|
||||||
seen_dirs.push(stat.value);
|
seen_dirs.push(stat.value);
|
||||||
} else {
|
} else {
|
||||||
@@ -2833,7 +2853,7 @@ merge(Compressor.prototype, {
|
|||||||
var fixed = this.fixed_value();
|
var fixed = this.fixed_value();
|
||||||
if (!fixed) return this;
|
if (!fixed) return this;
|
||||||
var value;
|
var value;
|
||||||
if (cached.indexOf(fixed) >= 0) {
|
if (member(fixed, cached)) {
|
||||||
value = fixed._eval();
|
value = fixed._eval();
|
||||||
} else {
|
} else {
|
||||||
this._eval = return_this;
|
this._eval = return_this;
|
||||||
@@ -2847,9 +2867,25 @@ merge(Compressor.prototype, {
|
|||||||
}
|
}
|
||||||
if (value && typeof value == "object") {
|
if (value && typeof value == "object") {
|
||||||
var escaped = this.definition().escaped;
|
var escaped = this.definition().escaped;
|
||||||
if (escaped && depth > escaped) return this;
|
switch (escaped.length) {
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (contains_ref(escaped[0], this)) break;
|
||||||
|
default:
|
||||||
|
if (depth > escaped.depth) return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
|
|
||||||
|
function contains_ref(expr, ref) {
|
||||||
|
var found = false;
|
||||||
|
expr.walk(new TreeWalker(function(node) {
|
||||||
|
if (found) return true;
|
||||||
|
if (node === ref) return found = true;
|
||||||
|
}));
|
||||||
|
return found;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
var global_objs = {
|
var global_objs = {
|
||||||
Array: Array,
|
Array: Array,
|
||||||
@@ -3596,13 +3632,22 @@ merge(Compressor.prototype, {
|
|||||||
} else if (compressor.option("functions")
|
} else if (compressor.option("functions")
|
||||||
&& def.value === def.name.fixed_value()
|
&& def.value === def.name.fixed_value()
|
||||||
&& def.value instanceof AST_Function
|
&& def.value instanceof AST_Function
|
||||||
&& !def.value.name
|
&& can_rename(def.value, def.name.name)
|
||||||
&& !def.value.variables.get(def.name.name)
|
|
||||||
&& (!compressor.has_directive("use strict") || parent instanceof AST_Scope)) {
|
&& (!compressor.has_directive("use strict") || parent instanceof AST_Scope)) {
|
||||||
compressor.warn("Declaring {name} as function [{file}:{line},{col}]", template(def.name));
|
compressor.warn("Declaring {name} as function [{file}:{line},{col}]", template(def.name));
|
||||||
var defun = make_node(AST_Defun, def, def.value);
|
var defun = make_node(AST_Defun, def, def.value);
|
||||||
defun.name = make_node(AST_SymbolDefun, def.name, def.name);
|
defun.name = make_node(AST_SymbolDefun, def.name, def.name);
|
||||||
def.name.scope.resolve().def_function(defun.name);
|
var name_def = def.name.scope.resolve().def_function(defun.name);
|
||||||
|
if (def.value.name) {
|
||||||
|
var old_def = def.value.name.definition();
|
||||||
|
def.value.walk(new TreeWalker(function(node) {
|
||||||
|
if (node instanceof AST_SymbolRef && node.definition() === old_def) {
|
||||||
|
node.name = name_def.name;
|
||||||
|
node.thedef = name_def;
|
||||||
|
node.reference({});
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
body.push(defun);
|
body.push(defun);
|
||||||
} else {
|
} else {
|
||||||
if (side_effects.length > 0) {
|
if (side_effects.length > 0) {
|
||||||
@@ -3633,6 +3678,11 @@ merge(Compressor.prototype, {
|
|||||||
}
|
}
|
||||||
sym.eliminated++;
|
sym.eliminated++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function can_rename(fn, name) {
|
||||||
|
var def = fn.variables.get(name);
|
||||||
|
return !def || fn.name && def === fn.name.definition();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
if (head.length > 0 || tail.length > 0) {
|
if (head.length > 0 || tail.length > 0) {
|
||||||
node.definitions = head.concat(tail);
|
node.definitions = head.concat(tail);
|
||||||
@@ -3658,6 +3708,7 @@ merge(Compressor.prototype, {
|
|||||||
// https://github.com/mishoo/UglifyJS2/issues/44
|
// https://github.com/mishoo/UglifyJS2/issues/44
|
||||||
// https://github.com/mishoo/UglifyJS2/issues/1830
|
// https://github.com/mishoo/UglifyJS2/issues/1830
|
||||||
// https://github.com/mishoo/UglifyJS2/issues/1838
|
// https://github.com/mishoo/UglifyJS2/issues/1838
|
||||||
|
// https://github.com/mishoo/UglifyJS2/issues/3371
|
||||||
// that's an invalid AST.
|
// that's an invalid AST.
|
||||||
// We fix it at this stage by moving the `var` outside the `for`.
|
// We fix it at this stage by moving the `var` outside the `for`.
|
||||||
if (node instanceof AST_For) {
|
if (node instanceof AST_For) {
|
||||||
@@ -3668,7 +3719,15 @@ merge(Compressor.prototype, {
|
|||||||
node.init = block.body.pop();
|
node.init = block.body.pop();
|
||||||
block.body.push(node);
|
block.body.push(node);
|
||||||
}
|
}
|
||||||
if (node.init instanceof AST_SimpleStatement) {
|
if (node.init instanceof AST_Defun) {
|
||||||
|
if (!block) {
|
||||||
|
block = make_node(AST_BlockStatement, node, {
|
||||||
|
body: [ node ]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
block.body.splice(-1, 0, node.init);
|
||||||
|
node.init = null;
|
||||||
|
} else if (node.init instanceof AST_SimpleStatement) {
|
||||||
node.init = node.init.body;
|
node.init = node.init.body;
|
||||||
} else if (is_empty(node.init)) {
|
} else if (is_empty(node.init)) {
|
||||||
node.init = null;
|
node.init = null;
|
||||||
@@ -3974,7 +4033,7 @@ merge(Compressor.prototype, {
|
|||||||
var def = sym.definition();
|
var def = sym.definition();
|
||||||
if (def.assignments != count) return;
|
if (def.assignments != count) return;
|
||||||
if (def.direct_access) return;
|
if (def.direct_access) return;
|
||||||
if (def.escaped == 1) return;
|
if (def.escaped.depth == 1) return;
|
||||||
if (def.references.length == count) return;
|
if (def.references.length == count) return;
|
||||||
if (def.single_use) return;
|
if (def.single_use) return;
|
||||||
if (top_retain(def)) return;
|
if (top_retain(def)) return;
|
||||||
@@ -5854,7 +5913,7 @@ merge(Compressor.prototype, {
|
|||||||
var single_use = def.single_use && !(parent instanceof AST_Call && parent.is_expr_pure(compressor));
|
var single_use = def.single_use && !(parent instanceof AST_Call && parent.is_expr_pure(compressor));
|
||||||
if (single_use && fixed instanceof AST_Lambda) {
|
if (single_use && fixed instanceof AST_Lambda) {
|
||||||
if (def.scope !== self.scope
|
if (def.scope !== self.scope
|
||||||
&& (!compressor.option("reduce_funcs") || def.escaped == 1 || fixed.inlined)) {
|
&& (!compressor.option("reduce_funcs") || def.escaped.depth == 1 || fixed.inlined)) {
|
||||||
single_use = false;
|
single_use = false;
|
||||||
} else if (recursive_ref(compressor, def)) {
|
} else if (recursive_ref(compressor, def)) {
|
||||||
single_use = false;
|
single_use = false;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
|
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
|
||||||
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
||||||
"license": "BSD-2-Clause",
|
"license": "BSD-2-Clause",
|
||||||
"version": "3.5.5",
|
"version": "3.5.6",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.0"
|
"node": ">=0.8.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1687,3 +1687,28 @@ try_increment: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "1"
|
expect_stdout: "1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe_escaped: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 3,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
console.log(function(index) {
|
||||||
|
return a[index];
|
||||||
|
}(function(term) {
|
||||||
|
return a.indexOf(term);
|
||||||
|
}("PASS")));
|
||||||
|
})([ "PASS" ]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -2712,8 +2712,8 @@ functions: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
!function() {
|
!function() {
|
||||||
var a = function() {
|
var a = function a() {
|
||||||
return "a";
|
return a && "a";
|
||||||
};
|
};
|
||||||
var b = function x() {
|
var b = function x() {
|
||||||
return !!x;
|
return !!x;
|
||||||
@@ -2736,19 +2736,19 @@ functions: {
|
|||||||
expect: {
|
expect: {
|
||||||
!function() {
|
!function() {
|
||||||
function a() {
|
function a() {
|
||||||
return "a";
|
return a && "a";
|
||||||
|
}
|
||||||
|
function b() {
|
||||||
|
return !!b;
|
||||||
}
|
}
|
||||||
var b = function x() {
|
|
||||||
return !!x;
|
|
||||||
};
|
|
||||||
var c = function(c) {
|
var c = function(c) {
|
||||||
return c;
|
return c;
|
||||||
};
|
};
|
||||||
if (c(b(a()))) {
|
if (c(b(a()))) {
|
||||||
function d() {}
|
function d() {}
|
||||||
var e = function y() {
|
function e() {
|
||||||
return typeof y;
|
return typeof e;
|
||||||
};
|
}
|
||||||
var f = function(f) {
|
var f = function(f) {
|
||||||
return f;
|
return f;
|
||||||
};
|
};
|
||||||
@@ -2768,8 +2768,8 @@ functions_use_strict: {
|
|||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
!function() {
|
!function() {
|
||||||
var a = function() {
|
var a = function a() {
|
||||||
return "a";
|
return a && "a";
|
||||||
};
|
};
|
||||||
var b = function x() {
|
var b = function x() {
|
||||||
return !!x;
|
return !!x;
|
||||||
@@ -2793,11 +2793,11 @@ functions_use_strict: {
|
|||||||
"use strict";
|
"use strict";
|
||||||
!function() {
|
!function() {
|
||||||
function a() {
|
function a() {
|
||||||
return "a";
|
return a && "a";
|
||||||
|
}
|
||||||
|
function b() {
|
||||||
|
return !!b;
|
||||||
}
|
}
|
||||||
var b = function x() {
|
|
||||||
return !!x;
|
|
||||||
};
|
|
||||||
var c = function(c) {
|
var c = function(c) {
|
||||||
return c;
|
return c;
|
||||||
};
|
};
|
||||||
@@ -3012,3 +3012,32 @@ issue_3366: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3371: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var a = function f() {
|
||||||
|
(function() {
|
||||||
|
console.log(typeof f);
|
||||||
|
})();
|
||||||
|
};
|
||||||
|
while (a());
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
function a() {
|
||||||
|
console.log(typeof a);
|
||||||
|
}
|
||||||
|
while (a());
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
}
|
||||||
|
|||||||
@@ -646,3 +646,30 @@ issue_2904: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "1"
|
expect_stdout: "1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3371: {
|
||||||
|
options = {
|
||||||
|
functions: true,
|
||||||
|
join_vars: true,
|
||||||
|
loops: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var a = function() {
|
||||||
|
console.log("PASS");
|
||||||
|
};
|
||||||
|
while (a());
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
function a() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
for (; a(); );
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -281,8 +281,8 @@ unsafe_evaluate_escaped: {
|
|||||||
console.log(function(){ var o={p:3},a=[o]; console.log(a[0].p++); return o.p; }());
|
console.log(function(){ var o={p:3},a=[o]; console.log(a[0].p++); return o.p; }());
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(function(){ var o={p:1}; console.log(o, o.p); return o.p; }());
|
console.log(function(){ var o={p:1}; console.log(o, 1); return o.p; }());
|
||||||
console.log(function(){ var o={p:2}; console.log(o.p, o); return o.p; }());
|
console.log(function(){ var o={p:2}; console.log(2, o); return o.p; }());
|
||||||
console.log(function(){ var o={p:3},a=[o]; console.log(a[0].p++); return o.p; }());
|
console.log(function(){ var o={p:3},a=[o]; console.log(a[0].p++); return o.p; }());
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
|
|||||||
1240
tools/domprops.json
1240
tools/domprops.json
File diff suppressed because it is too large
Load Diff
585
tools/props.html
585
tools/props.html
@@ -1,61 +1,540 @@
|
|||||||
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<body>
|
||||||
</head>
|
<script>
|
||||||
<body>
|
!function() {
|
||||||
<script>(function(){
|
var names = [];
|
||||||
var props = {};
|
var scanned = [];
|
||||||
|
var to_scan = [];
|
||||||
|
|
||||||
function addObject(obj) {
|
function scan(obj) {
|
||||||
if (obj == null) return;
|
if (obj && typeof obj == "object" && !~scanned.indexOf(obj)) {
|
||||||
|
scanned.push(obj);
|
||||||
|
to_scan.push(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
scan(self);
|
||||||
|
[
|
||||||
|
"a",
|
||||||
|
"abbr",
|
||||||
|
"acronym",
|
||||||
|
"address",
|
||||||
|
"applet",
|
||||||
|
"area",
|
||||||
|
"article",
|
||||||
|
"aside",
|
||||||
|
"audio",
|
||||||
|
"b",
|
||||||
|
"base",
|
||||||
|
"basefont",
|
||||||
|
"bdi",
|
||||||
|
"bdo",
|
||||||
|
"bgsound",
|
||||||
|
"big",
|
||||||
|
"blink",
|
||||||
|
"blockquote",
|
||||||
|
"body",
|
||||||
|
"br",
|
||||||
|
"button",
|
||||||
|
"canvas",
|
||||||
|
"caption",
|
||||||
|
"center",
|
||||||
|
"checked",
|
||||||
|
"cite",
|
||||||
|
"code",
|
||||||
|
"col",
|
||||||
|
"colgroup",
|
||||||
|
"command",
|
||||||
|
"comment",
|
||||||
|
"compact",
|
||||||
|
"content",
|
||||||
|
"data",
|
||||||
|
"datalist",
|
||||||
|
"dd",
|
||||||
|
"declare",
|
||||||
|
"defer",
|
||||||
|
"del",
|
||||||
|
"details",
|
||||||
|
"dfn",
|
||||||
|
"dialog",
|
||||||
|
"dir",
|
||||||
|
"disabled",
|
||||||
|
"div",
|
||||||
|
"dl",
|
||||||
|
"dt",
|
||||||
|
"element",
|
||||||
|
"em",
|
||||||
|
"embed",
|
||||||
|
"fieldset",
|
||||||
|
"figcaption",
|
||||||
|
"figure",
|
||||||
|
"font",
|
||||||
|
"footer",
|
||||||
|
"form",
|
||||||
|
"frame",
|
||||||
|
"frameset",
|
||||||
|
"h1",
|
||||||
|
"h2",
|
||||||
|
"h3",
|
||||||
|
"h4",
|
||||||
|
"h5",
|
||||||
|
"h6",
|
||||||
|
"head",
|
||||||
|
"header",
|
||||||
|
"hgroup",
|
||||||
|
"hr",
|
||||||
|
"html",
|
||||||
|
"i",
|
||||||
|
"iframe",
|
||||||
|
"image",
|
||||||
|
"img",
|
||||||
|
"input",
|
||||||
|
"ins",
|
||||||
|
"isindex",
|
||||||
|
"ismap",
|
||||||
|
"kbd",
|
||||||
|
"keygen",
|
||||||
|
"label",
|
||||||
|
"legend",
|
||||||
|
"li",
|
||||||
|
"link",
|
||||||
|
"listing",
|
||||||
|
"main",
|
||||||
|
"map",
|
||||||
|
"mark",
|
||||||
|
"marquee",
|
||||||
|
"math",
|
||||||
|
"menu",
|
||||||
|
"menuitem",
|
||||||
|
"meta",
|
||||||
|
"meter",
|
||||||
|
"multicol",
|
||||||
|
"multiple",
|
||||||
|
"nav",
|
||||||
|
"nobr",
|
||||||
|
"noembed",
|
||||||
|
"noframes",
|
||||||
|
"nohref",
|
||||||
|
"noresize",
|
||||||
|
"noscript",
|
||||||
|
"noshade",
|
||||||
|
"nowrap",
|
||||||
|
"object",
|
||||||
|
"ol",
|
||||||
|
"optgroup",
|
||||||
|
"option",
|
||||||
|
"output",
|
||||||
|
"p",
|
||||||
|
"param",
|
||||||
|
"picture",
|
||||||
|
"plaintext",
|
||||||
|
"pre",
|
||||||
|
"progress",
|
||||||
|
"q",
|
||||||
|
"rb",
|
||||||
|
"readonly",
|
||||||
|
"rp",
|
||||||
|
"rt",
|
||||||
|
"rtc",
|
||||||
|
"ruby",
|
||||||
|
"s",
|
||||||
|
"samp",
|
||||||
|
"script",
|
||||||
|
"section",
|
||||||
|
"select",
|
||||||
|
"selected",
|
||||||
|
"shadow",
|
||||||
|
"small",
|
||||||
|
"source",
|
||||||
|
"spacer",
|
||||||
|
"span",
|
||||||
|
"strike",
|
||||||
|
"strong",
|
||||||
|
"style",
|
||||||
|
"sub",
|
||||||
|
"summary",
|
||||||
|
"sup",
|
||||||
|
"svg",
|
||||||
|
"table",
|
||||||
|
"tbody",
|
||||||
|
"td",
|
||||||
|
"template",
|
||||||
|
"textarea",
|
||||||
|
"tfoot",
|
||||||
|
"th",
|
||||||
|
"thead",
|
||||||
|
"time",
|
||||||
|
"title",
|
||||||
|
"tr",
|
||||||
|
"track",
|
||||||
|
"tt",
|
||||||
|
"u",
|
||||||
|
"ul",
|
||||||
|
"var",
|
||||||
|
"video",
|
||||||
|
"wbr",
|
||||||
|
"xmp",
|
||||||
|
"XXX",
|
||||||
|
].forEach(function(tag) {
|
||||||
|
scan(document.createElement(tag));
|
||||||
|
});
|
||||||
|
[
|
||||||
|
"abort",
|
||||||
|
"absolutedeviceorientation",
|
||||||
|
"activate",
|
||||||
|
"active",
|
||||||
|
"addsourcebuffer",
|
||||||
|
"addstream",
|
||||||
|
"addtrack",
|
||||||
|
"afterprint",
|
||||||
|
"afterscriptexecute",
|
||||||
|
"afterupdate",
|
||||||
|
"animationcancel",
|
||||||
|
"animationend",
|
||||||
|
"animationiteration",
|
||||||
|
"animationstart",
|
||||||
|
"appinstalled",
|
||||||
|
"audioend",
|
||||||
|
"audioprocess",
|
||||||
|
"audiostart",
|
||||||
|
"autocomplete",
|
||||||
|
"autocompleteerror",
|
||||||
|
"auxclick",
|
||||||
|
"beforeactivate",
|
||||||
|
"beforecopy",
|
||||||
|
"beforecut",
|
||||||
|
"beforedeactivate",
|
||||||
|
"beforeeditfocus",
|
||||||
|
"beforeinstallprompt",
|
||||||
|
"beforepaste",
|
||||||
|
"beforeprint",
|
||||||
|
"beforescriptexecute",
|
||||||
|
"beforeunload",
|
||||||
|
"beforeupdate",
|
||||||
|
"blocked",
|
||||||
|
"blur",
|
||||||
|
"bounce",
|
||||||
|
"boundary",
|
||||||
|
"cached",
|
||||||
|
"cancel",
|
||||||
|
"candidatewindowhide",
|
||||||
|
"candidatewindowshow",
|
||||||
|
"candidatewindowupdate",
|
||||||
|
"canplay",
|
||||||
|
"canplaythrough",
|
||||||
|
"cellchange",
|
||||||
|
"change",
|
||||||
|
"chargingchange",
|
||||||
|
"chargingtimechange",
|
||||||
|
"checking",
|
||||||
|
"click",
|
||||||
|
"close",
|
||||||
|
"compassneedscalibration",
|
||||||
|
"complete",
|
||||||
|
"connect",
|
||||||
|
"connecting",
|
||||||
|
"connectionstatechange",
|
||||||
|
"contextmenu",
|
||||||
|
"controllerchange",
|
||||||
|
"controlselect",
|
||||||
|
"copy",
|
||||||
|
"cuechange",
|
||||||
|
"cut",
|
||||||
|
"dataavailable",
|
||||||
|
"datachannel",
|
||||||
|
"datasetchanged",
|
||||||
|
"datasetcomplete",
|
||||||
|
"dblclick",
|
||||||
|
"deactivate",
|
||||||
|
"devicechange",
|
||||||
|
"devicelight",
|
||||||
|
"devicemotion",
|
||||||
|
"deviceorientation",
|
||||||
|
"deviceorientationabsolute",
|
||||||
|
"deviceproximity",
|
||||||
|
"dischargingtimechange",
|
||||||
|
"disconnect",
|
||||||
|
"display",
|
||||||
|
"downloading",
|
||||||
|
"drag",
|
||||||
|
"dragend",
|
||||||
|
"dragenter",
|
||||||
|
"dragexit",
|
||||||
|
"dragleave",
|
||||||
|
"dragover",
|
||||||
|
"dragstart",
|
||||||
|
"drop",
|
||||||
|
"durationchange",
|
||||||
|
"emptied",
|
||||||
|
"encrypted",
|
||||||
|
"end",
|
||||||
|
"ended",
|
||||||
|
"enter",
|
||||||
|
"enterpictureinpicture",
|
||||||
|
"error",
|
||||||
|
"errorupdate",
|
||||||
|
"exit",
|
||||||
|
"filterchange",
|
||||||
|
"finish",
|
||||||
|
"focus",
|
||||||
|
"focusin",
|
||||||
|
"focusout",
|
||||||
|
"freeze",
|
||||||
|
"fullscreenchange",
|
||||||
|
"fullscreenerror",
|
||||||
|
"gesturechange",
|
||||||
|
"gestureend",
|
||||||
|
"gesturestart",
|
||||||
|
"gotpointercapture",
|
||||||
|
"hashchange",
|
||||||
|
"help",
|
||||||
|
"icecandidate",
|
||||||
|
"iceconnectionstatechange",
|
||||||
|
"icegatheringstatechange",
|
||||||
|
"inactive",
|
||||||
|
"input",
|
||||||
|
"invalid",
|
||||||
|
"keydown",
|
||||||
|
"keypress",
|
||||||
|
"keyup",
|
||||||
|
"languagechange",
|
||||||
|
"layoutcomplete",
|
||||||
|
"leavepictureinpicture",
|
||||||
|
"levelchange",
|
||||||
|
"load",
|
||||||
|
"loadeddata",
|
||||||
|
"loadedmetadata",
|
||||||
|
"loadend",
|
||||||
|
"loading",
|
||||||
|
"loadingdone",
|
||||||
|
"loadingerror",
|
||||||
|
"loadstart",
|
||||||
|
"losecapture",
|
||||||
|
"lostpointercapture",
|
||||||
|
"mark",
|
||||||
|
"message",
|
||||||
|
"messageerror",
|
||||||
|
"mousedown",
|
||||||
|
"mouseenter",
|
||||||
|
"mouseleave",
|
||||||
|
"mousemove",
|
||||||
|
"mouseout",
|
||||||
|
"mouseover",
|
||||||
|
"mouseup",
|
||||||
|
"mousewheel",
|
||||||
|
"move",
|
||||||
|
"moveend",
|
||||||
|
"movestart",
|
||||||
|
"mozfullscreenchange",
|
||||||
|
"mozfullscreenerror",
|
||||||
|
"mozorientationchange",
|
||||||
|
"mozpointerlockchange",
|
||||||
|
"mozpointerlockerror",
|
||||||
|
"mscontentzoom",
|
||||||
|
"msfullscreenchange",
|
||||||
|
"msfullscreenerror",
|
||||||
|
"msgesturechange",
|
||||||
|
"msgesturedoubletap",
|
||||||
|
"msgestureend",
|
||||||
|
"msgesturehold",
|
||||||
|
"msgesturestart",
|
||||||
|
"msgesturetap",
|
||||||
|
"msgotpointercapture",
|
||||||
|
"msinertiastart",
|
||||||
|
"mslostpointercapture",
|
||||||
|
"msmanipulationstatechanged",
|
||||||
|
"msneedkey",
|
||||||
|
"msorientationchange",
|
||||||
|
"mspointercancel",
|
||||||
|
"mspointerdown",
|
||||||
|
"mspointerenter",
|
||||||
|
"mspointerhover",
|
||||||
|
"mspointerleave",
|
||||||
|
"mspointermove",
|
||||||
|
"mspointerout",
|
||||||
|
"mspointerover",
|
||||||
|
"mspointerup",
|
||||||
|
"mssitemodejumplistitemremoved",
|
||||||
|
"msthumbnailclick",
|
||||||
|
"negotiationneeded",
|
||||||
|
"nomatch",
|
||||||
|
"noupdate",
|
||||||
|
"obsolete",
|
||||||
|
"offline",
|
||||||
|
"online",
|
||||||
|
"open",
|
||||||
|
"orientationchange",
|
||||||
|
"pagechange",
|
||||||
|
"pagehide",
|
||||||
|
"pageshow",
|
||||||
|
"paste",
|
||||||
|
"pause",
|
||||||
|
"play",
|
||||||
|
"playing",
|
||||||
|
"pluginstreamstart",
|
||||||
|
"pointercancel",
|
||||||
|
"pointerdown",
|
||||||
|
"pointerenter",
|
||||||
|
"pointerleave",
|
||||||
|
"pointerlockchange",
|
||||||
|
"pointerlockerror",
|
||||||
|
"pointermove",
|
||||||
|
"pointerout",
|
||||||
|
"pointerover",
|
||||||
|
"pointerup",
|
||||||
|
"popstate",
|
||||||
|
"progress",
|
||||||
|
"propertychange",
|
||||||
|
"ratechange",
|
||||||
|
"reading",
|
||||||
|
"readystatechange",
|
||||||
|
"rejectionhandled",
|
||||||
|
"removesourcebuffer",
|
||||||
|
"removestream",
|
||||||
|
"removetrack",
|
||||||
|
"reset",
|
||||||
|
"resize",
|
||||||
|
"resizeend",
|
||||||
|
"resizestart",
|
||||||
|
"resourcetimingbufferfull",
|
||||||
|
"result",
|
||||||
|
"resume",
|
||||||
|
"rowenter",
|
||||||
|
"rowexit",
|
||||||
|
"rowsdelete",
|
||||||
|
"rowsinserted",
|
||||||
|
"scroll",
|
||||||
|
"search",
|
||||||
|
"seeked",
|
||||||
|
"seeking",
|
||||||
|
"select",
|
||||||
|
"selectionchange",
|
||||||
|
"selectstart",
|
||||||
|
"show",
|
||||||
|
"signalingstatechange",
|
||||||
|
"soundend",
|
||||||
|
"soundstart",
|
||||||
|
"sourceclose",
|
||||||
|
"sourceclosed",
|
||||||
|
"sourceended",
|
||||||
|
"sourceopen",
|
||||||
|
"speechend",
|
||||||
|
"speechstart",
|
||||||
|
"stalled",
|
||||||
|
"start",
|
||||||
|
"statechange",
|
||||||
|
"stop",
|
||||||
|
"storage",
|
||||||
|
"storagecommit",
|
||||||
|
"submit",
|
||||||
|
"success",
|
||||||
|
"suspend",
|
||||||
|
"textinput",
|
||||||
|
"timeout",
|
||||||
|
"timeupdate",
|
||||||
|
"toggle",
|
||||||
|
"touchcancel",
|
||||||
|
"touchend",
|
||||||
|
"touchmove",
|
||||||
|
"touchstart",
|
||||||
|
"track",
|
||||||
|
"transitioncancel",
|
||||||
|
"transitionend",
|
||||||
|
"transitionrun",
|
||||||
|
"transitionstart",
|
||||||
|
"unhandledrejection",
|
||||||
|
"unload",
|
||||||
|
"updateready",
|
||||||
|
"upgradeneeded",
|
||||||
|
"userproximity",
|
||||||
|
"versionchange",
|
||||||
|
"visibilitychange",
|
||||||
|
"voiceschanged",
|
||||||
|
"volumechange",
|
||||||
|
"vrdisplayactivate",
|
||||||
|
"vrdisplayconnect",
|
||||||
|
"vrdisplaydeactivate",
|
||||||
|
"vrdisplaydisconnect",
|
||||||
|
"vrdisplaypresentchange",
|
||||||
|
"waiting",
|
||||||
|
"waitingforkey",
|
||||||
|
"warning",
|
||||||
|
"webkitanimationend",
|
||||||
|
"webkitanimationiteration",
|
||||||
|
"webkitanimationstart",
|
||||||
|
"webkitcurrentplaybacktargetiswirelesschanged",
|
||||||
|
"webkitfullscreenchange",
|
||||||
|
"webkitfullscreenerror",
|
||||||
|
"webkitkeyadded",
|
||||||
|
"webkitkeyerror",
|
||||||
|
"webkitkeymessage",
|
||||||
|
"webkitneedkey",
|
||||||
|
"webkitorientationchange",
|
||||||
|
"webkitplaybacktargetavailabilitychanged",
|
||||||
|
"webkitpointerlockchange",
|
||||||
|
"webkitpointerlockerror",
|
||||||
|
"webkitresourcetimingbufferfull",
|
||||||
|
"webkittransitionend",
|
||||||
|
"wheel",
|
||||||
|
"zoom",
|
||||||
|
].forEach(function(type) {
|
||||||
|
[
|
||||||
|
"beforeunloadevent",
|
||||||
|
"compositionevent",
|
||||||
|
"customevent",
|
||||||
|
"devicemotionevent",
|
||||||
|
"deviceorientationevent",
|
||||||
|
"dragevent",
|
||||||
|
"event",
|
||||||
|
"events",
|
||||||
|
"focusevent",
|
||||||
|
"hashchangeevent",
|
||||||
|
"htmlevents",
|
||||||
|
"keyboardevent",
|
||||||
|
"messageevent",
|
||||||
|
"mouseevent",
|
||||||
|
"mouseevents",
|
||||||
|
"storageevent",
|
||||||
|
"svgevents",
|
||||||
|
"textevent",
|
||||||
|
"touchevent",
|
||||||
|
"uievent",
|
||||||
|
"uievents",
|
||||||
|
].forEach(function(interface) {
|
||||||
try {
|
try {
|
||||||
Object.getOwnPropertyNames(obj).forEach(add);
|
var event = document.createEvent(interface);
|
||||||
} catch(ex) {}
|
event.initEvent(type, true, true);
|
||||||
if (obj.prototype) {
|
scan(event);
|
||||||
Object.getOwnPropertyNames(obj.prototype).forEach(add);
|
} catch (e) {}
|
||||||
}
|
});
|
||||||
if (typeof obj == "function") {
|
|
||||||
try {
|
|
||||||
Object.getOwnPropertyNames(new obj).forEach(add);
|
|
||||||
} catch(ex) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function add(name) {
|
|
||||||
props[name] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Object.getOwnPropertyNames(window).forEach(function(thing){
|
|
||||||
addObject(window[thing]);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var obj;
|
||||||
|
while (obj = to_scan.shift()) {
|
||||||
|
var proto = obj;
|
||||||
|
do {
|
||||||
|
Object.getOwnPropertyNames(proto).forEach(function(name) {
|
||||||
|
var visited = ~names.indexOf(name);
|
||||||
|
if (!visited) names.push(name);
|
||||||
try {
|
try {
|
||||||
addObject(new Event("click"));
|
scan(obj[name]);
|
||||||
addObject(new Event("contextmenu"));
|
if (visited) return;
|
||||||
addObject(new Event("mouseup"));
|
if (/^create/.test(name)) {
|
||||||
addObject(new Event("mousedown"));
|
scan(obj[name]());
|
||||||
addObject(new Event("keydown"));
|
|
||||||
addObject(new Event("keypress"));
|
|
||||||
addObject(new Event("keyup"));
|
|
||||||
} catch(ex) {}
|
|
||||||
|
|
||||||
var ta = document.createElement("textarea");
|
|
||||||
ta.style.width = "100%";
|
|
||||||
ta.style.height = "20em";
|
|
||||||
ta.style.boxSizing = "border-box";
|
|
||||||
<!-- ta.value = Object.keys(props).sort(cmp).map(function(name){ -->
|
|
||||||
<!-- return JSON.stringify(name); -->
|
|
||||||
<!-- }).join(",\n"); -->
|
|
||||||
ta.value = JSON.stringify({
|
|
||||||
vars: [],
|
|
||||||
props: Object.keys(props).sort(cmp)
|
|
||||||
}, null, 2);
|
|
||||||
document.body.appendChild(ta);
|
|
||||||
|
|
||||||
function cmp(a, b) {
|
|
||||||
a = a.toLowerCase();
|
|
||||||
b = b.toLowerCase();
|
|
||||||
return a < b ? -1 : a > b ? 1 : 0;
|
|
||||||
}
|
}
|
||||||
})();</script>
|
if (/^[A-Z]/.test(name)) {
|
||||||
</body>
|
scan(new obj[name]());
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
});
|
||||||
|
} while (proto = Object.getPrototypeOf(proto));
|
||||||
|
}
|
||||||
|
names.sort();
|
||||||
|
document.write('<pre>[\n "');
|
||||||
|
document.write(names.join('",\n "'));
|
||||||
|
document.write('"\n]</pre>');
|
||||||
|
}();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Reference in New Issue
Block a user