appscms-tools-theme 3.2.0 → 3.2.2
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.
- checksums.yaml +4 -4
- data/_includes/head/index.html +1 -1
- data/assets/js/partytown/debug/partytown-atomics.js +908 -551
- data/assets/js/partytown/debug/partytown-sandbox-sw.js +900 -539
- data/assets/js/partytown/debug/partytown-ww-atomics.js +2617 -1794
- data/assets/js/partytown/debug/partytown-ww-sw.js +2609 -1786
- data/assets/js/partytown/debug/partytown.js +108 -69
- data/assets/js/partytown/partytown-atomics.js +599 -1
- data/assets/js/partytown/partytown-sw.js +49 -1
- data/assets/js/theme.js +44 -27
- metadata +2 -2
|
@@ -1,1876 +1,2699 @@
|
|
|
1
1
|
/* Partytown 0.7.5 - MIT builder.io */
|
|
2
|
-
(self => {
|
|
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
|
-
|
|
2
|
+
((self) => {
|
|
3
|
+
const WinIdKey = Symbol();
|
|
4
|
+
const InstanceIdKey = Symbol();
|
|
5
|
+
const InstanceDataKey = Symbol();
|
|
6
|
+
const NamespaceKey = Symbol();
|
|
7
|
+
const ApplyPathKey = Symbol();
|
|
8
|
+
const InstanceStateKey = Symbol();
|
|
9
|
+
const HookContinue = Symbol();
|
|
10
|
+
const HookPrevent = Symbol();
|
|
11
|
+
const webWorkerInstances = new Map();
|
|
12
|
+
const webWorkerRefsByRefId = {};
|
|
13
|
+
const webWorkerRefIdsByRef = new WeakMap();
|
|
14
|
+
const postMessages = [];
|
|
15
|
+
const webWorkerCtx = {};
|
|
16
|
+
const webWorkerlocalStorage = new Map();
|
|
17
|
+
const webWorkerSessionStorage = new Map();
|
|
18
|
+
const environments = {};
|
|
19
|
+
const cachedDimensions = new Map();
|
|
20
|
+
const cachedStructure = new Map();
|
|
21
|
+
const commaSplit = (str) => str.split(",");
|
|
22
|
+
const partytownLibUrl = (url) => {
|
|
23
|
+
url = webWorkerCtx.$libPath$ + url;
|
|
24
|
+
if (new URL(url).origin != location.origin) {
|
|
25
|
+
throw "Invalid " + url;
|
|
26
|
+
}
|
|
27
|
+
return url;
|
|
28
|
+
};
|
|
29
|
+
const getterDimensionPropNames = commaSplit(
|
|
30
|
+
"clientWidth,clientHeight,clientTop,clientLeft,innerWidth,innerHeight,offsetWidth,offsetHeight,offsetTop,offsetLeft,outerWidth,outerHeight,pageXOffset,pageYOffset,scrollWidth,scrollHeight,scrollTop,scrollLeft"
|
|
31
|
+
);
|
|
32
|
+
const elementStructurePropNames = commaSplit(
|
|
33
|
+
"childElementCount,children,firstElementChild,lastElementChild,nextElementSibling,previousElementSibling"
|
|
34
|
+
);
|
|
35
|
+
const structureChangingMethodNames = commaSplit(
|
|
36
|
+
"insertBefore,remove,removeChild,replaceChild"
|
|
37
|
+
);
|
|
38
|
+
const dimensionChangingSetterNames = commaSplit(
|
|
39
|
+
"className,width,height,hidden,innerHTML,innerText,textContent"
|
|
40
|
+
);
|
|
41
|
+
const dimensionChangingMethodNames = commaSplit(
|
|
42
|
+
"setAttribute,setAttributeNS,setProperty"
|
|
43
|
+
);
|
|
44
|
+
const eventTargetMethods = commaSplit(
|
|
45
|
+
"addEventListener,dispatchEvent,removeEventListener"
|
|
46
|
+
);
|
|
47
|
+
const nonBlockingMethods = eventTargetMethods.concat(
|
|
48
|
+
dimensionChangingMethodNames,
|
|
49
|
+
commaSplit("add,observe,remove,unobserve")
|
|
50
|
+
);
|
|
51
|
+
const IS_TAG_REG = /^[A-Z_]([A-Z0-9-]*[A-Z0-9])?$/;
|
|
52
|
+
const noop = () => {};
|
|
53
|
+
const len = (obj) => obj.length;
|
|
54
|
+
const getConstructorName = (obj) => {
|
|
55
|
+
var _a, _b, _c;
|
|
56
|
+
try {
|
|
57
|
+
const constructorName =
|
|
58
|
+
null === (_a = null == obj ? void 0 : obj.constructor) || void 0 === _a
|
|
59
|
+
? void 0
|
|
60
|
+
: _a.name;
|
|
61
|
+
if (constructorName) {
|
|
62
|
+
return constructorName;
|
|
63
|
+
}
|
|
64
|
+
} catch (e) {}
|
|
65
|
+
try {
|
|
66
|
+
const zoneJsConstructorName =
|
|
67
|
+
null ===
|
|
68
|
+
(_c =
|
|
69
|
+
null ===
|
|
70
|
+
(_b =
|
|
71
|
+
null == obj ? void 0 : obj.__zone_symbol__originalInstance) ||
|
|
72
|
+
void 0 === _b
|
|
73
|
+
? void 0
|
|
74
|
+
: _b.constructor) || void 0 === _c
|
|
75
|
+
? void 0
|
|
76
|
+
: _c.name;
|
|
77
|
+
if (zoneJsConstructorName) {
|
|
78
|
+
return zoneJsConstructorName;
|
|
79
|
+
}
|
|
80
|
+
} catch (e) {}
|
|
81
|
+
return "";
|
|
82
|
+
};
|
|
83
|
+
const EMPTY_ARRAY = [];
|
|
84
|
+
const randomId = () =>
|
|
85
|
+
Math.round(Math.random() * Number.MAX_SAFE_INTEGER).toString(36);
|
|
86
|
+
const SCRIPT_TYPE = "text/partytown";
|
|
87
|
+
const defineProperty = (obj, memberName, descriptor) =>
|
|
88
|
+
Object.defineProperty(obj, memberName, {
|
|
89
|
+
...descriptor,
|
|
90
|
+
configurable: true,
|
|
61
91
|
});
|
|
62
|
-
|
|
63
|
-
|
|
92
|
+
const defineConstructorName = (Cstr, value) =>
|
|
93
|
+
defineProperty(Cstr, "name", {
|
|
94
|
+
value: value,
|
|
64
95
|
});
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
96
|
+
const definePrototypeProperty = (Cstr, memberName, descriptor) =>
|
|
97
|
+
defineProperty(Cstr.prototype, memberName, descriptor);
|
|
98
|
+
const definePrototypePropertyDescriptor = (Cstr, propertyDescriptorMap) =>
|
|
99
|
+
Object.defineProperties(Cstr.prototype, propertyDescriptorMap);
|
|
100
|
+
const definePrototypeValue = (Cstr, memberName, value) =>
|
|
101
|
+
definePrototypeProperty(Cstr, memberName, {
|
|
102
|
+
value: value,
|
|
103
|
+
writable: true,
|
|
70
104
|
});
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
105
|
+
const hasInstanceStateValue = (instance, stateKey) =>
|
|
106
|
+
stateKey in instance[InstanceStateKey];
|
|
107
|
+
const getInstanceStateValue = (instance, stateKey) =>
|
|
108
|
+
instance[InstanceStateKey][stateKey];
|
|
109
|
+
const setInstanceStateValue = (instance, stateKey, stateValue) =>
|
|
110
|
+
(instance[InstanceStateKey][stateKey] = stateValue);
|
|
111
|
+
const setWorkerRef = (ref, refId) => {
|
|
112
|
+
if (!(refId = webWorkerRefIdsByRef.get(ref))) {
|
|
113
|
+
webWorkerRefIdsByRef.set(ref, (refId = randomId()));
|
|
114
|
+
webWorkerRefsByRefId[refId] = ref;
|
|
115
|
+
}
|
|
116
|
+
return refId;
|
|
117
|
+
};
|
|
118
|
+
const getOrCreateNodeInstance = (
|
|
119
|
+
winId,
|
|
120
|
+
instanceId,
|
|
121
|
+
nodeName,
|
|
122
|
+
namespace,
|
|
123
|
+
instance
|
|
124
|
+
) => {
|
|
125
|
+
instance = webWorkerInstances.get(instanceId);
|
|
126
|
+
if (!instance && nodeName && environments[winId]) {
|
|
127
|
+
instance = environments[winId].$createNode$(
|
|
128
|
+
nodeName,
|
|
129
|
+
instanceId,
|
|
130
|
+
namespace
|
|
131
|
+
);
|
|
132
|
+
webWorkerInstances.set(instanceId, instance);
|
|
133
|
+
}
|
|
134
|
+
return instance;
|
|
135
|
+
};
|
|
136
|
+
const definePrototypeNodeType = (Cstr, nodeType) =>
|
|
137
|
+
definePrototypeValue(Cstr, "nodeType", nodeType);
|
|
138
|
+
const cachedTreeProps = (Cstr, treeProps) =>
|
|
139
|
+
treeProps.map((propName) =>
|
|
140
|
+
definePrototypeProperty(Cstr, propName, {
|
|
91
141
|
get() {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
142
|
+
let cacheKey = getInstanceCacheKey(this, propName);
|
|
143
|
+
let result = cachedStructure.get(cacheKey);
|
|
144
|
+
if (!result) {
|
|
145
|
+
result = getter(this, [propName]);
|
|
146
|
+
cachedStructure.set(cacheKey, result);
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
},
|
|
150
|
+
})
|
|
151
|
+
);
|
|
152
|
+
const getInstanceCacheKey = (instance, memberName, args) =>
|
|
153
|
+
[
|
|
154
|
+
instance[WinIdKey],
|
|
155
|
+
instance[InstanceIdKey],
|
|
156
|
+
memberName,
|
|
157
|
+
...(args || EMPTY_ARRAY).map((arg) =>
|
|
158
|
+
String(arg && arg[WinIdKey] ? arg[InstanceIdKey] : arg)
|
|
159
|
+
),
|
|
160
|
+
].join(".");
|
|
161
|
+
const cachedProps = (Cstr, propNames) =>
|
|
162
|
+
commaSplit(propNames).map((propName) =>
|
|
163
|
+
definePrototypeProperty(Cstr, propName, {
|
|
103
164
|
get() {
|
|
104
|
-
|
|
105
|
-
|
|
165
|
+
hasInstanceStateValue(this, propName) ||
|
|
166
|
+
setInstanceStateValue(this, propName, getter(this, [propName]));
|
|
167
|
+
return getInstanceStateValue(this, propName);
|
|
106
168
|
},
|
|
107
169
|
set(val) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
170
|
+
getInstanceStateValue(this, propName) !== val &&
|
|
171
|
+
setter(this, [propName], val);
|
|
172
|
+
setInstanceStateValue(this, propName, val);
|
|
173
|
+
},
|
|
174
|
+
})
|
|
175
|
+
);
|
|
176
|
+
const cachedDimensionProps = (Cstr) =>
|
|
177
|
+
getterDimensionPropNames.map((propName) =>
|
|
178
|
+
definePrototypeProperty(Cstr, propName, {
|
|
113
179
|
get() {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
for (propName in obj) {
|
|
148
|
-
propValue = obj[propName];
|
|
149
|
-
(includeFunctions || "function" != typeof propValue) && (serializedObj[propName] = serializeForMain(winId, instanceId, propValue, added));
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
return serializedObj;
|
|
153
|
-
};
|
|
154
|
-
const serializeInstanceForMain = (instance, value) => instance ? serializeForMain(instance[WinIdKey], instance[InstanceIdKey], value) : [ 0, value ];
|
|
155
|
-
const deserializeFromMain = (winId, instanceId, applyPath, serializedValueTransfer, serializedType, serializedValue, obj, key) => {
|
|
156
|
-
if (serializedValueTransfer) {
|
|
157
|
-
serializedType = serializedValueTransfer[0];
|
|
158
|
-
serializedValue = serializedValueTransfer[1];
|
|
159
|
-
if (0 === serializedType || 11 === serializedType || 12 === serializedType) {
|
|
160
|
-
return serializedValue;
|
|
161
|
-
}
|
|
162
|
-
if (4 === serializedType) {
|
|
163
|
-
return deserializeRefFromMain(applyPath, serializedValue);
|
|
164
|
-
}
|
|
165
|
-
if (6 === serializedType) {
|
|
166
|
-
return winId && applyPath.length > 0 ? (...args) => callMethod(environments[winId].$window$, applyPath, args, 1) : noop;
|
|
167
|
-
}
|
|
168
|
-
if (3 === serializedType) {
|
|
169
|
-
return getOrCreateSerializedInstance(serializedValue);
|
|
170
|
-
}
|
|
171
|
-
if (7 === serializedType) {
|
|
172
|
-
return new NodeList(serializedValue.map(getOrCreateSerializedInstance));
|
|
173
|
-
}
|
|
174
|
-
if (10 === serializedType) {
|
|
175
|
-
return new Attr(serializedValue);
|
|
176
|
-
}
|
|
177
|
-
if (1 === serializedType) {
|
|
178
|
-
return serializedValue.map((v => deserializeFromMain(winId, instanceId, applyPath, v)));
|
|
179
|
-
}
|
|
180
|
-
if (14 === serializedType) {
|
|
181
|
-
return new CustomError(serializedValue);
|
|
182
|
-
}
|
|
183
|
-
obj = {};
|
|
184
|
-
for (key in serializedValue) {
|
|
185
|
-
obj[key] = deserializeFromMain(winId, instanceId, [ ...applyPath, key ], serializedValue[key]);
|
|
186
|
-
}
|
|
187
|
-
if (13 === serializedType) {
|
|
188
|
-
return new environments[winId].$window$.CSSStyleDeclaration(winId, instanceId, applyPath, obj);
|
|
189
|
-
}
|
|
190
|
-
if (5 === serializedType) {
|
|
191
|
-
if ("message" === obj.type && obj.origin) {
|
|
192
|
-
let postMessageKey = JSON.stringify(obj.data);
|
|
193
|
-
let postMessageData = postMessages.find((pm => pm.$data$ === postMessageKey));
|
|
194
|
-
let env;
|
|
195
|
-
if (postMessageData) {
|
|
196
|
-
env = environments[postMessageData.$winId$];
|
|
197
|
-
if (env) {
|
|
198
|
-
obj.source = env.$window$;
|
|
199
|
-
obj.origin = env.$location$.origin;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
return new Proxy(new Event(obj.type, obj), {
|
|
204
|
-
get: (target, propName) => propName in obj ? obj[propName] : "function" == typeof target[String(propName)] ? noop : target[String(propName)]
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
if (2 === serializedType) {
|
|
208
|
-
return obj;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
};
|
|
212
|
-
const getOrCreateSerializedInstance = ([winId, instanceId, nodeName]) => instanceId === winId && environments[winId] ? environments[winId].$window$ : getOrCreateNodeInstance(winId, instanceId, nodeName);
|
|
213
|
-
const deserializeRefFromMain = (applyPath, {$winId$: $winId$, $instanceId$: $instanceId$, $nodeName$: $nodeName$, $refId$: $refId$}) => {
|
|
214
|
-
webWorkerRefsByRefId[$refId$] || webWorkerRefIdsByRef.set(webWorkerRefsByRefId[$refId$] = function(...args) {
|
|
215
|
-
const instance = getOrCreateNodeInstance($winId$, $instanceId$, $nodeName$);
|
|
216
|
-
return callMethod(instance, applyPath, args);
|
|
217
|
-
}, $refId$);
|
|
218
|
-
return webWorkerRefsByRefId[$refId$];
|
|
219
|
-
};
|
|
220
|
-
class CustomError extends Error {
|
|
221
|
-
constructor(errorObject) {
|
|
222
|
-
super(errorObject.message);
|
|
223
|
-
this.name = errorObject.name;
|
|
224
|
-
this.message = errorObject.message;
|
|
225
|
-
this.stack = errorObject.stack;
|
|
180
|
+
const dimension = cachedDimensions.get(
|
|
181
|
+
getInstanceCacheKey(this, propName)
|
|
182
|
+
);
|
|
183
|
+
if ("number" == typeof dimension) {
|
|
184
|
+
return dimension;
|
|
185
|
+
}
|
|
186
|
+
const groupedDimensions = getter(
|
|
187
|
+
this,
|
|
188
|
+
[propName],
|
|
189
|
+
getterDimensionPropNames
|
|
190
|
+
);
|
|
191
|
+
if (groupedDimensions && "object" == typeof groupedDimensions) {
|
|
192
|
+
Object.entries(groupedDimensions).map(
|
|
193
|
+
([dimensionPropName, value]) =>
|
|
194
|
+
cachedDimensions.set(
|
|
195
|
+
getInstanceCacheKey(this, dimensionPropName),
|
|
196
|
+
value
|
|
197
|
+
)
|
|
198
|
+
);
|
|
199
|
+
return groupedDimensions[propName];
|
|
200
|
+
}
|
|
201
|
+
return groupedDimensions;
|
|
202
|
+
},
|
|
203
|
+
})
|
|
204
|
+
);
|
|
205
|
+
const cachedDimensionMethods = (Cstr, dimensionMethodNames) =>
|
|
206
|
+
dimensionMethodNames.map((methodName) => {
|
|
207
|
+
Cstr.prototype[methodName] = function (...args) {
|
|
208
|
+
let cacheKey = getInstanceCacheKey(this, methodName, args);
|
|
209
|
+
let dimensions = cachedDimensions.get(cacheKey);
|
|
210
|
+
if (!dimensions) {
|
|
211
|
+
dimensions = callMethod(this, [methodName], args);
|
|
212
|
+
cachedDimensions.set(cacheKey, dimensions);
|
|
226
213
|
}
|
|
214
|
+
return dimensions;
|
|
215
|
+
};
|
|
216
|
+
});
|
|
217
|
+
const serializeForMain = ($winId$, $instanceId$, value, added, type) =>
|
|
218
|
+
void 0 !== value && (type = typeof value)
|
|
219
|
+
? "string" === type ||
|
|
220
|
+
"boolean" === type ||
|
|
221
|
+
"number" === type ||
|
|
222
|
+
null == value
|
|
223
|
+
? [0, value]
|
|
224
|
+
: "function" === type
|
|
225
|
+
? [
|
|
226
|
+
4,
|
|
227
|
+
{
|
|
228
|
+
$winId$: $winId$,
|
|
229
|
+
$instanceId$: $instanceId$,
|
|
230
|
+
$refId$: setWorkerRef(value),
|
|
231
|
+
},
|
|
232
|
+
]
|
|
233
|
+
: (added = added || new Set()) && Array.isArray(value)
|
|
234
|
+
? added.has(value)
|
|
235
|
+
? [1, []]
|
|
236
|
+
: added.add(value) && [
|
|
237
|
+
1,
|
|
238
|
+
value.map((v) =>
|
|
239
|
+
serializeForMain($winId$, $instanceId$, v, added)
|
|
240
|
+
),
|
|
241
|
+
]
|
|
242
|
+
: "object" === type
|
|
243
|
+
? value[InstanceIdKey]
|
|
244
|
+
? [3, [value[WinIdKey], value[InstanceIdKey]]]
|
|
245
|
+
: value instanceof Event
|
|
246
|
+
? [
|
|
247
|
+
5,
|
|
248
|
+
serializeObjectForMain(
|
|
249
|
+
$winId$,
|
|
250
|
+
$instanceId$,
|
|
251
|
+
value,
|
|
252
|
+
false,
|
|
253
|
+
added
|
|
254
|
+
),
|
|
255
|
+
]
|
|
256
|
+
: supportsTrustedHTML && value instanceof TrustedHTML
|
|
257
|
+
? [0, value.toString()]
|
|
258
|
+
: value instanceof ArrayBuffer
|
|
259
|
+
? [8, value]
|
|
260
|
+
: ArrayBuffer.isView(value)
|
|
261
|
+
? [9, value.buffer, getConstructorName(value)]
|
|
262
|
+
: [
|
|
263
|
+
2,
|
|
264
|
+
serializeObjectForMain($winId$, $instanceId$, value, true, added),
|
|
265
|
+
]
|
|
266
|
+
: void 0
|
|
267
|
+
: value;
|
|
268
|
+
const supportsTrustedHTML = "undefined" != typeof TrustedHTML;
|
|
269
|
+
const serializeObjectForMain = (
|
|
270
|
+
winId,
|
|
271
|
+
instanceId,
|
|
272
|
+
obj,
|
|
273
|
+
includeFunctions,
|
|
274
|
+
added,
|
|
275
|
+
serializedObj,
|
|
276
|
+
propName,
|
|
277
|
+
propValue
|
|
278
|
+
) => {
|
|
279
|
+
serializedObj = {};
|
|
280
|
+
if (!added.has(obj)) {
|
|
281
|
+
added.add(obj);
|
|
282
|
+
for (propName in obj) {
|
|
283
|
+
propValue = obj[propName];
|
|
284
|
+
(includeFunctions || "function" != typeof propValue) &&
|
|
285
|
+
(serializedObj[propName] = serializeForMain(
|
|
286
|
+
winId,
|
|
287
|
+
instanceId,
|
|
288
|
+
propValue,
|
|
289
|
+
added
|
|
290
|
+
));
|
|
291
|
+
}
|
|
227
292
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
293
|
+
return serializedObj;
|
|
294
|
+
};
|
|
295
|
+
const serializeInstanceForMain = (instance, value) =>
|
|
296
|
+
instance
|
|
297
|
+
? serializeForMain(instance[WinIdKey], instance[InstanceIdKey], value)
|
|
298
|
+
: [0, value];
|
|
299
|
+
const deserializeFromMain = (
|
|
300
|
+
winId,
|
|
301
|
+
instanceId,
|
|
302
|
+
applyPath,
|
|
303
|
+
serializedValueTransfer,
|
|
304
|
+
serializedType,
|
|
305
|
+
serializedValue,
|
|
306
|
+
obj,
|
|
307
|
+
key
|
|
308
|
+
) => {
|
|
309
|
+
if (serializedValueTransfer) {
|
|
310
|
+
serializedType = serializedValueTransfer[0];
|
|
311
|
+
serializedValue = serializedValueTransfer[1];
|
|
312
|
+
if (
|
|
313
|
+
0 === serializedType ||
|
|
314
|
+
11 === serializedType ||
|
|
315
|
+
12 === serializedType
|
|
316
|
+
) {
|
|
317
|
+
return serializedValue;
|
|
318
|
+
}
|
|
319
|
+
if (4 === serializedType) {
|
|
320
|
+
return deserializeRefFromMain(applyPath, serializedValue);
|
|
321
|
+
}
|
|
322
|
+
if (6 === serializedType) {
|
|
323
|
+
return winId && applyPath.length > 0
|
|
324
|
+
? (...args) =>
|
|
325
|
+
callMethod(environments[winId].$window$, applyPath, args, 1)
|
|
326
|
+
: noop;
|
|
327
|
+
}
|
|
328
|
+
if (3 === serializedType) {
|
|
329
|
+
return getOrCreateSerializedInstance(serializedValue);
|
|
330
|
+
}
|
|
331
|
+
if (7 === serializedType) {
|
|
332
|
+
return new NodeList(serializedValue.map(getOrCreateSerializedInstance));
|
|
333
|
+
}
|
|
334
|
+
if (10 === serializedType) {
|
|
335
|
+
return new Attr(serializedValue);
|
|
336
|
+
}
|
|
337
|
+
if (1 === serializedType) {
|
|
338
|
+
return serializedValue.map((v) =>
|
|
339
|
+
deserializeFromMain(winId, instanceId, applyPath, v)
|
|
340
|
+
);
|
|
341
|
+
}
|
|
342
|
+
if (14 === serializedType) {
|
|
343
|
+
return new CustomError(serializedValue);
|
|
344
|
+
}
|
|
345
|
+
obj = {};
|
|
346
|
+
for (key in serializedValue) {
|
|
347
|
+
obj[key] = deserializeFromMain(
|
|
348
|
+
winId,
|
|
349
|
+
instanceId,
|
|
350
|
+
[...applyPath, key],
|
|
351
|
+
serializedValue[key]
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
if (13 === serializedType) {
|
|
355
|
+
return new environments[winId].$window$.CSSStyleDeclaration(
|
|
356
|
+
winId,
|
|
357
|
+
instanceId,
|
|
358
|
+
applyPath,
|
|
359
|
+
obj
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
if (5 === serializedType) {
|
|
363
|
+
if ("message" === obj.type && obj.origin) {
|
|
364
|
+
let postMessageKey = JSON.stringify(obj.data);
|
|
365
|
+
let postMessageData = postMessages.find(
|
|
366
|
+
(pm) => pm.$data$ === postMessageKey
|
|
367
|
+
);
|
|
368
|
+
let env;
|
|
369
|
+
if (postMessageData) {
|
|
370
|
+
env = environments[postMessageData.$winId$];
|
|
371
|
+
if (env) {
|
|
372
|
+
obj.source = env.$window$;
|
|
373
|
+
obj.origin = env.$location$.origin;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
252
376
|
}
|
|
377
|
+
return new Proxy(new Event(obj.type, obj), {
|
|
378
|
+
get: (target, propName) =>
|
|
379
|
+
propName in obj
|
|
380
|
+
? obj[propName]
|
|
381
|
+
: "function" == typeof target[String(propName)]
|
|
382
|
+
? noop
|
|
383
|
+
: target[String(propName)],
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
if (2 === serializedType) {
|
|
387
|
+
return obj;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
};
|
|
391
|
+
const getOrCreateSerializedInstance = ([winId, instanceId, nodeName]) =>
|
|
392
|
+
instanceId === winId && environments[winId]
|
|
393
|
+
? environments[winId].$window$
|
|
394
|
+
: getOrCreateNodeInstance(winId, instanceId, nodeName);
|
|
395
|
+
const deserializeRefFromMain = (
|
|
396
|
+
applyPath,
|
|
397
|
+
{
|
|
398
|
+
$winId$: $winId$,
|
|
399
|
+
$instanceId$: $instanceId$,
|
|
400
|
+
$nodeName$: $nodeName$,
|
|
401
|
+
$refId$: $refId$,
|
|
402
|
+
}
|
|
403
|
+
) => {
|
|
404
|
+
webWorkerRefsByRefId[$refId$] ||
|
|
405
|
+
webWorkerRefIdsByRef.set(
|
|
406
|
+
(webWorkerRefsByRefId[$refId$] = function (...args) {
|
|
407
|
+
const instance = getOrCreateNodeInstance(
|
|
408
|
+
$winId$,
|
|
409
|
+
$instanceId$,
|
|
410
|
+
$nodeName$
|
|
411
|
+
);
|
|
412
|
+
return callMethod(instance, applyPath, args);
|
|
413
|
+
}),
|
|
414
|
+
$refId$
|
|
415
|
+
);
|
|
416
|
+
return webWorkerRefsByRefId[$refId$];
|
|
417
|
+
};
|
|
418
|
+
class CustomError extends Error {
|
|
419
|
+
constructor(errorObject) {
|
|
420
|
+
super(errorObject.message);
|
|
421
|
+
this.name = errorObject.name;
|
|
422
|
+
this.message = errorObject.message;
|
|
423
|
+
this.stack = errorObject.stack;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
class NodeList {
|
|
427
|
+
constructor(nodes) {
|
|
428
|
+
(this._ = nodes).map((node, index) => (this[index] = node));
|
|
429
|
+
}
|
|
430
|
+
entries() {
|
|
431
|
+
return this._.entries();
|
|
432
|
+
}
|
|
433
|
+
forEach(cb, thisArg) {
|
|
434
|
+
this._.map(cb, thisArg);
|
|
435
|
+
}
|
|
436
|
+
item(index) {
|
|
437
|
+
return this[index];
|
|
438
|
+
}
|
|
439
|
+
keys() {
|
|
440
|
+
return this._.keys();
|
|
441
|
+
}
|
|
442
|
+
get length() {
|
|
443
|
+
return len(this._);
|
|
444
|
+
}
|
|
445
|
+
values() {
|
|
446
|
+
return this._.values();
|
|
447
|
+
}
|
|
448
|
+
[Symbol.iterator]() {
|
|
449
|
+
return this._[Symbol.iterator]();
|
|
253
450
|
}
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
451
|
+
}
|
|
452
|
+
const Attr = class {
|
|
453
|
+
constructor(serializedAttr) {
|
|
454
|
+
this.name = serializedAttr[0];
|
|
455
|
+
this.value = serializedAttr[1];
|
|
456
|
+
}
|
|
457
|
+
get nodeName() {
|
|
458
|
+
return this.name;
|
|
459
|
+
}
|
|
460
|
+
get nodeType() {
|
|
461
|
+
return 2;
|
|
462
|
+
}
|
|
463
|
+
};
|
|
464
|
+
const warnCrossOrgin = (apiType, apiName, env) =>
|
|
465
|
+
console.warn(
|
|
466
|
+
`Partytown unable to ${apiType} cross-origin ${apiName}: ` +
|
|
467
|
+
env.$location$
|
|
468
|
+
);
|
|
469
|
+
const logWorker = (msg, winId) => {
|
|
470
|
+
try {
|
|
471
|
+
const config = webWorkerCtx.$config$;
|
|
472
|
+
if (config.logStackTraces) {
|
|
473
|
+
const frames = new Error().stack.split("\n");
|
|
474
|
+
const i = frames.findIndex((f) => f.includes("logWorker"));
|
|
475
|
+
msg += "\n" + frames.slice(i + 1).join("\n");
|
|
476
|
+
}
|
|
477
|
+
let prefix;
|
|
478
|
+
let color;
|
|
479
|
+
if (winId) {
|
|
480
|
+
prefix = `Worker (${normalizedWinId(winId)}) 🎉`;
|
|
481
|
+
color = winColor(winId);
|
|
482
|
+
} else {
|
|
483
|
+
prefix = self.name;
|
|
484
|
+
color = "#9844bf";
|
|
485
|
+
}
|
|
486
|
+
if (webWorkerCtx.lastLog !== msg) {
|
|
487
|
+
webWorkerCtx.lastLog = msg;
|
|
488
|
+
console.debug.apply(console, [
|
|
489
|
+
`%c${prefix}`,
|
|
490
|
+
`background: ${color}; color: white; padding: 2px 3px; border-radius: 2px; font-size: 0.8em;`,
|
|
491
|
+
msg,
|
|
492
|
+
]);
|
|
493
|
+
}
|
|
494
|
+
} catch (e) {}
|
|
495
|
+
};
|
|
496
|
+
const winIds = [];
|
|
497
|
+
const normalizedWinId = (winId) => {
|
|
498
|
+
winIds.includes(winId) || winIds.push(winId);
|
|
499
|
+
return winIds.indexOf(winId) + 1;
|
|
500
|
+
};
|
|
501
|
+
const winColor = (winId) => {
|
|
502
|
+
const colors = ["#00309e", "#ea3655", "#eea727"];
|
|
503
|
+
const index = normalizedWinId(winId) - 1;
|
|
504
|
+
return colors[index] || colors[colors.length - 1];
|
|
505
|
+
};
|
|
506
|
+
const getTargetProp = (target, applyPath) => {
|
|
507
|
+
let n = "";
|
|
508
|
+
if (target) {
|
|
509
|
+
const cstrName = getConstructorName(target);
|
|
510
|
+
if ("Window" === cstrName) {
|
|
511
|
+
n = "";
|
|
512
|
+
} else if ("string" == typeof target[InstanceDataKey]) {
|
|
513
|
+
let nodeName = target[InstanceDataKey];
|
|
514
|
+
n =
|
|
515
|
+
"#text" === nodeName
|
|
516
|
+
? "textNode."
|
|
517
|
+
: "#comment" === nodeName
|
|
518
|
+
? "commentNode."
|
|
519
|
+
: "#document" === nodeName
|
|
520
|
+
? "document."
|
|
521
|
+
: "html" === nodeName
|
|
522
|
+
? "doctype."
|
|
523
|
+
: nodeName.toLowerCase() + ".";
|
|
524
|
+
} else {
|
|
525
|
+
n =
|
|
526
|
+
"nodeType" in target && 2 === target.nodeType
|
|
527
|
+
? "attributes."
|
|
528
|
+
: "CanvasRenderingContext2D" === cstrName
|
|
529
|
+
? "context2D."
|
|
530
|
+
: "CanvasRenderingContextWebGL" === cstrName
|
|
531
|
+
? "contextWebGL."
|
|
532
|
+
: "CSSStyleDeclaration" === cstrName
|
|
533
|
+
? "style."
|
|
534
|
+
: "MutationObserver" === cstrName
|
|
535
|
+
? "mutationObserver."
|
|
536
|
+
: "NamedNodeMap" === cstrName
|
|
537
|
+
? "namedNodeMap."
|
|
538
|
+
: "ResizeObserver" === cstrName
|
|
539
|
+
? "resizeObserver."
|
|
540
|
+
: cstrName.substring(0, 1).toLowerCase() +
|
|
541
|
+
cstrName.substring(1) +
|
|
542
|
+
".";
|
|
543
|
+
}
|
|
544
|
+
target[ApplyPathKey] &&
|
|
545
|
+
target[ApplyPathKey].length &&
|
|
546
|
+
(n += [...target[ApplyPathKey]].join(".") + ".");
|
|
547
|
+
}
|
|
548
|
+
if (applyPath.length > 1) {
|
|
549
|
+
const first = applyPath.slice(0, applyPath.length - 1);
|
|
550
|
+
const last = applyPath[applyPath.length - 1];
|
|
551
|
+
if (!isNaN(last)) {
|
|
552
|
+
return n + `${first.join(".")}[${last}]`;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
return n + applyPath.join(".");
|
|
556
|
+
};
|
|
557
|
+
const getLogValue = (applyPath, v) => {
|
|
558
|
+
const type = typeof v;
|
|
559
|
+
if (void 0 === v) {
|
|
560
|
+
return "undefined";
|
|
561
|
+
}
|
|
562
|
+
if ("boolean" === type || "number" === type || null == v) {
|
|
563
|
+
return JSON.stringify(v);
|
|
564
|
+
}
|
|
565
|
+
if ("string" === type) {
|
|
566
|
+
return applyPath.includes("cookie")
|
|
567
|
+
? JSON.stringify(v.slice(0, 10) + "...")
|
|
568
|
+
: JSON.stringify(v.length > 50 ? v.slice(0, 40) + "..." : v);
|
|
569
|
+
}
|
|
570
|
+
if (Array.isArray(v)) {
|
|
571
|
+
return `[${v.map(getLogValue).join(", ")}]`;
|
|
572
|
+
}
|
|
573
|
+
if ("object" === type) {
|
|
574
|
+
const instanceId = v[InstanceIdKey];
|
|
575
|
+
const cstrName = getConstructorName(v);
|
|
576
|
+
if ("string" == typeof instanceId) {
|
|
577
|
+
if ("Window" === cstrName) {
|
|
578
|
+
return "window";
|
|
258
579
|
}
|
|
259
|
-
|
|
260
|
-
|
|
580
|
+
if ("string" == typeof v[InstanceDataKey]) {
|
|
581
|
+
if (1 === v.nodeType) {
|
|
582
|
+
return `<${v[InstanceDataKey].toLowerCase()}>`;
|
|
583
|
+
}
|
|
584
|
+
if (10 === v.nodeType) {
|
|
585
|
+
return `<!DOCTYPE ${v[InstanceDataKey]}>`;
|
|
586
|
+
}
|
|
587
|
+
if (v.nodeType <= 11) {
|
|
588
|
+
return v[InstanceDataKey];
|
|
589
|
+
}
|
|
261
590
|
}
|
|
262
|
-
|
|
263
|
-
|
|
591
|
+
return "¯\\_(ツ)_/¯ instance obj";
|
|
592
|
+
}
|
|
593
|
+
return v[Symbol.iterator]
|
|
594
|
+
? `[${Array.from(v)
|
|
595
|
+
.map((i) => getLogValue(applyPath, i))
|
|
596
|
+
.join(", ")}]`
|
|
597
|
+
: "value" in v
|
|
598
|
+
? "string" == typeof v.value
|
|
599
|
+
? `"${v.value}"`
|
|
600
|
+
: objToString(v.value)
|
|
601
|
+
: objToString(v);
|
|
602
|
+
}
|
|
603
|
+
return ((v) => "object" == typeof v && v && v.then)(v)
|
|
604
|
+
? "Promise"
|
|
605
|
+
: "function" === type
|
|
606
|
+
? `ƒ() ${v.name || ""}`.trim()
|
|
607
|
+
: `¯\\_(ツ)_/¯ ${String(v)}`.trim();
|
|
608
|
+
};
|
|
609
|
+
const objToString = (obj) => {
|
|
610
|
+
const s = [];
|
|
611
|
+
for (let key in obj) {
|
|
612
|
+
const value = obj[key];
|
|
613
|
+
const type = typeof value;
|
|
614
|
+
"string" === type
|
|
615
|
+
? s.push(`${key}: "${value}"`)
|
|
616
|
+
: "function" === type
|
|
617
|
+
? s.push(`${key}: ƒ`)
|
|
618
|
+
: Array.isArray(type)
|
|
619
|
+
? s.push(`${key}: [..]`)
|
|
620
|
+
: "object" === type && value
|
|
621
|
+
? s.push(`${key}: {..}`)
|
|
622
|
+
: s.push(`${key}: ${String(value)}`);
|
|
623
|
+
}
|
|
624
|
+
let str = s.join(", ");
|
|
625
|
+
str.length > 200 && (str = str.substring(0, 200) + "..");
|
|
626
|
+
return `{ ${str} }`;
|
|
627
|
+
};
|
|
628
|
+
const logDimensionCacheClearStyle = (target, propName) => {
|
|
629
|
+
(webWorkerCtx.$config$.logGetters || webWorkerCtx.$config$.logSetters) &&
|
|
630
|
+
logWorker(
|
|
631
|
+
`Dimension cache cleared from style.${propName} setter`,
|
|
632
|
+
target[WinIdKey]
|
|
633
|
+
);
|
|
634
|
+
};
|
|
635
|
+
const logDimensionCacheClearMethod = (target, methodName) => {
|
|
636
|
+
(webWorkerCtx.$config$.logGetters || webWorkerCtx.$config$.logCalls) &&
|
|
637
|
+
logWorker(
|
|
638
|
+
`Dimension cache cleared from method call ${methodName}()`,
|
|
639
|
+
target[WinIdKey]
|
|
640
|
+
);
|
|
641
|
+
};
|
|
642
|
+
const taskQueue = [];
|
|
643
|
+
const queue = (
|
|
644
|
+
instance,
|
|
645
|
+
$applyPath$,
|
|
646
|
+
callType,
|
|
647
|
+
$assignInstanceId$,
|
|
648
|
+
$groupedGetters$,
|
|
649
|
+
buffer
|
|
650
|
+
) => {
|
|
651
|
+
if (instance[ApplyPathKey]) {
|
|
652
|
+
taskQueue.push({
|
|
653
|
+
$winId$: instance[WinIdKey],
|
|
654
|
+
$instanceId$: instance[InstanceIdKey],
|
|
655
|
+
$applyPath$: [...instance[ApplyPathKey], ...$applyPath$],
|
|
656
|
+
$assignInstanceId$: $assignInstanceId$,
|
|
657
|
+
$groupedGetters$: $groupedGetters$,
|
|
658
|
+
});
|
|
659
|
+
taskQueue[len(taskQueue) - 1].$debug$ = ((
|
|
660
|
+
target,
|
|
661
|
+
applyPath,
|
|
662
|
+
callType
|
|
663
|
+
) => {
|
|
664
|
+
let m = getTargetProp(target, applyPath);
|
|
665
|
+
1 === callType
|
|
666
|
+
? (m += " (blocking)")
|
|
667
|
+
: 2 === callType
|
|
668
|
+
? (m += " (non-blocking)")
|
|
669
|
+
: 3 === callType && (m += " (non-blocking, no-side-effect)");
|
|
670
|
+
return m.trim();
|
|
671
|
+
})(instance, $applyPath$, callType);
|
|
672
|
+
buffer &&
|
|
673
|
+
3 !== callType &&
|
|
674
|
+
console.error("buffer must be sent NonBlockingNoSideEffect");
|
|
675
|
+
if (3 === callType) {
|
|
676
|
+
webWorkerCtx.$postMessage$(
|
|
677
|
+
[
|
|
678
|
+
12,
|
|
679
|
+
{
|
|
680
|
+
$msgId$: randomId(),
|
|
681
|
+
$tasks$: [...taskQueue],
|
|
682
|
+
},
|
|
683
|
+
],
|
|
684
|
+
buffer
|
|
685
|
+
? [buffer instanceof ArrayBuffer ? buffer : buffer.buffer]
|
|
686
|
+
: void 0
|
|
687
|
+
);
|
|
688
|
+
taskQueue.length = 0;
|
|
689
|
+
} else if (1 === callType) {
|
|
690
|
+
return sendToMain(true);
|
|
691
|
+
}
|
|
692
|
+
webWorkerCtx.$asyncMsgTimer$ = setTimeout(sendToMain, 20);
|
|
693
|
+
}
|
|
694
|
+
};
|
|
695
|
+
const sendToMain = (isBlocking) => {
|
|
696
|
+
clearTimeout(webWorkerCtx.$asyncMsgTimer$);
|
|
697
|
+
if (len(taskQueue)) {
|
|
698
|
+
webWorkerCtx.$config$.logMainAccess &&
|
|
699
|
+
logWorker(`Main access, tasks sent: ${taskQueue.length}`);
|
|
700
|
+
const endTask = taskQueue[len(taskQueue) - 1];
|
|
701
|
+
const accessReq = {
|
|
702
|
+
$msgId$: randomId(),
|
|
703
|
+
$tasks$: [...taskQueue],
|
|
704
|
+
};
|
|
705
|
+
taskQueue.length = 0;
|
|
706
|
+
if (isBlocking) {
|
|
707
|
+
const accessRsp = ((webWorkerCtx, accessReq) => {
|
|
708
|
+
const sharedDataBuffer = webWorkerCtx.$sharedDataBuffer$;
|
|
709
|
+
const sharedData = new Int32Array(sharedDataBuffer);
|
|
710
|
+
Atomics.store(sharedData, 0, 0);
|
|
711
|
+
webWorkerCtx.$postMessage$([11, accessReq]);
|
|
712
|
+
Atomics.wait(sharedData, 0, 0);
|
|
713
|
+
let dataLength = Atomics.load(sharedData, 0);
|
|
714
|
+
let accessRespStr = "";
|
|
715
|
+
let i = 0;
|
|
716
|
+
for (; i < dataLength; i++) {
|
|
717
|
+
accessRespStr += String.fromCharCode(sharedData[i + 1]);
|
|
718
|
+
}
|
|
719
|
+
return JSON.parse(accessRespStr);
|
|
720
|
+
})(webWorkerCtx, accessReq);
|
|
721
|
+
const isPromise = accessRsp.$isPromise$;
|
|
722
|
+
const rtnValue = deserializeFromMain(
|
|
723
|
+
endTask.$winId$,
|
|
724
|
+
endTask.$instanceId$,
|
|
725
|
+
endTask.$applyPath$,
|
|
726
|
+
accessRsp.$rtnValue$
|
|
727
|
+
);
|
|
728
|
+
if (accessRsp.$error$) {
|
|
729
|
+
if (isPromise) {
|
|
730
|
+
return Promise.reject(accessRsp.$error$);
|
|
731
|
+
}
|
|
732
|
+
throw new Error(accessRsp.$error$);
|
|
264
733
|
}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
734
|
+
return isPromise ? Promise.resolve(rtnValue) : rtnValue;
|
|
735
|
+
}
|
|
736
|
+
webWorkerCtx.$postMessage$([12, accessReq]);
|
|
737
|
+
}
|
|
738
|
+
};
|
|
739
|
+
const getter = (instance, applyPath, groupedGetters, rtnValue) => {
|
|
740
|
+
if (webWorkerCtx.$config$.get) {
|
|
741
|
+
rtnValue = webWorkerCtx.$config$.get(
|
|
742
|
+
createHookOptions(instance, applyPath)
|
|
743
|
+
);
|
|
744
|
+
if (rtnValue !== HookContinue) {
|
|
745
|
+
return rtnValue;
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
rtnValue = queue(instance, applyPath, 1, void 0, groupedGetters);
|
|
749
|
+
((
|
|
750
|
+
target,
|
|
751
|
+
applyPath,
|
|
752
|
+
rtnValue,
|
|
753
|
+
restrictedToWorker = false,
|
|
754
|
+
groupedGetters = false
|
|
755
|
+
) => {
|
|
756
|
+
if (webWorkerCtx.$config$.logGetters) {
|
|
268
757
|
try {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
let color;
|
|
277
|
-
if (winId) {
|
|
278
|
-
prefix = `Worker (${normalizedWinId(winId)}) 🎉`;
|
|
279
|
-
color = winColor(winId);
|
|
280
|
-
} else {
|
|
281
|
-
prefix = self.name;
|
|
282
|
-
color = "#9844bf";
|
|
283
|
-
}
|
|
284
|
-
if (webWorkerCtx.lastLog !== msg) {
|
|
285
|
-
webWorkerCtx.lastLog = msg;
|
|
286
|
-
console.debug.apply(console, [ `%c${prefix}`, `background: ${color}; color: white; padding: 2px 3px; border-radius: 2px; font-size: 0.8em;`, msg ]);
|
|
287
|
-
}
|
|
758
|
+
const msg = `Get ${getTargetProp(
|
|
759
|
+
target,
|
|
760
|
+
applyPath
|
|
761
|
+
)}, returned: ${getLogValue(applyPath, rtnValue)}${
|
|
762
|
+
restrictedToWorker ? " (restricted to worker)" : ""
|
|
763
|
+
}${groupedGetters ? " (grouped getter)" : ""}`;
|
|
764
|
+
msg.includes("Symbol(") || logWorker(msg, target[WinIdKey]);
|
|
288
765
|
} catch (e) {}
|
|
766
|
+
}
|
|
767
|
+
})(instance, applyPath, rtnValue, false, !!groupedGetters);
|
|
768
|
+
return rtnValue;
|
|
769
|
+
};
|
|
770
|
+
const setter = (instance, applyPath, value, hookSetterValue) => {
|
|
771
|
+
if (webWorkerCtx.$config$.set) {
|
|
772
|
+
hookSetterValue = webWorkerCtx.$config$.set({
|
|
773
|
+
value: value,
|
|
774
|
+
prevent: HookPrevent,
|
|
775
|
+
...createHookOptions(instance, applyPath),
|
|
776
|
+
});
|
|
777
|
+
if (hookSetterValue === HookPrevent) {
|
|
778
|
+
return;
|
|
779
|
+
}
|
|
780
|
+
hookSetterValue !== HookContinue && (value = hookSetterValue);
|
|
781
|
+
}
|
|
782
|
+
if (dimensionChangingSetterNames.some((s) => applyPath.includes(s))) {
|
|
783
|
+
cachedDimensions.clear();
|
|
784
|
+
((target, propName) => {
|
|
785
|
+
(webWorkerCtx.$config$.logGetters ||
|
|
786
|
+
webWorkerCtx.$config$.logSetters) &&
|
|
787
|
+
logWorker(
|
|
788
|
+
`Dimension cache cleared from setter "${propName}"`,
|
|
789
|
+
target[WinIdKey]
|
|
790
|
+
);
|
|
791
|
+
})(instance, applyPath[applyPath.length - 1]);
|
|
792
|
+
}
|
|
793
|
+
applyPath = [...applyPath, serializeInstanceForMain(instance, value), 0];
|
|
794
|
+
((target, applyPath, value, restrictedToWorker = false) => {
|
|
795
|
+
if (webWorkerCtx.$config$.logSetters) {
|
|
796
|
+
try {
|
|
797
|
+
applyPath = applyPath.slice(0, applyPath.length - 2);
|
|
798
|
+
logWorker(
|
|
799
|
+
`Set ${getTargetProp(target, applyPath)}, value: ${getLogValue(
|
|
800
|
+
applyPath,
|
|
801
|
+
value
|
|
802
|
+
)}${restrictedToWorker ? " (restricted to worker)" : ""}`,
|
|
803
|
+
target[WinIdKey]
|
|
804
|
+
);
|
|
805
|
+
} catch (e) {}
|
|
806
|
+
}
|
|
807
|
+
})(instance, applyPath, value);
|
|
808
|
+
queue(instance, applyPath, 2);
|
|
809
|
+
};
|
|
810
|
+
const callMethod = (
|
|
811
|
+
instance,
|
|
812
|
+
applyPath,
|
|
813
|
+
args,
|
|
814
|
+
callType,
|
|
815
|
+
assignInstanceId,
|
|
816
|
+
buffer,
|
|
817
|
+
rtnValue,
|
|
818
|
+
methodName
|
|
819
|
+
) => {
|
|
820
|
+
if (webWorkerCtx.$config$.apply) {
|
|
821
|
+
rtnValue = webWorkerCtx.$config$.apply({
|
|
822
|
+
args: args,
|
|
823
|
+
...createHookOptions(instance, applyPath),
|
|
824
|
+
});
|
|
825
|
+
if (rtnValue !== HookContinue) {
|
|
826
|
+
return rtnValue;
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
methodName = applyPath[len(applyPath) - 1];
|
|
830
|
+
applyPath = [...applyPath, serializeInstanceForMain(instance, args)];
|
|
831
|
+
callType = callType || (nonBlockingMethods.includes(methodName) ? 2 : 1);
|
|
832
|
+
if (
|
|
833
|
+
"setAttribute" === methodName &&
|
|
834
|
+
hasInstanceStateValue(instance, args[0])
|
|
835
|
+
) {
|
|
836
|
+
setInstanceStateValue(instance, args[0], args[1]);
|
|
837
|
+
} else if (structureChangingMethodNames.includes(methodName)) {
|
|
838
|
+
cachedDimensions.clear();
|
|
839
|
+
cachedStructure.clear();
|
|
840
|
+
((target, methodName) => {
|
|
841
|
+
(webWorkerCtx.$config$.logGetters || webWorkerCtx.$config$.logCalls) &&
|
|
842
|
+
logWorker(
|
|
843
|
+
`Dimension and DOM structure cache cleared from method call ${methodName}()`,
|
|
844
|
+
target[WinIdKey]
|
|
845
|
+
);
|
|
846
|
+
})(instance, methodName);
|
|
847
|
+
} else if (dimensionChangingMethodNames.includes(methodName)) {
|
|
848
|
+
callType = 2;
|
|
849
|
+
cachedDimensions.clear();
|
|
850
|
+
logDimensionCacheClearMethod(instance, methodName);
|
|
851
|
+
}
|
|
852
|
+
rtnValue = queue(
|
|
853
|
+
instance,
|
|
854
|
+
applyPath,
|
|
855
|
+
callType,
|
|
856
|
+
assignInstanceId,
|
|
857
|
+
void 0,
|
|
858
|
+
buffer
|
|
859
|
+
);
|
|
860
|
+
((target, applyPath, args, rtnValue) => {
|
|
861
|
+
if (webWorkerCtx.$config$.logCalls) {
|
|
862
|
+
try {
|
|
863
|
+
applyPath = applyPath.slice(0, applyPath.length - 1);
|
|
864
|
+
logWorker(
|
|
865
|
+
`Call ${getTargetProp(target, applyPath)}(${args
|
|
866
|
+
.map((v) => getLogValue(applyPath, v))
|
|
867
|
+
.join(", ")}), returned: ${getLogValue(applyPath, rtnValue)}`,
|
|
868
|
+
target[WinIdKey]
|
|
869
|
+
);
|
|
870
|
+
} catch (e) {}
|
|
871
|
+
}
|
|
872
|
+
})(instance, applyPath, args, rtnValue);
|
|
873
|
+
return rtnValue;
|
|
874
|
+
};
|
|
875
|
+
const constructGlobal = (instance, cstrName, args) => {
|
|
876
|
+
((target, cstrName, args) => {
|
|
877
|
+
if (webWorkerCtx.$config$.logCalls) {
|
|
878
|
+
try {
|
|
879
|
+
logWorker(
|
|
880
|
+
`Construct new ${cstrName}(${args
|
|
881
|
+
.map((v) => getLogValue([], v))
|
|
882
|
+
.join(", ")})`,
|
|
883
|
+
target[WinIdKey]
|
|
884
|
+
);
|
|
885
|
+
} catch (e) {}
|
|
886
|
+
}
|
|
887
|
+
})(instance, cstrName, args);
|
|
888
|
+
queue(instance, [1, cstrName, serializeInstanceForMain(instance, args)], 1);
|
|
889
|
+
};
|
|
890
|
+
const createHookOptions = (instance, applyPath) => ({
|
|
891
|
+
name: applyPath.join("."),
|
|
892
|
+
continue: HookContinue,
|
|
893
|
+
nodeName: instance[InstanceDataKey],
|
|
894
|
+
constructor: getConstructorName(instance),
|
|
895
|
+
instance: instance,
|
|
896
|
+
window: environments[instance[WinIdKey]].$window$,
|
|
897
|
+
});
|
|
898
|
+
const addStorageApi = (win, storageName, storages, isSameOrigin, env) => {
|
|
899
|
+
let getItems = (items) => {
|
|
900
|
+
items = storages.get(win.origin);
|
|
901
|
+
items || storages.set(win.origin, (items = []));
|
|
902
|
+
return items;
|
|
289
903
|
};
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
904
|
+
let getIndexByKey = (key) =>
|
|
905
|
+
getItems().findIndex((i) => i[STORAGE_KEY] === key);
|
|
906
|
+
let index;
|
|
907
|
+
let item;
|
|
908
|
+
let storage = {
|
|
909
|
+
getItem(key) {
|
|
910
|
+
index = getIndexByKey(key);
|
|
911
|
+
return index > -1 ? getItems()[index][STORAGE_VALUE] : null;
|
|
912
|
+
},
|
|
913
|
+
setItem(key, value) {
|
|
914
|
+
index = getIndexByKey(key);
|
|
915
|
+
index > -1
|
|
916
|
+
? (getItems()[index][STORAGE_VALUE] = value)
|
|
917
|
+
: getItems().push([key, value]);
|
|
918
|
+
isSameOrigin
|
|
919
|
+
? callMethod(win, [storageName, "setItem"], [key, value], 2)
|
|
920
|
+
: warnCrossOrgin("set", storageName, env);
|
|
921
|
+
},
|
|
922
|
+
removeItem(key) {
|
|
923
|
+
index = getIndexByKey(key);
|
|
924
|
+
index > -1 && getItems().splice(index, 1);
|
|
925
|
+
isSameOrigin
|
|
926
|
+
? callMethod(win, [storageName, "removeItem"], [key], 2)
|
|
927
|
+
: warnCrossOrgin("remove", storageName, env);
|
|
928
|
+
},
|
|
929
|
+
key(index) {
|
|
930
|
+
item = getItems()[index];
|
|
931
|
+
return item ? item[STORAGE_KEY] : null;
|
|
932
|
+
},
|
|
933
|
+
clear() {
|
|
934
|
+
getItems().length = 0;
|
|
935
|
+
isSameOrigin
|
|
936
|
+
? callMethod(win, [storageName, "clear"], EMPTY_ARRAY, 2)
|
|
937
|
+
: warnCrossOrgin("clear", storageName, env);
|
|
938
|
+
},
|
|
939
|
+
get length() {
|
|
940
|
+
return getItems().length;
|
|
941
|
+
},
|
|
299
942
|
};
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
943
|
+
win[storageName] = new Proxy(storage, {
|
|
944
|
+
get: (target, key) =>
|
|
945
|
+
Reflect.has(target, key)
|
|
946
|
+
? Reflect.get(target, key)
|
|
947
|
+
: target.getItem(key),
|
|
948
|
+
set(target, key, value) {
|
|
949
|
+
target.setItem(key, value);
|
|
950
|
+
return true;
|
|
951
|
+
},
|
|
952
|
+
has: (target, key) =>
|
|
953
|
+
!!Reflect.has(target, key) ||
|
|
954
|
+
("string" == typeof key && null !== target.getItem(key)),
|
|
955
|
+
deleteProperty(target, key) {
|
|
956
|
+
target.removeItem(key);
|
|
957
|
+
return true;
|
|
958
|
+
},
|
|
959
|
+
});
|
|
960
|
+
};
|
|
961
|
+
const STORAGE_KEY = 0;
|
|
962
|
+
const STORAGE_VALUE = 1;
|
|
963
|
+
const createCSSStyleDeclarationCstr = (win, WorkerBase, cstrName) => {
|
|
964
|
+
win[cstrName] = defineConstructorName(
|
|
965
|
+
class extends WorkerBase {
|
|
966
|
+
constructor(winId, instanceId, applyPath, styles) {
|
|
967
|
+
super(winId, instanceId, applyPath, styles || {});
|
|
968
|
+
return new Proxy(this, {
|
|
969
|
+
get(target, propName) {
|
|
970
|
+
if (target[propName]) {
|
|
971
|
+
return target[propName];
|
|
972
|
+
}
|
|
973
|
+
target[propName] ||
|
|
974
|
+
"string" != typeof propName ||
|
|
975
|
+
target[InstanceDataKey][propName] ||
|
|
976
|
+
(target[InstanceDataKey][propName] = getter(target, [
|
|
977
|
+
propName,
|
|
978
|
+
]));
|
|
979
|
+
return target[InstanceDataKey][propName];
|
|
980
|
+
},
|
|
981
|
+
set(target, propName, propValue) {
|
|
982
|
+
target[InstanceDataKey][propName] = propValue;
|
|
983
|
+
setter(target, [propName], propValue);
|
|
984
|
+
logDimensionCacheClearStyle(target, propName);
|
|
985
|
+
cachedDimensions.clear();
|
|
986
|
+
return true;
|
|
987
|
+
},
|
|
988
|
+
});
|
|
320
989
|
}
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
return "undefined";
|
|
990
|
+
setProperty(...args) {
|
|
991
|
+
this[InstanceDataKey][args[0]] = args[1];
|
|
992
|
+
callMethod(this, ["setProperty"], args, 2);
|
|
993
|
+
logDimensionCacheClearStyle(this, args[0]);
|
|
994
|
+
cachedDimensions.clear();
|
|
327
995
|
}
|
|
328
|
-
|
|
329
|
-
|
|
996
|
+
getPropertyValue(propName) {
|
|
997
|
+
return this[propName];
|
|
330
998
|
}
|
|
331
|
-
|
|
332
|
-
|
|
999
|
+
removeProperty(propName) {
|
|
1000
|
+
let value = this[InstanceDataKey][propName];
|
|
1001
|
+
callMethod(this, ["removeProperty"], [propName], 2);
|
|
1002
|
+
logDimensionCacheClearStyle(this, propName);
|
|
1003
|
+
cachedDimensions.clear();
|
|
1004
|
+
this[InstanceDataKey][propName] = void 0;
|
|
1005
|
+
return value;
|
|
333
1006
|
}
|
|
334
|
-
|
|
335
|
-
|
|
1007
|
+
},
|
|
1008
|
+
cstrName
|
|
1009
|
+
);
|
|
1010
|
+
};
|
|
1011
|
+
const createCSSStyleSheetConstructor = (win, cssStyleSheetCstrName) => {
|
|
1012
|
+
win[cssStyleSheetCstrName] = defineConstructorName(
|
|
1013
|
+
class {
|
|
1014
|
+
constructor(ownerNode) {
|
|
1015
|
+
this.ownerNode = ownerNode;
|
|
336
1016
|
}
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
}
|
|
355
|
-
return "¯\\_(ツ)_/¯ instance obj";
|
|
356
|
-
}
|
|
357
|
-
return v[Symbol.iterator] ? `[${Array.from(v).map((i => getLogValue(applyPath, i))).join(", ")}]` : "value" in v ? "string" == typeof v.value ? `"${v.value}"` : objToString(v.value) : objToString(v);
|
|
1017
|
+
get cssRules() {
|
|
1018
|
+
const ownerNode = this.ownerNode;
|
|
1019
|
+
return new Proxy(
|
|
1020
|
+
{},
|
|
1021
|
+
{
|
|
1022
|
+
get(target, propKey) {
|
|
1023
|
+
const propName = String(propKey);
|
|
1024
|
+
return "item" === propName
|
|
1025
|
+
? (index) => getCssRule(ownerNode, index)
|
|
1026
|
+
: "length" === propName
|
|
1027
|
+
? getCssRules(ownerNode).length
|
|
1028
|
+
: isNaN(propName)
|
|
1029
|
+
? target[propKey]
|
|
1030
|
+
: getCssRule(ownerNode, propName);
|
|
1031
|
+
},
|
|
1032
|
+
}
|
|
1033
|
+
);
|
|
358
1034
|
}
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
1035
|
+
insertRule(ruleText, index) {
|
|
1036
|
+
const cssRules = getCssRules(this.ownerNode);
|
|
1037
|
+
index = void 0 === index ? 0 : index;
|
|
1038
|
+
if (index >= 0 && index <= cssRules.length) {
|
|
1039
|
+
callMethod(
|
|
1040
|
+
this.ownerNode,
|
|
1041
|
+
["sheet", "insertRule"],
|
|
1042
|
+
[ruleText, index],
|
|
1043
|
+
2
|
|
1044
|
+
);
|
|
1045
|
+
cssRules.splice(index, 0, 0);
|
|
1046
|
+
}
|
|
1047
|
+
logDimensionCacheClearMethod(this.ownerNode, "insertRule");
|
|
1048
|
+
cachedDimensions.clear();
|
|
1049
|
+
return index;
|
|
367
1050
|
}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
(webWorkerCtx.$config$.logGetters || webWorkerCtx.$config$.logSetters) && logWorker(`Dimension cache cleared from style.${propName} setter`, target[WinIdKey]);
|
|
374
|
-
};
|
|
375
|
-
const logDimensionCacheClearMethod = (target, methodName) => {
|
|
376
|
-
(webWorkerCtx.$config$.logGetters || webWorkerCtx.$config$.logCalls) && logWorker(`Dimension cache cleared from method call ${methodName}()`, target[WinIdKey]);
|
|
377
|
-
};
|
|
378
|
-
const taskQueue = [];
|
|
379
|
-
const queue = (instance, $applyPath$, callType, $assignInstanceId$, $groupedGetters$, buffer) => {
|
|
380
|
-
if (instance[ApplyPathKey]) {
|
|
381
|
-
taskQueue.push({
|
|
382
|
-
$winId$: instance[WinIdKey],
|
|
383
|
-
$instanceId$: instance[InstanceIdKey],
|
|
384
|
-
$applyPath$: [ ...instance[ApplyPathKey], ...$applyPath$ ],
|
|
385
|
-
$assignInstanceId$: $assignInstanceId$,
|
|
386
|
-
$groupedGetters$: $groupedGetters$
|
|
387
|
-
});
|
|
388
|
-
taskQueue[len(taskQueue) - 1].$debug$ = ((target, applyPath, callType) => {
|
|
389
|
-
let m = getTargetProp(target, applyPath);
|
|
390
|
-
1 === callType ? m += " (blocking)" : 2 === callType ? m += " (non-blocking)" : 3 === callType && (m += " (non-blocking, no-side-effect)");
|
|
391
|
-
return m.trim();
|
|
392
|
-
})(instance, $applyPath$, callType);
|
|
393
|
-
buffer && 3 !== callType && console.error("buffer must be sent NonBlockingNoSideEffect");
|
|
394
|
-
if (3 === callType) {
|
|
395
|
-
webWorkerCtx.$postMessage$([ 12, {
|
|
396
|
-
$msgId$: randomId(),
|
|
397
|
-
$tasks$: [ ...taskQueue ]
|
|
398
|
-
} ], buffer ? [ buffer instanceof ArrayBuffer ? buffer : buffer.buffer ] : void 0);
|
|
399
|
-
taskQueue.length = 0;
|
|
400
|
-
} else if (1 === callType) {
|
|
401
|
-
return sendToMain(true);
|
|
402
|
-
}
|
|
403
|
-
webWorkerCtx.$asyncMsgTimer$ = setTimeout(sendToMain, 20);
|
|
1051
|
+
deleteRule(index) {
|
|
1052
|
+
callMethod(this.ownerNode, ["sheet", "deleteRule"], [index], 2);
|
|
1053
|
+
getCssRules(this.ownerNode).splice(index, 1);
|
|
1054
|
+
logDimensionCacheClearMethod(this.ownerNode, "deleteRule");
|
|
1055
|
+
cachedDimensions.clear();
|
|
404
1056
|
}
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
clearTimeout(webWorkerCtx.$asyncMsgTimer$);
|
|
408
|
-
if (len(taskQueue)) {
|
|
409
|
-
webWorkerCtx.$config$.logMainAccess && logWorker(`Main access, tasks sent: ${taskQueue.length}`);
|
|
410
|
-
const endTask = taskQueue[len(taskQueue) - 1];
|
|
411
|
-
const accessReq = {
|
|
412
|
-
$msgId$: randomId(),
|
|
413
|
-
$tasks$: [ ...taskQueue ]
|
|
414
|
-
};
|
|
415
|
-
taskQueue.length = 0;
|
|
416
|
-
if (isBlocking) {
|
|
417
|
-
const accessRsp = ((webWorkerCtx, accessReq) => {
|
|
418
|
-
const sharedDataBuffer = webWorkerCtx.$sharedDataBuffer$;
|
|
419
|
-
const sharedData = new Int32Array(sharedDataBuffer);
|
|
420
|
-
Atomics.store(sharedData, 0, 0);
|
|
421
|
-
webWorkerCtx.$postMessage$([ 11, accessReq ]);
|
|
422
|
-
Atomics.wait(sharedData, 0, 0);
|
|
423
|
-
let dataLength = Atomics.load(sharedData, 0);
|
|
424
|
-
let accessRespStr = "";
|
|
425
|
-
let i = 0;
|
|
426
|
-
for (;i < dataLength; i++) {
|
|
427
|
-
accessRespStr += String.fromCharCode(sharedData[i + 1]);
|
|
428
|
-
}
|
|
429
|
-
return JSON.parse(accessRespStr);
|
|
430
|
-
})(webWorkerCtx, accessReq);
|
|
431
|
-
const isPromise = accessRsp.$isPromise$;
|
|
432
|
-
const rtnValue = deserializeFromMain(endTask.$winId$, endTask.$instanceId$, endTask.$applyPath$, accessRsp.$rtnValue$);
|
|
433
|
-
if (accessRsp.$error$) {
|
|
434
|
-
if (isPromise) {
|
|
435
|
-
return Promise.reject(accessRsp.$error$);
|
|
436
|
-
}
|
|
437
|
-
throw new Error(accessRsp.$error$);
|
|
438
|
-
}
|
|
439
|
-
return isPromise ? Promise.resolve(rtnValue) : rtnValue;
|
|
440
|
-
}
|
|
441
|
-
webWorkerCtx.$postMessage$([ 12, accessReq ]);
|
|
1057
|
+
get type() {
|
|
1058
|
+
return "text/css";
|
|
442
1059
|
}
|
|
1060
|
+
},
|
|
1061
|
+
cssStyleSheetCstrName
|
|
1062
|
+
);
|
|
1063
|
+
const HTMLStyleDescriptorMap = {
|
|
1064
|
+
sheet: {
|
|
1065
|
+
get() {
|
|
1066
|
+
return new win[cssStyleSheetCstrName](this);
|
|
1067
|
+
},
|
|
1068
|
+
},
|
|
443
1069
|
};
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
1070
|
+
definePrototypePropertyDescriptor(
|
|
1071
|
+
win.HTMLStyleElement,
|
|
1072
|
+
HTMLStyleDescriptorMap
|
|
1073
|
+
);
|
|
1074
|
+
};
|
|
1075
|
+
const getCssRules = (ownerNode, cssRules) => {
|
|
1076
|
+
cssRules = getInstanceStateValue(ownerNode, 2);
|
|
1077
|
+
if (!cssRules) {
|
|
1078
|
+
cssRules = getter(ownerNode, ["sheet", "cssRules"]);
|
|
1079
|
+
setInstanceStateValue(ownerNode, 2, cssRules);
|
|
1080
|
+
}
|
|
1081
|
+
return cssRules;
|
|
1082
|
+
};
|
|
1083
|
+
const getCssRule = (ownerNode, index, cssRules) => {
|
|
1084
|
+
cssRules = getCssRules(ownerNode);
|
|
1085
|
+
0 === cssRules[index] &&
|
|
1086
|
+
(cssRules[index] = getter(ownerNode, [
|
|
1087
|
+
"sheet",
|
|
1088
|
+
"cssRules",
|
|
1089
|
+
parseInt(index, 10),
|
|
1090
|
+
]));
|
|
1091
|
+
return cssRules[index];
|
|
1092
|
+
};
|
|
1093
|
+
const runScriptContent = (
|
|
1094
|
+
env,
|
|
1095
|
+
instanceId,
|
|
1096
|
+
scriptContent,
|
|
1097
|
+
winId,
|
|
1098
|
+
errorMsg
|
|
1099
|
+
) => {
|
|
1100
|
+
try {
|
|
1101
|
+
webWorkerCtx.$config$.logScriptExecution &&
|
|
1102
|
+
logWorker(
|
|
1103
|
+
`Execute script: ${scriptContent
|
|
1104
|
+
.substring(0, 100)
|
|
1105
|
+
.split("\n")
|
|
1106
|
+
.map((l) => l.trim())
|
|
1107
|
+
.join(" ")
|
|
1108
|
+
.trim()
|
|
1109
|
+
.substring(0, 60)}...`,
|
|
1110
|
+
winId
|
|
1111
|
+
);
|
|
1112
|
+
env.$currentScriptId$ = instanceId;
|
|
1113
|
+
run(env, scriptContent);
|
|
1114
|
+
} catch (contentError) {
|
|
1115
|
+
console.error(scriptContent, contentError);
|
|
1116
|
+
errorMsg = String(contentError.stack || contentError);
|
|
1117
|
+
}
|
|
1118
|
+
env.$currentScriptId$ = "";
|
|
1119
|
+
return errorMsg;
|
|
1120
|
+
};
|
|
1121
|
+
const run = (env, scriptContent, scriptUrl) => {
|
|
1122
|
+
env.$runWindowLoadEvent$ = 1;
|
|
1123
|
+
scriptContent =
|
|
1124
|
+
`with(this){${scriptContent
|
|
1125
|
+
.replace(/\bthis\b/g, "(thi$(this)?window:this)")
|
|
1126
|
+
.replace(/\/\/# so/g, "//Xso")}\n;function thi$(t){return t===this}};${(
|
|
1127
|
+
webWorkerCtx.$config$.globalFns || []
|
|
1128
|
+
)
|
|
1129
|
+
.filter((globalFnName) => /[a-zA-Z_$][0-9a-zA-Z_$]*/.test(globalFnName))
|
|
1130
|
+
.map((g) => `(typeof ${g}=='function'&&(this.${g}=${g}))`)
|
|
1131
|
+
.join(";")};` + (scriptUrl ? "\n//# sourceURL=" + scriptUrl : "");
|
|
1132
|
+
env.$isSameOrigin$ ||
|
|
1133
|
+
(scriptContent = scriptContent.replace(
|
|
1134
|
+
/.postMessage\(/g,
|
|
1135
|
+
`.postMessage('${env.$winId$}',`
|
|
1136
|
+
));
|
|
1137
|
+
new Function(scriptContent).call(env.$window$);
|
|
1138
|
+
env.$runWindowLoadEvent$ = 0;
|
|
1139
|
+
};
|
|
1140
|
+
const runStateLoadHandlers = (instance, type, handlers) => {
|
|
1141
|
+
handlers = getInstanceStateValue(instance, type);
|
|
1142
|
+
handlers &&
|
|
1143
|
+
setTimeout(() =>
|
|
1144
|
+
handlers.map((cb) =>
|
|
1145
|
+
cb({
|
|
1146
|
+
type: type,
|
|
1147
|
+
})
|
|
1148
|
+
)
|
|
1149
|
+
);
|
|
1150
|
+
};
|
|
1151
|
+
const resolveToUrl = (
|
|
1152
|
+
env,
|
|
1153
|
+
url,
|
|
1154
|
+
type,
|
|
1155
|
+
baseLocation,
|
|
1156
|
+
resolvedUrl,
|
|
1157
|
+
configResolvedUrl
|
|
1158
|
+
) => {
|
|
1159
|
+
baseLocation = env.$location$;
|
|
1160
|
+
while (!baseLocation.host) {
|
|
1161
|
+
env = environments[env.$parentWinId$];
|
|
1162
|
+
baseLocation = env.$location$;
|
|
1163
|
+
if (env.$winId$ === env.$parentWinId$) {
|
|
1164
|
+
break;
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
resolvedUrl = new URL(url || "", baseLocation);
|
|
1168
|
+
if (type && webWorkerCtx.$config$.resolveUrl) {
|
|
1169
|
+
configResolvedUrl = webWorkerCtx.$config$.resolveUrl(
|
|
1170
|
+
resolvedUrl,
|
|
1171
|
+
baseLocation,
|
|
1172
|
+
type
|
|
1173
|
+
);
|
|
1174
|
+
if (configResolvedUrl) {
|
|
1175
|
+
return configResolvedUrl;
|
|
1176
|
+
}
|
|
1177
|
+
}
|
|
1178
|
+
return resolvedUrl;
|
|
1179
|
+
};
|
|
1180
|
+
const resolveUrl = (env, url, type) => resolveToUrl(env, url, type) + "";
|
|
1181
|
+
const getPartytownScript = () =>
|
|
1182
|
+
`<script src="${partytownLibUrl("partytown.js?v=0.7.5")}"><\/script>`;
|
|
1183
|
+
const createImageConstructor = (env) =>
|
|
1184
|
+
class HTMLImageElement {
|
|
1185
|
+
constructor() {
|
|
1186
|
+
this.s = "";
|
|
1187
|
+
this.l = [];
|
|
1188
|
+
this.e = [];
|
|
1189
|
+
this.style = {};
|
|
1190
|
+
}
|
|
1191
|
+
get src() {
|
|
1192
|
+
return this.s;
|
|
1193
|
+
}
|
|
1194
|
+
set src(src) {
|
|
1195
|
+
webWorkerCtx.$config$.logImageRequests &&
|
|
1196
|
+
logWorker(
|
|
1197
|
+
`Image() request: ${resolveUrl(env, src, "image")}`,
|
|
1198
|
+
env.$winId$
|
|
1199
|
+
);
|
|
1200
|
+
this.s = src;
|
|
1201
|
+
fetch(resolveUrl(env, src, "image"), {
|
|
1202
|
+
mode: "no-cors",
|
|
1203
|
+
credentials: "include",
|
|
1204
|
+
keepalive: true,
|
|
1205
|
+
}).then(
|
|
1206
|
+
(rsp) => {
|
|
1207
|
+
rsp.ok || 0 === rsp.status
|
|
1208
|
+
? this.l.map((cb) =>
|
|
1209
|
+
cb({
|
|
1210
|
+
type: "load",
|
|
1211
|
+
})
|
|
1212
|
+
)
|
|
1213
|
+
: this.e.map((cb) =>
|
|
1214
|
+
cb({
|
|
1215
|
+
type: "error",
|
|
1216
|
+
})
|
|
1217
|
+
);
|
|
1218
|
+
},
|
|
1219
|
+
() =>
|
|
1220
|
+
this.e.forEach((cb) =>
|
|
1221
|
+
cb({
|
|
1222
|
+
type: "error",
|
|
1223
|
+
})
|
|
1224
|
+
)
|
|
1225
|
+
);
|
|
1226
|
+
}
|
|
1227
|
+
addEventListener(eventName, cb) {
|
|
1228
|
+
"load" === eventName && this.l.push(cb);
|
|
1229
|
+
"error" === eventName && this.e.push(cb);
|
|
1230
|
+
}
|
|
1231
|
+
get onload() {
|
|
1232
|
+
return this.l[0];
|
|
1233
|
+
}
|
|
1234
|
+
set onload(cb) {
|
|
1235
|
+
this.l = [cb];
|
|
1236
|
+
}
|
|
1237
|
+
get onerror() {
|
|
1238
|
+
return this.e[0];
|
|
1239
|
+
}
|
|
1240
|
+
set onerror(cb) {
|
|
1241
|
+
this.e = [cb];
|
|
1242
|
+
}
|
|
461
1243
|
};
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
1244
|
+
const HTMLSrcElementDescriptorMap = {
|
|
1245
|
+
addEventListener: {
|
|
1246
|
+
value(...args) {
|
|
1247
|
+
const eventName = args[0];
|
|
1248
|
+
const callbacks = getInstanceStateValue(this, eventName) || [];
|
|
1249
|
+
callbacks.push(args[1]);
|
|
1250
|
+
setInstanceStateValue(this, eventName, callbacks);
|
|
1251
|
+
},
|
|
1252
|
+
},
|
|
1253
|
+
async: {
|
|
1254
|
+
get: noop,
|
|
1255
|
+
set: noop,
|
|
1256
|
+
},
|
|
1257
|
+
defer: {
|
|
1258
|
+
get: noop,
|
|
1259
|
+
set: noop,
|
|
1260
|
+
},
|
|
1261
|
+
onload: {
|
|
1262
|
+
get() {
|
|
1263
|
+
let callbacks = getInstanceStateValue(this, "load");
|
|
1264
|
+
return (callbacks && callbacks[0]) || null;
|
|
1265
|
+
},
|
|
1266
|
+
set(cb) {
|
|
1267
|
+
setInstanceStateValue(this, "load", cb ? [cb] : null);
|
|
1268
|
+
},
|
|
1269
|
+
},
|
|
1270
|
+
onerror: {
|
|
1271
|
+
get() {
|
|
1272
|
+
let callbacks = getInstanceStateValue(this, "error");
|
|
1273
|
+
return (callbacks && callbacks[0]) || null;
|
|
1274
|
+
},
|
|
1275
|
+
set(cb) {
|
|
1276
|
+
setInstanceStateValue(this, "error", cb ? [cb] : null);
|
|
1277
|
+
},
|
|
1278
|
+
},
|
|
1279
|
+
getAttribute: {
|
|
1280
|
+
value(attrName) {
|
|
1281
|
+
return "src" === attrName
|
|
1282
|
+
? this.src
|
|
1283
|
+
: callMethod(this, ["getAttribute"], [attrName]);
|
|
1284
|
+
},
|
|
1285
|
+
},
|
|
1286
|
+
setAttribute: {
|
|
1287
|
+
value(attrName, attrValue) {
|
|
1288
|
+
scriptAttrPropNames.includes(attrName)
|
|
1289
|
+
? (this[attrName] = attrValue)
|
|
1290
|
+
: callMethod(this, ["setAttribute"], [attrName, attrValue]);
|
|
1291
|
+
},
|
|
1292
|
+
},
|
|
1293
|
+
};
|
|
1294
|
+
const scriptAttrPropNames = commaSplit("src,type");
|
|
1295
|
+
const patchHTMLScriptElement = (WorkerHTMLScriptElement, env) => {
|
|
1296
|
+
const HTMLScriptDescriptorMap = {
|
|
1297
|
+
innerHTML: innerHTMLDescriptor,
|
|
1298
|
+
innerText: innerHTMLDescriptor,
|
|
1299
|
+
src: {
|
|
1300
|
+
get() {
|
|
1301
|
+
return getInstanceStateValue(this, 4) || "";
|
|
1302
|
+
},
|
|
1303
|
+
set(url) {
|
|
1304
|
+
const orgUrl = resolveUrl(env, url, null);
|
|
1305
|
+
const config = webWorkerCtx.$config$;
|
|
1306
|
+
url = resolveUrl(env, url, "script");
|
|
1307
|
+
setInstanceStateValue(this, 4, url);
|
|
1308
|
+
setter(this, ["src"], url);
|
|
1309
|
+
orgUrl !== url && setter(this, ["dataset", "ptsrc"], orgUrl);
|
|
1310
|
+
if (this.type && config.loadScriptsOnMainThread) {
|
|
1311
|
+
const shouldExecuteScriptViaMainThread =
|
|
1312
|
+
config.loadScriptsOnMainThread.some(
|
|
1313
|
+
(scriptUrl) => scriptUrl === url
|
|
1314
|
+
);
|
|
1315
|
+
shouldExecuteScriptViaMainThread &&
|
|
1316
|
+
setter(this, ["type"], "text/javascript");
|
|
1317
|
+
}
|
|
1318
|
+
},
|
|
1319
|
+
},
|
|
1320
|
+
textContent: innerHTMLDescriptor,
|
|
1321
|
+
type: {
|
|
1322
|
+
get() {
|
|
1323
|
+
return getter(this, ["type"]);
|
|
1324
|
+
},
|
|
1325
|
+
set(type) {
|
|
1326
|
+
if (!isScriptJsType(type)) {
|
|
1327
|
+
setInstanceStateValue(this, 5, type);
|
|
1328
|
+
setter(this, ["type"], type);
|
|
1329
|
+
}
|
|
1330
|
+
},
|
|
1331
|
+
},
|
|
1332
|
+
...HTMLSrcElementDescriptorMap,
|
|
490
1333
|
};
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
logDimensionCacheClearMethod(instance, methodName);
|
|
1334
|
+
definePrototypePropertyDescriptor(
|
|
1335
|
+
WorkerHTMLScriptElement,
|
|
1336
|
+
HTMLScriptDescriptorMap
|
|
1337
|
+
);
|
|
1338
|
+
};
|
|
1339
|
+
const innerHTMLDescriptor = {
|
|
1340
|
+
get() {
|
|
1341
|
+
const type = getter(this, ["type"]);
|
|
1342
|
+
return isScriptJsType(type)
|
|
1343
|
+
? getInstanceStateValue(this, 3) || ""
|
|
1344
|
+
: getter(this, ["innerHTML"]);
|
|
1345
|
+
},
|
|
1346
|
+
set(scriptContent) {
|
|
1347
|
+
setInstanceStateValue(this, 3, scriptContent);
|
|
1348
|
+
},
|
|
1349
|
+
};
|
|
1350
|
+
const isScriptJsType = (scriptType) =>
|
|
1351
|
+
!scriptType || "text/javascript" === scriptType;
|
|
1352
|
+
const createNodeCstr = (win, env, WorkerBase) => {
|
|
1353
|
+
const config = webWorkerCtx.$config$;
|
|
1354
|
+
const WorkerNode = defineConstructorName(
|
|
1355
|
+
class extends WorkerBase {
|
|
1356
|
+
appendChild(node) {
|
|
1357
|
+
return this.insertBefore(node, null);
|
|
516
1358
|
}
|
|
517
|
-
|
|
518
|
-
(
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
getItem(key) {
|
|
557
|
-
index = getIndexByKey(key);
|
|
558
|
-
return index > -1 ? getItems()[index][STORAGE_VALUE] : null;
|
|
559
|
-
},
|
|
560
|
-
setItem(key, value) {
|
|
561
|
-
index = getIndexByKey(key);
|
|
562
|
-
index > -1 ? getItems()[index][STORAGE_VALUE] = value : getItems().push([ key, value ]);
|
|
563
|
-
isSameOrigin ? callMethod(win, [ storageName, "setItem" ], [ key, value ], 2) : warnCrossOrgin("set", storageName, env);
|
|
564
|
-
},
|
|
565
|
-
removeItem(key) {
|
|
566
|
-
index = getIndexByKey(key);
|
|
567
|
-
index > -1 && getItems().splice(index, 1);
|
|
568
|
-
isSameOrigin ? callMethod(win, [ storageName, "removeItem" ], [ key ], 2) : warnCrossOrgin("remove", storageName, env);
|
|
569
|
-
},
|
|
570
|
-
key(index) {
|
|
571
|
-
item = getItems()[index];
|
|
572
|
-
return item ? item[STORAGE_KEY] : null;
|
|
573
|
-
},
|
|
574
|
-
clear() {
|
|
575
|
-
getItems().length = 0;
|
|
576
|
-
isSameOrigin ? callMethod(win, [ storageName, "clear" ], EMPTY_ARRAY, 2) : warnCrossOrgin("clear", storageName, env);
|
|
577
|
-
},
|
|
578
|
-
get length() {
|
|
579
|
-
return getItems().length;
|
|
580
|
-
}
|
|
581
|
-
};
|
|
582
|
-
win[storageName] = new Proxy(storage, {
|
|
583
|
-
get: (target, key) => Reflect.has(target, key) ? Reflect.get(target, key) : target.getItem(key),
|
|
584
|
-
set(target, key, value) {
|
|
585
|
-
target.setItem(key, value);
|
|
586
|
-
return true;
|
|
587
|
-
},
|
|
588
|
-
has: (target, key) => !!Reflect.has(target, key) || "string" == typeof key && null !== target.getItem(key),
|
|
589
|
-
deleteProperty(target, key) {
|
|
590
|
-
target.removeItem(key);
|
|
591
|
-
return true;
|
|
592
|
-
}
|
|
593
|
-
});
|
|
594
|
-
};
|
|
595
|
-
const STORAGE_KEY = 0;
|
|
596
|
-
const STORAGE_VALUE = 1;
|
|
597
|
-
const createCSSStyleDeclarationCstr = (win, WorkerBase, cstrName) => {
|
|
598
|
-
win[cstrName] = defineConstructorName(class extends WorkerBase {
|
|
599
|
-
constructor(winId, instanceId, applyPath, styles) {
|
|
600
|
-
super(winId, instanceId, applyPath, styles || {});
|
|
601
|
-
return new Proxy(this, {
|
|
602
|
-
get(target, propName) {
|
|
603
|
-
if (target[propName]) {
|
|
604
|
-
return target[propName];
|
|
605
|
-
}
|
|
606
|
-
target[propName] || "string" != typeof propName || target[InstanceDataKey][propName] || (target[InstanceDataKey][propName] = getter(target, [ propName ]));
|
|
607
|
-
return target[InstanceDataKey][propName];
|
|
608
|
-
},
|
|
609
|
-
set(target, propName, propValue) {
|
|
610
|
-
target[InstanceDataKey][propName] = propValue;
|
|
611
|
-
setter(target, [ propName ], propValue);
|
|
612
|
-
logDimensionCacheClearStyle(target, propName);
|
|
613
|
-
cachedDimensions.clear();
|
|
614
|
-
return true;
|
|
615
|
-
}
|
|
616
|
-
});
|
|
617
|
-
}
|
|
618
|
-
setProperty(...args) {
|
|
619
|
-
this[InstanceDataKey][args[0]] = args[1];
|
|
620
|
-
callMethod(this, [ "setProperty" ], args, 2);
|
|
621
|
-
logDimensionCacheClearStyle(this, args[0]);
|
|
622
|
-
cachedDimensions.clear();
|
|
623
|
-
}
|
|
624
|
-
getPropertyValue(propName) {
|
|
625
|
-
return this[propName];
|
|
626
|
-
}
|
|
627
|
-
removeProperty(propName) {
|
|
628
|
-
let value = this[InstanceDataKey][propName];
|
|
629
|
-
callMethod(this, [ "removeProperty" ], [ propName ], 2);
|
|
630
|
-
logDimensionCacheClearStyle(this, propName);
|
|
631
|
-
cachedDimensions.clear();
|
|
632
|
-
this[InstanceDataKey][propName] = void 0;
|
|
633
|
-
return value;
|
|
634
|
-
}
|
|
635
|
-
}, cstrName);
|
|
636
|
-
};
|
|
637
|
-
const createCSSStyleSheetConstructor = (win, cssStyleSheetCstrName) => {
|
|
638
|
-
win[cssStyleSheetCstrName] = defineConstructorName(class {
|
|
639
|
-
constructor(ownerNode) {
|
|
640
|
-
this.ownerNode = ownerNode;
|
|
641
|
-
}
|
|
642
|
-
get cssRules() {
|
|
643
|
-
const ownerNode = this.ownerNode;
|
|
644
|
-
return new Proxy({}, {
|
|
645
|
-
get(target, propKey) {
|
|
646
|
-
const propName = String(propKey);
|
|
647
|
-
return "item" === propName ? index => getCssRule(ownerNode, index) : "length" === propName ? getCssRules(ownerNode).length : isNaN(propName) ? target[propKey] : getCssRule(ownerNode, propName);
|
|
648
|
-
}
|
|
649
|
-
});
|
|
650
|
-
}
|
|
651
|
-
insertRule(ruleText, index) {
|
|
652
|
-
const cssRules = getCssRules(this.ownerNode);
|
|
653
|
-
index = void 0 === index ? 0 : index;
|
|
654
|
-
if (index >= 0 && index <= cssRules.length) {
|
|
655
|
-
callMethod(this.ownerNode, [ "sheet", "insertRule" ], [ ruleText, index ], 2);
|
|
656
|
-
cssRules.splice(index, 0, 0);
|
|
1359
|
+
get href() {}
|
|
1360
|
+
set href(_) {}
|
|
1361
|
+
insertBefore(newNode, referenceNode) {
|
|
1362
|
+
var _a, _b;
|
|
1363
|
+
const winId = (newNode[WinIdKey] = this[WinIdKey]);
|
|
1364
|
+
const instanceId = newNode[InstanceIdKey];
|
|
1365
|
+
const nodeName = newNode[InstanceDataKey];
|
|
1366
|
+
const isScript = "SCRIPT" === nodeName;
|
|
1367
|
+
const isIFrame = "INPUT" === nodeName;
|
|
1368
|
+
if (isScript) {
|
|
1369
|
+
const scriptContent = getInstanceStateValue(newNode, 3);
|
|
1370
|
+
const scriptType = getInstanceStateValue(newNode, 5);
|
|
1371
|
+
if (scriptContent) {
|
|
1372
|
+
if (isScriptJsType(scriptType)) {
|
|
1373
|
+
const scriptId = newNode.id;
|
|
1374
|
+
const loadOnMainThread =
|
|
1375
|
+
scriptId &&
|
|
1376
|
+
(null ===
|
|
1377
|
+
(_b =
|
|
1378
|
+
null === (_a = config.loadScriptsOnMainThread) ||
|
|
1379
|
+
void 0 === _a
|
|
1380
|
+
? void 0
|
|
1381
|
+
: _a.includes) || void 0 === _b
|
|
1382
|
+
? void 0
|
|
1383
|
+
: _b.call(_a, scriptId));
|
|
1384
|
+
if (loadOnMainThread) {
|
|
1385
|
+
setter(newNode, ["type"], "text/javascript");
|
|
1386
|
+
} else {
|
|
1387
|
+
const errorMsg = runScriptContent(
|
|
1388
|
+
env,
|
|
1389
|
+
instanceId,
|
|
1390
|
+
scriptContent,
|
|
1391
|
+
winId,
|
|
1392
|
+
""
|
|
1393
|
+
);
|
|
1394
|
+
const datasetType = errorMsg ? "pterror" : "ptid";
|
|
1395
|
+
const datasetValue = errorMsg || instanceId;
|
|
1396
|
+
setter(newNode, ["type"], "text/partytown-x");
|
|
1397
|
+
setter(newNode, ["dataset", datasetType], datasetValue);
|
|
657
1398
|
}
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
1399
|
+
}
|
|
1400
|
+
setter(newNode, ["innerHTML"], scriptContent);
|
|
1401
|
+
}
|
|
1402
|
+
}
|
|
1403
|
+
callMethod(this, ["insertBefore"], [newNode, referenceNode], 2);
|
|
1404
|
+
if (isIFrame) {
|
|
1405
|
+
const src = getInstanceStateValue(newNode, 0);
|
|
1406
|
+
if (src && src.startsWith("javascript:")) {
|
|
1407
|
+
const scriptContent = src.split("javascript:")[1];
|
|
1408
|
+
runScriptContent(env, instanceId, scriptContent, winId, "");
|
|
1409
|
+
}
|
|
1410
|
+
((winId, iframe) => {
|
|
1411
|
+
let i = 0;
|
|
1412
|
+
let type;
|
|
1413
|
+
let handlers;
|
|
1414
|
+
let callback = () => {
|
|
1415
|
+
if (
|
|
1416
|
+
environments[winId] &&
|
|
1417
|
+
environments[winId].$isInitialized$ &&
|
|
1418
|
+
!environments[winId].$isLoading$
|
|
1419
|
+
) {
|
|
1420
|
+
type = getInstanceStateValue(iframe, 1) ? "error" : "load";
|
|
1421
|
+
handlers = getInstanceStateValue(iframe, type);
|
|
1422
|
+
handlers &&
|
|
1423
|
+
handlers.map((handler) =>
|
|
1424
|
+
handler({
|
|
1425
|
+
type: type,
|
|
1426
|
+
})
|
|
1427
|
+
);
|
|
1428
|
+
} else if (i++ > 2e3) {
|
|
1429
|
+
handlers = getInstanceStateValue(iframe, "error");
|
|
1430
|
+
handlers &&
|
|
1431
|
+
handlers.map((handler) =>
|
|
1432
|
+
handler({
|
|
1433
|
+
type: "error",
|
|
1434
|
+
})
|
|
1435
|
+
);
|
|
1436
|
+
} else {
|
|
1437
|
+
setTimeout(callback, 9);
|
|
676
1438
|
}
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
}
|
|
687
|
-
return cssRules;
|
|
688
|
-
};
|
|
689
|
-
const getCssRule = (ownerNode, index, cssRules) => {
|
|
690
|
-
cssRules = getCssRules(ownerNode);
|
|
691
|
-
0 === cssRules[index] && (cssRules[index] = getter(ownerNode, [ "sheet", "cssRules", parseInt(index, 10) ]));
|
|
692
|
-
return cssRules[index];
|
|
693
|
-
};
|
|
694
|
-
const runScriptContent = (env, instanceId, scriptContent, winId, errorMsg) => {
|
|
695
|
-
try {
|
|
696
|
-
webWorkerCtx.$config$.logScriptExecution && logWorker(`Execute script: ${scriptContent.substring(0, 100).split("\n").map((l => l.trim())).join(" ").trim().substring(0, 60)}...`, winId);
|
|
697
|
-
env.$currentScriptId$ = instanceId;
|
|
698
|
-
run(env, scriptContent);
|
|
699
|
-
} catch (contentError) {
|
|
700
|
-
console.error(scriptContent, contentError);
|
|
701
|
-
errorMsg = String(contentError.stack || contentError);
|
|
702
|
-
}
|
|
703
|
-
env.$currentScriptId$ = "";
|
|
704
|
-
return errorMsg;
|
|
705
|
-
};
|
|
706
|
-
const run = (env, scriptContent, scriptUrl) => {
|
|
707
|
-
env.$runWindowLoadEvent$ = 1;
|
|
708
|
-
scriptContent = `with(this){${scriptContent.replace(/\bthis\b/g, "(thi$(this)?window:this)").replace(/\/\/# so/g, "//Xso")}\n;function thi$(t){return t===this}};${(webWorkerCtx.$config$.globalFns || []).filter((globalFnName => /[a-zA-Z_$][0-9a-zA-Z_$]*/.test(globalFnName))).map((g => `(typeof ${g}=='function'&&(this.${g}=${g}))`)).join(";")};` + (scriptUrl ? "\n//# sourceURL=" + scriptUrl : "");
|
|
709
|
-
env.$isSameOrigin$ || (scriptContent = scriptContent.replace(/.postMessage\(/g, `.postMessage('${env.$winId$}',`));
|
|
710
|
-
new Function(scriptContent).call(env.$window$);
|
|
711
|
-
env.$runWindowLoadEvent$ = 0;
|
|
712
|
-
};
|
|
713
|
-
const runStateLoadHandlers = (instance, type, handlers) => {
|
|
714
|
-
handlers = getInstanceStateValue(instance, type);
|
|
715
|
-
handlers && setTimeout((() => handlers.map((cb => cb({
|
|
716
|
-
type: type
|
|
717
|
-
})))));
|
|
718
|
-
};
|
|
719
|
-
const resolveToUrl = (env, url, type, baseLocation, resolvedUrl, configResolvedUrl) => {
|
|
720
|
-
baseLocation = env.$location$;
|
|
721
|
-
while (!baseLocation.host) {
|
|
722
|
-
env = environments[env.$parentWinId$];
|
|
723
|
-
baseLocation = env.$location$;
|
|
724
|
-
if (env.$winId$ === env.$parentWinId$) {
|
|
725
|
-
break;
|
|
726
|
-
}
|
|
727
|
-
}
|
|
728
|
-
resolvedUrl = new URL(url || "", baseLocation);
|
|
729
|
-
if (type && webWorkerCtx.$config$.resolveUrl) {
|
|
730
|
-
configResolvedUrl = webWorkerCtx.$config$.resolveUrl(resolvedUrl, baseLocation, type);
|
|
731
|
-
if (configResolvedUrl) {
|
|
732
|
-
return configResolvedUrl;
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
return resolvedUrl;
|
|
736
|
-
};
|
|
737
|
-
const resolveUrl = (env, url, type) => resolveToUrl(env, url, type) + "";
|
|
738
|
-
const getPartytownScript = () => `<script src="${partytownLibUrl("partytown.js?v=0.7.5")}"><\/script>`;
|
|
739
|
-
const createImageConstructor = env => class HTMLImageElement {
|
|
740
|
-
constructor() {
|
|
741
|
-
this.s = "";
|
|
742
|
-
this.l = [];
|
|
743
|
-
this.e = [];
|
|
744
|
-
this.style = {};
|
|
745
|
-
}
|
|
746
|
-
get src() {
|
|
747
|
-
return this.s;
|
|
748
|
-
}
|
|
749
|
-
set src(src) {
|
|
750
|
-
webWorkerCtx.$config$.logImageRequests && logWorker(`Image() request: ${resolveUrl(env, src, "image")}`, env.$winId$);
|
|
751
|
-
this.s = src;
|
|
752
|
-
fetch(resolveUrl(env, src, "image"), {
|
|
753
|
-
mode: "no-cors",
|
|
754
|
-
credentials: "include",
|
|
755
|
-
keepalive: true
|
|
756
|
-
}).then((rsp => {
|
|
757
|
-
rsp.ok || 0 === rsp.status ? this.l.map((cb => cb({
|
|
758
|
-
type: "load"
|
|
759
|
-
}))) : this.e.map((cb => cb({
|
|
760
|
-
type: "error"
|
|
761
|
-
})));
|
|
762
|
-
}), (() => this.e.forEach((cb => cb({
|
|
763
|
-
type: "error"
|
|
764
|
-
})))));
|
|
765
|
-
}
|
|
766
|
-
addEventListener(eventName, cb) {
|
|
767
|
-
"load" === eventName && this.l.push(cb);
|
|
768
|
-
"error" === eventName && this.e.push(cb);
|
|
1439
|
+
};
|
|
1440
|
+
callback();
|
|
1441
|
+
})(instanceId, newNode);
|
|
1442
|
+
}
|
|
1443
|
+
if (isScript) {
|
|
1444
|
+
sendToMain(true);
|
|
1445
|
+
webWorkerCtx.$postMessage$([7, winId]);
|
|
1446
|
+
}
|
|
1447
|
+
return newNode;
|
|
769
1448
|
}
|
|
770
|
-
get
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
this.l = [ cb ];
|
|
1449
|
+
get nodeName() {
|
|
1450
|
+
return "#s" === this[InstanceDataKey]
|
|
1451
|
+
? "#document-fragment"
|
|
1452
|
+
: this[InstanceDataKey];
|
|
775
1453
|
}
|
|
776
|
-
get
|
|
777
|
-
|
|
1454
|
+
get nodeType() {
|
|
1455
|
+
return 3;
|
|
778
1456
|
}
|
|
779
|
-
|
|
780
|
-
|
|
1457
|
+
get ownerDocument() {
|
|
1458
|
+
return env.$document$;
|
|
781
1459
|
}
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
1460
|
+
},
|
|
1461
|
+
"Node"
|
|
1462
|
+
);
|
|
1463
|
+
cachedTreeProps(
|
|
1464
|
+
WorkerNode,
|
|
1465
|
+
commaSplit(
|
|
1466
|
+
"childNodes,firstChild,isConnected,lastChild,nextSibling,parentElement,parentNode,previousSibling"
|
|
1467
|
+
)
|
|
1468
|
+
);
|
|
1469
|
+
win.Node = WorkerNode;
|
|
1470
|
+
};
|
|
1471
|
+
const htmlMedia = commaSplit("AUDIO,CANVAS,VIDEO");
|
|
1472
|
+
const windowMediaConstructors = commaSplit("Audio,MediaSource");
|
|
1473
|
+
const patchDocument = (WorkerDocument, env, isDocumentImplementation) => {
|
|
1474
|
+
const DocumentDescriptorMap = {
|
|
1475
|
+
body: {
|
|
1476
|
+
get: () => env.$body$,
|
|
1477
|
+
},
|
|
1478
|
+
cookie: {
|
|
1479
|
+
get() {
|
|
1480
|
+
if (env.$isSameOrigin$) {
|
|
1481
|
+
return getter(this, ["cookie"]);
|
|
1482
|
+
}
|
|
1483
|
+
warnCrossOrgin("get", "cookie", env);
|
|
1484
|
+
return "";
|
|
791
1485
|
},
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
1486
|
+
set(value) {
|
|
1487
|
+
if (env.$isSameOrigin$) {
|
|
1488
|
+
setter(this, ["cookie"], value);
|
|
1489
|
+
} else {
|
|
1490
|
+
warnCrossOrgin("set", "cookie", env);
|
|
1491
|
+
}
|
|
795
1492
|
},
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
1493
|
+
},
|
|
1494
|
+
createElement: {
|
|
1495
|
+
value(tagName) {
|
|
1496
|
+
tagName = tagName.toUpperCase();
|
|
1497
|
+
if (!IS_TAG_REG.test(tagName)) {
|
|
1498
|
+
throw tagName + " not valid";
|
|
1499
|
+
}
|
|
1500
|
+
const isIframe = "DIV" === tagName;
|
|
1501
|
+
const winId = this[WinIdKey];
|
|
1502
|
+
const instanceId = (isIframe ? "f_" : "") + randomId();
|
|
1503
|
+
callMethod(this, ["createElement"], [tagName], 2, instanceId);
|
|
1504
|
+
const elm = getOrCreateNodeInstance(winId, instanceId, tagName);
|
|
1505
|
+
if (isIframe) {
|
|
1506
|
+
const env = createEnvironment(
|
|
1507
|
+
{
|
|
1508
|
+
$winId$: instanceId,
|
|
1509
|
+
$parentWinId$: winId,
|
|
1510
|
+
$url$: "about:blank",
|
|
1511
|
+
},
|
|
1512
|
+
true
|
|
1513
|
+
);
|
|
1514
|
+
env.$window$.fetch = fetch;
|
|
1515
|
+
setter(elm, ["srcdoc"], getPartytownScript());
|
|
1516
|
+
} else if ("SCRIPT" === tagName) {
|
|
1517
|
+
const scriptType = getInstanceStateValue(elm, 5);
|
|
1518
|
+
isScriptJsType(scriptType) &&
|
|
1519
|
+
setter(elm, ["type"], "text/partytown");
|
|
1520
|
+
}
|
|
1521
|
+
return elm;
|
|
799
1522
|
},
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
1523
|
+
},
|
|
1524
|
+
createElementNS: {
|
|
1525
|
+
value(namespace, tagName) {
|
|
1526
|
+
const instanceId = randomId();
|
|
1527
|
+
const nsElm = getOrCreateNodeInstance(
|
|
1528
|
+
this[WinIdKey],
|
|
1529
|
+
instanceId,
|
|
1530
|
+
tagName,
|
|
1531
|
+
namespace
|
|
1532
|
+
);
|
|
1533
|
+
callMethod(
|
|
1534
|
+
this,
|
|
1535
|
+
["createElementNS"],
|
|
1536
|
+
[namespace, tagName],
|
|
1537
|
+
2,
|
|
1538
|
+
instanceId
|
|
1539
|
+
);
|
|
1540
|
+
return nsElm;
|
|
808
1541
|
},
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
1542
|
+
},
|
|
1543
|
+
createTextNode: {
|
|
1544
|
+
value(text) {
|
|
1545
|
+
const winId = this[WinIdKey];
|
|
1546
|
+
const instanceId = randomId();
|
|
1547
|
+
const textNode = getOrCreateNodeInstance(winId, instanceId, "#text");
|
|
1548
|
+
callMethod(this, ["createTextNode"], [text], 2, instanceId);
|
|
1549
|
+
return textNode;
|
|
817
1550
|
},
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
1551
|
+
},
|
|
1552
|
+
createEvent: {
|
|
1553
|
+
value: (type) => new Event(type),
|
|
1554
|
+
},
|
|
1555
|
+
currentScript: {
|
|
1556
|
+
get() {
|
|
1557
|
+
return env.$currentScriptId$
|
|
1558
|
+
? getOrCreateNodeInstance(
|
|
1559
|
+
this[WinIdKey],
|
|
1560
|
+
env.$currentScriptId$,
|
|
1561
|
+
"SCRIPT"
|
|
1562
|
+
)
|
|
1563
|
+
: null;
|
|
822
1564
|
},
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
1565
|
+
},
|
|
1566
|
+
defaultView: {
|
|
1567
|
+
get: () => (isDocumentImplementation ? null : env.$window$),
|
|
1568
|
+
},
|
|
1569
|
+
documentElement: {
|
|
1570
|
+
get: () => env.$documentElement$,
|
|
1571
|
+
},
|
|
1572
|
+
getElementsByTagName: {
|
|
1573
|
+
value(tagName) {
|
|
1574
|
+
tagName = tagName.toUpperCase();
|
|
1575
|
+
return "BODY" === tagName
|
|
1576
|
+
? [env.$body$]
|
|
1577
|
+
: "HEAD" === tagName
|
|
1578
|
+
? [env.$head$]
|
|
1579
|
+
: callMethod(this, ["getElementsByTagName"], [tagName]);
|
|
1580
|
+
},
|
|
1581
|
+
},
|
|
1582
|
+
head: {
|
|
1583
|
+
get: () => env.$head$,
|
|
1584
|
+
},
|
|
1585
|
+
images: {
|
|
1586
|
+
get() {
|
|
1587
|
+
return getter(this, ["images"]);
|
|
1588
|
+
},
|
|
1589
|
+
},
|
|
1590
|
+
implementation: {
|
|
1591
|
+
get() {
|
|
1592
|
+
return {
|
|
1593
|
+
hasFeature: () => true,
|
|
1594
|
+
createHTMLDocument: (title) => {
|
|
1595
|
+
const $winId$ = randomId();
|
|
1596
|
+
callMethod(
|
|
1597
|
+
this,
|
|
1598
|
+
["implementation", "createHTMLDocument"],
|
|
1599
|
+
[title],
|
|
1600
|
+
1,
|
|
1601
|
+
{
|
|
1602
|
+
$winId$: $winId$,
|
|
849
1603
|
}
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
1604
|
+
);
|
|
1605
|
+
const docEnv = createEnvironment(
|
|
1606
|
+
{
|
|
1607
|
+
$winId$: $winId$,
|
|
1608
|
+
$parentWinId$: $winId$,
|
|
1609
|
+
$url$: env.$location$ + "",
|
|
1610
|
+
$visibilityState$: "hidden",
|
|
855
1611
|
},
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
}
|
|
861
|
-
}
|
|
1612
|
+
true,
|
|
1613
|
+
true
|
|
1614
|
+
);
|
|
1615
|
+
return docEnv.$document$;
|
|
862
1616
|
},
|
|
863
|
-
|
|
864
|
-
}
|
|
865
|
-
|
|
1617
|
+
};
|
|
1618
|
+
},
|
|
1619
|
+
},
|
|
1620
|
+
location: {
|
|
1621
|
+
get: () => env.$location$,
|
|
1622
|
+
set(url) {
|
|
1623
|
+
env.$location$.href = url + "";
|
|
1624
|
+
},
|
|
1625
|
+
},
|
|
1626
|
+
nodeType: {
|
|
1627
|
+
value: 9,
|
|
1628
|
+
},
|
|
1629
|
+
parentNode: {
|
|
1630
|
+
value: null,
|
|
1631
|
+
},
|
|
1632
|
+
parentElement: {
|
|
1633
|
+
value: null,
|
|
1634
|
+
},
|
|
1635
|
+
readyState: {
|
|
1636
|
+
value: "complete",
|
|
1637
|
+
},
|
|
1638
|
+
visibilityState: {
|
|
1639
|
+
get: () => env.$visibilityState$ || "visible",
|
|
1640
|
+
},
|
|
866
1641
|
};
|
|
867
|
-
|
|
1642
|
+
definePrototypePropertyDescriptor(WorkerDocument, DocumentDescriptorMap);
|
|
1643
|
+
cachedProps(WorkerDocument, "compatMode,referrer,forms");
|
|
1644
|
+
};
|
|
1645
|
+
const patchDocumentElementChild = (WokerDocumentElementChild, env) => {
|
|
1646
|
+
const DocumentElementChildDescriptorMap = {
|
|
1647
|
+
parentElement: {
|
|
868
1648
|
get() {
|
|
869
|
-
|
|
870
|
-
return isScriptJsType(type) ? getInstanceStateValue(this, 3) || "" : getter(this, [ "innerHTML" ]);
|
|
1649
|
+
return this.parentNode;
|
|
871
1650
|
},
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
1651
|
+
},
|
|
1652
|
+
parentNode: {
|
|
1653
|
+
get: () => env.$documentElement$,
|
|
1654
|
+
},
|
|
875
1655
|
};
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
} else {
|
|
902
|
-
const errorMsg = runScriptContent(env, instanceId, scriptContent, winId, "");
|
|
903
|
-
const datasetType = errorMsg ? "pterror" : "ptid";
|
|
904
|
-
const datasetValue = errorMsg || instanceId;
|
|
905
|
-
setter(newNode, [ "type" ], "text/partytown-x");
|
|
906
|
-
setter(newNode, [ "dataset", datasetType ], datasetValue);
|
|
907
|
-
}
|
|
908
|
-
}
|
|
909
|
-
setter(newNode, [ "innerHTML" ], scriptContent);
|
|
910
|
-
}
|
|
911
|
-
}
|
|
912
|
-
callMethod(this, [ "insertBefore" ], [ newNode, referenceNode ], 2);
|
|
913
|
-
if (isIFrame) {
|
|
914
|
-
const src = getInstanceStateValue(newNode, 0);
|
|
915
|
-
if (src && src.startsWith("javascript:")) {
|
|
916
|
-
const scriptContent = src.split("javascript:")[1];
|
|
917
|
-
runScriptContent(env, instanceId, scriptContent, winId, "");
|
|
918
|
-
}
|
|
919
|
-
((winId, iframe) => {
|
|
920
|
-
let i = 0;
|
|
921
|
-
let type;
|
|
922
|
-
let handlers;
|
|
923
|
-
let callback = () => {
|
|
924
|
-
if (environments[winId] && environments[winId].$isInitialized$ && !environments[winId].$isLoading$) {
|
|
925
|
-
type = getInstanceStateValue(iframe, 1) ? "error" : "load";
|
|
926
|
-
handlers = getInstanceStateValue(iframe, type);
|
|
927
|
-
handlers && handlers.map((handler => handler({
|
|
928
|
-
type: type
|
|
929
|
-
})));
|
|
930
|
-
} else if (i++ > 2e3) {
|
|
931
|
-
handlers = getInstanceStateValue(iframe, "error");
|
|
932
|
-
handlers && handlers.map((handler => handler({
|
|
933
|
-
type: "error"
|
|
934
|
-
})));
|
|
935
|
-
} else {
|
|
936
|
-
setTimeout(callback, 9);
|
|
937
|
-
}
|
|
938
|
-
};
|
|
939
|
-
callback();
|
|
940
|
-
})(instanceId, newNode);
|
|
941
|
-
}
|
|
942
|
-
if (isScript) {
|
|
943
|
-
sendToMain(true);
|
|
944
|
-
webWorkerCtx.$postMessage$([ 7, winId ]);
|
|
945
|
-
}
|
|
946
|
-
return newNode;
|
|
947
|
-
}
|
|
948
|
-
get nodeName() {
|
|
949
|
-
return "#s" === this[InstanceDataKey] ? "#document-fragment" : this[InstanceDataKey];
|
|
950
|
-
}
|
|
951
|
-
get nodeType() {
|
|
952
|
-
return 3;
|
|
953
|
-
}
|
|
954
|
-
get ownerDocument() {
|
|
955
|
-
return env.$document$;
|
|
956
|
-
}
|
|
957
|
-
}, "Node");
|
|
958
|
-
cachedTreeProps(WorkerNode, commaSplit("childNodes,firstChild,isConnected,lastChild,nextSibling,parentElement,parentNode,previousSibling"));
|
|
959
|
-
win.Node = WorkerNode;
|
|
1656
|
+
definePrototypePropertyDescriptor(
|
|
1657
|
+
WokerDocumentElementChild,
|
|
1658
|
+
DocumentElementChildDescriptorMap
|
|
1659
|
+
);
|
|
1660
|
+
};
|
|
1661
|
+
const patchElement = (WorkerElement, WorkerHTMLElement) => {
|
|
1662
|
+
const ElementDescriptorMap = {
|
|
1663
|
+
localName: {
|
|
1664
|
+
get() {
|
|
1665
|
+
return this[InstanceDataKey].toLowerCase();
|
|
1666
|
+
},
|
|
1667
|
+
},
|
|
1668
|
+
namespaceURI: {
|
|
1669
|
+
get() {
|
|
1670
|
+
return this[NamespaceKey] || "http://www.w3.org/1999/xhtml";
|
|
1671
|
+
},
|
|
1672
|
+
},
|
|
1673
|
+
nodeType: {
|
|
1674
|
+
value: 1,
|
|
1675
|
+
},
|
|
1676
|
+
tagName: {
|
|
1677
|
+
get() {
|
|
1678
|
+
return this[InstanceDataKey];
|
|
1679
|
+
},
|
|
1680
|
+
},
|
|
960
1681
|
};
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
const env = createEnvironment({
|
|
997
|
-
$winId$: instanceId,
|
|
998
|
-
$parentWinId$: winId,
|
|
999
|
-
$url$: "about:blank"
|
|
1000
|
-
}, true);
|
|
1001
|
-
env.$window$.fetch = fetch;
|
|
1002
|
-
setter(elm, [ "srcdoc" ], getPartytownScript());
|
|
1003
|
-
} else if ("SCRIPT" === tagName) {
|
|
1004
|
-
const scriptType = getInstanceStateValue(elm, 5);
|
|
1005
|
-
isScriptJsType(scriptType) && setter(elm, [ "type" ], "text/partytown");
|
|
1006
|
-
}
|
|
1007
|
-
return elm;
|
|
1008
|
-
}
|
|
1009
|
-
},
|
|
1010
|
-
createElementNS: {
|
|
1011
|
-
value(namespace, tagName) {
|
|
1012
|
-
const instanceId = randomId();
|
|
1013
|
-
const nsElm = getOrCreateNodeInstance(this[WinIdKey], instanceId, tagName, namespace);
|
|
1014
|
-
callMethod(this, [ "createElementNS" ], [ namespace, tagName ], 2, instanceId);
|
|
1015
|
-
return nsElm;
|
|
1016
|
-
}
|
|
1017
|
-
},
|
|
1018
|
-
createTextNode: {
|
|
1019
|
-
value(text) {
|
|
1020
|
-
const winId = this[WinIdKey];
|
|
1021
|
-
const instanceId = randomId();
|
|
1022
|
-
const textNode = getOrCreateNodeInstance(winId, instanceId, "#text");
|
|
1023
|
-
callMethod(this, [ "createTextNode" ], [ text ], 2, instanceId);
|
|
1024
|
-
return textNode;
|
|
1025
|
-
}
|
|
1026
|
-
},
|
|
1027
|
-
createEvent: {
|
|
1028
|
-
value: type => new Event(type)
|
|
1029
|
-
},
|
|
1030
|
-
currentScript: {
|
|
1031
|
-
get() {
|
|
1032
|
-
return env.$currentScriptId$ ? getOrCreateNodeInstance(this[WinIdKey], env.$currentScriptId$, "SCRIPT") : null;
|
|
1033
|
-
}
|
|
1034
|
-
},
|
|
1035
|
-
defaultView: {
|
|
1036
|
-
get: () => isDocumentImplementation ? null : env.$window$
|
|
1037
|
-
},
|
|
1038
|
-
documentElement: {
|
|
1039
|
-
get: () => env.$documentElement$
|
|
1040
|
-
},
|
|
1041
|
-
getElementsByTagName: {
|
|
1042
|
-
value(tagName) {
|
|
1043
|
-
tagName = tagName.toUpperCase();
|
|
1044
|
-
return "BODY" === tagName ? [ env.$body$ ] : "HEAD" === tagName ? [ env.$head$ ] : callMethod(this, [ "getElementsByTagName" ], [ tagName ]);
|
|
1045
|
-
}
|
|
1046
|
-
},
|
|
1047
|
-
head: {
|
|
1048
|
-
get: () => env.$head$
|
|
1049
|
-
},
|
|
1050
|
-
images: {
|
|
1051
|
-
get() {
|
|
1052
|
-
return getter(this, [ "images" ]);
|
|
1682
|
+
definePrototypePropertyDescriptor(WorkerElement, ElementDescriptorMap);
|
|
1683
|
+
cachedTreeProps(WorkerElement, elementStructurePropNames);
|
|
1684
|
+
cachedProps(WorkerElement, "id");
|
|
1685
|
+
cachedDimensionProps(WorkerHTMLElement);
|
|
1686
|
+
cachedDimensionMethods(
|
|
1687
|
+
WorkerHTMLElement,
|
|
1688
|
+
commaSplit("getClientRects,getBoundingClientRect")
|
|
1689
|
+
);
|
|
1690
|
+
};
|
|
1691
|
+
const patchHTMLAnchorElement = (WorkerHTMLAnchorElement, env) => {
|
|
1692
|
+
const HTMLAnchorDescriptorMap = {};
|
|
1693
|
+
commaSplit(
|
|
1694
|
+
"hash,host,hostname,href,origin,pathname,port,protocol,search"
|
|
1695
|
+
).map((anchorProp) => {
|
|
1696
|
+
HTMLAnchorDescriptorMap[anchorProp] = {
|
|
1697
|
+
get() {
|
|
1698
|
+
let value = getInstanceStateValue(this, 4);
|
|
1699
|
+
let href;
|
|
1700
|
+
if ("string" != typeof value) {
|
|
1701
|
+
href = getter(this, ["href"]);
|
|
1702
|
+
setInstanceStateValue(this, 4, href);
|
|
1703
|
+
value = new URL(href)[anchorProp];
|
|
1704
|
+
}
|
|
1705
|
+
return resolveToUrl(env, value, null)[anchorProp];
|
|
1706
|
+
},
|
|
1707
|
+
set(value) {
|
|
1708
|
+
let url;
|
|
1709
|
+
if ("href" === anchorProp) {
|
|
1710
|
+
if (
|
|
1711
|
+
((url) => {
|
|
1712
|
+
try {
|
|
1713
|
+
new URL(url);
|
|
1714
|
+
return true;
|
|
1715
|
+
} catch (_) {
|
|
1716
|
+
return false;
|
|
1053
1717
|
}
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1718
|
+
})(value)
|
|
1719
|
+
) {
|
|
1720
|
+
url = new URL(value);
|
|
1721
|
+
} else {
|
|
1722
|
+
const baseHref = env.$location$.href;
|
|
1723
|
+
url = resolveToUrl(env, baseHref, null);
|
|
1724
|
+
url.href = new URL(value + "", url.href);
|
|
1725
|
+
}
|
|
1726
|
+
} else {
|
|
1727
|
+
url = resolveToUrl(env, this.href, null);
|
|
1728
|
+
url[anchorProp] = value;
|
|
1729
|
+
}
|
|
1730
|
+
setInstanceStateValue(this, 4, url.href);
|
|
1731
|
+
setter(this, ["href"], url.href);
|
|
1732
|
+
},
|
|
1733
|
+
};
|
|
1734
|
+
});
|
|
1735
|
+
definePrototypePropertyDescriptor(
|
|
1736
|
+
WorkerHTMLAnchorElement,
|
|
1737
|
+
HTMLAnchorDescriptorMap
|
|
1738
|
+
);
|
|
1739
|
+
};
|
|
1740
|
+
const patchHTMLIFrameElement = (WorkerHTMLIFrameElement, env) => {
|
|
1741
|
+
const HTMLIFrameDescriptorMap = {
|
|
1742
|
+
contentDocument: {
|
|
1743
|
+
get() {
|
|
1744
|
+
return getIframeEnv(this).$document$;
|
|
1745
|
+
},
|
|
1746
|
+
},
|
|
1747
|
+
contentWindow: {
|
|
1748
|
+
get() {
|
|
1749
|
+
return getIframeEnv(this).$window$;
|
|
1750
|
+
},
|
|
1751
|
+
},
|
|
1752
|
+
src: {
|
|
1753
|
+
get() {
|
|
1754
|
+
let src = getInstanceStateValue(this, 0);
|
|
1755
|
+
if (src && src.startsWith("javascript:")) {
|
|
1756
|
+
return src;
|
|
1757
|
+
}
|
|
1758
|
+
src = getIframeEnv(this).$location$.href;
|
|
1759
|
+
return src.startsWith("about:") ? "" : src;
|
|
1760
|
+
},
|
|
1761
|
+
set(src) {
|
|
1762
|
+
if (src) {
|
|
1763
|
+
if (src.startsWith("javascript:")) {
|
|
1764
|
+
setInstanceStateValue(this, 0, src);
|
|
1765
|
+
} else if (!src.startsWith("about:")) {
|
|
1766
|
+
let xhr = new XMLHttpRequest();
|
|
1767
|
+
let xhrStatus;
|
|
1768
|
+
let env = getIframeEnv(this);
|
|
1769
|
+
env.$location$.href = src = resolveUrl(env, src, "div");
|
|
1770
|
+
env.$isLoading$ = 1;
|
|
1771
|
+
setInstanceStateValue(this, 1, void 0);
|
|
1772
|
+
xhr.open("GET", src, false);
|
|
1773
|
+
xhr.send();
|
|
1774
|
+
xhrStatus = xhr.status;
|
|
1775
|
+
if (xhrStatus > 199 && xhrStatus < 300) {
|
|
1776
|
+
setter(
|
|
1777
|
+
this,
|
|
1778
|
+
["srcdoc"],
|
|
1779
|
+
`<base href="${src}">` +
|
|
1780
|
+
(function (text) {
|
|
1781
|
+
return text.replace(SCRIPT_TAG_REGEXP, (_, attrs) => {
|
|
1782
|
+
const parts = [];
|
|
1783
|
+
let hasType = false;
|
|
1784
|
+
let match;
|
|
1785
|
+
while ((match = ATTR_REGEXP.exec(attrs))) {
|
|
1786
|
+
let [keyValue] = match;
|
|
1787
|
+
if (keyValue.startsWith("type=")) {
|
|
1788
|
+
hasType = true;
|
|
1789
|
+
keyValue = keyValue.replace(
|
|
1790
|
+
/(application|text)\/javascript/,
|
|
1791
|
+
SCRIPT_TYPE
|
|
1792
|
+
);
|
|
1793
|
+
}
|
|
1794
|
+
parts.push(keyValue);
|
|
1071
1795
|
}
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
},
|
|
1090
|
-
readyState: {
|
|
1091
|
-
value: "complete"
|
|
1092
|
-
},
|
|
1093
|
-
visibilityState: {
|
|
1094
|
-
get: () => env.$visibilityState$ || "visible"
|
|
1095
|
-
}
|
|
1096
|
-
};
|
|
1097
|
-
definePrototypePropertyDescriptor(WorkerDocument, DocumentDescriptorMap);
|
|
1098
|
-
cachedProps(WorkerDocument, "compatMode,referrer,forms");
|
|
1099
|
-
};
|
|
1100
|
-
const patchDocumentElementChild = (WokerDocumentElementChild, env) => {
|
|
1101
|
-
const DocumentElementChildDescriptorMap = {
|
|
1102
|
-
parentElement: {
|
|
1103
|
-
get() {
|
|
1104
|
-
return this.parentNode;
|
|
1105
|
-
}
|
|
1106
|
-
},
|
|
1107
|
-
parentNode: {
|
|
1108
|
-
get: () => env.$documentElement$
|
|
1109
|
-
}
|
|
1110
|
-
};
|
|
1111
|
-
definePrototypePropertyDescriptor(WokerDocumentElementChild, DocumentElementChildDescriptorMap);
|
|
1796
|
+
hasType || parts.push('type="text/partytown"');
|
|
1797
|
+
return `<script ${parts.join(" ")}>`;
|
|
1798
|
+
});
|
|
1799
|
+
})(xhr.responseText) +
|
|
1800
|
+
getPartytownScript()
|
|
1801
|
+
);
|
|
1802
|
+
sendToMain(true);
|
|
1803
|
+
webWorkerCtx.$postMessage$([7, env.$winId$]);
|
|
1804
|
+
} else {
|
|
1805
|
+
setInstanceStateValue(this, 1, xhrStatus);
|
|
1806
|
+
env.$isLoading$ = 0;
|
|
1807
|
+
}
|
|
1808
|
+
}
|
|
1809
|
+
}
|
|
1810
|
+
},
|
|
1811
|
+
},
|
|
1812
|
+
...HTMLSrcElementDescriptorMap,
|
|
1112
1813
|
};
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
}
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1814
|
+
definePrototypePropertyDescriptor(
|
|
1815
|
+
WorkerHTMLIFrameElement,
|
|
1816
|
+
HTMLIFrameDescriptorMap
|
|
1817
|
+
);
|
|
1818
|
+
};
|
|
1819
|
+
const ATTR_REGEXP_STR =
|
|
1820
|
+
"((?:\\w|-)+(?:=(?:(?:\\w|-)+|'[^']*'|\"[^\"]*\")?)?)";
|
|
1821
|
+
const SCRIPT_TAG_REGEXP = new RegExp(
|
|
1822
|
+
`<script\\s*((${ATTR_REGEXP_STR}\\s*)*)>`,
|
|
1823
|
+
"mg"
|
|
1824
|
+
);
|
|
1825
|
+
const ATTR_REGEXP = new RegExp(ATTR_REGEXP_STR, "mg");
|
|
1826
|
+
const getIframeEnv = (iframe) => {
|
|
1827
|
+
const $winId$ = iframe[InstanceIdKey];
|
|
1828
|
+
environments[$winId$] ||
|
|
1829
|
+
createEnvironment(
|
|
1830
|
+
{
|
|
1831
|
+
$winId$: $winId$,
|
|
1832
|
+
$parentWinId$: iframe[WinIdKey],
|
|
1833
|
+
$url$: getter(iframe, ["src"]) || "about:blank",
|
|
1834
|
+
},
|
|
1835
|
+
true
|
|
1836
|
+
);
|
|
1837
|
+
return environments[$winId$];
|
|
1838
|
+
};
|
|
1839
|
+
const patchSvgElement = (WorkerSVGGraphicsElement) => {
|
|
1840
|
+
const getMatrix = (elm, methodName) => {
|
|
1841
|
+
const {
|
|
1842
|
+
a: a,
|
|
1843
|
+
b: b,
|
|
1844
|
+
c: c,
|
|
1845
|
+
d: d,
|
|
1846
|
+
e: e,
|
|
1847
|
+
f: f,
|
|
1848
|
+
} = callMethod(elm, [methodName], EMPTY_ARRAY);
|
|
1849
|
+
return new DOMMatrixReadOnly([a, b, c, d, e, f]);
|
|
1139
1850
|
};
|
|
1140
|
-
const
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
return resolveToUrl(env, value, null)[anchorProp];
|
|
1153
|
-
},
|
|
1154
|
-
set(value) {
|
|
1155
|
-
let url;
|
|
1156
|
-
if ("href" === anchorProp) {
|
|
1157
|
-
if ((url => {
|
|
1158
|
-
try {
|
|
1159
|
-
new URL(url);
|
|
1160
|
-
return true;
|
|
1161
|
-
} catch (_) {
|
|
1162
|
-
return false;
|
|
1163
|
-
}
|
|
1164
|
-
})(value)) {
|
|
1165
|
-
url = new URL(value);
|
|
1166
|
-
} else {
|
|
1167
|
-
const baseHref = env.$location$.href;
|
|
1168
|
-
url = resolveToUrl(env, baseHref, null);
|
|
1169
|
-
url.href = new URL(value + "", url.href);
|
|
1170
|
-
}
|
|
1171
|
-
} else {
|
|
1172
|
-
url = resolveToUrl(env, this.href, null);
|
|
1173
|
-
url[anchorProp] = value;
|
|
1174
|
-
}
|
|
1175
|
-
setInstanceStateValue(this, 4, url.href);
|
|
1176
|
-
setter(this, [ "href" ], url.href);
|
|
1177
|
-
}
|
|
1178
|
-
};
|
|
1179
|
-
}));
|
|
1180
|
-
definePrototypePropertyDescriptor(WorkerHTMLAnchorElement, HTMLAnchorDescriptorMap);
|
|
1851
|
+
const SVGGraphicsElementDescriptorMap = {
|
|
1852
|
+
...WorkerSVGGraphicsElement,
|
|
1853
|
+
getCTM: {
|
|
1854
|
+
value: function () {
|
|
1855
|
+
return getMatrix(this, "getCTM");
|
|
1856
|
+
},
|
|
1857
|
+
},
|
|
1858
|
+
getScreenCTM: {
|
|
1859
|
+
value: function () {
|
|
1860
|
+
return getMatrix(this, "getScreenCTM");
|
|
1861
|
+
},
|
|
1862
|
+
},
|
|
1181
1863
|
};
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1864
|
+
definePrototypePropertyDescriptor(
|
|
1865
|
+
WorkerSVGGraphicsElement,
|
|
1866
|
+
SVGGraphicsElementDescriptorMap
|
|
1867
|
+
);
|
|
1868
|
+
};
|
|
1869
|
+
const createNamedNodeMapCstr = (win, WorkerBase) => {
|
|
1870
|
+
win.NamedNodeMap = defineConstructorName(
|
|
1871
|
+
class NamedNodeMap extends WorkerBase {
|
|
1872
|
+
constructor(winId, instanceId, applyPath) {
|
|
1873
|
+
super(winId, instanceId, applyPath);
|
|
1874
|
+
return new Proxy(this, {
|
|
1875
|
+
get(target, propName) {
|
|
1876
|
+
const handler = NAMED_NODE_MAP_HANDLERS[propName];
|
|
1877
|
+
return handler
|
|
1878
|
+
? handler.bind(target, [propName])
|
|
1879
|
+
: getter(target, [propName]);
|
|
1193
1880
|
},
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
set(src) {
|
|
1204
|
-
if (src) {
|
|
1205
|
-
if (src.startsWith("javascript:")) {
|
|
1206
|
-
setInstanceStateValue(this, 0, src);
|
|
1207
|
-
} else if (!src.startsWith("about:")) {
|
|
1208
|
-
let xhr = new XMLHttpRequest;
|
|
1209
|
-
let xhrStatus;
|
|
1210
|
-
let env = getIframeEnv(this);
|
|
1211
|
-
env.$location$.href = src = resolveUrl(env, src, "iframe");
|
|
1212
|
-
env.$isLoading$ = 1;
|
|
1213
|
-
setInstanceStateValue(this, 1, void 0);
|
|
1214
|
-
xhr.open("GET", src, false);
|
|
1215
|
-
xhr.send();
|
|
1216
|
-
xhrStatus = xhr.status;
|
|
1217
|
-
if (xhrStatus > 199 && xhrStatus < 300) {
|
|
1218
|
-
setter(this, [ "srcdoc" ], `<base href="${src}">` + function(text) {
|
|
1219
|
-
return text.replace(SCRIPT_TAG_REGEXP, ((_, attrs) => {
|
|
1220
|
-
const parts = [];
|
|
1221
|
-
let hasType = false;
|
|
1222
|
-
let match;
|
|
1223
|
-
while (match = ATTR_REGEXP.exec(attrs)) {
|
|
1224
|
-
let [keyValue] = match;
|
|
1225
|
-
if (keyValue.startsWith("type=")) {
|
|
1226
|
-
hasType = true;
|
|
1227
|
-
keyValue = keyValue.replace(/(application|text)\/javascript/, SCRIPT_TYPE);
|
|
1228
|
-
}
|
|
1229
|
-
parts.push(keyValue);
|
|
1230
|
-
}
|
|
1231
|
-
hasType || parts.push('type="text/partytown"');
|
|
1232
|
-
return `<script ${parts.join(" ")}>`;
|
|
1233
|
-
}));
|
|
1234
|
-
}(xhr.responseText) + getPartytownScript());
|
|
1235
|
-
sendToMain(true);
|
|
1236
|
-
webWorkerCtx.$postMessage$([ 7, env.$winId$ ]);
|
|
1237
|
-
} else {
|
|
1238
|
-
setInstanceStateValue(this, 1, xhrStatus);
|
|
1239
|
-
env.$isLoading$ = 0;
|
|
1240
|
-
}
|
|
1241
|
-
}
|
|
1242
|
-
}
|
|
1243
|
-
}
|
|
1881
|
+
set(target, propName, propValue) {
|
|
1882
|
+
const handler = NAMED_NODE_MAP_HANDLERS[propName];
|
|
1883
|
+
if (handler) {
|
|
1884
|
+
throw new Error(
|
|
1885
|
+
"Can't set read-only property: " + String(propName)
|
|
1886
|
+
);
|
|
1887
|
+
}
|
|
1888
|
+
setter(target, [propName], propValue);
|
|
1889
|
+
return true;
|
|
1244
1890
|
},
|
|
1245
|
-
|
|
1246
|
-
}
|
|
1247
|
-
|
|
1891
|
+
});
|
|
1892
|
+
}
|
|
1893
|
+
},
|
|
1894
|
+
"NamedNodeMap"
|
|
1895
|
+
);
|
|
1896
|
+
};
|
|
1897
|
+
function method(applyPath, ...args) {
|
|
1898
|
+
return callMethod(this, applyPath, args, 1);
|
|
1899
|
+
}
|
|
1900
|
+
const NAMED_NODE_MAP_HANDLERS = {
|
|
1901
|
+
getNamedItem: method,
|
|
1902
|
+
getNamedItemNS: method,
|
|
1903
|
+
item: method,
|
|
1904
|
+
removeNamedItem: method,
|
|
1905
|
+
removeNamedItemNS: method,
|
|
1906
|
+
setNamedItem: method,
|
|
1907
|
+
setNamedItemNS: method,
|
|
1908
|
+
};
|
|
1909
|
+
const createWindow = (
|
|
1910
|
+
$winId$,
|
|
1911
|
+
$parentWinId$,
|
|
1912
|
+
url,
|
|
1913
|
+
$visibilityState$,
|
|
1914
|
+
isIframeWindow,
|
|
1915
|
+
isDocumentImplementation
|
|
1916
|
+
) => {
|
|
1917
|
+
let cstrInstanceId;
|
|
1918
|
+
let cstrNodeName;
|
|
1919
|
+
let cstrNamespace;
|
|
1920
|
+
const WorkerBase = class {
|
|
1921
|
+
constructor(winId, instanceId, applyPath, instanceData, namespace) {
|
|
1922
|
+
this[WinIdKey] = winId || $winId$;
|
|
1923
|
+
this[InstanceIdKey] = instanceId || cstrInstanceId || randomId();
|
|
1924
|
+
this[ApplyPathKey] = applyPath || [];
|
|
1925
|
+
this[InstanceDataKey] = instanceData || cstrNodeName;
|
|
1926
|
+
this[NamespaceKey] = namespace || cstrNamespace;
|
|
1927
|
+
this[InstanceStateKey] = {};
|
|
1928
|
+
cstrInstanceId = cstrNodeName = cstrNamespace = void 0;
|
|
1929
|
+
}
|
|
1248
1930
|
};
|
|
1249
|
-
const
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1931
|
+
const WorkerLocation = defineConstructorName(
|
|
1932
|
+
class extends URL {
|
|
1933
|
+
assign() {
|
|
1934
|
+
logWorker("location.assign(), noop");
|
|
1935
|
+
}
|
|
1936
|
+
reload() {
|
|
1937
|
+
logWorker("location.reload(), noop");
|
|
1938
|
+
}
|
|
1939
|
+
replace() {
|
|
1940
|
+
logWorker("location.replace(), noop");
|
|
1941
|
+
}
|
|
1942
|
+
},
|
|
1943
|
+
"Location"
|
|
1944
|
+
);
|
|
1945
|
+
const $location$ = new WorkerLocation(url);
|
|
1946
|
+
const $isSameOrigin$ =
|
|
1947
|
+
$location$.origin === webWorkerCtx.$origin$ ||
|
|
1948
|
+
"about:blank" === $location$.origin;
|
|
1949
|
+
const $isTopWindow$ = $parentWinId$ === $winId$;
|
|
1950
|
+
const env = {};
|
|
1951
|
+
const getChildEnvs = () => {
|
|
1952
|
+
let childEnv = [];
|
|
1953
|
+
let envWinId;
|
|
1954
|
+
let otherEnv;
|
|
1955
|
+
for (envWinId in environments) {
|
|
1956
|
+
otherEnv = environments[envWinId];
|
|
1957
|
+
otherEnv.$parentWinId$ !== $winId$ ||
|
|
1958
|
+
otherEnv.$isTopWindow$ ||
|
|
1959
|
+
childEnv.push(otherEnv);
|
|
1960
|
+
}
|
|
1961
|
+
return childEnv;
|
|
1260
1962
|
};
|
|
1261
|
-
const
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1963
|
+
const WorkerWindow = defineConstructorName(
|
|
1964
|
+
class extends WorkerBase {
|
|
1965
|
+
constructor() {
|
|
1966
|
+
super($winId$, $winId$);
|
|
1967
|
+
let win = this;
|
|
1968
|
+
let value;
|
|
1969
|
+
let historyState;
|
|
1970
|
+
let hasInitializedMedia = 0;
|
|
1971
|
+
let initWindowMedia = () => {
|
|
1972
|
+
if (!hasInitializedMedia) {
|
|
1973
|
+
(() => {
|
|
1974
|
+
if (!webWorkerCtx.$initWindowMedia$) {
|
|
1975
|
+
self.$bridgeToMedia$ = [
|
|
1976
|
+
getter,
|
|
1977
|
+
setter,
|
|
1978
|
+
callMethod,
|
|
1979
|
+
constructGlobal,
|
|
1980
|
+
definePrototypePropertyDescriptor,
|
|
1981
|
+
randomId,
|
|
1982
|
+
WinIdKey,
|
|
1983
|
+
InstanceIdKey,
|
|
1984
|
+
ApplyPathKey,
|
|
1985
|
+
];
|
|
1986
|
+
webWorkerCtx.$importScripts$(
|
|
1987
|
+
partytownLibUrl("partytown-media.js?v=0.7.5")
|
|
1988
|
+
);
|
|
1989
|
+
webWorkerCtx.$initWindowMedia$ = self.$bridgeFromMedia$;
|
|
1990
|
+
delete self.$bridgeFromMedia$;
|
|
1271
1991
|
}
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1992
|
+
return webWorkerCtx.$initWindowMedia$;
|
|
1993
|
+
})()(
|
|
1994
|
+
WorkerBase,
|
|
1995
|
+
WorkerEventTargetProxy,
|
|
1996
|
+
env,
|
|
1997
|
+
win,
|
|
1998
|
+
windowMediaConstructors
|
|
1999
|
+
);
|
|
2000
|
+
hasInitializedMedia = 1;
|
|
2001
|
+
}
|
|
2002
|
+
};
|
|
2003
|
+
let nodeCstrs = {};
|
|
2004
|
+
let $createNode$ = (nodeName, instanceId, namespace) => {
|
|
2005
|
+
htmlMedia.includes(nodeName) && initWindowMedia();
|
|
2006
|
+
const NodeCstr = nodeCstrs[nodeName]
|
|
2007
|
+
? nodeCstrs[nodeName]
|
|
2008
|
+
: nodeName.includes("-")
|
|
2009
|
+
? nodeCstrs.UNKNOWN
|
|
2010
|
+
: nodeCstrs.I;
|
|
2011
|
+
cstrInstanceId = instanceId;
|
|
2012
|
+
cstrNodeName = nodeName;
|
|
2013
|
+
cstrNamespace = namespace;
|
|
2014
|
+
return new NodeCstr();
|
|
2015
|
+
};
|
|
2016
|
+
win.Window = WorkerWindow;
|
|
2017
|
+
win.name = name + `${normalizedWinId($winId$)} (${$winId$})`;
|
|
2018
|
+
createNodeCstr(win, env, WorkerBase);
|
|
2019
|
+
((win) => {
|
|
2020
|
+
win.NodeList = defineConstructorName(NodeList, "NodeList");
|
|
2021
|
+
})(win);
|
|
2022
|
+
createNamedNodeMapCstr(win, WorkerBase);
|
|
2023
|
+
createCSSStyleDeclarationCstr(win, WorkerBase, "CSSStyleDeclaration");
|
|
2024
|
+
((win, WorkerBase, cstrName) => {
|
|
2025
|
+
win[cstrName] = defineConstructorName(
|
|
2026
|
+
class extends WorkerBase {
|
|
2027
|
+
now() {
|
|
2028
|
+
return performance.now();
|
|
1276
2029
|
}
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
this[InstanceStateKey] = {};
|
|
1326
|
-
cstrInstanceId = cstrNodeName = cstrNamespace = void 0;
|
|
1327
|
-
}
|
|
1328
|
-
};
|
|
1329
|
-
const WorkerLocation = defineConstructorName(class extends URL {
|
|
1330
|
-
assign() {
|
|
1331
|
-
logWorker("location.assign(), noop");
|
|
1332
|
-
}
|
|
1333
|
-
reload() {
|
|
1334
|
-
logWorker("location.reload(), noop");
|
|
1335
|
-
}
|
|
1336
|
-
replace() {
|
|
1337
|
-
logWorker("location.replace(), noop");
|
|
1338
|
-
}
|
|
1339
|
-
}, "Location");
|
|
1340
|
-
const $location$ = new WorkerLocation(url);
|
|
1341
|
-
const $isSameOrigin$ = $location$.origin === webWorkerCtx.$origin$ || "about:blank" === $location$.origin;
|
|
1342
|
-
const $isTopWindow$ = $parentWinId$ === $winId$;
|
|
1343
|
-
const env = {};
|
|
1344
|
-
const getChildEnvs = () => {
|
|
1345
|
-
let childEnv = [];
|
|
1346
|
-
let envWinId;
|
|
1347
|
-
let otherEnv;
|
|
1348
|
-
for (envWinId in environments) {
|
|
1349
|
-
otherEnv = environments[envWinId];
|
|
1350
|
-
otherEnv.$parentWinId$ !== $winId$ || otherEnv.$isTopWindow$ || childEnv.push(otherEnv);
|
|
1351
|
-
}
|
|
1352
|
-
return childEnv;
|
|
1353
|
-
};
|
|
1354
|
-
const WorkerWindow = defineConstructorName(class extends WorkerBase {
|
|
1355
|
-
constructor() {
|
|
1356
|
-
super($winId$, $winId$);
|
|
1357
|
-
let win = this;
|
|
1358
|
-
let value;
|
|
1359
|
-
let historyState;
|
|
1360
|
-
let hasInitializedMedia = 0;
|
|
1361
|
-
let initWindowMedia = () => {
|
|
1362
|
-
if (!hasInitializedMedia) {
|
|
1363
|
-
(() => {
|
|
1364
|
-
if (!webWorkerCtx.$initWindowMedia$) {
|
|
1365
|
-
self.$bridgeToMedia$ = [ getter, setter, callMethod, constructGlobal, definePrototypePropertyDescriptor, randomId, WinIdKey, InstanceIdKey, ApplyPathKey ];
|
|
1366
|
-
webWorkerCtx.$importScripts$(partytownLibUrl("partytown-media.js?v=0.7.5"));
|
|
1367
|
-
webWorkerCtx.$initWindowMedia$ = self.$bridgeFromMedia$;
|
|
1368
|
-
delete self.$bridgeFromMedia$;
|
|
1369
|
-
}
|
|
1370
|
-
return webWorkerCtx.$initWindowMedia$;
|
|
1371
|
-
})()(WorkerBase, WorkerEventTargetProxy, env, win, windowMediaConstructors);
|
|
1372
|
-
hasInitializedMedia = 1;
|
|
2030
|
+
},
|
|
2031
|
+
cstrName
|
|
2032
|
+
);
|
|
2033
|
+
})(win, WorkerBase, "Performance");
|
|
2034
|
+
((win, nodeCstrs) => {
|
|
2035
|
+
const registry = new Map();
|
|
2036
|
+
win.customElements = {
|
|
2037
|
+
define(tagName, Cstr, opts) {
|
|
2038
|
+
registry.set(tagName, Cstr);
|
|
2039
|
+
nodeCstrs[tagName.toUpperCase()] = Cstr;
|
|
2040
|
+
const ceData = [Cstr.name, Cstr.observedAttributes];
|
|
2041
|
+
callMethod(
|
|
2042
|
+
win,
|
|
2043
|
+
["customElements", "define"],
|
|
2044
|
+
[tagName, ceData, opts]
|
|
2045
|
+
);
|
|
2046
|
+
},
|
|
2047
|
+
get: (tagName) =>
|
|
2048
|
+
registry.get(tagName) ||
|
|
2049
|
+
callMethod(win, ["customElements", "get"], [tagName]),
|
|
2050
|
+
whenDefined: (tagName) =>
|
|
2051
|
+
registry.has(tagName)
|
|
2052
|
+
? Promise.resolve()
|
|
2053
|
+
: callMethod(
|
|
2054
|
+
win,
|
|
2055
|
+
["customElements", "whenDefined"],
|
|
2056
|
+
[tagName]
|
|
2057
|
+
),
|
|
2058
|
+
upgrade: (elm) =>
|
|
2059
|
+
callMethod(win, ["customElements", "upgrade"], [elm]),
|
|
2060
|
+
};
|
|
2061
|
+
})(win, nodeCstrs);
|
|
2062
|
+
webWorkerCtx.$interfaces$.map(
|
|
2063
|
+
([cstrName, superCstrName, members, interfaceType, nodeName]) => {
|
|
2064
|
+
const SuperCstr = TrapConstructors[cstrName]
|
|
2065
|
+
? WorkerTrapProxy
|
|
2066
|
+
: "EventTarget" === superCstrName
|
|
2067
|
+
? WorkerEventTargetProxy
|
|
2068
|
+
: "Object" === superCstrName
|
|
2069
|
+
? WorkerBase
|
|
2070
|
+
: win[superCstrName];
|
|
2071
|
+
const Cstr = (win[cstrName] = defineConstructorName(
|
|
2072
|
+
12 === interfaceType
|
|
2073
|
+
? class extends WorkerBase {
|
|
2074
|
+
constructor(...args) {
|
|
2075
|
+
super();
|
|
2076
|
+
constructGlobal(this, cstrName, args);
|
|
2077
|
+
}
|
|
1373
2078
|
}
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
((win, nodeCstrs) => {
|
|
1400
|
-
const registry = new Map;
|
|
1401
|
-
win.customElements = {
|
|
1402
|
-
define(tagName, Cstr, opts) {
|
|
1403
|
-
registry.set(tagName, Cstr);
|
|
1404
|
-
nodeCstrs[tagName.toUpperCase()] = Cstr;
|
|
1405
|
-
const ceData = [ Cstr.name, Cstr.observedAttributes ];
|
|
1406
|
-
callMethod(win, [ "customElements", "define" ], [ tagName, ceData, opts ]);
|
|
2079
|
+
: win[cstrName] || class extends SuperCstr {},
|
|
2080
|
+
cstrName
|
|
2081
|
+
));
|
|
2082
|
+
nodeName && (nodeCstrs[nodeName] = Cstr);
|
|
2083
|
+
members.map(([memberName, memberType, staticValue]) => {
|
|
2084
|
+
memberName in Cstr.prototype ||
|
|
2085
|
+
memberName in SuperCstr.prototype ||
|
|
2086
|
+
("string" == typeof memberType
|
|
2087
|
+
? definePrototypeProperty(Cstr, memberName, {
|
|
2088
|
+
get() {
|
|
2089
|
+
if (!hasInstanceStateValue(this, memberName)) {
|
|
2090
|
+
const instanceId = this[InstanceIdKey];
|
|
2091
|
+
const applyPath = [
|
|
2092
|
+
...this[ApplyPathKey],
|
|
2093
|
+
memberName,
|
|
2094
|
+
];
|
|
2095
|
+
const PropCstr = win[memberType];
|
|
2096
|
+
PropCstr &&
|
|
2097
|
+
setInstanceStateValue(
|
|
2098
|
+
this,
|
|
2099
|
+
memberName,
|
|
2100
|
+
new PropCstr($winId$, instanceId, applyPath)
|
|
2101
|
+
);
|
|
2102
|
+
}
|
|
2103
|
+
return getInstanceStateValue(this, memberName);
|
|
1407
2104
|
},
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
constructGlobal(this, cstrName, args);
|
|
2105
|
+
set(value) {
|
|
2106
|
+
setInstanceStateValue(this, memberName, value);
|
|
2107
|
+
},
|
|
2108
|
+
})
|
|
2109
|
+
: 5 === memberType
|
|
2110
|
+
? definePrototypeValue(
|
|
2111
|
+
Cstr,
|
|
2112
|
+
memberName,
|
|
2113
|
+
function (...args) {
|
|
2114
|
+
return callMethod(this, [memberName], args);
|
|
1419
2115
|
}
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
2116
|
+
)
|
|
2117
|
+
: memberType > 0 &&
|
|
2118
|
+
(void 0 !== staticValue
|
|
2119
|
+
? definePrototypeValue(Cstr, memberName, staticValue)
|
|
2120
|
+
: definePrototypeProperty(Cstr, memberName, {
|
|
1424
2121
|
get() {
|
|
1425
|
-
|
|
1426
|
-
const instanceId = this[InstanceIdKey];
|
|
1427
|
-
const applyPath = [ ...this[ApplyPathKey], memberName ];
|
|
1428
|
-
const PropCstr = win[memberType];
|
|
1429
|
-
PropCstr && setInstanceStateValue(this, memberName, new PropCstr($winId$, instanceId, applyPath));
|
|
1430
|
-
}
|
|
1431
|
-
return getInstanceStateValue(this, memberName);
|
|
2122
|
+
return getter(this, [memberName]);
|
|
1432
2123
|
},
|
|
1433
2124
|
set(value) {
|
|
1434
|
-
|
|
1435
|
-
}
|
|
1436
|
-
}) : 5 === memberType ? definePrototypeValue(Cstr, memberName, (function(...args) {
|
|
1437
|
-
return callMethod(this, [ memberName ], args);
|
|
1438
|
-
})) : memberType > 0 && (void 0 !== staticValue ? definePrototypeValue(Cstr, memberName, staticValue) : definePrototypeProperty(Cstr, memberName, {
|
|
1439
|
-
get() {
|
|
1440
|
-
return getter(this, [ memberName ]);
|
|
2125
|
+
return setter(this, [memberName], value);
|
|
1441
2126
|
},
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
});
|
|
1521
|
-
win.requestAnimationFrame = cb => setTimeout((() => cb(performance.now())), 9);
|
|
1522
|
-
win.cancelAnimationFrame = id => clearTimeout(id);
|
|
1523
|
-
win.requestIdleCallback = (cb, start) => {
|
|
1524
|
-
start = Date.now();
|
|
1525
|
-
return setTimeout((() => cb({
|
|
1526
|
-
didTimeout: false,
|
|
1527
|
-
timeRemaining: () => Math.max(0, 50 - (Date.now() - start))
|
|
1528
|
-
})), 1);
|
|
1529
|
-
};
|
|
1530
|
-
win.cancelIdleCallback = id => clearTimeout(id);
|
|
1531
|
-
addStorageApi(win, "localStorage", webWorkerlocalStorage, $isSameOrigin$, env);
|
|
1532
|
-
addStorageApi(win, "sessionStorage", webWorkerSessionStorage, $isSameOrigin$, env);
|
|
1533
|
-
$isSameOrigin$ || (win.indexeddb = void 0);
|
|
1534
|
-
if (isIframeWindow) {
|
|
1535
|
-
historyState = {};
|
|
1536
|
-
win.history = {
|
|
1537
|
-
pushState(stateObj) {
|
|
1538
|
-
historyState = stateObj;
|
|
1539
|
-
},
|
|
1540
|
-
replaceState(stateObj) {
|
|
1541
|
-
historyState = stateObj;
|
|
1542
|
-
},
|
|
1543
|
-
get state() {
|
|
1544
|
-
return historyState;
|
|
1545
|
-
},
|
|
1546
|
-
length: 0
|
|
1547
|
-
};
|
|
1548
|
-
win.indexeddb = void 0;
|
|
1549
|
-
} else {
|
|
1550
|
-
const originalPushState = win.history.pushState.bind(win.history);
|
|
1551
|
-
const originalReplaceState = win.history.replaceState.bind(win.history);
|
|
1552
|
-
win.history.pushState = (stateObj, _, newUrl) => {
|
|
1553
|
-
false !== env.$propagateHistoryChange$ && originalPushState(stateObj, _, newUrl);
|
|
1554
|
-
};
|
|
1555
|
-
win.history.replaceState = (stateObj, _, newUrl) => {
|
|
1556
|
-
false !== env.$propagateHistoryChange$ && originalReplaceState(stateObj, _, newUrl);
|
|
1557
|
-
};
|
|
2127
|
+
})));
|
|
2128
|
+
});
|
|
2129
|
+
}
|
|
2130
|
+
);
|
|
2131
|
+
commaSplit(
|
|
2132
|
+
"atob,btoa,crypto,indexedDB,setTimeout,setInterval,clearTimeout,clearInterval"
|
|
2133
|
+
).map((globalName) => {
|
|
2134
|
+
delete WorkerWindow.prototype[globalName];
|
|
2135
|
+
if (!(globalName in win)) {
|
|
2136
|
+
value = self[globalName];
|
|
2137
|
+
null != value &&
|
|
2138
|
+
(win[globalName] =
|
|
2139
|
+
"function" != typeof value ||
|
|
2140
|
+
value.toString().startsWith("class")
|
|
2141
|
+
? value
|
|
2142
|
+
: value.bind(self));
|
|
2143
|
+
}
|
|
2144
|
+
});
|
|
2145
|
+
Object.getOwnPropertyNames(self).map((globalName) => {
|
|
2146
|
+
globalName in win || (win[globalName] = self[globalName]);
|
|
2147
|
+
});
|
|
2148
|
+
windowMediaConstructors.map((cstrName) =>
|
|
2149
|
+
defineProperty(win, cstrName, {
|
|
2150
|
+
get() {
|
|
2151
|
+
initWindowMedia();
|
|
2152
|
+
return win[cstrName];
|
|
2153
|
+
},
|
|
2154
|
+
})
|
|
2155
|
+
);
|
|
2156
|
+
"trustedTypes" in self && (win.trustedTypes = self.trustedTypes);
|
|
2157
|
+
patchElement(win.Element, win.HTMLElement);
|
|
2158
|
+
patchDocument(win.Document, env, isDocumentImplementation);
|
|
2159
|
+
((WorkerDocumentFragment) => {
|
|
2160
|
+
definePrototypeNodeType(WorkerDocumentFragment, 11);
|
|
2161
|
+
cachedTreeProps(WorkerDocumentFragment, elementStructurePropNames);
|
|
2162
|
+
})(win.DocumentFragment);
|
|
2163
|
+
patchHTMLAnchorElement(win.HTMLAnchorElement, env);
|
|
2164
|
+
((WorkerHTMLFormElement) => {
|
|
2165
|
+
definePrototypePropertyDescriptor(WorkerHTMLFormElement, {});
|
|
2166
|
+
cachedProps(WorkerHTMLFormElement, "elements");
|
|
2167
|
+
})(win.HTMLFormElement);
|
|
2168
|
+
patchHTMLIFrameElement(win.HTMLIFrameElement);
|
|
2169
|
+
patchHTMLScriptElement(win.HTMLScriptElement, env);
|
|
2170
|
+
patchSvgElement(win.SVGGraphicsElement);
|
|
2171
|
+
patchDocumentElementChild(win.HTMLHeadElement, env);
|
|
2172
|
+
patchDocumentElementChild(win.HTMLBodyElement, env);
|
|
2173
|
+
((WorkerHTMLHtmlElement, env) => {
|
|
2174
|
+
const DocumentElementDescriptorMap = {
|
|
2175
|
+
parentElement: {
|
|
2176
|
+
value: null,
|
|
2177
|
+
},
|
|
2178
|
+
parentNode: {
|
|
2179
|
+
get: () => env.$document$,
|
|
2180
|
+
},
|
|
2181
|
+
};
|
|
2182
|
+
definePrototypePropertyDescriptor(
|
|
2183
|
+
WorkerHTMLHtmlElement,
|
|
2184
|
+
DocumentElementDescriptorMap
|
|
2185
|
+
);
|
|
2186
|
+
})(win.HTMLHtmlElement, env);
|
|
2187
|
+
createCSSStyleSheetConstructor(win, "CSSStyleSheet");
|
|
2188
|
+
definePrototypeNodeType(win.Comment, 8);
|
|
2189
|
+
definePrototypeNodeType(win.DocumentType, 10);
|
|
2190
|
+
Object.assign(env, {
|
|
2191
|
+
$winId$: $winId$,
|
|
2192
|
+
$parentWinId$: $parentWinId$,
|
|
2193
|
+
$window$: new Proxy(win, {
|
|
2194
|
+
get: (win, propName) => {
|
|
2195
|
+
var _a;
|
|
2196
|
+
if ("string" != typeof propName || isNaN(propName)) {
|
|
2197
|
+
return (
|
|
2198
|
+
null === (_a = webWorkerCtx.$config$.mainWindowAccessors) ||
|
|
2199
|
+
void 0 === _a
|
|
2200
|
+
? void 0
|
|
2201
|
+
: _a.includes(propName)
|
|
2202
|
+
)
|
|
2203
|
+
? getter(this, [propName])
|
|
2204
|
+
: win[propName];
|
|
1558
2205
|
}
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
"load" === args[0] ? env.$runWindowLoadEvent$ && setTimeout((() => args[1]({
|
|
1563
|
-
type: "load"
|
|
1564
|
-
}))) : callMethod(this, [ "addEventListener" ], args, 2);
|
|
1565
|
-
}
|
|
1566
|
-
get body() {
|
|
1567
|
-
return env.$body$;
|
|
1568
|
-
}
|
|
1569
|
-
get document() {
|
|
1570
|
-
return env.$document$;
|
|
1571
|
-
}
|
|
1572
|
-
get documentElement() {
|
|
1573
|
-
return env.$documentElement$;
|
|
1574
|
-
}
|
|
1575
|
-
fetch(input, init) {
|
|
1576
|
-
input = "string" == typeof input || input instanceof URL ? String(input) : input.url;
|
|
1577
|
-
return fetch(resolveUrl(env, input, "fetch"), init);
|
|
1578
|
-
}
|
|
1579
|
-
get frames() {
|
|
1580
|
-
return env.$window$;
|
|
1581
|
-
}
|
|
1582
|
-
get frameElement() {
|
|
1583
|
-
return $isTopWindow$ ? null : getOrCreateNodeInstance($parentWinId$, $winId$, "IFRAME");
|
|
1584
|
-
}
|
|
1585
|
-
get globalThis() {
|
|
1586
|
-
return env.$window$;
|
|
1587
|
-
}
|
|
1588
|
-
get head() {
|
|
1589
|
-
return env.$head$;
|
|
1590
|
-
}
|
|
1591
|
-
get length() {
|
|
1592
|
-
return getChildEnvs().length;
|
|
1593
|
-
}
|
|
1594
|
-
get location() {
|
|
1595
|
-
return $location$;
|
|
1596
|
-
}
|
|
1597
|
-
set location(loc) {
|
|
1598
|
-
$location$.href = loc + "";
|
|
1599
|
-
}
|
|
1600
|
-
get Image() {
|
|
1601
|
-
return createImageConstructor(env);
|
|
1602
|
-
}
|
|
1603
|
-
get navigator() {
|
|
1604
|
-
return (env => {
|
|
1605
|
-
let key;
|
|
1606
|
-
let nav = {
|
|
1607
|
-
sendBeacon: (url, body) => {
|
|
1608
|
-
if (webWorkerCtx.$config$.logSendBeaconRequests) {
|
|
1609
|
-
try {
|
|
1610
|
-
logWorker(`sendBeacon: ${resolveUrl(env, url, null)}${body ? ", data: " + JSON.stringify(body) : ""}`);
|
|
1611
|
-
} catch (e) {
|
|
1612
|
-
console.error(e);
|
|
1613
|
-
}
|
|
1614
|
-
}
|
|
1615
|
-
try {
|
|
1616
|
-
fetch(resolveUrl(env, url, null), {
|
|
1617
|
-
method: "POST",
|
|
1618
|
-
body: body,
|
|
1619
|
-
mode: "no-cors",
|
|
1620
|
-
keepalive: true
|
|
1621
|
-
});
|
|
1622
|
-
return true;
|
|
1623
|
-
} catch (e) {
|
|
1624
|
-
console.error(e);
|
|
1625
|
-
return false;
|
|
1626
|
-
}
|
|
1627
|
-
}
|
|
1628
|
-
};
|
|
1629
|
-
for (key in navigator) {
|
|
1630
|
-
nav[key] = navigator[key];
|
|
1631
|
-
}
|
|
1632
|
-
return nav;
|
|
1633
|
-
})(env);
|
|
1634
|
-
}
|
|
1635
|
-
get origin() {
|
|
1636
|
-
return $location$.origin;
|
|
1637
|
-
}
|
|
1638
|
-
set origin(_) {}
|
|
1639
|
-
get parent() {
|
|
1640
|
-
for (let envWinId in environments) {
|
|
1641
|
-
if (environments[envWinId].$winId$ === $parentWinId$) {
|
|
1642
|
-
return environments[envWinId].$window$;
|
|
1643
|
-
}
|
|
2206
|
+
{
|
|
2207
|
+
let frame = getChildEnvs()[propName];
|
|
2208
|
+
return frame ? frame.$window$ : void 0;
|
|
1644
2209
|
}
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
2210
|
+
},
|
|
2211
|
+
has: () => true,
|
|
2212
|
+
}),
|
|
2213
|
+
$document$: $createNode$("#document", $winId$ + ".d"),
|
|
2214
|
+
$documentElement$: $createNode$("HTML", $winId$ + ".e"),
|
|
2215
|
+
$head$: $createNode$("HEAD", $winId$ + ".h"),
|
|
2216
|
+
$body$: $createNode$("BODY", $winId$ + ".b"),
|
|
2217
|
+
$location$: $location$,
|
|
2218
|
+
$visibilityState$: $visibilityState$,
|
|
2219
|
+
$isSameOrigin$: $isSameOrigin$,
|
|
2220
|
+
$isTopWindow$: $isTopWindow$,
|
|
2221
|
+
$createNode$: $createNode$,
|
|
2222
|
+
});
|
|
2223
|
+
win.requestAnimationFrame = (cb) =>
|
|
2224
|
+
setTimeout(() => cb(performance.now()), 9);
|
|
2225
|
+
win.cancelAnimationFrame = (id) => clearTimeout(id);
|
|
2226
|
+
win.requestIdleCallback = (cb, start) => {
|
|
2227
|
+
start = Date.now();
|
|
2228
|
+
return setTimeout(
|
|
2229
|
+
() =>
|
|
2230
|
+
cb({
|
|
2231
|
+
didTimeout: false,
|
|
2232
|
+
timeRemaining: () => Math.max(0, 50 - (Date.now() - start)),
|
|
2233
|
+
}),
|
|
2234
|
+
1
|
|
2235
|
+
);
|
|
2236
|
+
};
|
|
2237
|
+
win.cancelIdleCallback = (id) => clearTimeout(id);
|
|
2238
|
+
addStorageApi(
|
|
2239
|
+
win,
|
|
2240
|
+
"localStorage",
|
|
2241
|
+
webWorkerlocalStorage,
|
|
2242
|
+
$isSameOrigin$,
|
|
2243
|
+
env
|
|
2244
|
+
);
|
|
2245
|
+
addStorageApi(
|
|
2246
|
+
win,
|
|
2247
|
+
"sessionStorage",
|
|
2248
|
+
webWorkerSessionStorage,
|
|
2249
|
+
$isSameOrigin$,
|
|
2250
|
+
env
|
|
2251
|
+
);
|
|
2252
|
+
$isSameOrigin$ || (win.indexeddb = void 0);
|
|
2253
|
+
if (isIframeWindow) {
|
|
2254
|
+
historyState = {};
|
|
2255
|
+
win.history = {
|
|
2256
|
+
pushState(stateObj) {
|
|
2257
|
+
historyState = stateObj;
|
|
2258
|
+
},
|
|
2259
|
+
replaceState(stateObj) {
|
|
2260
|
+
historyState = stateObj;
|
|
2261
|
+
},
|
|
2262
|
+
get state() {
|
|
2263
|
+
return historyState;
|
|
2264
|
+
},
|
|
2265
|
+
length: 0,
|
|
2266
|
+
};
|
|
2267
|
+
win.indexeddb = void 0;
|
|
2268
|
+
} else {
|
|
2269
|
+
const originalPushState = win.history.pushState.bind(win.history);
|
|
2270
|
+
const originalReplaceState = win.history.replaceState.bind(
|
|
2271
|
+
win.history
|
|
2272
|
+
);
|
|
2273
|
+
win.history.pushState = (stateObj, _, newUrl) => {
|
|
2274
|
+
false !== env.$propagateHistoryChange$ &&
|
|
2275
|
+
originalPushState(stateObj, _, newUrl);
|
|
2276
|
+
};
|
|
2277
|
+
win.history.replaceState = (stateObj, _, newUrl) => {
|
|
2278
|
+
false !== env.$propagateHistoryChange$ &&
|
|
2279
|
+
originalReplaceState(stateObj, _, newUrl);
|
|
2280
|
+
};
|
|
2281
|
+
}
|
|
2282
|
+
win.Worker = void 0;
|
|
2283
|
+
}
|
|
2284
|
+
addEventListener(...args) {
|
|
2285
|
+
"load" === args[0]
|
|
2286
|
+
? env.$runWindowLoadEvent$ &&
|
|
2287
|
+
setTimeout(() =>
|
|
2288
|
+
args[1]({
|
|
2289
|
+
type: "load",
|
|
2290
|
+
})
|
|
2291
|
+
)
|
|
2292
|
+
: callMethod(this, ["addEventListener"], args, 2);
|
|
2293
|
+
}
|
|
2294
|
+
get body() {
|
|
2295
|
+
return env.$body$;
|
|
2296
|
+
}
|
|
2297
|
+
get document() {
|
|
2298
|
+
return env.$document$;
|
|
2299
|
+
}
|
|
2300
|
+
get documentElement() {
|
|
2301
|
+
return env.$documentElement$;
|
|
2302
|
+
}
|
|
2303
|
+
fetch(input, init) {
|
|
2304
|
+
input =
|
|
2305
|
+
"string" == typeof input || input instanceof URL
|
|
2306
|
+
? String(input)
|
|
2307
|
+
: input.url;
|
|
2308
|
+
return fetch(resolveUrl(env, input, "fetch"), init);
|
|
2309
|
+
}
|
|
2310
|
+
get frames() {
|
|
2311
|
+
return env.$window$;
|
|
2312
|
+
}
|
|
2313
|
+
get frameElement() {
|
|
2314
|
+
return $isTopWindow$
|
|
2315
|
+
? null
|
|
2316
|
+
: getOrCreateNodeInstance($parentWinId$, $winId$, "INPUT");
|
|
2317
|
+
}
|
|
2318
|
+
get globalThis() {
|
|
2319
|
+
return env.$window$;
|
|
2320
|
+
}
|
|
2321
|
+
get head() {
|
|
2322
|
+
return env.$head$;
|
|
2323
|
+
}
|
|
2324
|
+
get length() {
|
|
2325
|
+
return getChildEnvs().length;
|
|
2326
|
+
}
|
|
2327
|
+
get location() {
|
|
2328
|
+
return $location$;
|
|
2329
|
+
}
|
|
2330
|
+
set location(loc) {
|
|
2331
|
+
$location$.href = loc + "";
|
|
2332
|
+
}
|
|
2333
|
+
get Image() {
|
|
2334
|
+
return createImageConstructor(env);
|
|
2335
|
+
}
|
|
2336
|
+
get navigator() {
|
|
2337
|
+
return ((env) => {
|
|
2338
|
+
let key;
|
|
2339
|
+
let nav = {
|
|
2340
|
+
sendBeacon: (url, body) => {
|
|
2341
|
+
if (webWorkerCtx.$config$.logSendBeaconRequests) {
|
|
2342
|
+
try {
|
|
2343
|
+
logWorker(
|
|
2344
|
+
`sendBeacon: ${resolveUrl(env, url, null)}${
|
|
2345
|
+
body ? ", data: " + JSON.stringify(body) : ""
|
|
2346
|
+
}`
|
|
2347
|
+
);
|
|
2348
|
+
} catch (e) {
|
|
2349
|
+
console.error(e);
|
|
2350
|
+
}
|
|
1655
2351
|
}
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
2352
|
+
try {
|
|
2353
|
+
fetch(resolveUrl(env, url, null), {
|
|
2354
|
+
method: "POST",
|
|
2355
|
+
body: body,
|
|
2356
|
+
mode: "no-cors",
|
|
2357
|
+
keepalive: true,
|
|
2358
|
+
});
|
|
2359
|
+
return true;
|
|
2360
|
+
} catch (e) {
|
|
2361
|
+
console.error(e);
|
|
2362
|
+
return false;
|
|
1666
2363
|
}
|
|
1667
|
-
|
|
1668
|
-
}
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
}
|
|
1672
|
-
get XMLHttpRequest() {
|
|
1673
|
-
const Xhr = XMLHttpRequest;
|
|
1674
|
-
const str = String(Xhr);
|
|
1675
|
-
const ExtendedXhr = defineConstructorName(class extends Xhr {
|
|
1676
|
-
open(...args) {
|
|
1677
|
-
args[1] = resolveUrl(env, args[1], "xhr");
|
|
1678
|
-
super.open(...args);
|
|
1679
|
-
}
|
|
1680
|
-
set withCredentials(_) {}
|
|
1681
|
-
toString() {
|
|
1682
|
-
return str;
|
|
1683
|
-
}
|
|
1684
|
-
}, getConstructorName(Xhr));
|
|
1685
|
-
ExtendedXhr.prototype.constructor.toString = () => str;
|
|
1686
|
-
return ExtendedXhr;
|
|
1687
|
-
}
|
|
1688
|
-
}, "Window");
|
|
1689
|
-
const WorkerTrapProxy = class extends WorkerBase {
|
|
1690
|
-
constructor(winId, instanceId, applyPath, nodeName) {
|
|
1691
|
-
super(winId, instanceId, applyPath, nodeName);
|
|
1692
|
-
return new Proxy(this, {
|
|
1693
|
-
get: (instance, propName) => getter(instance, [ propName ]),
|
|
1694
|
-
set(instance, propName, propValue) {
|
|
1695
|
-
setter(instance, [ propName ], propValue);
|
|
1696
|
-
return true;
|
|
1697
|
-
}
|
|
1698
|
-
});
|
|
2364
|
+
},
|
|
2365
|
+
};
|
|
2366
|
+
for (key in navigator) {
|
|
2367
|
+
nav[key] = navigator[key];
|
|
1699
2368
|
}
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
{
|
|
1719
|
-
|
|
1720
|
-
|
|
2369
|
+
return nav;
|
|
2370
|
+
})(env);
|
|
2371
|
+
}
|
|
2372
|
+
get origin() {
|
|
2373
|
+
return $location$.origin;
|
|
2374
|
+
}
|
|
2375
|
+
set origin(_) {}
|
|
2376
|
+
get parent() {
|
|
2377
|
+
for (let envWinId in environments) {
|
|
2378
|
+
if (environments[envWinId].$winId$ === $parentWinId$) {
|
|
2379
|
+
return environments[envWinId].$window$;
|
|
2380
|
+
}
|
|
2381
|
+
}
|
|
2382
|
+
return env.$window$;
|
|
2383
|
+
}
|
|
2384
|
+
postMessage(...args) {
|
|
2385
|
+
if (environments[args[0]]) {
|
|
2386
|
+
len(postMessages) > 50 && postMessages.splice(0, 5);
|
|
2387
|
+
postMessages.push({
|
|
2388
|
+
$winId$: args[0],
|
|
2389
|
+
$data$: JSON.stringify(args[1]),
|
|
2390
|
+
});
|
|
2391
|
+
args = args.slice(1);
|
|
2392
|
+
}
|
|
2393
|
+
callMethod(this, ["postMessage"], args, 3);
|
|
2394
|
+
}
|
|
2395
|
+
get self() {
|
|
2396
|
+
return env.$window$;
|
|
2397
|
+
}
|
|
2398
|
+
get top() {
|
|
2399
|
+
for (let envWinId in environments) {
|
|
2400
|
+
if (environments[envWinId].$isTopWindow$) {
|
|
2401
|
+
return environments[envWinId].$window$;
|
|
1721
2402
|
}
|
|
2403
|
+
}
|
|
2404
|
+
return env.$window$;
|
|
2405
|
+
}
|
|
2406
|
+
get window() {
|
|
2407
|
+
return env.$window$;
|
|
2408
|
+
}
|
|
2409
|
+
get XMLHttpRequest() {
|
|
2410
|
+
const Xhr = XMLHttpRequest;
|
|
2411
|
+
const str = String(Xhr);
|
|
2412
|
+
const ExtendedXhr = defineConstructorName(
|
|
2413
|
+
class extends Xhr {
|
|
2414
|
+
open(...args) {
|
|
2415
|
+
args[1] = resolveUrl(env, args[1], "xhr");
|
|
2416
|
+
super.open(...args);
|
|
2417
|
+
}
|
|
2418
|
+
set withCredentials(_) {}
|
|
2419
|
+
toString() {
|
|
2420
|
+
return str;
|
|
2421
|
+
}
|
|
2422
|
+
},
|
|
2423
|
+
getConstructorName(Xhr)
|
|
2424
|
+
);
|
|
2425
|
+
ExtendedXhr.prototype.constructor.toString = () => str;
|
|
2426
|
+
return ExtendedXhr;
|
|
1722
2427
|
}
|
|
1723
|
-
|
|
1724
|
-
|
|
2428
|
+
},
|
|
2429
|
+
"Window"
|
|
2430
|
+
);
|
|
2431
|
+
const WorkerTrapProxy = class extends WorkerBase {
|
|
2432
|
+
constructor(winId, instanceId, applyPath, nodeName) {
|
|
2433
|
+
super(winId, instanceId, applyPath, nodeName);
|
|
2434
|
+
return new Proxy(this, {
|
|
2435
|
+
get: (instance, propName) => getter(instance, [propName]),
|
|
2436
|
+
set(instance, propName, propValue) {
|
|
2437
|
+
setter(instance, [propName], propValue);
|
|
2438
|
+
return true;
|
|
2439
|
+
},
|
|
2440
|
+
});
|
|
2441
|
+
}
|
|
1725
2442
|
};
|
|
1726
|
-
const
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
2443
|
+
const WorkerEventTargetProxy = class extends WorkerBase {};
|
|
2444
|
+
eventTargetMethods.map(
|
|
2445
|
+
(methodName) =>
|
|
2446
|
+
(WorkerEventTargetProxy.prototype[methodName] = function (...args) {
|
|
2447
|
+
return callMethod(this, [methodName], args, 2);
|
|
2448
|
+
})
|
|
2449
|
+
);
|
|
2450
|
+
cachedProps(WorkerWindow, "devicePixelRatio");
|
|
2451
|
+
cachedDimensionProps(WorkerWindow);
|
|
2452
|
+
cachedDimensionMethods(WorkerWindow, ["getComputedStyle"]);
|
|
2453
|
+
new WorkerWindow();
|
|
2454
|
+
return env;
|
|
2455
|
+
};
|
|
2456
|
+
const TrapConstructors = {
|
|
2457
|
+
DOMStringMap: 1,
|
|
2458
|
+
NamedNodeMap: 1,
|
|
2459
|
+
};
|
|
2460
|
+
const createEnvironment = (
|
|
2461
|
+
{
|
|
2462
|
+
$winId$: $winId$,
|
|
2463
|
+
$parentWinId$: $parentWinId$,
|
|
2464
|
+
$url$: $url$,
|
|
2465
|
+
$visibilityState$: $visibilityState$,
|
|
2466
|
+
},
|
|
2467
|
+
isIframeWindow,
|
|
2468
|
+
isDocumentImplementation
|
|
2469
|
+
) => {
|
|
2470
|
+
if (!environments[$winId$]) {
|
|
2471
|
+
environments[$winId$] = createWindow(
|
|
2472
|
+
$winId$,
|
|
2473
|
+
$parentWinId$,
|
|
2474
|
+
$url$,
|
|
2475
|
+
$visibilityState$,
|
|
2476
|
+
isIframeWindow,
|
|
2477
|
+
isDocumentImplementation
|
|
2478
|
+
);
|
|
2479
|
+
{
|
|
2480
|
+
const winType = $winId$ === $parentWinId$ ? "top" : "input";
|
|
2481
|
+
logWorker(
|
|
2482
|
+
`Created ${winType} window ${normalizedWinId($winId$)} environment`,
|
|
2483
|
+
$winId$
|
|
2484
|
+
);
|
|
2485
|
+
}
|
|
2486
|
+
}
|
|
2487
|
+
webWorkerCtx.$postMessage$([7, $winId$]);
|
|
2488
|
+
return environments[$winId$];
|
|
2489
|
+
};
|
|
2490
|
+
const queuedEvents = [];
|
|
2491
|
+
const receiveMessageFromSandboxToWorker = (ev) => {
|
|
2492
|
+
const msg = ev.data;
|
|
2493
|
+
const msgType = msg[0];
|
|
2494
|
+
const msgValue = msg[1];
|
|
2495
|
+
if (webWorkerCtx.$isInitialized$) {
|
|
2496
|
+
if (7 === msgType) {
|
|
2497
|
+
(async (initScript) => {
|
|
2498
|
+
let winId = initScript.$winId$;
|
|
2499
|
+
let instanceId = initScript.$instanceId$;
|
|
2500
|
+
let instance = getOrCreateNodeInstance(winId, instanceId, "SCRIPT");
|
|
2501
|
+
let scriptContent = initScript.$content$;
|
|
2502
|
+
let scriptSrc = initScript.$url$;
|
|
2503
|
+
let scriptOrgSrc = initScript.$orgUrl$;
|
|
2504
|
+
let errorMsg = "";
|
|
2505
|
+
let env = environments[winId];
|
|
2506
|
+
let rsp;
|
|
2507
|
+
let javascriptContentTypes = [
|
|
2508
|
+
"text/jscript",
|
|
2509
|
+
"text/javascript",
|
|
2510
|
+
"text/x-javascript",
|
|
2511
|
+
"application/javascript",
|
|
2512
|
+
"application/x-javascript",
|
|
2513
|
+
"text/ecmascript",
|
|
2514
|
+
"text/x-ecmascript",
|
|
2515
|
+
"application/ecmascript",
|
|
2516
|
+
];
|
|
2517
|
+
if (scriptSrc) {
|
|
2518
|
+
try {
|
|
2519
|
+
scriptSrc = resolveToUrl(env, scriptSrc, "script") + "";
|
|
2520
|
+
setInstanceStateValue(instance, 4, scriptSrc);
|
|
2521
|
+
webWorkerCtx.$config$.logScriptExecution &&
|
|
2522
|
+
logWorker(`Execute script src: ${scriptOrgSrc}`, winId);
|
|
2523
|
+
rsp = await fetch(scriptSrc);
|
|
2524
|
+
if (rsp.ok) {
|
|
2525
|
+
let responseContentType = rsp.headers.get("content-type");
|
|
2526
|
+
let shouldExecute = javascriptContentTypes.some((ct) => {
|
|
2527
|
+
var _a, _b, _c;
|
|
2528
|
+
return null ===
|
|
2529
|
+
(_c =
|
|
2530
|
+
null ===
|
|
2531
|
+
(_a =
|
|
2532
|
+
null == responseContentType
|
|
2533
|
+
? void 0
|
|
2534
|
+
: responseContentType.toLowerCase) || void 0 === _a
|
|
2535
|
+
? void 0
|
|
2536
|
+
: (_b = _a.call(responseContentType)).includes) ||
|
|
2537
|
+
void 0 === _c
|
|
2538
|
+
? void 0
|
|
2539
|
+
: _c.call(_b, ct);
|
|
2540
|
+
});
|
|
2541
|
+
if (shouldExecute) {
|
|
2542
|
+
scriptContent = await rsp.text();
|
|
2543
|
+
env.$currentScriptId$ = instanceId;
|
|
2544
|
+
run(env, scriptContent, scriptOrgSrc || scriptSrc);
|
|
1808
2545
|
}
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
2546
|
+
runStateLoadHandlers(instance, "load");
|
|
2547
|
+
} else {
|
|
2548
|
+
errorMsg = rsp.statusText;
|
|
2549
|
+
runStateLoadHandlers(instance, "error");
|
|
2550
|
+
}
|
|
2551
|
+
} catch (urlError) {
|
|
2552
|
+
console.error(urlError);
|
|
2553
|
+
errorMsg = String(urlError.stack || urlError);
|
|
2554
|
+
runStateLoadHandlers(instance, "error");
|
|
2555
|
+
}
|
|
2556
|
+
} else {
|
|
2557
|
+
scriptContent &&
|
|
2558
|
+
(errorMsg = runScriptContent(
|
|
2559
|
+
env,
|
|
2560
|
+
instanceId,
|
|
2561
|
+
scriptContent,
|
|
2562
|
+
winId,
|
|
2563
|
+
errorMsg
|
|
2564
|
+
));
|
|
2565
|
+
}
|
|
2566
|
+
env.$currentScriptId$ = "";
|
|
2567
|
+
webWorkerCtx.$postMessage$([6, winId, instanceId, errorMsg]);
|
|
2568
|
+
})(msgValue);
|
|
2569
|
+
} else if (9 === msgType) {
|
|
2570
|
+
(({
|
|
2571
|
+
$winId$: $winId$,
|
|
2572
|
+
$instanceId$: $instanceId$,
|
|
2573
|
+
$refId$: $refId$,
|
|
2574
|
+
$thisArg$: $thisArg$,
|
|
2575
|
+
$args$: $args$,
|
|
2576
|
+
}) => {
|
|
2577
|
+
if (webWorkerRefsByRefId[$refId$]) {
|
|
2578
|
+
try {
|
|
2579
|
+
webWorkerRefsByRefId[$refId$].apply(
|
|
2580
|
+
deserializeFromMain($winId$, $instanceId$, [], $thisArg$),
|
|
2581
|
+
deserializeFromMain($winId$, $instanceId$, [], $args$)
|
|
2582
|
+
);
|
|
2583
|
+
} catch (e) {
|
|
2584
|
+
console.error(e);
|
|
2585
|
+
}
|
|
2586
|
+
}
|
|
2587
|
+
})(msgValue);
|
|
2588
|
+
} else if (10 === msgType) {
|
|
2589
|
+
(({ $winId$: $winId$, $forward$: $forward$, $args$: $args$ }) => {
|
|
2590
|
+
try {
|
|
2591
|
+
let target = environments[$winId$].$window$;
|
|
2592
|
+
let i = 0;
|
|
2593
|
+
let l = len($forward$);
|
|
2594
|
+
for (; i < l; i++) {
|
|
2595
|
+
i + 1 < l
|
|
2596
|
+
? (target = target[$forward$[i]])
|
|
2597
|
+
: target[$forward$[i]].apply(
|
|
2598
|
+
target,
|
|
2599
|
+
deserializeFromMain(null, $winId$, [], $args$)
|
|
2600
|
+
);
|
|
2601
|
+
}
|
|
2602
|
+
} catch (e) {
|
|
2603
|
+
console.error(e);
|
|
2604
|
+
}
|
|
2605
|
+
})(msgValue);
|
|
2606
|
+
} else if (5 === msgType) {
|
|
2607
|
+
createEnvironment(msgValue);
|
|
2608
|
+
} else if (8 === msgType) {
|
|
2609
|
+
if (1 !== environments[msgValue].$isInitialized$) {
|
|
2610
|
+
const winId = msgValue;
|
|
2611
|
+
const env = environments[winId];
|
|
2612
|
+
const winType = env.$winId$ === env.$parentWinId$ ? "top" : "input";
|
|
2613
|
+
logWorker(
|
|
2614
|
+
`Initialized ${winType} window ${normalizedWinId(
|
|
2615
|
+
winId
|
|
2616
|
+
)} environment 🎉`,
|
|
2617
|
+
winId
|
|
2618
|
+
);
|
|
1872
2619
|
}
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
2620
|
+
environments[msgValue].$isInitialized$ = 1;
|
|
2621
|
+
environments[msgValue].$isLoading$ = 0;
|
|
2622
|
+
} else if (14 === msgType) {
|
|
2623
|
+
environments[msgValue].$visibilityState$ = msg[2];
|
|
2624
|
+
} else if (13 === msgType) {
|
|
2625
|
+
const $winId$ = msgValue.$winId$;
|
|
2626
|
+
const env = environments[$winId$];
|
|
2627
|
+
env.$location$.href = msgValue.url;
|
|
2628
|
+
!(function ($winId$, env, data) {
|
|
2629
|
+
const history = env.$window$.history;
|
|
2630
|
+
switch (data.type) {
|
|
2631
|
+
case 0:
|
|
2632
|
+
env.$propagateHistoryChange$ = false;
|
|
2633
|
+
try {
|
|
2634
|
+
history.pushState(data.state, "", data.newUrl);
|
|
2635
|
+
} catch (e) {}
|
|
2636
|
+
env.$propagateHistoryChange$ = true;
|
|
2637
|
+
break;
|
|
2638
|
+
|
|
2639
|
+
case 1:
|
|
2640
|
+
env.$propagateHistoryChange$ = false;
|
|
2641
|
+
try {
|
|
2642
|
+
history.replaceState(data.state, "", data.newUrl);
|
|
2643
|
+
} catch (e) {}
|
|
2644
|
+
env.$propagateHistoryChange$ = true;
|
|
2645
|
+
}
|
|
2646
|
+
})(msgValue.$winId$, env, msgValue);
|
|
2647
|
+
} else {
|
|
2648
|
+
15 === msgType &&
|
|
2649
|
+
((_type, winId, instanceId, callbackName, args) => {
|
|
2650
|
+
const elm = getOrCreateNodeInstance(winId, instanceId);
|
|
2651
|
+
elm &&
|
|
2652
|
+
"function" == typeof elm[callbackName] &&
|
|
2653
|
+
elm[callbackName].apply(elm, args);
|
|
2654
|
+
})(...msg);
|
|
2655
|
+
}
|
|
2656
|
+
} else if (1 === msgType) {
|
|
2657
|
+
((initWebWorkerData) => {
|
|
2658
|
+
const config = (webWorkerCtx.$config$ = JSON.parse(
|
|
2659
|
+
initWebWorkerData.$config$
|
|
2660
|
+
));
|
|
2661
|
+
const locOrigin = initWebWorkerData.$origin$;
|
|
2662
|
+
webWorkerCtx.$importScripts$ = importScripts.bind(self);
|
|
2663
|
+
webWorkerCtx.$interfaces$ = initWebWorkerData.$interfaces$;
|
|
2664
|
+
webWorkerCtx.$libPath$ = initWebWorkerData.$libPath$;
|
|
2665
|
+
webWorkerCtx.$origin$ = locOrigin;
|
|
2666
|
+
webWorkerCtx.$postMessage$ = postMessage.bind(self);
|
|
2667
|
+
webWorkerCtx.$sharedDataBuffer$ = initWebWorkerData.$sharedDataBuffer$;
|
|
2668
|
+
webWorkerlocalStorage.set(locOrigin, initWebWorkerData.$localStorage$);
|
|
2669
|
+
webWorkerSessionStorage.set(
|
|
2670
|
+
locOrigin,
|
|
2671
|
+
initWebWorkerData.$sessionStorage$
|
|
2672
|
+
);
|
|
2673
|
+
self.importScripts = void 0;
|
|
2674
|
+
delete self.postMessage;
|
|
2675
|
+
delete self.WorkerGlobalScope;
|
|
2676
|
+
commaSplit("resolveUrl,get,set,apply").map((configName) => {
|
|
2677
|
+
config[configName] &&
|
|
2678
|
+
(config[configName] = new Function(
|
|
2679
|
+
"return " + config[configName]
|
|
2680
|
+
)());
|
|
2681
|
+
});
|
|
2682
|
+
})(msgValue);
|
|
2683
|
+
webWorkerCtx.$postMessage$([2]);
|
|
2684
|
+
} else if (3 === msgType) {
|
|
2685
|
+
webWorkerCtx.$interfaces$ = [...webWorkerCtx.$interfaces$, ...msgValue];
|
|
2686
|
+
webWorkerCtx.$isInitialized$ = 1;
|
|
2687
|
+
logWorker("Initialized web worker");
|
|
2688
|
+
webWorkerCtx.$postMessage$([4]);
|
|
2689
|
+
queuedEvents.length &&
|
|
2690
|
+
logWorker(`Queued ready messages: ${queuedEvents.length}`);
|
|
2691
|
+
[...queuedEvents].map(receiveMessageFromSandboxToWorker);
|
|
2692
|
+
queuedEvents.length = 0;
|
|
2693
|
+
} else {
|
|
2694
|
+
queuedEvents.push(ev);
|
|
2695
|
+
}
|
|
2696
|
+
};
|
|
2697
|
+
self.onmessage = receiveMessageFromSandboxToWorker;
|
|
2698
|
+
postMessage([0]);
|
|
1876
2699
|
})(self);
|