puppeteer-core
Advanced tools
Comparing version 1.9.0 to 1.10.0
@@ -196,2 +196,35 @@ /** | ||
/** | ||
* @param {function(!Target):boolean} predicate | ||
* @param {{timeout?: number}=} options | ||
*/ | ||
async waitForTarget(predicate, options = {}) { | ||
const { | ||
timeout = 30000 | ||
} = options; | ||
const existingTarget = this.targets().find(predicate); | ||
if (existingTarget) | ||
return existingTarget; | ||
let resolve; | ||
const targetPromise = new Promise(x => resolve = x); | ||
this.on(Browser.Events.TargetCreated, check); | ||
this.on(Browser.Events.TargetChanged, check); | ||
try { | ||
if (!timeout) | ||
return await targetPromise; | ||
return await helper.waitWithTimeout(targetPromise, 'target', timeout); | ||
} finally { | ||
this.removeListener(Browser.Events.TargetCreated, check); | ||
this.removeListener(Browser.Events.TargetChanged, check); | ||
} | ||
/** | ||
* @param {!Target} target | ||
*/ | ||
function check(target) { | ||
if (predicate(target)) | ||
resolve(target); | ||
} | ||
} | ||
/** | ||
* @return {!Promise<!Array<!Puppeteer.Page>>} | ||
@@ -267,2 +300,10 @@ */ | ||
/** | ||
* @param {function(!Target):boolean} predicate | ||
* @param {{timeout?: number}=} options | ||
*/ | ||
waitForTarget(predicate, options) { | ||
return this._browser.waitForTarget(target => target.browserContext() === this && predicate(target), options); | ||
} | ||
/** | ||
* @return {!Promise<!Array<!Puppeteer.Page>>} | ||
@@ -269,0 +310,0 @@ */ |
@@ -227,4 +227,4 @@ /** | ||
this._enabled = false; | ||
const [ruleTrackingResponse] = await Promise.all([ | ||
this._client.send('CSS.stopRuleUsageTracking'), | ||
const ruleTrackingResponse = await this._client.send('CSS.stopRuleUsageTracking'); | ||
await Promise.all([ | ||
this._client.send('CSS.disable'), | ||
@@ -231,0 +231,0 @@ this._client.send('DOM.disable'), |
@@ -97,4 +97,22 @@ /** | ||
let functionText = pageFunction.toString(); | ||
try { | ||
new Function('(' + functionText + ')'); | ||
} catch (e1) { | ||
// This means we might have a function shorthand. Try another | ||
// time prefixing 'function '. | ||
if (functionText.startsWith('async ')) | ||
functionText = 'async function ' + functionText.substring('async '.length); | ||
else | ||
functionText = 'function ' + functionText; | ||
try { | ||
new Function('(' + functionText + ')'); | ||
} catch (e2) { | ||
// We tried hard to serialize, but there's a weird beast here. | ||
throw new Error('Passed function is not well-serializable!'); | ||
} | ||
} | ||
const { exceptionDetails, result: remoteObject } = await this._client.send('Runtime.callFunctionOn', { | ||
functionDeclaration: pageFunction.toString() + '\n' + suffix + '\n', | ||
functionDeclaration: functionText + '\n' + suffix + '\n', | ||
executionContextId: this._contextId, | ||
@@ -630,3 +648,3 @@ arguments: args.map(convertArgument.bind(this)), | ||
} | ||
return area; | ||
return Math.abs(area); | ||
} | ||
@@ -633,0 +651,0 @@ |
@@ -251,2 +251,21 @@ /** | ||
} | ||
/** | ||
* @template T | ||
* @param {!Promise<T>} promise | ||
* @param {string} taskName | ||
* @param {number} timeout | ||
* @return {!Promise<T>} | ||
*/ | ||
static async waitWithTimeout(promise, taskName, timeout) { | ||
let reject; | ||
const timeoutError = new TimeoutError(`waiting for ${taskName} failed: timeout ${timeout}ms exceeded`); | ||
const timeoutPromise = new Promise((resolve, x) => reject = x); | ||
const timeoutTimer = setTimeout(() => reject(timeoutError), timeout); | ||
try { | ||
return await Promise.race([promise, timeoutPromise]); | ||
} finally { | ||
clearTimeout(timeoutTimer); | ||
} | ||
} | ||
} | ||
@@ -253,0 +272,0 @@ |
@@ -38,2 +38,3 @@ /** | ||
'--disable-background-timer-throttling', | ||
'--disable-backgrounding-occluded-windows', | ||
'--disable-breakpad', | ||
@@ -47,4 +48,6 @@ '--disable-client-side-phishing-detection', | ||
'--disable-hang-monitor', | ||
'--disable-ipc-flooding-protection', | ||
'--disable-popup-blocking', | ||
'--disable-prompt-on-repost', | ||
'--disable-renderer-backgrounding', | ||
'--disable-sync', | ||
@@ -51,0 +54,0 @@ '--disable-translate', |
@@ -30,3 +30,3 @@ /** | ||
const {createJSHandle} = require('./ExecutionContext'); | ||
const {Accessibility} = require('./Accessibility'); | ||
const writeFileAsync = helper.promisify(fs.writeFile); | ||
@@ -82,2 +82,3 @@ | ||
this._touchscreen = new Touchscreen(client, this._keyboard); | ||
this._accessibility = new Accessibility(client); | ||
this._networkManager = new NetworkManager(client); | ||
@@ -227,2 +228,9 @@ /** @type {!FrameManager} */ | ||
/** | ||
* @return {!Accessibility} | ||
*/ | ||
get accessibility() { | ||
return this._accessibility; | ||
} | ||
/** | ||
* @return {!Array<Puppeteer.Frame>} | ||
@@ -229,0 +237,0 @@ */ |
@@ -30,3 +30,7 @@ /** | ||
this._eventListeners = [ | ||
helper.addEventListener(pipeRead, 'data', buffer => this._dispatch(buffer)) | ||
helper.addEventListener(pipeRead, 'data', buffer => this._dispatch(buffer)), | ||
helper.addEventListener(pipeRead, 'close', () => { | ||
if (this.onclose) | ||
this.onclose.call(null); | ||
}) | ||
]; | ||
@@ -33,0 +37,0 @@ this.onmessage = null; |
@@ -125,4 +125,4 @@ /** | ||
'KeyZ': {'keyCode': 90, 'code': 'KeyZ', 'shiftKey': 'Z', 'key': 'z'}, | ||
'MetaLeft': {'keyCode': 91, 'code': 'MetaLeft', 'key': 'Meta'}, | ||
'MetaRight': {'keyCode': 92, 'code': 'MetaRight', 'key': 'Meta'}, | ||
'MetaLeft': {'keyCode': 91, 'code': 'MetaLeft', 'key': 'Meta', 'location': 1}, | ||
'MetaRight': {'keyCode': 92, 'code': 'MetaRight', 'key': 'Meta', 'location': 2}, | ||
'ContextMenu': {'keyCode': 93, 'code': 'ContextMenu', 'key': 'ContextMenu'}, | ||
@@ -182,5 +182,5 @@ 'NumpadMultiply': {'keyCode': 106, 'code': 'NumpadMultiply', 'key': '*', 'location': 3}, | ||
'Clear': {'keyCode': 12, 'key': 'Clear', 'code': 'Numpad5', 'location': 3}, | ||
'Shift': {'keyCode': 16, 'key': 'Shift', 'code': 'ShiftLeft'}, | ||
'Control': {'keyCode': 17, 'key': 'Control', 'code': 'ControlLeft'}, | ||
'Alt': {'keyCode': 18, 'key': 'Alt', 'code': 'AltLeft'}, | ||
'Shift': {'keyCode': 16, 'key': 'Shift', 'code': 'ShiftLeft', 'location': 1}, | ||
'Control': {'keyCode': 17, 'key': 'Control', 'code': 'ControlLeft', 'location': 1}, | ||
'Alt': {'keyCode': 18, 'key': 'Alt', 'code': 'AltLeft', 'location': 1}, | ||
'Accept': {'keyCode': 30, 'key': 'Accept'}, | ||
@@ -218,3 +218,3 @@ 'ModeChange': {'keyCode': 31, 'key': 'ModeChange'}, | ||
'z': {'keyCode': 90, 'key': 'z', 'code': 'KeyZ'}, | ||
'Meta': {'keyCode': 91, 'key': 'Meta', 'code': 'MetaLeft'}, | ||
'Meta': {'keyCode': 91, 'key': 'Meta', 'code': 'MetaLeft', 'location': 1}, | ||
'*': {'keyCode': 106, 'key': '*', 'code': 'NumpadMultiply', 'location': 3}, | ||
@@ -221,0 +221,0 @@ '+': {'keyCode': 107, 'key': '+', 'code': 'NumpadAdd', 'location': 3}, |
@@ -378,2 +378,61 @@ /** | ||
/** | ||
* @param {function(!Target):boolean} predicate | ||
* @param {{timeout?: number}=} options | ||
*/ | ||
/* async */ waitForTarget(predicate, options = {}) {return (fn => { | ||
const gen = fn.call(this); | ||
return new Promise((resolve, reject) => { | ||
function step(key, arg) { | ||
let info, value; | ||
try { | ||
info = gen[key](arg); | ||
value = info.value; | ||
} catch (error) { | ||
reject(error); | ||
return; | ||
} | ||
if (info.done) { | ||
resolve(value); | ||
} else { | ||
return Promise.resolve(value).then( | ||
value => { | ||
step('next', value); | ||
}, | ||
err => { | ||
step('throw', err); | ||
}); | ||
} | ||
} | ||
return step('next'); | ||
}); | ||
})(function*(){ | ||
const { | ||
timeout = 30000 | ||
} = options; | ||
const existingTarget = this.targets().find(predicate); | ||
if (existingTarget) | ||
return existingTarget; | ||
let resolve; | ||
const targetPromise = new Promise(x => resolve = x); | ||
this.on(Browser.Events.TargetCreated, check); | ||
this.on(Browser.Events.TargetChanged, check); | ||
try { | ||
if (!timeout) | ||
return (yield targetPromise); | ||
return (yield helper.waitWithTimeout(targetPromise, 'target', timeout)); | ||
} finally { | ||
this.removeListener(Browser.Events.TargetCreated, check); | ||
this.removeListener(Browser.Events.TargetChanged, check); | ||
} | ||
/** | ||
* @param {!Target} target | ||
*/ | ||
function check(target) { | ||
if (predicate(target)) | ||
resolve(target); | ||
} | ||
});} | ||
/** | ||
* @return {!Promise<!Array<!Puppeteer.Page>>} | ||
@@ -553,2 +612,10 @@ */ | ||
/** | ||
* @param {function(!Target):boolean} predicate | ||
* @param {{timeout?: number}=} options | ||
*/ | ||
waitForTarget(predicate, options) { | ||
return this._browser.waitForTarget(target => target.browserContext() === this && predicate(target), options); | ||
} | ||
/** | ||
* @return {!Promise<!Array<!Puppeteer.Page>>} | ||
@@ -555,0 +622,0 @@ */ |
@@ -487,4 +487,4 @@ /** | ||
this._enabled = false; | ||
const [ruleTrackingResponse] = (yield Promise.all([ | ||
this._client.send('CSS.stopRuleUsageTracking'), | ||
const ruleTrackingResponse = (yield this._client.send('CSS.stopRuleUsageTracking')); | ||
(yield Promise.all([ | ||
this._client.send('CSS.disable'), | ||
@@ -491,0 +491,0 @@ this._client.send('DOM.disable'), |
@@ -149,4 +149,22 @@ /** | ||
let functionText = pageFunction.toString(); | ||
try { | ||
new Function('(' + functionText + ')'); | ||
} catch (e1) { | ||
// This means we might have a function shorthand. Try another | ||
// time prefixing 'function '. | ||
if (functionText.startsWith('async ')) | ||
functionText = 'async function ' + functionText.substring('async '.length); | ||
else | ||
functionText = 'function ' + functionText; | ||
try { | ||
new Function('(' + functionText + ')'); | ||
} catch (e2) { | ||
// We tried hard to serialize, but there's a weird beast here. | ||
throw new Error('Passed function is not well-serializable!'); | ||
} | ||
} | ||
const { exceptionDetails, result: remoteObject } = (yield this._client.send('Runtime.callFunctionOn', { | ||
functionDeclaration: pageFunction.toString() + '\n' + suffix + '\n', | ||
functionDeclaration: functionText + '\n' + suffix + '\n', | ||
executionContextId: this._contextId, | ||
@@ -1332,3 +1350,3 @@ arguments: args.map(convertArgument.bind(this)), | ||
} | ||
return area; | ||
return Math.abs(area); | ||
} | ||
@@ -1335,0 +1353,0 @@ |
@@ -277,2 +277,47 @@ /** | ||
} | ||
/** | ||
* @template T | ||
* @param {!Promise<T>} promise | ||
* @param {string} taskName | ||
* @param {number} timeout | ||
* @return {!Promise<T>} | ||
*/ | ||
static /* async */ waitWithTimeout(promise, taskName, timeout) {return (fn => { | ||
const gen = fn.call(this); | ||
return new Promise((resolve, reject) => { | ||
function step(key, arg) { | ||
let info, value; | ||
try { | ||
info = gen[key](arg); | ||
value = info.value; | ||
} catch (error) { | ||
reject(error); | ||
return; | ||
} | ||
if (info.done) { | ||
resolve(value); | ||
} else { | ||
return Promise.resolve(value).then( | ||
value => { | ||
step('next', value); | ||
}, | ||
err => { | ||
step('throw', err); | ||
}); | ||
} | ||
} | ||
return step('next'); | ||
}); | ||
})(function*(){ | ||
let reject; | ||
const timeoutError = new TimeoutError(`waiting for ${taskName} failed: timeout ${timeout}ms exceeded`); | ||
const timeoutPromise = new Promise((resolve, x) => reject = x); | ||
const timeoutTimer = setTimeout(() => reject(timeoutError), timeout); | ||
try { | ||
return (yield Promise.race([promise, timeoutPromise])); | ||
} finally { | ||
clearTimeout(timeoutTimer); | ||
} | ||
});} | ||
} | ||
@@ -279,0 +324,0 @@ |
@@ -38,2 +38,3 @@ /** | ||
'--disable-background-timer-throttling', | ||
'--disable-backgrounding-occluded-windows', | ||
'--disable-breakpad', | ||
@@ -47,4 +48,6 @@ '--disable-client-side-phishing-detection', | ||
'--disable-hang-monitor', | ||
'--disable-ipc-flooding-protection', | ||
'--disable-popup-blocking', | ||
'--disable-prompt-on-repost', | ||
'--disable-renderer-backgrounding', | ||
'--disable-sync', | ||
@@ -51,0 +54,0 @@ '--disable-translate', |
@@ -30,3 +30,3 @@ /** | ||
const {createJSHandle} = require('./ExecutionContext'); | ||
const {Accessibility} = require('./Accessibility'); | ||
const writeFileAsync = helper.promisify(fs.writeFile); | ||
@@ -108,2 +108,3 @@ | ||
this._touchscreen = new Touchscreen(client, this._keyboard); | ||
this._accessibility = new Accessibility(client); | ||
this._networkManager = new NetworkManager(client); | ||
@@ -279,2 +280,9 @@ /** @type {!FrameManager} */ | ||
/** | ||
* @return {!Accessibility} | ||
*/ | ||
get accessibility() { | ||
return this._accessibility; | ||
} | ||
/** | ||
* @return {!Array<Puppeteer.Frame>} | ||
@@ -281,0 +289,0 @@ */ |
@@ -30,3 +30,7 @@ /** | ||
this._eventListeners = [ | ||
helper.addEventListener(pipeRead, 'data', buffer => this._dispatch(buffer)) | ||
helper.addEventListener(pipeRead, 'data', buffer => this._dispatch(buffer)), | ||
helper.addEventListener(pipeRead, 'close', () => { | ||
if (this.onclose) | ||
this.onclose.call(null); | ||
}) | ||
]; | ||
@@ -33,0 +37,0 @@ this.onmessage = null; |
@@ -125,4 +125,4 @@ /** | ||
'KeyZ': {'keyCode': 90, 'code': 'KeyZ', 'shiftKey': 'Z', 'key': 'z'}, | ||
'MetaLeft': {'keyCode': 91, 'code': 'MetaLeft', 'key': 'Meta'}, | ||
'MetaRight': {'keyCode': 92, 'code': 'MetaRight', 'key': 'Meta'}, | ||
'MetaLeft': {'keyCode': 91, 'code': 'MetaLeft', 'key': 'Meta', 'location': 1}, | ||
'MetaRight': {'keyCode': 92, 'code': 'MetaRight', 'key': 'Meta', 'location': 2}, | ||
'ContextMenu': {'keyCode': 93, 'code': 'ContextMenu', 'key': 'ContextMenu'}, | ||
@@ -182,5 +182,5 @@ 'NumpadMultiply': {'keyCode': 106, 'code': 'NumpadMultiply', 'key': '*', 'location': 3}, | ||
'Clear': {'keyCode': 12, 'key': 'Clear', 'code': 'Numpad5', 'location': 3}, | ||
'Shift': {'keyCode': 16, 'key': 'Shift', 'code': 'ShiftLeft'}, | ||
'Control': {'keyCode': 17, 'key': 'Control', 'code': 'ControlLeft'}, | ||
'Alt': {'keyCode': 18, 'key': 'Alt', 'code': 'AltLeft'}, | ||
'Shift': {'keyCode': 16, 'key': 'Shift', 'code': 'ShiftLeft', 'location': 1}, | ||
'Control': {'keyCode': 17, 'key': 'Control', 'code': 'ControlLeft', 'location': 1}, | ||
'Alt': {'keyCode': 18, 'key': 'Alt', 'code': 'AltLeft', 'location': 1}, | ||
'Accept': {'keyCode': 30, 'key': 'Accept'}, | ||
@@ -218,3 +218,3 @@ 'ModeChange': {'keyCode': 31, 'key': 'ModeChange'}, | ||
'z': {'keyCode': 90, 'key': 'z', 'code': 'KeyZ'}, | ||
'Meta': {'keyCode': 91, 'key': 'Meta', 'code': 'MetaLeft'}, | ||
'Meta': {'keyCode': 91, 'key': 'Meta', 'code': 'MetaLeft', 'location': 1}, | ||
'*': {'keyCode': 106, 'key': '*', 'code': 'NumpadMultiply', 'location': 3}, | ||
@@ -221,0 +221,0 @@ '+': {'keyCode': 107, 'key': '+', 'code': 'NumpadAdd', 'location': 3}, |
{ | ||
"name": "puppeteer-core", | ||
"version": "1.9.0", | ||
"version": "1.10.0", | ||
"description": "A high-level API to control headless Chrome over the DevTools Protocol", | ||
@@ -11,3 +11,3 @@ "main": "index.js", | ||
"puppeteer": { | ||
"chromium_revision": "594312" | ||
"chromium_revision": "599821" | ||
}, | ||
@@ -14,0 +14,0 @@ "scripts": { |
@@ -9,3 +9,3 @@ # Puppeteer | ||
###### [API](https://github.com/GoogleChrome/puppeteer/blob/v1.9.0/docs/api.md) | [FAQ](#faq) | [Contributing](https://github.com/GoogleChrome/puppeteer/blob/master/CONTRIBUTING.md) | [Troubleshooting](https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md) | ||
###### [API](https://github.com/GoogleChrome/puppeteer/blob/v1.10.0/docs/api.md) | [FAQ](#faq) | [Contributing](https://github.com/GoogleChrome/puppeteer/blob/master/CONTRIBUTING.md) | [Troubleshooting](https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md) | ||
@@ -20,3 +20,3 @@ > Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the [DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/). Puppeteer runs [headless](https://developers.google.com/web/updates/2017/04/headless-chrome) by default, but can be configured to run full (non-headless) Chrome or Chromium. | ||
* Generate screenshots and PDFs of pages. | ||
* Crawl a SPA and generate pre-rendered content (i.e. "SSR"). | ||
* Crawl a SPA (Single-Page Application) and generate pre-rendered content (i.e. "SSR" (Server-Side Rendering)). | ||
* Automate form submission, UI testing, keyboard input, etc. | ||
@@ -42,3 +42,3 @@ * Create an up-to-date, automated testing environment. Run your tests directly in the latest version of Chrome using the latest JavaScript and browser features. | ||
Note: When you install Puppeteer, it downloads a recent version of Chromium (~170MB Mac, ~282MB Linux, ~280MB Win) that is guaranteed to work with the API. To skip the download, see [Environment variables](https://github.com/GoogleChrome/puppeteer/blob/v1.9.0/docs/api.md#environment-variables). | ||
Note: When you install Puppeteer, it downloads a recent version of Chromium (~170MB Mac, ~282MB Linux, ~280MB Win) that is guaranteed to work with the API. To skip the download, see [Environment variables](https://github.com/GoogleChrome/puppeteer/blob/v1.10.0/docs/api.md#environment-variables). | ||
@@ -56,3 +56,3 @@ | ||
`puppeteer-core` is intended to be a lightweight version of puppeteer for launching an existing browser installation or for connecting to a remote one. | ||
`puppeteer-core` is intended to be a lightweight version of Puppeteer for launching an existing browser installation or for connecting to a remote one. | ||
@@ -66,3 +66,3 @@ See [puppeteer vs puppeteer-core](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#puppeteer-vs-puppeteer-core). | ||
Puppeteer will be familiar to people using other browser testing frameworks. You create an instance | ||
of `Browser`, open pages, and then manipulate them with [Puppeteer's API](https://github.com/GoogleChrome/puppeteer/blob/v1.9.0/docs/api.md#). | ||
of `Browser`, open pages, and then manipulate them with [Puppeteer's API](https://github.com/GoogleChrome/puppeteer/blob/v1.10.0/docs/api.md#). | ||
@@ -92,3 +92,3 @@ **Example** - navigating to https://example.com and saving a screenshot as *example.png*: | ||
Puppeteer sets an initial page size to 800px x 600px, which defines the screenshot size. The page size can be customized with [`Page.setViewport()`](https://github.com/GoogleChrome/puppeteer/blob/v1.9.0/docs/api.md#pagesetviewportviewport). | ||
Puppeteer sets an initial page size to 800px x 600px, which defines the screenshot size. The page size can be customized with [`Page.setViewport()`](https://github.com/GoogleChrome/puppeteer/blob/v1.10.0/docs/api.md#pagesetviewportviewport). | ||
@@ -118,3 +118,3 @@ **Example** - create a PDF. | ||
See [`Page.pdf()`](https://github.com/GoogleChrome/puppeteer/blob/v1.9.0/docs/api.md#pagepdfoptions) for more information about creating pdfs. | ||
See [`Page.pdf()`](https://github.com/GoogleChrome/puppeteer/blob/v1.10.0/docs/api.md#pagepdfoptions) for more information about creating pdfs. | ||
@@ -154,3 +154,3 @@ **Example** - evaluate script in the context of the page | ||
See [`Page.evaluate()`](https://github.com/GoogleChrome/puppeteer/blob/v1.9.0/docs/api.md#pageevaluatepagefunction-args) for more information on `evaluate` and related methods like `evaluateOnNewDocument` and `exposeFunction`. | ||
See [`Page.evaluate()`](https://github.com/GoogleChrome/puppeteer/blob/v1.10.0/docs/api.md#pageevaluatepagefunction-args) for more information on `evaluate` and related methods like `evaluateOnNewDocument` and `exposeFunction`. | ||
@@ -164,3 +164,3 @@ <!-- [END getstarted] --> | ||
Puppeteer launches Chromium in [headless mode](https://developers.google.com/web/updates/2017/04/headless-chrome). To launch a full version of Chromium, set the ['headless' option](https://github.com/GoogleChrome/puppeteer/blob/v1.9.0/docs/api.md#puppeteerlaunchoptions) when launching a browser: | ||
Puppeteer launches Chromium in [headless mode](https://developers.google.com/web/updates/2017/04/headless-chrome). To launch a full version of Chromium, set the ['headless' option](https://github.com/GoogleChrome/puppeteer/blob/v1.10.0/docs/api.md#puppeteerlaunchoptions) when launching a browser: | ||
@@ -181,3 +181,3 @@ ```js | ||
See [`Puppeteer.launch()`](https://github.com/GoogleChrome/puppeteer/blob/v1.9.0/docs/api.md#puppeteerlaunchoptions) for more information. | ||
See [`Puppeteer.launch()`](https://github.com/GoogleChrome/puppeteer/blob/v1.10.0/docs/api.md#puppeteerlaunchoptions) for more information. | ||
@@ -194,3 +194,3 @@ See [`this article`](https://www.howtogeek.com/202825/what%E2%80%99s-the-difference-between-chromium-and-chrome/) for a description of the differences between Chromium and Chrome. [`This article`](https://chromium.googlesource.com/chromium/src/+/lkcr/docs/chromium_browser_vs_google_chrome.md) describes some differences for Linux users. | ||
- [API Documentation](https://github.com/GoogleChrome/puppeteer/blob/v1.9.0/docs/api.md) | ||
- [API Documentation](https://github.com/GoogleChrome/puppeteer/blob/v1.10.0/docs/api.md) | ||
- [Examples](https://github.com/GoogleChrome/puppeteer/tree/master/examples/) | ||
@@ -360,3 +360,3 @@ - [Community list of Puppeteer resources](https://github.com/transitive-bullshit/awesome-puppeteer) | ||
* Puppeteer is bundled with Chromium--not Chrome--and so by default, it inherits all of [Chromium's media-related limitations](https://www.chromium.org/audio-video). This means that Puppeteer does not support licensed formats such as AAC or H.264. (However, it is possible to force Puppeteer to use a separately-installed version Chrome instead of Chromium via the [`executablePath` option to `puppeteer.launch`](https://github.com/GoogleChrome/puppeteer/blob/v1.9.0/docs/api.md#puppeteerlaunchoptions). You should only use this configuration if you need an official release of Chrome that supports these media formats.) | ||
* Puppeteer is bundled with Chromium--not Chrome--and so by default, it inherits all of [Chromium's media-related limitations](https://www.chromium.org/audio-video). This means that Puppeteer does not support licensed formats such as AAC or H.264. (However, it is possible to force Puppeteer to use a separately-installed version Chrome instead of Chromium via the [`executablePath` option to `puppeteer.launch`](https://github.com/GoogleChrome/puppeteer/blob/v1.10.0/docs/api.md#puppeteerlaunchoptions). You should only use this configuration if you need an official release of Chrome that supports these media formats.) | ||
* Since Puppeteer (in all configurations) controls a desktop version of Chromium/Chrome, features that are only supported by the mobile version of Chrome are not supported. This means that Puppeteer [does not support HTTP Live Streaming (HLS)](https://caniuse.com/#feat=http-live-streaming). | ||
@@ -363,0 +363,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
652176
57
19454
19