efront 3.9.14 → 3.10.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pivot/auth/login.js +14 -7
- package/apps/pivot/auth/login.less +3 -0
- package/apps/pivot/main.js +19 -3
- package/apps/pivot/task/invoke.js +1 -0
- package/apps/pivot/task/list.js +12 -3
- package/apps/pivot/task/rsync.html +16 -0
- package/apps/pivot/task/rsync.js +39 -0
- package/apps/pivot/task/rsync.less +10 -0
- package/coms/basic/FormData.js +14 -0
- package/coms/basic/_cross.js +329 -0
- package/coms/basic/cookie.js +92 -0
- package/coms/basic/parseURL_test.js +2 -1
- package/coms/{zimoli → basic}/removeFromList.js +0 -0
- package/coms/{zimoli → basic}/repeat.js +0 -0
- package/coms/compile/common.js +3 -0
- package/coms/compile/scanner2.js +3 -0
- package/coms/frame/edit.js +5 -0
- package/coms/frame/list.js +0 -1
- package/coms/reptile/cross.js +109 -0
- package/coms/reptile/{fs.js → fs2.js} +0 -0
- package/coms/reptile/m3u8Download.js +1 -1
- package/coms/zimoli/bind.js +14 -0
- package/coms/zimoli/button.less +1 -0
- package/coms/zimoli/cross.js +38 -338
- package/coms/zimoli/data.js +7 -7
- package/coms/zimoli/jsonp.js +3 -0
- package/coms/zimoli/on.js +10 -0
- package/coms/zimoli/popup.js +8 -1
- package/coms/zimoli/selectList.js +3 -3
- package/coms/zimoli/selectList.less +13 -1
- package/coms/zimoli/view.less +9 -2
- package/package.json +1 -1
- package/public/efront.js +1 -1
- package/coms/reptile/main.js +0 -3
- package/coms/zimoli/FormData.js +0 -13
package/apps/pivot/auth/login.js
CHANGED
|
@@ -4,17 +4,17 @@ var fields = refilm`
|
|
|
4
4
|
服务器地址/host* select?a ${hosts}
|
|
5
5
|
密码/password* password
|
|
6
6
|
`;
|
|
7
|
-
function main() {
|
|
7
|
+
function main(host) {
|
|
8
8
|
var page = view();
|
|
9
9
|
page.innerHTML = login;
|
|
10
10
|
drag.on(page);
|
|
11
|
+
fields[0].readonly = !!host;
|
|
11
12
|
on("append")(page, function () {
|
|
12
13
|
move.bindPosition(page, [.5, .5]);
|
|
13
14
|
});
|
|
14
15
|
renderWithDefaults(page, {
|
|
15
16
|
fields, data: {
|
|
16
|
-
host: data.getInstance("base").host || location.host,
|
|
17
|
-
|
|
17
|
+
host: host ? parseURL(host).host : data.getInstance("base").host || location.host,
|
|
18
18
|
}, pending: false
|
|
19
19
|
});
|
|
20
20
|
on("submit")(page, async function () {
|
|
@@ -24,14 +24,21 @@ function main() {
|
|
|
24
24
|
page.disabled = true;
|
|
25
25
|
try {
|
|
26
26
|
var base = location.protocol + "//" + parseURL(this.$scope.data.host).host + "/";
|
|
27
|
-
data.setInstance("base", { base, host: parseURL(base).host });
|
|
28
|
-
var
|
|
27
|
+
if (!host) data.setInstance("base", { base, host: parseURL(base).host });
|
|
28
|
+
var api = Object.assign({}, await data.getApi("login"));
|
|
29
|
+
api.base = base;
|
|
30
|
+
var info = await data.from(api, {
|
|
29
31
|
a: encode62.timeencode(encode62.geta(password))
|
|
30
32
|
}).loading_promise;
|
|
31
33
|
info = encode62.timeupdate(info);
|
|
32
34
|
data.setSource(base, info);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
if (host) {
|
|
36
|
+
cast(page, 'login', info);
|
|
37
|
+
remove(page);
|
|
38
|
+
} else {
|
|
39
|
+
user.login({});
|
|
40
|
+
go('/main');
|
|
41
|
+
}
|
|
35
42
|
} catch (e) {
|
|
36
43
|
console.log(e);
|
|
37
44
|
}
|
package/apps/pivot/main.js
CHANGED
|
@@ -1,10 +1,26 @@
|
|
|
1
1
|
data.loadConfig("api.yml");
|
|
2
2
|
user.loginPath = '/auth/login';
|
|
3
|
+
cross.addReform(async function ({ status, url, headers }, reform, reject) {
|
|
4
|
+
if (status === 401) {
|
|
5
|
+
var base = data.getInstance("base").base;
|
|
6
|
+
var { protocol, host } = parseURL(url);
|
|
7
|
+
var base1 = protocol + "//" + host + "/";
|
|
8
|
+
if (base !== base1) {
|
|
9
|
+
data.setSource(base1, null);
|
|
10
|
+
var page = await popup("/auth/login", base1);
|
|
11
|
+
care(page, "login", function (info) {
|
|
12
|
+
data.setSource(base1, info);
|
|
13
|
+
headers.authorization = info;
|
|
14
|
+
reform();
|
|
15
|
+
});
|
|
16
|
+
on("remove")(page, reject);
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
location.reload();
|
|
20
|
+
}
|
|
21
|
+
})
|
|
3
22
|
data.setReporter(function (m, t) {
|
|
4
23
|
alert(m, t);
|
|
5
|
-
var base = data.getInstance("base").base;
|
|
6
|
-
data.setSource(base, '');
|
|
7
|
-
if (m.status === 401) location.reload();
|
|
8
24
|
});
|
|
9
25
|
data.bindInstance("base", async function (base) {
|
|
10
26
|
if (!base.base) return;
|
package/apps/pivot/task/list.js
CHANGED
|
@@ -3,12 +3,21 @@ plist.bind(null, '任务管理', "task", refilm`
|
|
|
3
3
|
*任务名/name 100
|
|
4
4
|
*是否启用/status radio [不启用,启用]
|
|
5
5
|
任务代码/code text
|
|
6
|
-
|
|
6
|
+
/ - ${[
|
|
7
|
+
{
|
|
7
8
|
when(o) {
|
|
8
9
|
return o.status === 1;
|
|
9
10
|
},
|
|
10
11
|
name: "执行", do(o) {
|
|
11
12
|
popup("/task/invoke", o);
|
|
12
13
|
}
|
|
13
|
-
}
|
|
14
|
-
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
when(o) {
|
|
17
|
+
return o.status === 1;
|
|
18
|
+
},
|
|
19
|
+
name: "同步", do(o) {
|
|
20
|
+
popup("/task/rsync", o);
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
]}`, '/task/edit');
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<div head>
|
|
2
|
+
同步任务 - <span -text=task.name></span>(<span -text=task.key></span>)
|
|
3
|
+
<close @click="remove()"></close>
|
|
4
|
+
</div>
|
|
5
|
+
<div body>
|
|
6
|
+
<padding ng-repeat="h in hosts">
|
|
7
|
+
<a @click="checked[h.key]=!checked[h.key]" disabled:="h.key===base.host" :class="{finished:finished[h.key]}">
|
|
8
|
+
<checker -model="checked[h.key]"></checker>
|
|
9
|
+
<span -text="h.name"></span>
|
|
10
|
+
<span v-if="h.key===base.host">(当前)</span>
|
|
11
|
+
</a>
|
|
12
|
+
</padding>
|
|
13
|
+
</div>
|
|
14
|
+
<div foot>
|
|
15
|
+
<btn @click="flush()">同步</btn>
|
|
16
|
+
</div>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
function main(task) {
|
|
2
|
+
var page = view();
|
|
3
|
+
page.innerHTML = template;
|
|
4
|
+
drag.on(page.firstChild, page);
|
|
5
|
+
resize.on(page);
|
|
6
|
+
renderWithDefaults(page, {
|
|
7
|
+
task,
|
|
8
|
+
checkbox(e) {
|
|
9
|
+
e = checkbox(e);
|
|
10
|
+
cast(e, { options: this.hosts })
|
|
11
|
+
},
|
|
12
|
+
base: data.getInstance("base"),
|
|
13
|
+
hosts: data.getInstance("hosts"),
|
|
14
|
+
finished: {},
|
|
15
|
+
checked: {},
|
|
16
|
+
async flush() {
|
|
17
|
+
var api = await data.getApi("edit");
|
|
18
|
+
api = Object.assign({}, api);
|
|
19
|
+
var finished = this.finished = {};
|
|
20
|
+
var checked = this.checked;
|
|
21
|
+
for (var h of this.hosts) {
|
|
22
|
+
if (!checked[h.key]) continue;
|
|
23
|
+
api.base = location.protocol + "//" + h.key + "/";
|
|
24
|
+
cross.addDirect(api.base);
|
|
25
|
+
await data.from(api, {
|
|
26
|
+
type: "task",
|
|
27
|
+
key: encode62.timeencode(task.key),
|
|
28
|
+
value: encode62.timeencode(JSON.stringify(task))
|
|
29
|
+
});
|
|
30
|
+
finished[h.key] = true;
|
|
31
|
+
}
|
|
32
|
+
alert('同步完成!');
|
|
33
|
+
},
|
|
34
|
+
remove() {
|
|
35
|
+
remove(page);
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
return page;
|
|
39
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
var FormData = this.FormData;
|
|
2
|
+
if (!FormData) {
|
|
3
|
+
FormData = function FormData() {
|
|
4
|
+
this.form = {};
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
FormData.prototype.append = function (key, value) {
|
|
8
|
+
this.form[key] = value;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
FormData.prototype.toString = function () {
|
|
12
|
+
return serialize(this.form);
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
var { getCookies, addCookie } = cookie;
|
|
2
|
+
var { File } = this;
|
|
3
|
+
function isFile(a) {
|
|
4
|
+
if (File) {
|
|
5
|
+
return a instanceof File;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
var base = null, location_href = null;
|
|
9
|
+
// ///// 1 ////////// 2 /////// 3 //// 4 //
|
|
10
|
+
var domainReg = /^(?:(https?)\:)?\/\/(.*?)(?:\/(.*?))?([\?#].*)?$/i;
|
|
11
|
+
var setHost = function (host) {
|
|
12
|
+
base = host;
|
|
13
|
+
};
|
|
14
|
+
var HeadersKeys = ["Content-Type"];
|
|
15
|
+
var cors_hosts = [];
|
|
16
|
+
function getDomainPath(url) {
|
|
17
|
+
return url.replace(domainReg, "$2/$3");
|
|
18
|
+
}
|
|
19
|
+
function getRequestProtocol(url) {
|
|
20
|
+
if (/^https:/i.test(url)) {
|
|
21
|
+
return "https:";
|
|
22
|
+
}
|
|
23
|
+
return "http:";
|
|
24
|
+
}
|
|
25
|
+
function isChildPath(relative, path) {
|
|
26
|
+
return relative.replace(/^(.*\/)[^\/]*$/, path);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
var getCrossUrl = function (domain, headers) {
|
|
30
|
+
if (notCross(domain)) return domain;
|
|
31
|
+
var originDomain = getDomainPath(domain);
|
|
32
|
+
var _cookies = getCookies(originDomain);
|
|
33
|
+
var _headers = {};
|
|
34
|
+
if (_cookies) {
|
|
35
|
+
_headers.Cookie = _cookies;
|
|
36
|
+
}
|
|
37
|
+
extend(_headers, headers);
|
|
38
|
+
_headers = serialize(_headers);
|
|
39
|
+
if (_headers) _headers = "," + _headers;
|
|
40
|
+
return domain
|
|
41
|
+
.replace(/^(s?)(\/\/)/i, "http$1:$2")
|
|
42
|
+
.replace(domainReg, base + `*${/^(https\:|s\/\/)/i.test(domain) ? "*" : ""}$2${_headers}/$3$4`);
|
|
43
|
+
};
|
|
44
|
+
function noop() { }
|
|
45
|
+
function toResponse() {
|
|
46
|
+
if (this.responseType === 'json') return JSON.stringify(this.response);
|
|
47
|
+
return this.response;
|
|
48
|
+
}
|
|
49
|
+
function _cross(jsonp, digest = noop, method, url, headers) {
|
|
50
|
+
var originDomain = getDomainPath(url);
|
|
51
|
+
if (!originDomain) throw new Error("路径格式错误!");
|
|
52
|
+
var _cookies = getCookies(originDomain);
|
|
53
|
+
var _headers = {};
|
|
54
|
+
if (_cookies) {
|
|
55
|
+
_headers.Cookie = _cookies;
|
|
56
|
+
}
|
|
57
|
+
extend(_headers, headers);
|
|
58
|
+
if (/^[mc]/i.test(method)) {
|
|
59
|
+
_headers["User-Agent"] = /^m/i.test(method)
|
|
60
|
+
? "Efront/1.9 (iPhone) Safari/602.1"
|
|
61
|
+
: "Efront/1.9 (Windows) Chrome/77.0.3865.90";
|
|
62
|
+
method = method.slice(1);
|
|
63
|
+
}
|
|
64
|
+
var loaded, errored;
|
|
65
|
+
var onload = function (data) {
|
|
66
|
+
removeFromList(requests, xhr);
|
|
67
|
+
if (xhr.decoder) {
|
|
68
|
+
data = xhr.decoder(data);
|
|
69
|
+
}
|
|
70
|
+
loaded = data;
|
|
71
|
+
flush();
|
|
72
|
+
digest();
|
|
73
|
+
};
|
|
74
|
+
var onerror1 = function (e) {
|
|
75
|
+
removeFromList(requests, xhr);
|
|
76
|
+
errored = e || "未知错误!";
|
|
77
|
+
flush();
|
|
78
|
+
digest();
|
|
79
|
+
};
|
|
80
|
+
var onerror = async function (e) {
|
|
81
|
+
if (e.type === 'error') {
|
|
82
|
+
e = { response: "无法访问服务器", toString: toResponse };
|
|
83
|
+
}
|
|
84
|
+
for (var r of reforms) {
|
|
85
|
+
var r = await reform(r, { method, url, status: xhr.status, headers: _headers }, fire, onerror1, e);
|
|
86
|
+
if (r === false) return;
|
|
87
|
+
}
|
|
88
|
+
onerror1(e);
|
|
89
|
+
};
|
|
90
|
+
var flush = function () {
|
|
91
|
+
var then = xhr.then;
|
|
92
|
+
delete xhr.then;
|
|
93
|
+
if (loaded) onloads.splice(0, onloads.length).map(e => e instanceof Function && e(xhr));
|
|
94
|
+
if (errored) onerrors.splice(0, onerrors.length).map(e => e instanceof Function && e(errored));
|
|
95
|
+
xhr.then = then;
|
|
96
|
+
};
|
|
97
|
+
if (/^jsonp/i.test(method)) {
|
|
98
|
+
var cb = method.split('\-')[1] || 'callback';
|
|
99
|
+
setTimeout(function () {
|
|
100
|
+
if (!isEmpty(jsondata) && isEmpty(datas)) {
|
|
101
|
+
datas = serialize(jsondata);
|
|
102
|
+
}
|
|
103
|
+
if (datas) {
|
|
104
|
+
xhr.src += (/\?/.test(xhr.src) ? "&" : "?") + datas;
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
var xhr = jsonp(url, {
|
|
108
|
+
[cb](a) {
|
|
109
|
+
onload({ status: 200, response: JSON.stringify(a), toString: toResponse });
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
xhr.onerror = onerror;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
var nocross = notCross(url);
|
|
116
|
+
var callback = function () {
|
|
117
|
+
var exposeHeaders = xhr.getResponseHeader("access-control-expose-headers");
|
|
118
|
+
var exposeMap = {};
|
|
119
|
+
if (exposeHeaders) exposeHeaders.split(",").forEach(h => exposeMap[h.toLowerCase()] = true);
|
|
120
|
+
if (xhr.getResponseHeader) {
|
|
121
|
+
var exposekey = nocross ? "set-cookie" : "efront-cookie";
|
|
122
|
+
if (exposeMap[exposekey]) {
|
|
123
|
+
var cookie = xhr.getResponseHeader(exposekey);
|
|
124
|
+
addCookie(cookie, originDomain);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
switch (xhr.status) {
|
|
128
|
+
case 0:
|
|
129
|
+
if (!xhr.response) {
|
|
130
|
+
onerror({ status: 0, response: "无法访问服务器", toString: toResponse });
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
case 200:
|
|
134
|
+
case 201:
|
|
135
|
+
case 304:
|
|
136
|
+
onload(xhr);
|
|
137
|
+
break;
|
|
138
|
+
case 307:
|
|
139
|
+
case 302:
|
|
140
|
+
case 301:
|
|
141
|
+
if (xhr.isRedirected > 2) break;
|
|
142
|
+
var exposekey = nocross ? "location" : "efront-location";
|
|
143
|
+
var location = exposeMap[exposekey] && xhr.getResponseHeader(exposekey);
|
|
144
|
+
if (!domainReg.test(location)) {
|
|
145
|
+
if (/^\//.test(location)) {
|
|
146
|
+
location = originDomain.replace(/\/.*$/, location);
|
|
147
|
+
} else {
|
|
148
|
+
location = originDomain.replace(/[^\/+]$/, location);
|
|
149
|
+
}
|
|
150
|
+
location = getRequestProtocol(url) + "//" + location;
|
|
151
|
+
}
|
|
152
|
+
var crs = _cross("get", location, _headers);
|
|
153
|
+
crs.isRedirected = (xhr.isRedirected || 0) + 1;
|
|
154
|
+
crs.done(onload, false);
|
|
155
|
+
crs.error(onerror, false);
|
|
156
|
+
break;
|
|
157
|
+
default:
|
|
158
|
+
onerror(xhr);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
var cross = this;
|
|
162
|
+
var xhr = cross(callback, onerror);
|
|
163
|
+
var send = xhr.send;
|
|
164
|
+
xhr.toString = toResponse;
|
|
165
|
+
xhr.json = xhr.data = xhr.send = function (data, value) {
|
|
166
|
+
if (!jsondata && !(isEmpty(data) && isEmpty(value))) jsondata = data instanceof Array ? [] : {};
|
|
167
|
+
if (FormData && data instanceof FormData) {
|
|
168
|
+
datas = data;
|
|
169
|
+
} else if (isObject(data) && !isFile(data)) {
|
|
170
|
+
extend(jsondata, data);
|
|
171
|
+
} else if (!isEmpty(value)) {
|
|
172
|
+
extend(jsondata, { [data]: value });
|
|
173
|
+
} else if (isString(data) && value !== false && /^\s*\{|\=/.test(data)) {
|
|
174
|
+
var data = /^\s*\{/.test(data) ? JSON.parse(data) : parseKV(data, "&", "=");
|
|
175
|
+
extend(jsondata, data);
|
|
176
|
+
} else {
|
|
177
|
+
datas = data;
|
|
178
|
+
}
|
|
179
|
+
return xhr;
|
|
180
|
+
};
|
|
181
|
+
xhr.form = function (data) {
|
|
182
|
+
xhr.data(data);
|
|
183
|
+
if (FormData) {
|
|
184
|
+
datas = new FormData;
|
|
185
|
+
for (var k in jsondata) {
|
|
186
|
+
datas.append(k, jsondata[k]);
|
|
187
|
+
}
|
|
188
|
+
} else {
|
|
189
|
+
realHeaders["Content-Type"] = "application/x-www-form-urlencoded";
|
|
190
|
+
datas = serialize(jsondata, "&", "=");
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
var fire = function () {
|
|
195
|
+
var isform = /^f/i.test(method);
|
|
196
|
+
if (isform) {
|
|
197
|
+
if (method === 'form') method = 'post';
|
|
198
|
+
else method = method.slice(1);
|
|
199
|
+
}
|
|
200
|
+
if (/^jsonp/i.test(method)) method = "get";
|
|
201
|
+
if (!isEmpty(jsondata) && isEmpty(datas)) {
|
|
202
|
+
if (/^(get|head|trace)$/i.test(method)) {
|
|
203
|
+
url = url.replace(/#[\s\S]*/, '');
|
|
204
|
+
datas = serialize(jsondata);
|
|
205
|
+
if (datas) {
|
|
206
|
+
url += (/\?/.test(url) ? "&" : "?") + datas;
|
|
207
|
+
datas = "";
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
} else if (isform) {
|
|
211
|
+
xhr.form(jsondata);
|
|
212
|
+
} else {
|
|
213
|
+
datas = JSON.stringify(jsondata);
|
|
214
|
+
if (datas === "{}" || datas === "[]") {
|
|
215
|
+
datas = '';
|
|
216
|
+
} else {
|
|
217
|
+
realHeaders["Content-Type"] = "application/json;charset=UTF-8";
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (nocross) {
|
|
222
|
+
extend(realHeaders, _headers);
|
|
223
|
+
xhr.open(method, url);
|
|
224
|
+
} else {
|
|
225
|
+
xhr.open(method, getCrossUrl(url, _headers));
|
|
226
|
+
}
|
|
227
|
+
Object.keys(realHeaders).forEach(key => setRequestHeader.call(xhr, key, realHeaders[key]));
|
|
228
|
+
if (!isEmpty(datas)) send.call(xhr, datas);
|
|
229
|
+
else send.call(xhr);
|
|
230
|
+
digest();
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
setTimeout(fire, 0);
|
|
234
|
+
|
|
235
|
+
}
|
|
236
|
+
var setRequestHeader = xhr.setRequestHeader;
|
|
237
|
+
var realHeaders = Object.create(null);
|
|
238
|
+
xhr.setRequestHeader = function (key, value) {
|
|
239
|
+
realHeaders[key] = value;
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
var onloads = [], onerrors = [];
|
|
243
|
+
xhr.done = xhr.success = function (on, asqueue = true) {
|
|
244
|
+
if (!asqueue) onloads.splice(0, onloads.length);
|
|
245
|
+
onloads.push(on);
|
|
246
|
+
flush();
|
|
247
|
+
return xhr;
|
|
248
|
+
};
|
|
249
|
+
var datas = "";
|
|
250
|
+
var jsondata = null;
|
|
251
|
+
xhr.fail = xhr.error = function (on, asqueue = true) {
|
|
252
|
+
if (!asqueue) {
|
|
253
|
+
onerrors.splice(0, onerrors.length);
|
|
254
|
+
}
|
|
255
|
+
onerrors.push(on);
|
|
256
|
+
flush();
|
|
257
|
+
return xhr;
|
|
258
|
+
};
|
|
259
|
+
xhr.then = function (ok, oh) {
|
|
260
|
+
onloads.push(ok);
|
|
261
|
+
onerrors.push(oh);
|
|
262
|
+
flush();
|
|
263
|
+
};
|
|
264
|
+
var abort = xhr.abort;
|
|
265
|
+
xhr.abort = function () {
|
|
266
|
+
removeFromList(requests, this);
|
|
267
|
+
if (isFunction(abort)) abort.call(this);
|
|
268
|
+
};
|
|
269
|
+
requests.push(xhr);
|
|
270
|
+
return xhr;
|
|
271
|
+
}
|
|
272
|
+
function addDirect(a) {
|
|
273
|
+
if (cors_hosts.indexOf(a) >= 0) return;
|
|
274
|
+
if (typeof a === 'string' || a instanceof RegExp) cors_hosts.push(a);
|
|
275
|
+
}
|
|
276
|
+
function notCross(domain) {
|
|
277
|
+
if (!base || location_href && location_href === domain.slice(0, location_href.length) || !/^https?\:\/\/|^s?\/\//.test(domain)) return true;
|
|
278
|
+
for (var cx = 0, dx = cors_hosts.length; cx < dx; cx++) {
|
|
279
|
+
var host = cors_hosts[cx];
|
|
280
|
+
if (host instanceof RegExp) {
|
|
281
|
+
if (host.test(domain)) return true;
|
|
282
|
+
} else {
|
|
283
|
+
host = host.replace(domainReg, '$2/$3');
|
|
284
|
+
if (domain.replace(domainReg, '$2/$3').slice(0, host.length) === host) return true;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
var requests = [];
|
|
291
|
+
var reforms = [];
|
|
292
|
+
function reform(r, info, fire, cancel, e) {
|
|
293
|
+
var fired = false;
|
|
294
|
+
return r(info, function () {
|
|
295
|
+
if (fired) return;
|
|
296
|
+
fired = true;
|
|
297
|
+
fire();
|
|
298
|
+
}, function () {
|
|
299
|
+
if (fired) return;
|
|
300
|
+
fired = true;
|
|
301
|
+
cancel(e);
|
|
302
|
+
})
|
|
303
|
+
}
|
|
304
|
+
function addReform(r) {
|
|
305
|
+
if (isFunction(r)) reforms.push(r);
|
|
306
|
+
}
|
|
307
|
+
var bind = _cross.bind;
|
|
308
|
+
_cross.bind = function () {
|
|
309
|
+
var _cross = bind.apply(this, arguments);
|
|
310
|
+
extend(_cross, {
|
|
311
|
+
requests,
|
|
312
|
+
abortAll() {
|
|
313
|
+
var rs = requests.splice(0, requests.length);
|
|
314
|
+
for (var r of rs) r.abort();
|
|
315
|
+
},
|
|
316
|
+
setHost,
|
|
317
|
+
addReform,
|
|
318
|
+
getCookies,
|
|
319
|
+
addCookie,
|
|
320
|
+
addDirect,
|
|
321
|
+
getCrossUrl
|
|
322
|
+
});
|
|
323
|
+
return _cross;
|
|
324
|
+
}
|
|
325
|
+
_cross.setHost = setHost;
|
|
326
|
+
_cross.setLocation = function (host) {
|
|
327
|
+
location_href = host;
|
|
328
|
+
if (!base) base = /^https?\:/i.test(location_href) ? '/' : "http://efront.cc/";
|
|
329
|
+
};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
var cookiesMap = {};
|
|
2
|
+
var parseCookieFromText = function (cookie) {
|
|
3
|
+
var pairs = cookie.split(/;\s*/);
|
|
4
|
+
var info = {};
|
|
5
|
+
for (var cx = 1, dx = pairs.length; cx < dx; cx++) {
|
|
6
|
+
var kvs = /^(.+?)\=(.+?)$/.exec(pairs[cx]);
|
|
7
|
+
if (!kvs) continue;
|
|
8
|
+
var [, k, v] = kvs;
|
|
9
|
+
k = k.trim().toLowerCase();
|
|
10
|
+
switch (k) {
|
|
11
|
+
case "expires":
|
|
12
|
+
v = +new Date(v);
|
|
13
|
+
break;
|
|
14
|
+
case "max-age":
|
|
15
|
+
k = "expires";
|
|
16
|
+
v = Date.now() + v * 1000;
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
info[k] = v;
|
|
20
|
+
}
|
|
21
|
+
var pair = parseKV(pairs[0], ";");
|
|
22
|
+
return [pair, info];
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
function addCookie(cookie_text, originDomain = "") {
|
|
26
|
+
if (!cookie_text) return;
|
|
27
|
+
if (cookie_text instanceof Array) cookie_text = cookie_text.join(",");
|
|
28
|
+
var cookies = cookie_text.replace(/(^|;|,)\s*(expires)=(\w*),([^=]*)(;|$)/ig, "$1$2=$3.$4$5")
|
|
29
|
+
.split(/,\s*/).map(parseCookieFromText);
|
|
30
|
+
for (var cookie of cookies) {
|
|
31
|
+
var [pair, info] = cookie;
|
|
32
|
+
var { path, domain, expires } = info;
|
|
33
|
+
if (!domain) {
|
|
34
|
+
domain = originDomain.replace(/[^\/]+$/, "");
|
|
35
|
+
}
|
|
36
|
+
if (/^\./.test(domain)) {
|
|
37
|
+
domain = domain.replace(/^\.+/, "");
|
|
38
|
+
}
|
|
39
|
+
var destPath;
|
|
40
|
+
if (/^\//.test(path)) {
|
|
41
|
+
destPath = domain.replace(/\/.*$/, "") + path;
|
|
42
|
+
} else {
|
|
43
|
+
destPath = domain;
|
|
44
|
+
}
|
|
45
|
+
destPath = destPath.replace(/\/+$/, "");
|
|
46
|
+
if (originDomain.indexOf(destPath) >= 0) {
|
|
47
|
+
if (!cookiesMap[destPath]) {
|
|
48
|
+
cookiesMap[destPath] = {};
|
|
49
|
+
}
|
|
50
|
+
var map = cookiesMap[destPath];
|
|
51
|
+
for (var k in pair) {
|
|
52
|
+
var v = pair[k];
|
|
53
|
+
map[k] = [v, expires];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function getCookies(domainPath) {
|
|
60
|
+
var cookieObject = {};
|
|
61
|
+
var splited = domainPath.split("/");
|
|
62
|
+
var domain = splited[0];
|
|
63
|
+
var now = Date.now();
|
|
64
|
+
do {
|
|
65
|
+
var copy = splited.slice(0);
|
|
66
|
+
do {
|
|
67
|
+
domainPath = copy.join("/");
|
|
68
|
+
var cookie = cookiesMap[domainPath];
|
|
69
|
+
if (cookie) {
|
|
70
|
+
for (var k in cookie) {
|
|
71
|
+
if (!cookieObject[k]) {
|
|
72
|
+
var [cook, expires] = cookie[k];
|
|
73
|
+
if (expires && expires < now) {
|
|
74
|
+
delete cookieObject[k];
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
cookieObject[k] = cook;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
copy.pop();
|
|
82
|
+
} while (copy.length);
|
|
83
|
+
domain = domain.replace(/^.*?(\.|$)/, "");
|
|
84
|
+
splited[0] = domain;
|
|
85
|
+
} while (domain.length);
|
|
86
|
+
return serialize(cookieObject, ";");
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
cookiesMap,
|
|
90
|
+
addCookie,
|
|
91
|
+
getCookies,
|
|
92
|
+
}
|
|
@@ -42,4 +42,5 @@ test(":cluster-opt.html", "pathname", ":cluster-opt.html")
|
|
|
42
42
|
test("d:/cluster-opt.html", "pathname", "d:/cluster-opt.html")
|
|
43
43
|
test("d:\\cluster-opt.html", "pathname", "d:\\cluster-opt.html")
|
|
44
44
|
test("ftp:\\\\cluster-opt.html", "host", "cluster-opt.html")
|
|
45
|
-
test("\\\\cluster-opt.html", "host", "cluster-opt.html")
|
|
45
|
+
test("\\\\cluster-opt.html", "host", "cluster-opt.html")
|
|
46
|
+
test("https://a:b@測試?abc#foo", "host", "測試")
|
|
File without changes
|
|
File without changes
|
package/coms/compile/common.js
CHANGED
package/coms/compile/scanner2.js
CHANGED
package/coms/frame/edit.js
CHANGED
|
@@ -22,6 +22,11 @@ function main(title, { submit }, { data: origin, fields, }) {
|
|
|
22
22
|
dispatch(this, 'submited');
|
|
23
23
|
remove(this);
|
|
24
24
|
});
|
|
25
|
+
bind('keydown.ctrl.s')(page, async function (e) {
|
|
26
|
+
e.preventDefault();
|
|
27
|
+
await submit(item, fields);
|
|
28
|
+
dispatch(this, 'submited');
|
|
29
|
+
});
|
|
25
30
|
on("append")(page, lazy(function () {
|
|
26
31
|
page.querySelector("input").focus();
|
|
27
32
|
}));
|
package/coms/frame/list.js
CHANGED