Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/plugins/default-browser-emulator/injected-scripts/polyfill.reorder.ts
1029 views
1
for (const { propertyName, prevProperty, throughProperty, path } of args.itemsToReorder || []) {
2
try {
3
if (!path.includes('.prototype')) {
4
reorderOnWindow(path, propertyName, prevProperty, throughProperty);
5
continue;
6
}
7
reorderDescriptor(path, propertyName, prevProperty, throughProperty);
8
} catch (err) {
9
console.log(`ERROR adding order polyfill ${path}->${propertyName}\n${err.toString()}`);
10
}
11
}
12
13
function reorderOnWindow(objectPath, propertyName, prevProperty, throughProperty) {
14
const getOwnPropertyDescriptorsToString = Object.getOwnPropertyDescriptors.toString();
15
Object.getOwnPropertyDescriptors = new Proxy(Object.getOwnPropertyDescriptors, {
16
apply(target, thisArg, argArray) {
17
const descriptors = ReflectCached.apply(...arguments);
18
const objectAtPath = getObjectAtPath(objectPath);
19
if (thisArg === objectAtPath || (argArray && argArray[0] === objectAtPath)) {
20
const keys = Object.keys(descriptors);
21
adjustKeyOrder(keys, propertyName, prevProperty, throughProperty);
22
const finalDescriptors = {};
23
for (const key of keys) {
24
finalDescriptors[key] = descriptors[key];
25
}
26
return finalDescriptors;
27
}
28
return descriptors;
29
},
30
});
31
overriddenFns.set(Object.getOwnPropertyDescriptors, getOwnPropertyDescriptorsToString);
32
33
const getOwnPropertyNamesToString = Object.getOwnPropertyNames.toString();
34
Object.getOwnPropertyNames = new Proxy(Object.getOwnPropertyNames, {
35
apply(target, thisArg, argArray) {
36
const objectAtPath = getObjectAtPath(objectPath);
37
const keys = ReflectCached.apply(...arguments);
38
if (thisArg === objectAtPath || (argArray && argArray[0] === objectAtPath)) {
39
adjustKeyOrder(keys, propertyName, prevProperty, throughProperty);
40
}
41
return keys;
42
},
43
});
44
overriddenFns.set(Object.getOwnPropertyNames, getOwnPropertyNamesToString);
45
46
const keysToString = Object.keys.toString();
47
Object.keys = new Proxy(Object.keys, {
48
apply(target, thisArg, argArray) {
49
const keys = ReflectCached.apply(...arguments);
50
const objectAtPath = getObjectAtPath(objectPath);
51
if (thisArg === objectAtPath || (argArray && argArray[0] === objectAtPath)) {
52
adjustKeyOrder(keys, propertyName, prevProperty, throughProperty);
53
}
54
return keys;
55
},
56
});
57
overriddenFns.set(Object.keys, keysToString);
58
}
59
60
function reorderDescriptor(path, propertyName, prevProperty, throughProperty) {
61
const owner = getObjectAtPath(path);
62
63
const descriptor = Object.getOwnPropertyDescriptor(owner, propertyName);
64
if (!descriptor) {
65
console.log(`Can't redefine a non-existent property descriptor: ${path} -> ${propertyName}`);
66
return;
67
}
68
const prevDescriptor = Object.getOwnPropertyDescriptor(owner, prevProperty);
69
if (!prevDescriptor) {
70
console.log(
71
`Can't redefine a non-existent prev property descriptor: ${path} -> ${propertyName}, prev =${prevProperty}`,
72
);
73
return;
74
}
75
76
const descriptors = Object.getOwnPropertyDescriptors(owner);
77
const keys = Object.keys(owner);
78
adjustKeyOrder(keys, propertyName, prevProperty, throughProperty);
79
80
for (const key of keys) {
81
const keyDescriptor = descriptors[key];
82
delete owner[key];
83
Object.defineProperty(owner, key, keyDescriptor);
84
}
85
}
86
87
function adjustKeyOrder(keys, propertyName, prevProperty, throughProperty) {
88
const currentIndex = keys.indexOf(propertyName);
89
const throughPropIndex = keys.indexOf(throughProperty) - currentIndex + 1;
90
const props = keys.splice(currentIndex, throughPropIndex);
91
keys.splice(keys.indexOf(prevProperty) + 1, 0, ...props);
92
}
93
94