testcafe 3.7.4 → 3.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/assertions/executor.js +2 -2
- package/lib/browser/provider/utils/client-functions.js +1 -3
- package/lib/cli/argument-parser/index.js +3 -3
- package/lib/client/automation/index.js +5 -4
- package/lib/client/automation/playback/press/utils.js +3 -2
- package/lib/client/browser/service-worker.js +1 -1
- package/lib/client/core/index.js +6 -10
- package/lib/client/core/utils/dom.js +2 -2
- package/lib/client/driver/index.js +429 -425
- package/lib/client/driver/index.min.js +1 -1
- package/lib/client/ui/favicon.ico +0 -0
- package/lib/client/ui/index.js +426 -426
- package/lib/client/ui/index.min.js +1 -1
- package/lib/client/ui/sprite.png +0 -0
- package/lib/client-functions/replicator.js +2 -2
- package/lib/client-functions/selectors/selector-attribute-filter.js +1 -3
- package/lib/client-functions/selectors/selector-text-filter.js +1 -3
- package/lib/configuration/types.js +1 -2
- package/lib/custom-client-scripts/client-script-init.js +1 -1
- package/lib/custom-client-scripts/problematic-scripts.js +1 -1
- package/lib/custom-client-scripts/utils.js +4 -4
- package/lib/live/controller.js +5 -5
- package/lib/reporter/plugin-host.js +3 -1
- package/lib/test-run/commands/validations/argument.js +3 -2
- package/lib/test-run/index.js +2 -2
- package/lib/utils/replicator/index.js +442 -0
- package/package.json +20 -23
|
@@ -1084,443 +1084,443 @@ window['%hammerhead%'].utils.removeInjectedScript();
|
|
|
1084
1084
|
return ClientBrowserConsoleMessages;
|
|
1085
1085
|
}(BrowserConsoleMessages));
|
|
1086
1086
|
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
var
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
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
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
}
|
|
1087
|
+
/* eslint-disable no-var */
|
|
1088
|
+
// Const
|
|
1089
|
+
var TRANSFORMED_TYPE_KEY = '@t';
|
|
1090
|
+
var CIRCULAR_REF_KEY = '@r';
|
|
1091
|
+
var KEY_REQUIRE_ESCAPING_RE = /^#*@(t|r)$/;
|
|
1092
|
+
var TYPED_ARRAY_CTORS = {
|
|
1093
|
+
'Int8Array': typeof Int8Array === 'function' ? Int8Array : void 0,
|
|
1094
|
+
'Uint8Array': typeof Uint8Array === 'function' ? Uint8Array : void 0,
|
|
1095
|
+
'Uint8ClampedArray': typeof Uint8ClampedArray === 'function' ? Uint8ClampedArray : void 0,
|
|
1096
|
+
'Int16Array': typeof Int16Array === 'function' ? Int16Array : void 0,
|
|
1097
|
+
'Uint16Array': typeof Uint16Array === 'function' ? Uint16Array : void 0,
|
|
1098
|
+
'Int32Array': typeof Int32Array === 'function' ? Int32Array : void 0,
|
|
1099
|
+
'Uint32Array': typeof Uint32Array === 'function' ? Uint32Array : void 0,
|
|
1100
|
+
'Float32Array': typeof Float32Array === 'function' ? Float32Array : void 0,
|
|
1101
|
+
'Float64Array': typeof Float64Array === 'function' ? Float64Array : void 0,
|
|
1102
|
+
};
|
|
1103
|
+
var SAFE_ERROR_CTORS = {
|
|
1104
|
+
'Error': Error,
|
|
1105
|
+
'EvalError': EvalError,
|
|
1106
|
+
'RangeError': RangeError,
|
|
1107
|
+
'ReferenceError': ReferenceError,
|
|
1108
|
+
'SyntaxError': SyntaxError,
|
|
1109
|
+
'TypeError': TypeError,
|
|
1110
|
+
'URIError': URIError,
|
|
1111
|
+
};
|
|
1112
|
+
var ARRAY_BUFFER_SUPPORTED = typeof ArrayBuffer === 'function';
|
|
1113
|
+
var MAP_SUPPORTED = typeof Map === 'function';
|
|
1114
|
+
var SET_SUPPORTED = typeof Set === 'function';
|
|
1115
|
+
var BUFFER_FROM_SUPPORTED = typeof Buffer === 'function';
|
|
1116
|
+
var TYPED_ARRAY_SUPPORTED = function (typeName) {
|
|
1117
|
+
return !!TYPED_ARRAY_CTORS[typeName];
|
|
1118
|
+
};
|
|
1119
|
+
// Saved proto functions
|
|
1120
|
+
var arrSlice = Array.prototype.slice;
|
|
1121
|
+
// Default serializer
|
|
1122
|
+
var JSONSerializer = {
|
|
1123
|
+
serialize: function (val) {
|
|
1124
|
+
return JSON.stringify(val);
|
|
1125
|
+
},
|
|
1126
|
+
deserialize: function (val) {
|
|
1127
|
+
return JSON.parse(val);
|
|
1128
|
+
},
|
|
1129
|
+
};
|
|
1130
|
+
// EncodingTransformer
|
|
1131
|
+
var EncodingTransformer = function (val, transforms) {
|
|
1132
|
+
this.references = val;
|
|
1133
|
+
this.transforms = transforms;
|
|
1134
|
+
this.circularCandidates = [];
|
|
1135
|
+
this.circularCandidatesDescrs = [];
|
|
1136
|
+
this.circularRefCount = 0;
|
|
1137
|
+
};
|
|
1138
|
+
EncodingTransformer._createRefMark = function (idx) {
|
|
1139
|
+
var obj = Object.create(null);
|
|
1140
|
+
obj[CIRCULAR_REF_KEY] = idx;
|
|
1141
|
+
return obj;
|
|
1142
|
+
};
|
|
1143
|
+
EncodingTransformer.prototype._createCircularCandidate = function (val, parent, key) {
|
|
1144
|
+
this.circularCandidates.push(val);
|
|
1145
|
+
this.circularCandidatesDescrs.push({ parent: parent, key: key, refIdx: -1 });
|
|
1146
|
+
};
|
|
1147
|
+
EncodingTransformer.prototype._applyTransform = function (val, parent, key, transform) {
|
|
1148
|
+
var result = Object.create(null);
|
|
1149
|
+
var serializableVal = transform.toSerializable(val);
|
|
1150
|
+
if (typeof serializableVal === 'object')
|
|
1151
|
+
this._createCircularCandidate(val, parent, key);
|
|
1152
|
+
result[TRANSFORMED_TYPE_KEY] = transform.type;
|
|
1153
|
+
result.data = this._handleValue(serializableVal, parent, key);
|
|
1154
|
+
return result;
|
|
1155
|
+
};
|
|
1156
|
+
EncodingTransformer.prototype._handleArray = function (arr) {
|
|
1157
|
+
var result = [];
|
|
1158
|
+
for (var i = 0; i < arr.length; i++)
|
|
1159
|
+
result[i] = this._handleValue(arr[i], result, i);
|
|
1160
|
+
return result;
|
|
1161
|
+
};
|
|
1162
|
+
EncodingTransformer.prototype._handlePlainObject = function (obj) {
|
|
1163
|
+
var replicator = this;
|
|
1164
|
+
var result = Object.create(null);
|
|
1165
|
+
var ownPropertyNames = Object.getOwnPropertyNames(obj);
|
|
1166
|
+
ownPropertyNames.forEach(function (key) {
|
|
1167
|
+
var resultKey = KEY_REQUIRE_ESCAPING_RE.test(key) ? '#' + key : key;
|
|
1168
|
+
result[resultKey] = replicator._handleValue(obj[key], result, resultKey);
|
|
1169
|
+
});
|
|
1170
|
+
return result;
|
|
1171
|
+
};
|
|
1172
|
+
EncodingTransformer.prototype._handleObject = function (obj, parent, key) {
|
|
1173
|
+
this._createCircularCandidate(obj, parent, key);
|
|
1174
|
+
return Array.isArray(obj) ? this._handleArray(obj) : this._handlePlainObject(obj);
|
|
1175
|
+
};
|
|
1176
|
+
EncodingTransformer.prototype._ensureCircularReference = function (obj) {
|
|
1177
|
+
var circularCandidateIdx = this.circularCandidates.indexOf(obj);
|
|
1178
|
+
if (circularCandidateIdx > -1) {
|
|
1179
|
+
var descr = this.circularCandidatesDescrs[circularCandidateIdx];
|
|
1180
|
+
if (descr.refIdx === -1)
|
|
1181
|
+
descr.refIdx = descr.parent ? ++this.circularRefCount : 0;
|
|
1182
|
+
return EncodingTransformer._createRefMark(descr.refIdx);
|
|
1183
|
+
}
|
|
1184
|
+
return null;
|
|
1185
|
+
};
|
|
1186
|
+
EncodingTransformer.prototype._handleValue = function (val, parent, key) {
|
|
1187
|
+
var type = typeof val;
|
|
1188
|
+
var isObject = type === 'object' && val !== null;
|
|
1189
|
+
if (isObject) {
|
|
1190
|
+
var refMark = this._ensureCircularReference(val);
|
|
1191
|
+
if (refMark)
|
|
1192
|
+
return refMark;
|
|
1193
|
+
}
|
|
1194
|
+
for (var i = 0; i < this.transforms.length; i++) {
|
|
1195
|
+
var transform = this.transforms[i];
|
|
1196
|
+
if (transform.shouldTransform(type, val))
|
|
1197
|
+
return this._applyTransform(val, parent, key, transform);
|
|
1198
|
+
}
|
|
1199
|
+
if (isObject)
|
|
1200
|
+
return this._handleObject(val, parent, key);
|
|
1201
|
+
return val;
|
|
1202
|
+
};
|
|
1203
|
+
EncodingTransformer.prototype.transform = function () {
|
|
1204
|
+
var references = [this._handleValue(this.references, null, null)];
|
|
1205
|
+
for (var i = 0; i < this.circularCandidatesDescrs.length; i++) {
|
|
1206
|
+
var descr = this.circularCandidatesDescrs[i];
|
|
1207
|
+
if (descr.refIdx > 0) {
|
|
1208
|
+
references[descr.refIdx] = descr.parent[descr.key];
|
|
1209
|
+
descr.parent[descr.key] = EncodingTransformer._createRefMark(descr.refIdx);
|
|
1211
1210
|
}
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
});
|
|
1234
|
-
for (var unsecapedKey in unescaped)
|
|
1235
|
-
obj[unsecapedKey] = unescaped[unsecapedKey];
|
|
1236
|
-
};
|
|
1237
|
-
DecodingTransformer.prototype._handleTransformedObject = function (obj, parent, key) {
|
|
1238
|
-
var transformType = obj[TRANSFORMED_TYPE_KEY];
|
|
1239
|
-
var transform = this.transformMap[transformType];
|
|
1240
|
-
if (!transform)
|
|
1241
|
-
throw new Error('Can\'t find transform for "' + transformType + '" type.');
|
|
1242
|
-
this.activeTransformsStack.push(obj);
|
|
1243
|
-
this._handleValue(obj.data, obj, 'data');
|
|
1244
|
-
this.activeTransformsStack.pop();
|
|
1245
|
-
parent[key] = transform.fromSerializable(obj.data);
|
|
1246
|
-
};
|
|
1247
|
-
DecodingTransformer.prototype._handleCircularSelfRefDuringTransform = function (refIdx, parent, key) {
|
|
1248
|
-
// NOTE: we've hit a hard case: object reference itself during transformation.
|
|
1249
|
-
// We can't dereference it since we don't have resulting object yet. And we'll
|
|
1250
|
-
// not be able to restore reference lately because we will need to traverse
|
|
1251
|
-
// transformed object again and reference might be unreachable or new object contain
|
|
1252
|
-
// new circular references. As a workaround we create getter, so once transformation
|
|
1253
|
-
// complete, dereferenced property will point to correct transformed object.
|
|
1254
|
-
var references = this.references;
|
|
1255
|
-
var val = void 0;
|
|
1256
|
-
Object.defineProperty(parent, key, {
|
|
1257
|
-
configurable: true,
|
|
1258
|
-
enumerable: true,
|
|
1259
|
-
get: function () {
|
|
1260
|
-
if (val === void 0)
|
|
1261
|
-
val = references[refIdx];
|
|
1262
|
-
return val;
|
|
1263
|
-
},
|
|
1264
|
-
set: function (value) {
|
|
1265
|
-
val = value;
|
|
1266
|
-
return val;
|
|
1267
|
-
}
|
|
1268
|
-
});
|
|
1269
|
-
};
|
|
1270
|
-
DecodingTransformer.prototype._handleCircularRef = function (refIdx, parent, key) {
|
|
1271
|
-
if (this.activeTransformsStack.indexOf(this.references[refIdx]) > -1)
|
|
1272
|
-
this._handleCircularSelfRefDuringTransform(refIdx, parent, key);
|
|
1273
|
-
else {
|
|
1274
|
-
if (!this.visitedRefs[refIdx]) {
|
|
1275
|
-
this.visitedRefs[refIdx] = true;
|
|
1276
|
-
this._handleValue(this.references[refIdx], this.references, refIdx);
|
|
1277
|
-
}
|
|
1278
|
-
parent[key] = this.references[refIdx];
|
|
1211
|
+
}
|
|
1212
|
+
return references;
|
|
1213
|
+
};
|
|
1214
|
+
// DecodingTransformer
|
|
1215
|
+
var DecodingTransformer = function (references, transformsMap) {
|
|
1216
|
+
this.references = references;
|
|
1217
|
+
this.transformMap = transformsMap;
|
|
1218
|
+
this.activeTransformsStack = [];
|
|
1219
|
+
this.visitedRefs = Object.create(null);
|
|
1220
|
+
};
|
|
1221
|
+
DecodingTransformer.prototype._handlePlainObject = function (obj) {
|
|
1222
|
+
var replicator = this;
|
|
1223
|
+
var unescaped = Object.create(null);
|
|
1224
|
+
var ownPropertyNames = Object.getOwnPropertyNames(obj);
|
|
1225
|
+
ownPropertyNames.forEach(function (key) {
|
|
1226
|
+
replicator._handleValue(obj[key], obj, key);
|
|
1227
|
+
if (KEY_REQUIRE_ESCAPING_RE.test(key)) {
|
|
1228
|
+
// NOTE: use intermediate object to avoid unescaped and escaped keys interference
|
|
1229
|
+
// E.g. unescaped "##@t" will be "#@t" which can overwrite escaped "#@t".
|
|
1230
|
+
unescaped[key.substring(1)] = obj[key];
|
|
1231
|
+
delete obj[key];
|
|
1279
1232
|
}
|
|
1280
|
-
};
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1233
|
+
});
|
|
1234
|
+
for (var unescapedKey in unescaped)
|
|
1235
|
+
obj[unescapedKey] = unescaped[unescapedKey];
|
|
1236
|
+
};
|
|
1237
|
+
DecodingTransformer.prototype._handleTransformedObject = function (obj, parent, key) {
|
|
1238
|
+
var transformType = obj[TRANSFORMED_TYPE_KEY];
|
|
1239
|
+
var transform = this.transformMap[transformType];
|
|
1240
|
+
if (!transform)
|
|
1241
|
+
throw new Error('Can\'t find transform for "' + transformType + '" type.');
|
|
1242
|
+
this.activeTransformsStack.push(obj);
|
|
1243
|
+
this._handleValue(obj.data, obj, 'data');
|
|
1244
|
+
this.activeTransformsStack.pop();
|
|
1245
|
+
parent[key] = transform.fromSerializable(obj.data);
|
|
1246
|
+
};
|
|
1247
|
+
DecodingTransformer.prototype._handleCircularSelfRefDuringTransform = function (refIdx, parent, key) {
|
|
1248
|
+
// NOTE: we've hit a hard case: object reference itself during transformation.
|
|
1249
|
+
// We can't dereference it since we don't have resulting object yet. And we'll
|
|
1250
|
+
// not be able to restore reference lately because we will need to traverse
|
|
1251
|
+
// transformed object again and reference might be unreachable or new object contain
|
|
1252
|
+
// new circular references. As a workaround we create getter, so once transformation
|
|
1253
|
+
// complete, dereferenced property will point to correct transformed object.
|
|
1254
|
+
var references = this.references;
|
|
1255
|
+
var val = void 0;
|
|
1256
|
+
Object.defineProperty(parent, key, {
|
|
1257
|
+
configurable: true,
|
|
1258
|
+
enumerable: true,
|
|
1259
|
+
get: function () {
|
|
1260
|
+
if (val === void 0)
|
|
1261
|
+
val = references[refIdx];
|
|
1262
|
+
return val;
|
|
1263
|
+
},
|
|
1264
|
+
set: function (value) {
|
|
1265
|
+
val = value;
|
|
1266
|
+
// eslint-disable-next-line no-setter-return
|
|
1267
|
+
return val;
|
|
1268
|
+
},
|
|
1269
|
+
});
|
|
1270
|
+
};
|
|
1271
|
+
DecodingTransformer.prototype._handleCircularRef = function (refIdx, parent, key) {
|
|
1272
|
+
if (this.activeTransformsStack.indexOf(this.references[refIdx]) > -1)
|
|
1273
|
+
this._handleCircularSelfRefDuringTransform(refIdx, parent, key);
|
|
1274
|
+
else {
|
|
1275
|
+
if (!this.visitedRefs[refIdx]) {
|
|
1276
|
+
this.visitedRefs[refIdx] = true;
|
|
1277
|
+
this._handleValue(this.references[refIdx], this.references, refIdx);
|
|
1292
1278
|
}
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1279
|
+
parent[key] = this.references[refIdx];
|
|
1280
|
+
}
|
|
1281
|
+
};
|
|
1282
|
+
DecodingTransformer.prototype._handleValue = function (val, parent, key) {
|
|
1283
|
+
if (typeof val !== 'object' || val === null)
|
|
1284
|
+
return;
|
|
1285
|
+
var refIdx = val[CIRCULAR_REF_KEY];
|
|
1286
|
+
if (refIdx !== void 0)
|
|
1287
|
+
this._handleCircularRef(refIdx, parent, key);
|
|
1288
|
+
else if (val[TRANSFORMED_TYPE_KEY])
|
|
1289
|
+
this._handleTransformedObject(val, parent, key);
|
|
1290
|
+
else if (Array.isArray(val)) {
|
|
1291
|
+
for (var i = 0; i < val.length; i++)
|
|
1292
|
+
this._handleValue(val[i], val, i);
|
|
1293
|
+
}
|
|
1294
|
+
else
|
|
1295
|
+
this._handlePlainObject(val);
|
|
1296
|
+
};
|
|
1297
|
+
DecodingTransformer.prototype.transform = function () {
|
|
1298
|
+
this.visitedRefs[0] = true;
|
|
1299
|
+
this._handleValue(this.references[0], this.references, 0);
|
|
1300
|
+
return this.references[0];
|
|
1301
|
+
};
|
|
1302
|
+
// Transforms
|
|
1303
|
+
var builtInTransforms = [
|
|
1304
|
+
{
|
|
1305
|
+
type: '[[NaN]]',
|
|
1306
|
+
shouldTransform: function (type, val) {
|
|
1307
|
+
return type === 'number' && isNaN(val);
|
|
1314
1308
|
},
|
|
1315
|
-
{
|
|
1316
|
-
|
|
1317
|
-
shouldTransform: function (type) {
|
|
1318
|
-
return type === 'undefined';
|
|
1319
|
-
},
|
|
1320
|
-
toSerializable: function () {
|
|
1321
|
-
return '';
|
|
1322
|
-
},
|
|
1323
|
-
fromSerializable: function () {
|
|
1324
|
-
return void 0;
|
|
1325
|
-
}
|
|
1309
|
+
toSerializable: function () {
|
|
1310
|
+
return '';
|
|
1326
1311
|
},
|
|
1327
|
-
{
|
|
1328
|
-
|
|
1329
|
-
shouldTransform: function (type, val) {
|
|
1330
|
-
return val instanceof Date;
|
|
1331
|
-
},
|
|
1332
|
-
toSerializable: function (date) {
|
|
1333
|
-
return date.getTime();
|
|
1334
|
-
},
|
|
1335
|
-
fromSerializable: function (val) {
|
|
1336
|
-
var date = new Date();
|
|
1337
|
-
date.setTime(val);
|
|
1338
|
-
return date;
|
|
1339
|
-
}
|
|
1312
|
+
fromSerializable: function () {
|
|
1313
|
+
return NaN;
|
|
1340
1314
|
},
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
toSerializable: function (re) {
|
|
1347
|
-
var result = {
|
|
1348
|
-
src: re.source,
|
|
1349
|
-
flags: ''
|
|
1350
|
-
};
|
|
1351
|
-
if (re.global)
|
|
1352
|
-
result.flags += 'g';
|
|
1353
|
-
if (re.ignoreCase)
|
|
1354
|
-
result.flags += 'i';
|
|
1355
|
-
if (re.multiline)
|
|
1356
|
-
result.flags += 'm';
|
|
1357
|
-
return result;
|
|
1358
|
-
},
|
|
1359
|
-
fromSerializable: function (val) {
|
|
1360
|
-
return new RegExp(val.src, val.flags);
|
|
1361
|
-
}
|
|
1315
|
+
},
|
|
1316
|
+
{
|
|
1317
|
+
type: '[[undefined]]',
|
|
1318
|
+
shouldTransform: function (type) {
|
|
1319
|
+
return type === 'undefined';
|
|
1362
1320
|
},
|
|
1363
|
-
{
|
|
1364
|
-
|
|
1365
|
-
shouldTransform: function (type, val) {
|
|
1366
|
-
return val instanceof Error;
|
|
1367
|
-
},
|
|
1368
|
-
toSerializable: function (err) {
|
|
1369
|
-
return {
|
|
1370
|
-
name: err.name,
|
|
1371
|
-
message: err.message,
|
|
1372
|
-
stack: err.stack
|
|
1373
|
-
};
|
|
1374
|
-
},
|
|
1375
|
-
fromSerializable: function (val) {
|
|
1376
|
-
var Ctor = GLOBAL[val.name] || Error;
|
|
1377
|
-
var err = new Ctor(val.message);
|
|
1378
|
-
err.stack = val.stack;
|
|
1379
|
-
return err;
|
|
1380
|
-
}
|
|
1321
|
+
toSerializable: function () {
|
|
1322
|
+
return '';
|
|
1381
1323
|
},
|
|
1382
|
-
{
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1324
|
+
fromSerializable: function () {
|
|
1325
|
+
return void 0;
|
|
1326
|
+
},
|
|
1327
|
+
},
|
|
1328
|
+
{
|
|
1329
|
+
type: '[[Date]]',
|
|
1330
|
+
shouldTransform: function (type, val) {
|
|
1331
|
+
return val instanceof Date;
|
|
1332
|
+
},
|
|
1333
|
+
toSerializable: function (date) {
|
|
1334
|
+
return date.getTime();
|
|
1335
|
+
},
|
|
1336
|
+
fromSerializable: function (val) {
|
|
1337
|
+
var date = new Date();
|
|
1338
|
+
date.setTime(val);
|
|
1339
|
+
return date;
|
|
1340
|
+
},
|
|
1341
|
+
},
|
|
1342
|
+
{
|
|
1343
|
+
type: '[[RegExp]]',
|
|
1344
|
+
shouldTransform: function (type, val) {
|
|
1345
|
+
return val instanceof RegExp;
|
|
1346
|
+
},
|
|
1347
|
+
toSerializable: function (re) {
|
|
1348
|
+
var result = {
|
|
1349
|
+
src: re.source,
|
|
1350
|
+
flags: '',
|
|
1351
|
+
};
|
|
1352
|
+
if (re.global)
|
|
1353
|
+
result.flags += 'g';
|
|
1354
|
+
if (re.ignoreCase)
|
|
1355
|
+
result.flags += 'i';
|
|
1356
|
+
if (re.multiline)
|
|
1357
|
+
result.flags += 'm';
|
|
1358
|
+
return result;
|
|
1359
|
+
},
|
|
1360
|
+
fromSerializable: function (val) {
|
|
1361
|
+
return new RegExp(val.src, val.flags);
|
|
1362
|
+
},
|
|
1363
|
+
},
|
|
1364
|
+
{
|
|
1365
|
+
type: '[[Error]]',
|
|
1366
|
+
shouldTransform: function (type, val) {
|
|
1367
|
+
return val instanceof Error;
|
|
1368
|
+
},
|
|
1369
|
+
toSerializable: function (err) {
|
|
1370
|
+
return {
|
|
1371
|
+
name: err.name,
|
|
1372
|
+
message: err.message,
|
|
1373
|
+
stack: err.stack,
|
|
1374
|
+
};
|
|
1375
|
+
},
|
|
1376
|
+
fromSerializable: function (val) {
|
|
1377
|
+
var Ctor = SAFE_ERROR_CTORS[val.name] || Error;
|
|
1378
|
+
var err = new Ctor(val.message);
|
|
1379
|
+
err.stack = val.stack;
|
|
1380
|
+
return err;
|
|
1381
|
+
},
|
|
1382
|
+
},
|
|
1383
|
+
{
|
|
1384
|
+
type: '[[ArrayBuffer]]',
|
|
1385
|
+
shouldTransform: function (type, val) {
|
|
1386
|
+
return ARRAY_BUFFER_SUPPORTED && val instanceof ArrayBuffer;
|
|
1387
|
+
},
|
|
1388
|
+
toSerializable: function (buffer) {
|
|
1389
|
+
var view = new Int8Array(buffer);
|
|
1390
|
+
return arrSlice.call(view);
|
|
1391
|
+
},
|
|
1392
|
+
fromSerializable: function (val) {
|
|
1393
|
+
if (ARRAY_BUFFER_SUPPORTED) {
|
|
1394
|
+
var buffer = new ArrayBuffer(val.length);
|
|
1388
1395
|
var view = new Int8Array(buffer);
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
fromSerializable: function (val) {
|
|
1392
|
-
if (ARRAY_BUFFER_SUPPORTED) {
|
|
1393
|
-
var buffer = new ArrayBuffer(val.length);
|
|
1394
|
-
var view = new Int8Array(buffer);
|
|
1395
|
-
view.set(val);
|
|
1396
|
-
return buffer;
|
|
1397
|
-
}
|
|
1398
|
-
return val;
|
|
1396
|
+
view.set(val);
|
|
1397
|
+
return buffer;
|
|
1399
1398
|
}
|
|
1399
|
+
return val;
|
|
1400
1400
|
},
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
toSerializable: function (buffer) {
|
|
1407
|
-
return arrSlice.call(buffer);
|
|
1408
|
-
},
|
|
1409
|
-
fromSerializable: function (val) {
|
|
1410
|
-
if (BUFFER_FROM_SUPPORTED)
|
|
1411
|
-
return Buffer.from(val);
|
|
1412
|
-
return val;
|
|
1413
|
-
}
|
|
1401
|
+
},
|
|
1402
|
+
{
|
|
1403
|
+
type: '[[Buffer]]',
|
|
1404
|
+
shouldTransform: function (type, val) {
|
|
1405
|
+
return BUFFER_FROM_SUPPORTED && val instanceof Buffer;
|
|
1414
1406
|
},
|
|
1415
|
-
{
|
|
1416
|
-
|
|
1417
|
-
shouldTransform: function (type, val) {
|
|
1418
|
-
return Object.keys(TYPED_ARRAY_CTORS).some(function (ctorName) {
|
|
1419
|
-
return TYPED_ARRAY_SUPPORTED(ctorName) && val instanceof TYPED_ARRAY_CTORS[ctorName];
|
|
1420
|
-
});
|
|
1421
|
-
},
|
|
1422
|
-
toSerializable: function (arr) {
|
|
1423
|
-
return {
|
|
1424
|
-
ctorName: arr.constructor.name,
|
|
1425
|
-
arr: arrSlice.call(arr)
|
|
1426
|
-
};
|
|
1427
|
-
},
|
|
1428
|
-
fromSerializable: function (val) {
|
|
1429
|
-
return TYPED_ARRAY_SUPPORTED(val.ctorName) ? new TYPED_ARRAY_CTORS[val.ctorName](val.arr) : val.arr;
|
|
1430
|
-
}
|
|
1407
|
+
toSerializable: function (buffer) {
|
|
1408
|
+
return arrSlice.call(buffer);
|
|
1431
1409
|
},
|
|
1432
|
-
{
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1410
|
+
fromSerializable: function (val) {
|
|
1411
|
+
if (BUFFER_FROM_SUPPORTED)
|
|
1412
|
+
return Buffer.from(val);
|
|
1413
|
+
return val;
|
|
1414
|
+
},
|
|
1415
|
+
},
|
|
1416
|
+
{
|
|
1417
|
+
type: '[[TypedArray]]',
|
|
1418
|
+
shouldTransform: function (type, val) {
|
|
1419
|
+
return Object.keys(TYPED_ARRAY_CTORS).some(function (ctorName) {
|
|
1420
|
+
return TYPED_ARRAY_SUPPORTED(ctorName) && val instanceof TYPED_ARRAY_CTORS[ctorName];
|
|
1421
|
+
});
|
|
1422
|
+
},
|
|
1423
|
+
toSerializable: function (arr) {
|
|
1424
|
+
return {
|
|
1425
|
+
ctorName: arr.constructor.name,
|
|
1426
|
+
arr: arrSlice.call(arr),
|
|
1427
|
+
};
|
|
1428
|
+
},
|
|
1429
|
+
fromSerializable: function (val) {
|
|
1430
|
+
return TYPED_ARRAY_SUPPORTED(val.ctorName) ? new TYPED_ARRAY_CTORS[val.ctorName](val.arr) : val.arr;
|
|
1431
|
+
},
|
|
1432
|
+
},
|
|
1433
|
+
{
|
|
1434
|
+
type: '[[Map]]',
|
|
1435
|
+
shouldTransform: function (type, val) {
|
|
1436
|
+
return MAP_SUPPORTED && val instanceof Map;
|
|
1437
|
+
},
|
|
1438
|
+
toSerializable: function (map) {
|
|
1439
|
+
var flattenedKVArr = [];
|
|
1440
|
+
map.forEach(function (val, key) {
|
|
1441
|
+
flattenedKVArr.push(key);
|
|
1442
|
+
flattenedKVArr.push(val);
|
|
1443
|
+
});
|
|
1444
|
+
return flattenedKVArr;
|
|
1445
|
+
},
|
|
1446
|
+
fromSerializable: function (val) {
|
|
1447
|
+
if (MAP_SUPPORTED) {
|
|
1448
|
+
// NOTE: new Map(iterable) is not supported by all browsers
|
|
1449
|
+
var map = new Map();
|
|
1450
|
+
for (var i = 0; i < val.length; i += 2)
|
|
1451
|
+
map.set(val[i], val[i + 1]);
|
|
1452
|
+
return map;
|
|
1457
1453
|
}
|
|
1454
|
+
var kvArr = [];
|
|
1455
|
+
for (var j = 0; j < val.length; j += 2)
|
|
1456
|
+
kvArr.push([val[j], val[j + 1]]);
|
|
1457
|
+
return kvArr;
|
|
1458
1458
|
},
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
return val;
|
|
1459
|
+
},
|
|
1460
|
+
{
|
|
1461
|
+
type: '[[Set]]',
|
|
1462
|
+
shouldTransform: function (type, val) {
|
|
1463
|
+
return SET_SUPPORTED && val instanceof Set;
|
|
1464
|
+
},
|
|
1465
|
+
toSerializable: function (set) {
|
|
1466
|
+
var arr = [];
|
|
1467
|
+
set.forEach(function (val) {
|
|
1468
|
+
arr.push(val);
|
|
1469
|
+
});
|
|
1470
|
+
return arr;
|
|
1471
|
+
},
|
|
1472
|
+
fromSerializable: function (val) {
|
|
1473
|
+
if (SET_SUPPORTED) {
|
|
1474
|
+
// NOTE: new Set(iterable) is not supported by all browsers
|
|
1475
|
+
var set = new Set();
|
|
1476
|
+
for (var i = 0; i < val.length; i++)
|
|
1477
|
+
set.add(val[i]);
|
|
1478
|
+
return set;
|
|
1480
1479
|
}
|
|
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
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1480
|
+
return val;
|
|
1481
|
+
},
|
|
1482
|
+
},
|
|
1483
|
+
];
|
|
1484
|
+
// Replicator
|
|
1485
|
+
var Replicator = function (serializer) {
|
|
1486
|
+
this.transforms = [];
|
|
1487
|
+
this.transformsMap = Object.create(null);
|
|
1488
|
+
this.serializer = serializer || JSONSerializer;
|
|
1489
|
+
this.addTransforms(builtInTransforms);
|
|
1490
|
+
};
|
|
1491
|
+
// Manage transforms
|
|
1492
|
+
Replicator.prototype.addTransforms = function (transforms) {
|
|
1493
|
+
transforms = Array.isArray(transforms) ? transforms : [transforms];
|
|
1494
|
+
for (var i = 0; i < transforms.length; i++) {
|
|
1495
|
+
var transform = transforms[i];
|
|
1496
|
+
if (this.transformsMap[transform.type])
|
|
1497
|
+
throw new Error('Transform with type "' + transform.type + '" was already added.');
|
|
1498
|
+
this.transforms.push(transform);
|
|
1499
|
+
this.transformsMap[transform.type] = transform;
|
|
1500
|
+
}
|
|
1501
|
+
return this;
|
|
1502
|
+
};
|
|
1503
|
+
Replicator.prototype.removeTransforms = function (transforms) {
|
|
1504
|
+
transforms = Array.isArray(transforms) ? transforms : [transforms];
|
|
1505
|
+
for (var i = 0; i < transforms.length; i++) {
|
|
1506
|
+
var transform = transforms[i];
|
|
1507
|
+
var idx = this.transforms.indexOf(transform);
|
|
1508
|
+
if (idx > -1)
|
|
1509
|
+
this.transforms.splice(idx, 1);
|
|
1510
|
+
delete this.transformsMap[transform.type];
|
|
1511
|
+
}
|
|
1512
|
+
return this;
|
|
1513
|
+
};
|
|
1514
|
+
Replicator.prototype.encode = function (val) {
|
|
1515
|
+
var transformer = new EncodingTransformer(val, this.transforms);
|
|
1516
|
+
var references = transformer.transform();
|
|
1517
|
+
return this.serializer.serialize(references);
|
|
1518
|
+
};
|
|
1519
|
+
Replicator.prototype.decode = function (val) {
|
|
1520
|
+
var references = this.serializer.deserialize(val);
|
|
1521
|
+
var transformer = new DecodingTransformer(references, this.transformsMap);
|
|
1522
|
+
return transformer.transform();
|
|
1523
|
+
};
|
|
1524
1524
|
|
|
1525
1525
|
var identity = function (val) { return val; };
|
|
1526
1526
|
function createReplicator(transforms) {
|
|
@@ -1528,11 +1528,11 @@ window['%hammerhead%'].utils.removeInjectedScript();
|
|
|
1528
1528
|
// to JSON with a command or command result.
|
|
1529
1529
|
// Therefore there is no need to do additional job here,
|
|
1530
1530
|
// so we use identity functions for serialization.
|
|
1531
|
-
var replicator
|
|
1531
|
+
var replicator = new Replicator({
|
|
1532
1532
|
serialize: identity,
|
|
1533
1533
|
deserialize: identity,
|
|
1534
1534
|
});
|
|
1535
|
-
return replicator
|
|
1535
|
+
return replicator.addTransforms(transforms);
|
|
1536
1536
|
}
|
|
1537
1537
|
|
|
1538
1538
|
// @ts-ignore
|
|
@@ -1689,8 +1689,10 @@ window['%hammerhead%'].utils.removeInjectedScript();
|
|
|
1689
1689
|
throw new DomNodeClientFunctionResultError(this._instantiationCallsiteName);
|
|
1690
1690
|
return false;
|
|
1691
1691
|
};
|
|
1692
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
1692
1693
|
ClientFunctionNodeTransform.prototype.toSerializable = function () {
|
|
1693
1694
|
};
|
|
1695
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
1694
1696
|
ClientFunctionNodeTransform.prototype.fromSerializable = function () {
|
|
1695
1697
|
};
|
|
1696
1698
|
return ClientFunctionNodeTransform;
|
|
@@ -2626,6 +2628,7 @@ window['%hammerhead%'].utils.removeInjectedScript();
|
|
|
2626
2628
|
this._extend(snapshot, node);
|
|
2627
2629
|
return snapshot;
|
|
2628
2630
|
};
|
|
2631
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
2629
2632
|
SelectorNodeTransform.prototype.fromSerializable = function () {
|
|
2630
2633
|
};
|
|
2631
2634
|
return SelectorNodeTransform;
|
|
@@ -4316,6 +4319,7 @@ window['%hammerhead%'].utils.removeInjectedScript();
|
|
|
4316
4319
|
SelectorElementActionTransform.prototype.toSerializable = function (node) {
|
|
4317
4320
|
return new ElementActionSnapshot(node);
|
|
4318
4321
|
};
|
|
4322
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
4319
4323
|
SelectorElementActionTransform.prototype.fromSerializable = function () {
|
|
4320
4324
|
};
|
|
4321
4325
|
return SelectorElementActionTransform;
|
|
@@ -4376,7 +4380,7 @@ window['%hammerhead%'].utils.removeInjectedScript();
|
|
|
4376
4380
|
}
|
|
4377
4381
|
this._requests.clear();
|
|
4378
4382
|
this._offListening();
|
|
4379
|
-
this._waitResolve();
|
|
4383
|
+
this._waitResolve();
|
|
4380
4384
|
};
|
|
4381
4385
|
RequestBarrier.prototype.wait = function (isPageLoad) {
|
|
4382
4386
|
var _this = this;
|
|
@@ -4446,7 +4450,7 @@ window['%hammerhead%'].utils.removeInjectedScript();
|
|
|
4446
4450
|
}
|
|
4447
4451
|
this._scripts.clear();
|
|
4448
4452
|
this._offListening();
|
|
4449
|
-
this._waitResolve();
|
|
4453
|
+
this._waitResolve();
|
|
4450
4454
|
this._waitResolve = null;
|
|
4451
4455
|
};
|
|
4452
4456
|
ScriptExecutionBarrier.prototype.wait = function () {
|