-
Notifications
You must be signed in to change notification settings - Fork 915
Expand file tree
/
Copy pathbrowser.ts
More file actions
165 lines (155 loc) · 5.85 KB
/
browser.ts
File metadata and controls
165 lines (155 loc) · 5.85 KB
1
2
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
import fs from "fs";
import path from "path";
import { Page } from "puppeteer-core";
import { env } from "../env.js";
export const getChromeExecutablePath = () => {
if (env.CHROME_EXECUTABLE_PATH) {
const executablePath = env.CHROME_EXECUTABLE_PATH;
const normalizedPath = path.normalize(executablePath);
if (!fs.existsSync(normalizedPath)) {
console.warn(`Your custom chrome executable at ${normalizedPath} does not exist`);
} else {
return executablePath;
}
}
if (process.platform === "win32") {
const programFilesPath = `${process.env["ProgramFiles"]}\\Google\\Chrome\\Application\\chrome.exe`;
const programFilesX86Path = `C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe`;
if (fs.existsSync(programFilesPath)) {
return programFilesPath;
} else if (fs.existsSync(programFilesX86Path)) {
return programFilesX86Path;
}
}
if (process.platform === "darwin") {
return "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome";
}
return "/usr/bin/chromium";
};
export async function installMouseHelper(page: Page, device: string) {
await page.evaluateOnNewDocument((deviceType) => {
// Install mouse helper only for top-level frame.
if (window !== window.parent) return;
window.addEventListener(
"DOMContentLoaded",
() => {
if (deviceType === "desktop") {
// Desktop mode: show regular arrow cursor
const CURSOR_ID = "__cursor__";
if (document.getElementById(CURSOR_ID)) return;
const cursor = document.createElement("div");
cursor.id = CURSOR_ID;
Object.assign(cursor.style, {
position: "fixed",
top: "0px",
left: "0px",
width: "20px",
height: "20px",
backgroundImage: `url("data:image/svg+xml;utf8,<svg width='16' height='16' viewBox='0 0 20 20' fill='black' outline='white' xmlns='http://www.w3.org/2000/svg'><path d='M15.8089 7.22221C15.9333 7.00888 15.9911 6.78221 15.9822 6.54221C15.9733 6.29333 15.8978 6.06667 15.7555 5.86221C15.6133 5.66667 15.4311 5.52445 15.2089 5.43555L1.70222 0.0888888C1.47111 0 1.23555 -0.0222222 0.995555 0.0222222C0.746667 0.0755555 0.537779 0.186667 0.368888 0.355555C0.191111 0.533333 0.0755555 0.746667 0.0222222 0.995555C-0.0222222 1.23555 0 1.47111 0.0888888 1.70222L5.43555 15.2222C5.52445 15.4445 5.66667 15.6267 5.86221 15.7689C6.06667 15.9111 6.28888 15.9867 6.52888 15.9955H6.58221C6.82221 15.9955 7.04445 15.9333 7.24888 15.8089C7.44445 15.6845 7.59555 15.52 7.70221 15.3155L10.2089 10.2222L15.3022 7.70221C15.5155 7.59555 15.6845 7.43555 15.8089 7.22221Z' ></path></svg>")`,
backgroundSize: "cover",
pointerEvents: "none",
zIndex: "99999",
transform: "translate(-2px, -2px)",
});
document.body.appendChild(cursor);
document.addEventListener("mousemove", (e) => {
cursor.style.top = e.clientY + "px";
cursor.style.left = e.clientX + "px";
});
} else {
// Mobile mode: show circular touch indicator
const box = document.createElement("puppeteer-mouse-pointer");
const styleElement = document.createElement("style");
styleElement.innerHTML = `
puppeteer-mouse-pointer {
pointer-events: none;
position: absolute;
top: 0;
z-index: 10000;
left: 0;
width: 20px;
height: 20px;
background: rgba(0,0,0,.4);
border: 1px solid white;
border-radius: 10px;
margin: -10px 0 0 -10px;
padding: 0;
transition: background .2s, border-radius .2s, border-color .2s;
}
puppeteer-mouse-pointer.button-1 {
transition: none;
background: rgba(0,0,0,0.9);
}
puppeteer-mouse-pointer.button-2 {
transition: none;
border-color: rgba(0,0,255,0.9);
}
puppeteer-mouse-pointer.button-3 {
transition: none;
border-radius: 4px;
}
puppeteer-mouse-pointer.button-4 {
transition: none;
border-color: rgba(255,0,0,0.9);
}
puppeteer-mouse-pointer.button-5 {
transition: none;
border-color: rgba(0,255,0,0.9);
}
`;
document.head.appendChild(styleElement);
document.body.appendChild(box);
document.addEventListener(
"mousemove",
(event) => {
box.style.left = event.pageX + "px";
box.style.top = event.pageY + "px";
updateButtons(event.buttons);
},
true,
);
document.addEventListener(
"mousedown",
(event) => {
updateButtons(event.buttons);
box.classList.add("button-" + event.which);
},
true,
);
document.addEventListener(
"mouseup",
(event) => {
updateButtons(event.buttons);
box.classList.remove("button-" + event.which);
},
true,
);
function updateButtons(buttons) {
for (let i = 0; i < 5; i++)
// @ts-ignore
box.classList.toggle("button-" + i, buttons & (1 << i));
}
}
},
false,
);
}, device);
}
export function filterHeaders(headers: Record<string, string>) {
const headersToRemove = [
"accept-encoding",
"accept",
"cache-control",
"pragma",
"sec-fetch-dest",
"sec-fetch-mode",
"sec-fetch-site",
"sec-fetch-user",
"upgrade-insecure-requests",
];
const filteredHeaders = { ...headers };
headersToRemove.forEach((header) => {
delete filteredHeaders[header];
});
return filteredHeaders;
}