Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/plugins/default-browser-emulator/lib/loadDomOverrides.ts
1029 views
1
import { BrowserEmulator } from '@secret-agent/plugin-utils';
2
import DomOverridesBuilder from './DomOverridesBuilder';
3
import IBrowserData from '../interfaces/IBrowserData';
4
import parseNavigatorPlugins from './utils/parseNavigatorPlugins';
5
6
export default function loadDomOverrides(
7
emulator: BrowserEmulator,
8
data: IBrowserData,
9
): DomOverridesBuilder {
10
const domOverrides = new DomOverridesBuilder();
11
12
domOverrides.add('Error.captureStackTrace');
13
domOverrides.add('Error.constructor');
14
const deviceProfile = emulator.deviceProfile;
15
16
domOverrides.add('navigator.deviceMemory', { memory: deviceProfile.deviceMemory });
17
domOverrides.add('navigator', {
18
userAgentString: emulator.userAgentString,
19
platform: emulator.operatingSystemPlatform,
20
headless: emulator.browserEngine.isHeaded !== true,
21
});
22
23
domOverrides.add('MediaDevices.prototype.enumerateDevices', {
24
videoDevice: deviceProfile.videoDevice,
25
});
26
27
domOverrides.add('Notification.permission');
28
domOverrides.add('Permission.prototype.query');
29
30
const windowChrome = data.windowChrome;
31
if (windowChrome) {
32
domOverrides.add('window.chrome', {
33
updateLoadTimes: true,
34
polyfill: {
35
property: windowChrome.chrome,
36
prevProperty: windowChrome.prevProperty,
37
},
38
});
39
}
40
41
const domPolyfill = data.domPolyfill;
42
if (domPolyfill) {
43
if (domPolyfill?.add?.length) {
44
domOverrides.add('polyfill.add', {
45
itemsToAdd: domPolyfill.add,
46
});
47
}
48
if (domPolyfill?.remove?.length) {
49
domOverrides.add('polyfill.remove', {
50
itemsToRemove: domPolyfill.remove,
51
});
52
}
53
if (domPolyfill?.modify?.length) {
54
domOverrides.add('polyfill.modify', {
55
itemsToModify: domPolyfill.modify,
56
});
57
}
58
if (domPolyfill?.reorder?.length) {
59
domOverrides.add('polyfill.reorder', {
60
itemsToReorder: domPolyfill.reorder,
61
});
62
}
63
}
64
65
const windowNavigator = data.windowNavigator;
66
domOverrides.add('navigator.plugins', parseNavigatorPlugins(windowNavigator.navigator));
67
domOverrides.add('WebGLRenderingContext.prototype.getParameter', deviceProfile.webGlParameters);
68
domOverrides.add('console.debug');
69
domOverrides.add('HTMLIFrameElement.prototype');
70
domOverrides.add('Element.prototype.attachShadow');
71
72
domOverrides.add('window.outerWidth', {
73
frameBorderWidth: data.windowFraming.frameBorderWidth,
74
});
75
domOverrides.add('window.outerHeight', {
76
frameBorderHeight: data.windowFraming.frameBorderHeight,
77
});
78
79
return domOverrides;
80
}
81
82