forked from suxiaogang/WeiboPicBed
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbackground.js
More file actions
133 lines (127 loc) · 3.17 KB
/
background.js
File metadata and controls
133 lines (127 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import {http} from './js/http.js';
chrome.action.onClicked.addListener(function (tab) {
chrome.windows.getCurrent(function(screen) {
var w = 800;
var h = 550;
var left = Math.round((screen.width / 2) - (w / 2));
var top = Math.round((screen.height / 2) - (h / 2));
chrome.windows.create({
url : 'popup.html',
width : w,
height : h,
focused : true,
'left' : left,
'top' : top,
type : 'popup'
});
})
});
function packMsgRep(state, data, message) {
return {
state,
uuid: message.uuid,
data,
timestamp: Date.now()
};
}
async function parseHttpResponse(response) {
if (response == null) {
return {
status: -2,
statusText: null,
body: null
};
} else if (response instanceof Error) {
return {
status: -1,
statusText: `${response.name}: ${response.message}`,
body: response.stack
};
} else {
return {
status: response.status,
statusText: response.statusText,
body: await response.text()
};
}
}
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
new Promise(async (resolve, reject) => {
if (typeof message != 'object' || !message.type) {
console.error("消息格式不符合规范:", message);
reject(`消息 ${JSON.stringify(message)} 格式不符合规范。`);
return;
}
switch (message.type) {
case 'FetchRequest': {
http.request(message.data).then(response => {
resolve(parseHttpResponse(response));
}).catch(error => {
reject(parseHttpResponse(error));
});
break;
}
case 'FetchGet': {
http.get(message.data).then(response => {
resolve(parseHttpResponse(response));
}).catch(error => {
reject(parseHttpResponse(error));
});
break;
}
case 'FetchPost': {
const {url, data} = message.data
let postdata = {}
if (data.type == 'file') {
const {file, paramName, filename, customBodyObj} = data
let formData = new FormData()
const obj = dataURLtoBlob(data[paramName])
formData.append([paramName], obj, filename)
for (const key in customBodyObj) {
if (customBodyObj.hasOwnProperty.call(customBodyObj, key)) {
const element = customBodyObj[key];
formData.append([key], element)
}
}
postdata = {
url: url,
data: formData
}
} else {
postdata = message.data
}
http.post(postdata).then(response => {
resolve(parseHttpResponse(response));
}).catch(error => {
reject(parseHttpResponse(error));
});
break;
}
default: {
console.error("消息类型非法:", message);
reject(`消息 ${message} 类型非法。`);
break;
}
}
}).then((response) => {
sendResponse(packMsgRep(true, response, message));
// console.log(`消息 ${JSON.stringify(message)} 处理完成。`);
}).catch(e => {
sendResponse(packMsgRep(false, e, message));
console.error(`消息 ${JSON.stringify(message)} 处理失败:`, e);
});
return true;
});
const dataURLtoBlob = (dataUrl) => {
let arr = dataUrl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n)
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
return new Blob([u8arr], {
type: mime,
})
}