Commit 473be7d4 authored by lukas.niegsch's avatar lukas.niegsch

fix misusage of cdp api

parent ea89ea09
class HeadlessChromium class HeadlessChromium
{ {
constructor(websocket) constructor(url)
{ {
this.websocket = websocket this.url = url
this.browserWebsocket = this.getBrowserWebsocketUrl()
this.pageWebsockets = new Map()
} }
// session websocket != page websocket getBrowserWebsocketUrl()
// page websocket can be found at localhost:<port>/json/version {
// at webSocketDebuggerUrl where targetId = id var xmlHttp = new XMLHttpRequest();
// question? how to make localhost GET request to get this resource ... xmlHttp.open("GET", this.url + "/json/version", false);
async runCommand(command, params = {}) xmlHttp.send(null);
return JSON.parse(xmlHttp.responseText).webSocketDebuggerUrl
}
getPageWebsocket(page)
{
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", this.url + "/json/list", false);
xmlHttp.send(null);
for (const target of JSON.parse(xmlHttp.responseText))
{
if (target.id = page)
{
return target.webSocketDebuggerUrl
}
}
}
async runCommand(websocket, command, params = {})
{ {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
var server = new WebSocket(this.websocket) var server = new WebSocket(websocket)
server.onopen = () => { server.onopen = () => {
var message = {id: 0, method: command, params: params} var message = {id: 0, method: command, params: params}
...@@ -43,58 +63,52 @@ class HeadlessChromium ...@@ -43,58 +63,52 @@ class HeadlessChromium
}) })
} }
async getVersion() async runBrowserCommand(command, params = {})
{ {
return await this.runCommand("Browser.getVersion") return await this.runCommand(this.browserWebsocket, command, params)
} }
async enableDOM() async runPageCommand(page, command, params = {})
{ {
return await this.runCommand("DOM.enable") var websocket = this.pageWebsockets.get(page)
}
async enableNetwork() if (!websocket)
{ {
return await this.runCommand("Network.enable") console.error(page + ' is not a valid page. Use browser.createPage() to create a valid page.')
return
}
return await this.runCommand(websocket, command, params)
} }
async enablePage() async getVersion()
{ {
return await this.runCommand("Page.enable") return await this.runBrowserCommand("Browser.getVersion")
} }
async openNewPage(url, width = 1920, height = 1080) async openNewPage(url, width = 1920, height = 1080)
{ {
var response = await this.runCommand("Target.createTarget", {url: url, width: width, height: height}) var response = await this.runBrowserCommand("Target.createTarget", {url: url, width: width, height: height})
return response.targetId var page = response.targetId
this.pageWebsockets.set(page, this.getPageWebsocket(page))
return page
} }
async closePage(page) async closePage(page)
{ {
return await this.runCommand("Target.closeTarget", {targetId: page}) this.pageWebsockets.delete(page)
return await this.runBrowserCommand("Target.closeTarget", {targetId: page})
} }
async focusPage(page) async enablePage(page)
{ {
await this.runCommand("Target.activateTarget", {targetId: page}) return await this.runPageCommand(page, "Page.enable")
var response = await this.runCommand("Target.attachToTarget", {targetId: page})
await this.runCommand(response.method, response.params)
console.log(response)
} }
async printToPdf() async printToPdf(page)
{ {
var response = await this.runCommand("Page.printToPDF") // wip: printing fails for some reason
var response = await this.runPageCommand(page, "Page.printToPDF")
return response return response
} }
async canEmulate()
{
return await this.runCommand("Emulation.canEmulate")
}
async getPages()
{
return await this.runCommand("Target.getTargets")
}
} }
class RequestHandler
{
constructor()
{
this.buffer = ["https://www.example.com"]
}
var xmlHttp = new XMLHttpRequest(); hasNextRequest()
xmlHttp.open("GET", "http://localhost:9222/json/version", false); {
xmlHttp.send(null); return this.buffer.length != 0
console.log(xmlHttp.responseText); }
\ No newline at end of file
getNextRequest()
{
return this.buffer.pop()
}
publishResults(data)
{
console.log("result: \n" + data)
}
}
\ No newline at end of file
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>HTML to PDF</title> <title>HTML to PDF</title>
</head> </head>
<body> <body>
<script src="connection.js"></script> <script src="connection.js"></script>
<script src="chromium.js"></script> <script src="chromium.js"></script>
<script> <script>
var searchParams = (new URL(window.location.href)).searchParams /*
var websocketUrl = searchParams.get("websocket") Usage: Start google chromium with the following command line flags.
var browser = new HeadlessChromium(websocketUrl) --headless
var urls = ["https://www.example.com"] --remote-debugging-port=9222
--disable-web-security
async function html2pdf(url) --user-data-dir=/var/tmp/chrome
{ The last two flags can be ommited if we find another way to enable
var pdf = await browser.getPages() Cross-Origin Resource Sharing.
console.log(pdf) */
return var searchParams = (new URL(window.location.href)).searchParams
var browser = new HeadlessChromium(searchParams.get("browser"))
var handler = new RequestHandler()
async function html2pdf(url)
{
var page = await browser.openNewPage(url) var page = await browser.openNewPage(url)
await browser.focusPage(page) await browser.enablePage(page)
await browser.enablePage() var pdf = browser.printToPdf(page)
var pdf = browser.printToPdf()
await browser.closePage(page) await browser.closePage(page)
return pdf return pdf
} }
async function mainloop() async function mainloop()
{ {
if (urls.length == 0) if (!handler.hasNextRequest())
{ {
setTimeout(mainloop, 30 /* seconds */ * 1000) setTimeout(mainloop, 30 /* seconds */ * 1000)
return return
} }
var pdf = await html2pdf(urls.pop()) var url = handler.getNextRequest()
console.log(pdf) var pdf = await html2pdf(url)
handler.publishResults(pdf)
setTimeout(mainloop, 3 /* seconds */ * 1000) setTimeout(mainloop, 3 /* seconds */ * 1000)
} }
mainloop() mainloop()
</script> </script>
</body> </body>
</html> </html>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment