Skip to content

Commit 1aa1cc8

Browse files
author
devel01
committed
commit
1 parent 197cee4 commit 1aa1cc8

File tree

10 files changed

+2667
-0
lines changed

10 files changed

+2667
-0
lines changed

.gitignore

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
**/.vs
2+
*.o
3+
*.obj
4+
*.gch
5+
*.pch
6+
.idea
7+
**/.idea
8+
**/.vscode
9+
**/.vs
10+
**/*.cbp
11+
**/cmake-build-release
12+
**/cmake-build-debug
13+
**/CMakeCache.txt

commit.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
git add --all
2+
git commit -m "commit"
3+
git push origin master

readme.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#Trash Script
2+
3+
A very tiny JS-like script interpreter implemented throw JS.
4+
5+
Less than 10KB (gziped)
6+
7+
The primary purpose of TrashScript is to execute scripts in environments where ```eval``` and ```new Function``` are restricted, such as in browser extensions.
8+
9+
TrashScript was originally designed for modules in the
10+
"[filecxx browser extension](https://github.com/filecxx/FileCentipede)" such as "Third-Party Query Interfaces," which can run custom scripts.
11+
12+
While not all JavaScript syntax has been implemented, the majority of commonly used syntax is available.
13+
14+
###Keywords: How to allow eval in chrome extension
15+
16+
17+
##Usage examples:
18+
19+
###Config
20+
```
21+
TrashScript.config = {
22+
max_exec_limit:1000000 //default
23+
}
24+
```
25+
26+
###Basic
27+
```
28+
var executor = TrashScript("Source code",function(e)
29+
{
30+
if(e.status === "error"){
31+
console.log(e);
32+
}else if(e.status === "complete"){
33+
console.log(e.result);
34+
}
35+
});
36+
executor.exec();
37+
```
38+
39+
###Bind existing JavaScript functions or objects
40+
```
41+
TrashScript.bind("alert",function(arg){
42+
window.alert(arg);
43+
});
44+
```
45+
```
46+
TrashScript.bind({
47+
console:console,
48+
test:function(){},
49+
print:console.log,
50+
alert:alert,
51+
JSON:JSON
52+
});
53+
```
54+
55+
###Context object for 'this'
56+
```
57+
var executor = TrashScript("function aaa(){alert(this)};return aaa()",function(e){...});
58+
executor.exec(window); //'this' is window
59+
```
60+
```
61+
var executor = TrashScript("function aaa(){alert(this)};return aaa()",function(e){...});
62+
executor.exec({}); //'this' is an empty object
63+
```

