Future withPage()

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();
    }
  }