browserless 10.10.3 → 10.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -46,6 +46,7 @@ This package integrates and re-exports functionality from other `@browserless/*`
46
46
  | `@browserless/goto` | Page navigation with smart waiting strategies, ad blocking, and evasion techniques |
47
47
  | `@browserless/screenshot` | Screenshot capture with overlays, device emulation, and code highlighting |
48
48
  | `@browserless/pdf` | PDF generation with customizable margins and scaling |
49
+ | `@browserless/capture` | Tab recording via extension + `tabCapture` (uses default browser context) |
49
50
  | `@browserless/errors` | Standardized error handling and timeout errors |
50
51
 
51
52
  ## License
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "browserless",
3
3
  "description": "The headless Chrome/Chromium driver on top of Puppeteer. Take screenshots, generate PDFs, extract text and HTML with a production-ready API.",
4
4
  "homepage": "https://browserless.js.org",
5
- "version": "10.10.3",
5
+ "version": "10.11.1",
6
6
  "main": "src/index.js",
7
7
  "author": {
8
8
  "email": "hello@microlink.io",
@@ -18,27 +18,28 @@
18
18
  "url": "https://github.com/microlinkhq/browserless/issues"
19
19
  },
20
20
  "keywords": [
21
+ "automation",
21
22
  "browser",
22
23
  "browserless",
23
24
  "chrome",
24
25
  "chromium",
25
26
  "headless",
27
+ "html",
28
+ "javascript",
29
+ "nodejs",
30
+ "pdf",
26
31
  "puppeteer",
27
32
  "screenshot",
28
- "pdf",
29
- "html",
30
33
  "text",
31
- "automation",
32
- "web-scraping",
33
- "nodejs",
34
- "javascript"
34
+ "web-scraping"
35
35
  ],
36
36
  "dependencies": {
37
- "@browserless/errors": "^10.10.1",
38
- "@browserless/goto": "^10.10.2",
39
- "@browserless/pdf": "^10.10.3",
40
- "@browserless/screenshot": "^10.10.3",
41
- "debug-logfmt": "~1.4.7",
37
+ "@browserless/capture": "^10.11.1",
38
+ "@browserless/errors": "^10.11.1",
39
+ "@browserless/goto": "^10.11.1",
40
+ "@browserless/pdf": "^10.11.1",
41
+ "@browserless/screenshot": "^10.11.1",
42
+ "debug-logfmt": "~1.4.8",
42
43
  "kill-process-group": "~1.0.13",
43
44
  "p-reflect": "~2.1.0",
44
45
  "p-retry": "~4.6.1",
@@ -47,7 +48,7 @@
47
48
  "superlock": "~1.2.6"
48
49
  },
49
50
  "devDependencies": {
50
- "@browserless/test": "^10.9.18",
51
+ "@browserless/test": "^10.11.1",
51
52
  "ava": "5",
52
53
  "ps-list": "7",
53
54
  "tinyspawn": "latest"
@@ -67,5 +68,5 @@
67
68
  "timeout": "2m",
68
69
  "workerThreads": false
69
70
  },
70
- "gitHead": "4d2b893e8215a91d830f4471f51c567a53cd6bbb"
71
+ "gitHead": "2a4bbeeadfb7f010d57a8806f706de2bc48f936e"
71
72
  }
package/src/driver.js CHANGED
@@ -1,6 +1,7 @@
1
1
  'use strict'
2
2
 
3
3
  const killProcessGroup = require('kill-process-group')
4
+ const createCapture = require('@browserless/capture')
4
5
  const debug = require('debug-logfmt')('browserless')
5
6
  const requireOneOf = require('require-one-of')
6
7
  const pReflect = require('p-reflect')
@@ -42,12 +43,28 @@ const defaultArgs = [
42
43
  'PushMessaging',
43
44
  'site-per-process', // Disables OOPIF. https://www.chromium.org/Home/chromium-security/site-isolation
44
45
  'WebPayments'
45
- ].join(',')}`
46
+ ].join(',')}`,
47
+ `--allowlisted-extension-id=${createCapture.extensionId}`,
48
+ `--disable-extensions-except=${createCapture.extensionPath}`,
49
+ `--load-extension=${createCapture.extensionPath}`
46
50
  ]
