@loki/target-chrome-core
Advanced tools
Comparing version 0.20.3 to 0.21.0
{ | ||
"name": "@loki/target-chrome-core", | ||
"version": "0.20.3", | ||
"version": "0.21.0", | ||
"description": "Loki Chrome target core lib", | ||
@@ -23,4 +23,4 @@ "keywords": [ | ||
"dependencies": { | ||
"@loki/browser": "^0.20.2", | ||
"@loki/core": "^0.20.0" | ||
"@loki/browser": "^0.21.0", | ||
"@loki/core": "^0.21.0" | ||
}, | ||
@@ -30,3 +30,3 @@ "publishConfig": { | ||
}, | ||
"gitHead": "caa4742573e8f98cb79d08428809eddff1e4cbdb" | ||
"gitHead": "a2d1932446621a449994a8e76f3485712fe19ebb" | ||
} |
const debug = require('debug')('loki:chrome'); | ||
const { | ||
disableAnimations, | ||
disableInputCaret, | ||
disablePointerEvents, | ||
@@ -8,2 +9,3 @@ getSelectorBoxSize, | ||
awaitLokiReady, | ||
awaitSelectorPresent, | ||
addLokiSessionMarker, | ||
@@ -74,60 +76,66 @@ } = require('@loki/browser'); | ||
const awaitRequestsFinished = () => | ||
new Promise(async (resolve, reject) => { | ||
const pendingRequestURLMap = {}; | ||
const failedURLs = []; | ||
let pageLoaded = false; | ||
let stabilizationTimer = null; | ||
const pendingRequestURLMap = {}; | ||
const failedURLs = []; | ||
let stabilizationTimer = null; | ||
let requestsFinishedAwaiter; | ||
const maybeFulfillPromise = () => { | ||
if (pageLoaded && Object.keys(pendingRequestURLMap).length === 0) { | ||
if (failedURLs.length !== 0) { | ||
reject(new FetchingURLsError(failedURLs)); | ||
} else { | ||
// In some cases such as fonts further requests will only happen after the page has been fully rendered | ||
if (stabilizationTimer) { | ||
clearTimeout(stabilizationTimer); | ||
} | ||
stabilizationTimer = setTimeout( | ||
resolve, | ||
REQUEST_STABILIZATION_TIMEOUT | ||
); | ||
} | ||
} | ||
}; | ||
const maybeFulfillPromise = () => { | ||
if (!requestsFinishedAwaiter) { | ||
return; | ||
} | ||
const { reject, resolve } = requestsFinishedAwaiter; | ||
const requestEnded = requestId => { | ||
delete pendingRequestURLMap[requestId]; | ||
maybeFulfillPromise(); | ||
}; | ||
const requestFailed = requestId => { | ||
const failedURL = pendingRequestURLMap[requestId]; | ||
if (!fetchFailIgnore || !fetchFailIgnore.test(failedURL)) { | ||
failedURLs.push(failedURL); | ||
} | ||
requestEnded(requestId); | ||
}; | ||
Network.requestWillBeSent(({ requestId, request }) => { | ||
if (Object.keys(pendingRequestURLMap).length === 0) { | ||
if (failedURLs.length !== 0) { | ||
reject(new FetchingURLsError(failedURLs)); | ||
} else { | ||
// In some cases such as fonts further requests will only happen after the page has been fully rendered | ||
if (stabilizationTimer) { | ||
clearTimeout(stabilizationTimer); | ||
} | ||
pendingRequestURLMap[requestId] = request.url; | ||
}); | ||
stabilizationTimer = setTimeout( | ||
resolve, | ||
REQUEST_STABILIZATION_TIMEOUT | ||
); | ||
} | ||
} | ||
}; | ||
Network.responseReceived(({ requestId, response }) => { | ||
if (response.status >= 400) { | ||
requestFailed(requestId); | ||
} else { | ||
requestEnded(requestId); | ||
} | ||
}); | ||
const startObservingRequests = () => { | ||
const requestEnded = requestId => { | ||
delete pendingRequestURLMap[requestId]; | ||
maybeFulfillPromise(); | ||
}; | ||
Network.loadingFailed(({ requestId }) => { | ||
const requestFailed = requestId => { | ||
const failedURL = pendingRequestURLMap[requestId]; | ||
if (!fetchFailIgnore || !fetchFailIgnore.test(failedURL)) { | ||
failedURLs.push(failedURL); | ||
} | ||
requestEnded(requestId); | ||
}; | ||
Network.requestWillBeSent(({ requestId, request }) => { | ||
if (stabilizationTimer) { | ||
clearTimeout(stabilizationTimer); | ||
} | ||
pendingRequestURLMap[requestId] = request.url; | ||
}); | ||
Network.responseReceived(({ requestId, response }) => { | ||
if (response.status >= 400) { | ||
requestFailed(requestId); | ||
}); | ||
} else { | ||
requestEnded(requestId); | ||
} | ||
}); | ||
await Page.loadEventFired(); | ||
pageLoaded = true; | ||
Network.loadingFailed(({ requestId }) => { | ||
requestFailed(requestId); | ||
}); | ||
}; | ||
const awaitRequestsFinished = () => | ||
new Promise((resolve, reject) => { | ||
requestsFinishedAwaiter = { resolve, reject }; | ||
maybeFulfillPromise(); | ||
@@ -163,3 +171,3 @@ }); | ||
client.loadUrl = async url => { | ||
client.loadUrl = async (url, selectorToBePresent) => { | ||
if (!options.chromeEnableAnimations) { | ||
@@ -170,6 +178,19 @@ debug('Disabling animations'); | ||
await evaluateOnNewDocument(`(${disablePointerEvents})(window);`); | ||
await evaluateOnNewDocument(`(${disableInputCaret})(window);`); | ||
debug(`Navigating to ${url}`); | ||
await Promise.all([Page.navigate({ url }), awaitRequestsFinished()]); | ||
startObservingRequests(); | ||
await Page.navigate({ url }); | ||
await Page.loadEventFired(); | ||
if (selectorToBePresent) { | ||
debug(`Awaiting selector "${selectorToBePresent}"`); | ||
await executeFunctionWithWindow( | ||
awaitSelectorPresent, | ||
selectorToBePresent | ||
); | ||
} | ||
await awaitRequestsFinished(); | ||
debug('Awaiting runtime setup'); | ||
@@ -328,3 +349,3 @@ await executeFunctionWithWindow(awaitLokiReady); | ||
try { | ||
await withTimeout(options.chromeLoadTimeout)(tab.loadUrl(url)); | ||
await withTimeout(options.chromeLoadTimeout)(tab.loadUrl(url, selector)); | ||
screenshot = await tab.captureScreenshot(selector); | ||
@@ -331,0 +352,0 @@ } catch (err) { |
14436
373
+ Added@loki/browser@0.21.1(transitive)
+ Added@loki/core@0.21.0(transitive)
+ Added@loki/integration-core@0.21.0(transitive)
- Removed@loki/browser@0.20.2(transitive)
- Removed@loki/core@0.20.0(transitive)
- Removed@loki/integration-core@0.20.2(transitive)
Updated@loki/browser@^0.21.0
Updated@loki/core@^0.21.0