Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 18 additions & 22 deletions src/app/service/content/gm_api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -633,36 +633,32 @@ export default class GMApi extends GM_Base {
if (details.data instanceof FormData) {
// 处理FormData
param.dataType = "FormData";
const data: Array<GMSend.XHRFormData> = [];
const keys: { [key: string]: boolean } = {};
details.data.forEach((val, key) => {
keys[key] = true;
});
// 处理FormData中的数据
await Promise.all(
Object.keys(keys).map((key) => {
const values = (<FormData>details.data).getAll(key);
return Promise.all(
values.map(async (val) => {
if (val instanceof File) {
const url = await a.CAT_createBlobUrl(val);
data.push({
key,
type: "file",
val: url,
filename: val.name,
});
} else {
data.push({
const data = (await Promise.all(
Object.keys(keys).flatMap((key) =>
(<FormData>details.data).getAll(key).map((val) =>
val instanceof File
? a.CAT_createBlobUrl(val).then(
(url) =>
({
key,
type: "file",
val: url,
filename: val.name,
}) as GMSend.XHRFormData
)
: ({
key,
type: "text",
val,
});
}
})
);
})
);
} as GMSend.XHRFormData)
)
)
)) as GMSend.XHRFormData[];
param.data = data;
} else if (details.data instanceof Blob) {
// 处理blob
Expand Down
10 changes: 7 additions & 3 deletions src/app/service/offscreen/gm_api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,10 +148,14 @@ export default class GMApi {
const data = new FormData();
if (details.data && details.data instanceof Array) {
await Promise.all(
details.data.map(async (val: GMSend.XHRFormData) => {
details.data.map((val: GMSend.XHRFormData) => {
if (val.type === "file") {
const file = new File([await (await fetch(val.val)).blob()], val.filename!);
data.append(val.key, file, val.filename);
return fetch(val.val)
.then((res) => res.blob())
.then((blob) => {
const file = new File([blob], val.filename!);
data.append(val.key, file, val.filename);
});
} else {
data.append(val.key, val.val);
}
Expand Down
21 changes: 11 additions & 10 deletions src/app/service/service_worker/fetch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,16 +80,17 @@ export async function fetchIconByDomain(domain: string): Promise<TMsgResponse<st
}

const urls = await Promise.all(
icons.map(async (icon) => {
try {
const res = await fetch((fetchingUrl = icon), { method: "HEAD", signal: timeoutAbortSignal(timeout) });
if (res.ok && checkFileNameEqual(res.url, icon)) {
return res.url;
}
} catch {
// 忽略错误
}
})
icons.map((icon) =>
fetch((fetchingUrl = icon), { method: "HEAD", signal: timeoutAbortSignal(timeout) })
.then((res) => {
if (res.ok && checkFileNameEqual(res.url, icon)) {
return res.url;
}
})
.catch(() => {
// 忽略错误
})
)
);

return msgResponse(0, urls.filter((url) => !!url) as string[]);
Expand Down
58 changes: 29 additions & 29 deletions src/app/service/service_worker/runtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -472,36 +472,36 @@ export class RuntimeService {
enableScript.push(scriptRes as ScriptLoadInfo);
}

await Promise.all([
// 加载value
...enableScript.map(async (script) => {
const value = await this.value.getScriptValue(script!);
script.value = value;
}),
// 加载resource
...enableScript.map(async (script) => {
const resource = await this.resource.getScriptResources(script, false);
script.resource = resource;
Object.keys(script.resource).forEach((name) => {
const res = script.resource[name];
// 删除base64以节省资源
// 如果有content就删除base64
if (res.content) {
res.base64 = undefined;
const { value, resource, scriptDAO } = this;
await Promise.all(
enableScript.flatMap((script) => [
// 加载value
value.getScriptValue(script!).then((value) => {
script.value = value;
}),
// 加载resource
resource.getScriptResources(script, false).then((resource) => {
for (const name of Object.keys(resource)) {
const res = script.resource[name];
// 删除base64以节省资源
// 如果有content就删除base64
if (res.content) {
res.base64 = undefined;
}
}
});
}),
// 加载code相关的信息
...enableScript.map(async (script) => {
const code = await this.scriptDAO.scriptCodeDAO.get(script.uuid);
if (code) {
const metadataStr = getMetadataStr(code.code) || "";
const userConfigStr = getUserConfigStr(code.code) || "";
script.metadataStr = metadataStr;
script.userConfigStr = userConfigStr;
}
}),
]);
script.resource = resource;
}),
// 加载code相关的信息
scriptDAO.scriptCodeDAO.get(script.uuid).then((code) => {
if (code) {
const metadataStr = getMetadataStr(code.code) || "";
const userConfigStr = getUserConfigStr(code.code) || "";
script.metadataStr = metadataStr;
script.userConfigStr = userConfigStr;
}
}),
])
);

// 更新资源使用了file协议的脚本
const needUpdateRegisteredUserScripts = enableScript.filter((script) => {
Expand Down
32 changes: 16 additions & 16 deletions src/app/service/service_worker/script.ts
Original file line number Diff line number Diff line change
Expand Up @@ -326,30 +326,30 @@ export class ScriptService {
return this.scriptCodeDAO.get(uuid);
}

async buildScriptRunResource(script: Script): Promise<ScriptRunResource> {
buildScriptRunResource(script: Script): Promise<ScriptRunResource> {
const ret: ScriptRunResource = <ScriptRunResource>Object.assign(script);

// 自定义配置
if (ret.selfMetadata) {
ret.metadata = { ...ret.metadata };
Object.keys(ret.selfMetadata).forEach((key) => {
ret.metadata[key] = ret.selfMetadata![key];
});
}

ret.value = await this.valueService.getScriptValue(ret);

ret.resource = await this.resourceService.getScriptResources(ret, true);

ret.flag = randomMessageFlag();
const code = await this.getCode(ret.uuid);
if (!code) {
throw new Error("code is null");
}
ret.code = code.code;
ret.code = compileScriptCode(ret);

return ret;
return Promise.all([
this.valueService.getScriptValue(ret),
this.resourceService.getScriptResources(ret, true),
this.getCode(script.uuid),
]).then(([value, resource, code]) => {
if (!code) {
throw new Error("code is null");
}
ret.value = value;
ret.resource = resource;
ret.flag = randomMessageFlag();
ret.code = code.code;
ret.code = compileScriptCode(ret);
return ret;
});
}

async excludeUrl({ uuid, url, remove }: { uuid: string; url: string; remove: boolean }) {
Expand Down
24 changes: 9 additions & 15 deletions src/app/service/service_worker/synchronize.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ export class SynchronizeService {
}
// 获取所有脚本
const list = await this.scriptDAO.all();
return Promise.all(list.map(async (script): Promise<ScriptBackupData> => this.generateScriptBackupData(script)));
return Promise.all(list.map((script) => this.generateScriptBackupData(script)));
}

async generateScriptBackupData(script: Script): Promise<ScriptBackupData> {
Expand Down Expand Up @@ -178,20 +178,14 @@ export class SynchronizeService {
requiresCss: ResourceBackup[];
}) {
const { uuid, requires, resources, requiresCss } = data;
const ret: Promise<any>[] = [];
// 处理requires
requires.forEach((item) => {
ret.push(this.resource.importResource(uuid, item, "require"));
});
// 处理resources
resources.forEach((item) => {
ret.push(this.resource.importResource(uuid, item, "resource"));
});
// 处理requiresCss
requiresCss.forEach((item) => {
ret.push(this.resource.importResource(uuid, item, "require-css"));
});
return Promise.all(ret).then(() => {
return Promise.all([
// 处理requires
...requires.map((item) => this.resource.importResource(uuid, item, "require")),
// 处理resources
...resources.map((item) => this.resource.importResource(uuid, item, "resource")),
// 处理requiresCss
...requiresCss.map((item) => this.resource.importResource(uuid, item, "require-css")),
]).then(() => {
return;
});
}
Expand Down
51 changes: 0 additions & 51 deletions src/app/service/service_worker/utils.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,3 @@
export function isExtensionRequest(
details: chrome.webRequest.OnBeforeRequestDetails & { originUrl?: string }
): boolean {
return !!(
(details.initiator && chrome.runtime.getURL("").startsWith(details.initiator)) ||
(details.originUrl && details.originUrl.startsWith(chrome.runtime.getURL("")))
);
}

export function getRunAt(runAts: string[]): chrome.extensionTypes.RunAt {
if (runAts.length === 0) {
return "document_idle";
Expand All @@ -20,48 +11,6 @@ export function getRunAt(runAts: string[]): chrome.extensionTypes.RunAt {
return "document_idle";
}

export function mapToObject(map: Map<string, any>): { [key: string]: any } {
const obj: { [key: string]: any } = {};
map.forEach((value, key) => {
if (value instanceof Map) {
obj[key] = mapToObject(value);
} else if (obj[key] instanceof Array) {
obj[key].push(value);
} else {
obj[key] = value;
}
});
return obj;
}

export function objectToMap(obj: { [key: string]: any }): Map<string, any> {
const map = new Map<string, any>();
Object.keys(obj).forEach((key) => {
if (obj[key] instanceof Map) {
map.set(key, objectToMap(obj[key]));
} else if (obj[key] instanceof Array) {
map.set(key, obj[key]);
} else {
map.set(key, obj[key]);
}
});
return map;
}

export function arrayToObject(arr: Array<any>): any[] {
const obj: any[] = [];
arr.forEach((item) => {
if (item instanceof Map) {
obj.push(mapToObject(item));
} else if (item instanceof Array) {
obj.push(arrayToObject(item));
} else {
obj.push(item);
}
});
return obj;
}

// 检查是不是base64编码
export function isBase64(str: string): boolean {
if (typeof str !== "string" || str.length === 0) {
Expand Down
47 changes: 24 additions & 23 deletions src/locales/locales.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,32 +81,33 @@ export function isChineseUser() {
}

// 匹配语言
export async function matchLanguage() {
const acceptLanguages = await chrome.i18n.getAcceptLanguages();
// 遍历数组寻找匹配语言
for (let i = 0; i < acceptLanguages.length; i += 1) {
const lng = acceptLanguages[i];
if (i18n.hasResourceBundle(lng, "translation")) {
return lng;
export function matchLanguage(): Promise<string> {
return chrome.i18n.getAcceptLanguages().then((acceptLanguages) => {
// 遍历数组寻找匹配语言
for (let i = 0; i < acceptLanguages.length; i += 1) {
const lng = acceptLanguages[i];
if (i18n.hasResourceBundle(lng, "translation")) {
return lng;
}
}
}
// 根据前缀去匹配
const prefixMap = {} as Partial<Record<string, string[]>>;
for (const lng of i18n.languages) {
const prefix = lng.split("-")[0];
if (!prefixMap[prefix]) {
prefixMap[prefix] = [];
// 根据前缀去匹配
const prefixMap = {} as Partial<Record<string, string[]>>;
for (const lng of i18n.languages) {
const prefix = lng.split("-")[0];
if (!prefixMap[prefix]) {
prefixMap[prefix] = [];
}
prefixMap[prefix].push(lng);
}
prefixMap[prefix].push(lng);
}
for (let i = 0; i < acceptLanguages.length; i += 1) {
const lng = acceptLanguages[i];
const prefix = lng.split("-")[0];
if (prefixMap[prefix] && prefixMap[prefix].length > 0) {
return prefixMap[prefix][0]; // 返回第一个匹配的语言
for (let i = 0; i < acceptLanguages.length; i += 1) {
const lng = acceptLanguages[i];
const prefix = lng.split("-")[0];
if (prefixMap[prefix] && prefixMap[prefix].length > 0) {
return prefixMap[prefix][0]; // 返回第一个匹配的语言
}
}
}
return "";
return "";
});
}

export { t };
Expand Down
14 changes: 7 additions & 7 deletions src/pages/components/CodeEditor/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@ const CodeEditor: React.ForwardRefRenderFunction<{ editor: editor.IStandaloneCod
}));

useEffect(() => {
const loadConfigs = async () => {
const [eslintConfig, enableEslint] = await Promise.all([
systemConfig.getEslintConfig(),
systemConfig.getEnableEslint(),
]);
setEslintConfig(eslintConfig);
setEnableEslint(enableEslint);
const loadConfigs = () => {
Promise.all([systemConfig.getEslintConfig(), systemConfig.getEnableEslint()]).then(
([eslintConfig, enableEslint]) => {
setEslintConfig(eslintConfig);
setEnableEslint(enableEslint);
}
);
};
loadConfigs();
}, []);
Expand Down
Loading