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