in pkg/pub_integration/lib/src/headless_env.dart [87:177]
Future<R> withPage<R>({
FakeGoogleUser? user,
required Future<R> Function(Page page) fn,
}) async {
await startBrowser();
final page = await _browser!.newPage();
_pageOriginExpando[page] = _origin;
await page.setRequestInterception(true);
if (trackCoverage) {
await page.coverage.startJSCoverage(resetOnNavigation: false);
// TODO: figure out why the following future does not complete
void startCSSCoverage() {
page.coverage.startCSSCoverage(resetOnNavigation: false);
}
startCSSCoverage();
}
page.onRequest.listen((rq) async {
// soft-abort
if (rq.url.startsWith('https://www.google-analytics.com/') ||
rq.url.startsWith('https://www.googletagmanager.com/') ||
rq.url.startsWith('https://www.google.com/insights')) {
await rq.abort(error: ErrorReason.failed);
return;
}
// ignore
if (rq.url.startsWith('data:')) {
await rq.continueRequest();
return;
}
if (rq.url ==
'https://apis.google.com/js/platform.js?onload=pubAuthInit') {
final fakePlatformJs = File('lib/src/fake_platform.js');
final fileContent = await fakePlatformJs.readAsString();
final overrides = <String>[
if (user != null) 'googleUser = ${json.encode(user.toJson())};',
];
await rq.respond(
status: 200,
contentType: 'text/javascript',
body: '$fileContent\n\n${overrides.join('\n')}',
);
return;
}
await rq.continueRequest();
});
page.onResponse.listen((rs) async {
if (rs.status >= 500) {
serverErrors
.add('${rs.status} ${rs.statusText} received on ${rs.request.url}');
} else if (rs.status >= 400 && rs.url.contains('/static/')) {
serverErrors
.add('${rs.status} ${rs.statusText} received on ${rs.request.url}');
}
final contentType = rs.headers[HttpHeaders.contentTypeHeader];
if (contentType == null || contentType.isEmpty) {
serverErrors
.add('Content type header is missing for ${rs.request.url}.');
}
if (rs.status == 200 && contentType!.contains('text/html')) {
try {
parseAndValidateHtml(await rs.text);
} catch (e) {
serverErrors.add('${rs.request.url} returned bad HTML: $e');
}
}
});
// print console messages
page.onConsole.listen(print);
// print and store uncaught errors
page.onError.listen((e) {
print('Error: $e');
clientErrors.add(e);
});
_trackedPages.add(page);
try {
return await fn(page);
} finally {
await _closePage(page);
_verifyErrors();
}
}