test/test.css

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
2+
.Button {
3+
font-size: 13px;
4+
display: inline-block;
5+
padding: 6px 12px 6px 12px;
6+
text-decoration: none;
7+
color: #393d3f;
8+
border: 1px solid #bcbebf;
9+
border-right-color: #a3a5a6;
10+
border-bottom-color: #a3a5a6;
11+
background: #E0DDDA;
12+
background: linear-gradient(to bottom,#eff0f1 0%,#e3e4e5 100%);
13+
box-shadow: 1px 1px 1px rgba(184,181,179,0.7),0 0 1px #E1DEDB inset;
14+
border-radius: 2px;
15+
cursor: pointer;
16+
user-select: none;
17+
}
18+
.Button:hover {
19+
border-color: #909293;
20+
background: #DAD7D4;
21+
background: linear-gradient(to bottom,#eaebec 0%,#e0e1e2 100%)
22+
}
23+
.Button:active {
24+
transition: none;
25+
border-color: #979592;
26+
box-shadow: 1px 1px 1px rgba(184,181,179,0.7),0 2px 5px #bec0c1 inset;
27+
background: #d8dadb
28+
}
29+
.Button._disabled{
30+
color: #989593;
31+
background: #d7d9da;
32+
box-shadow: 1px 1px 1px rgba(184,181,179,0.7),0 0 1px #E1DEDB inset;
33+
border-color: #C3BDB9;
34+
cursor: progress;
35+
}

test/test.html

Lines changed: 260 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,260 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>TrashScript Test</title>
6+
<link rel="stylesheet" href="test.css">
7+
<script src="../trashscript.js"></script>
8+
<style>
9+
body{
10+
background: #eff0f1;
11+
}
12+
13+
body > .example{
14+
display: flex;
15+
width: 100%;
16+
}
17+
pre{
18+
width: 50%;
19+
box-sizing: border-box;
20+
background: white;
21+
border: 1px solid #bcbebf;
22+
}
23+
.result{
24+
box-sizing: border-box;
25+
width: 50%;
26+
padding: 20px;
27+
}
28+
29+
</style>
30+
</head>
31+
<body>
32+
33+
<div class="example">
34+
<pre><code>
35+
a = null
36+
b = a ? true: false
37+
return a + "\n\"" + 0xff + " " + b
38+
</code></pre>
39+
<div class="result">123213</div>
40+
</div>
41+
<div class="Button">Run</div>
42+
43+
44+
<div class="example">
45+
<pre><code>
46+
a = [1,2,[3,4]]
47+
alert(a[2][1])
48+
return a
49+
</code></pre>
50+
<div class="result"></div>
51+
</div>
52+
<div class="Button">Run</div>
53+
54+
55+
<div class="example">
56+
<pre><code>
57+
n = 1;
58+
a = [1,2 + 2 * 3,-+-+n, !!n]
59+
b = function(a){
60+
return a
61+
}
62+
c = function(a){
63+
return a
64+
}(" 44")
65+
66+
d = (function(a){
67+
return a
68+
})(" 55")
69+
70+
e = (function(a){
71+
return a
72+
})
73+
return a + ":" + b(33) + c + d + e(" 77");
74+
</code></pre>
75+
<div class="result"></div>
76+
</div>
77+
<div class="Button">Run</div>
78+
79+
80+
<div class="example">
81+
<pre><code>
82+
a = [1,2,]
83+
b = function(callback){
84+
return callback();
85+
}
86+
c = b(function(){
87+
return "array: ";
88+
})
89+
90+
return JSON.stringify(c + ": " + a);
91+
</code></pre>
92+
<div class="result"></div>
93+
</div>
94+
<div class="Button">Run</div>
95+
96+
97+
<div class="example">
98+
<pre><code>
99+
a = {a:11,b:true,c:"xxxx"+1};
100+
return JSON.stringify(a)
101+
</code></pre>
102+
<div class="result"></div>
103+
</div>
104+
<div class="Button">Run</div>
105+
106+
107+
<div class="example">
108+
<pre><code>
109+
alert(123)
110+
</code></pre>
111+
<div class="result"></div>
112+
</div>
113+
<div class="Button">Run</div>
114+
115+
116+
<div class="example">
117+
<pre><code>
118+
a = [1,"2",true]
119+
return a[0] + ":" + a[1] + ":" + a[2]
120+
</code></pre>
121+
<div class="result"></div>
122+
</div>
123+
<div class="Button">Run</div>
124+
125+
126+
<div class="example">
127+
<pre><code>
128+
a = 2;
129+
if(a === "2"){
130+
alert(true)
131+
}else{
132+
return 1 + 2 * 2
133+
}
134+
</code></pre>
135+
<div class="result"></div>
136+
</div>
137+
<div class="Button">Run</div>
138+
139+
140+
<div class="example">
141+
<pre><code>
142+
for(i=0;i<1100000;++i){}
143+
</code></pre>
144+
<div class="result"></div>
145+
</div>
146+
<div class="Button">Run</div>
147+
148+
149+
<div class="example">
150+
<pre><code>
151+
a = 3;
152+
for(i=0,y=2;i < a,y<1;++i,++y){
153+
if(i === 1){
154+
print("continue")
155+
continue
156+
}else{
157+
print("bbb" + i)
158+
}
159+
print(i)
160+
++i
161+
}
162+
</code></pre>
163+
<div class="result"></div>
164+
</div>
165+
<div class="Button">Run</div>
166+
167+
168+
<div class="example">
169+
<pre><code>
170+
a = 3;
171+
172+
while(a < 10)
173+
{
174+
print(a)
175+
++a
176+
print("++a:" + a)
177+
}
178+
</code></pre>
179+
<div class="result"></div>
180+
</div>
181+
<div class="Button">Run</div>
182+
183+
184+
<div class="example">
185+
<pre><code>
186+
var cc = true
187+
var obj = {
188+
x:1,
189+
fn1:function(a,b)
190+
{
191+
function xx(n){
192+
//print(this)
193+
//print(cc)
194+
}
195+
print(this.x)
196+
//print(a + ":" + b)
197+
xx(11)
198+
alert(1)
199+
}
200+
}
201+
//console.log(this)
202+
obj.fn1(111,"aaa")
203+
</code></pre>
204+
<div class="result"></div>
205+
</div>
206+
<div class="Button">Run</div>
207+
208+
209+
<script>
210+
TrashScript.bind({
211+
console:console,
212+
test:function(){},
213+
print:console.log,
214+
alert:function(x){
215+
alert(x)
216+
},
217+
JSON:JSON
218+
});
219+
(function(){
220+
var buttons = document.querySelectorAll(".Button");
221+
var codes = document.querySelectorAll("pre");
222+
var results = document.querySelectorAll(".result");
223+
224+
for(var i=0;i<buttons.length;++i)
225+
{
226+
(function(i)
227+
{
228+
var button = buttons[i];
229+
var result = results[i];
230+
var disabled = false;
231+
232+
button.addEventListener("click",function()
233+
{
234+
if(disabled){
235+
return;
236+
}
237+
disabled = true;
238+
button.className = "Button _disabled";
239+
240+
var context = TrashScript(codes[i].innerText,function(e)
241+
{
242+
if(e.status === "complete"){
243+
disabled = false;
244+
button.className = "Button";
245+
}else if(e.status === "error"){
246+
disabled = false;
247+
button.className = "Button";
248+
codes[i].style.borderColor = "red";
249+
}
250+
result.innerHTML = JSON.stringify(e) + "<br/>result: <br/>" + e.result;
251+
});
252+
context.exec(window);
253+
});
254+
})(i);
255+
}
256+
})();
257+
258+
</script>
259+
</body>
260+
</html>

0 commit comments

Comments
 (0)