47
51
 
52
+ const normalizeIgnoreDefaultArgs = ignoreDefaultArgs => {
53
+ if (ignoreDefaultArgs === true) return true
54
+
55
+ const required = ['--disable-extensions']
56
+
57
+ if (Array.isArray(ignoreDefaultArgs)) {
58
+ return [...new Set([...ignoreDefaultArgs, ...required])]
59
+ }
60
+
61
+ return required
62
+ }
63
+
48
64
  const spawn = ({
49
65
  args = defaultArgs,
50
66
  headless = true,
67
+ ignoreDefaultArgs,
51
68
  ignoreHTTPSErrors = true,
52
69
  mode = 'launch',
53
70
  puppeteer = requireOneOf(['puppeteer', 'puppeteer-core', 'puppeteer-firefox']),
@@ -57,6 +74,7 @@ const spawn = ({
57
74
  puppeteer[mode]({
58
75
  args,
59
76
  headless,
77
+ ignoreDefaultArgs: normalizeIgnoreDefaultArgs(ignoreDefaultArgs),
60
78
  ignoreHTTPSErrors,
61
79
  waitForInitialPage,
62
80
  ...launchOpts
package/src/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  'use strict'
2
2
 
3
3
  const { ensureError, browserTimeout } = require('@browserless/errors')
4
+ const createCapture = require('@browserless/capture')
4
5
  const createScreenshot = require('@browserless/screenshot')
5
6
  const debug = require('debug-logfmt')('browserless')
6
7
  const createGoto = require('@browserless/goto')
@@ -78,9 +79,11 @@ module.exports = ({ timeout: globalTimeout = 30000, ...launchOpts } = {}) => {
78
79
 
79
80
  const getBrowserContext = () => _contextPromise
80
81
 
81
- const createPage = async name => {
82
+ const createPage = async (name, { useDefaultContext = false } = {}) => {
82
83
  const duration = debug.duration('createPage')
83
- const browserContext = await getBrowserContext()
84
+ const browserContext = useDefaultContext
85
+ ? (await getBrowser()).defaultBrowserContext()
86
+ : await getBrowserContext()
84
87
  const page = await browserContext.newPage()
85
88
  const browser = typeof page.browser === 'function' ? page.browser() : undefined
86
89
  const metadata = {
@@ -103,7 +106,7 @@ module.exports = ({ timeout: globalTimeout = 30000, ...launchOpts } = {}) => {
103
106
  }
104
107
  }
105
108
 
106
- const withPage = (fn, { timeout: evaluateTimeout } = {}) => {
109
+ const withPage = (fn, { timeout: evaluateTimeout, useDefaultContext = false } = {}) => {
107
110
  const name = fn.name || 'anonymous'
108
111
 
109
112
  return async (...args) => {
@@ -114,7 +117,7 @@ module.exports = ({ timeout: globalTimeout = 30000, ...launchOpts } = {}) => {
114
117
  let closePageTimeout
115
118
 
116
119
  try {
117
- page = await createPage(name)
120
+ page = await createPage(name, { useDefaultContext })
118
121
  closePageTimeout = setTimeout(() => {
119
122
  closePage(page, name).catch(error => {
120
123
  const { message, code, name } = ensureError(error)
@@ -192,6 +195,7 @@ module.exports = ({ timeout: globalTimeout = 30000, ...launchOpts } = {}) => {
192
195
  goto,
193
196
  html: evaluate(page => page.content()),
194
197
  page: createPage,
198
+ capture: withPage(createCapture({ goto }), { useDefaultContext: true }),
195
199
  pdf: withPage(createPdf({ goto })),
196
200
  screenshot: withPage(createScreenshot({ goto })),
197
201
  text: evaluate(page => page.evaluate(() => document.body.innerText)),