initialize method

Future<void> initialize()

Initializes the headless browser

Implementation

Future<void> initialize() async {
  if (_isDisposed) {
    throw ScrapingException.validation(
      'Cannot initialize a disposed browser',
      isRetryable: false,
    );
  }

  if (_headlessWebView != null) {
    return;
  }

  final webViewSettings = config.toInAppWebViewSettings();

  _headlessWebView = HeadlessInAppWebView(
    initialSettings: webViewSettings,
    onWebViewCreated: (controller) {
      _controller = controller;
      _log('Headless browser initialized');
    },
    onLoadStart: (controller, url) {
      _log('Started loading: $url');
    },
    onLoadStop: (controller, url) {
      _log('Finished loading: $url');
      _pageLoadCompleter?.complete(true);
    },
    onReceivedError: (controller, request, error) {
      _log(
        'Error loading ${request.url}: ${error.description} (${error.type})',
        isError: true,
      );
      _pageLoadCompleter?.completeError(
        ScrapingException.network(
          'Failed to load page: ${error.description} (${error.type})',
          isRetryable: true,
        ),
      );
    },
    onReceivedHttpError: (controller, request, errorResponse) {
      _log(
        'HTTP error loading ${request.url}: ${errorResponse.statusCode} ${errorResponse.reasonPhrase}',
        isError: true,
      );
      _pageLoadCompleter?.completeError(
        ScrapingException.http(
          'HTTP error: ${errorResponse.statusCode} ${errorResponse.reasonPhrase}',
          statusCode: errorResponse.statusCode,
          isRetryable:
              (errorResponse.statusCode ?? 0) >= 500 ||
              errorResponse.statusCode == 429,
        ),
      );
    },
    onConsoleMessage: (controller, consoleMessage) {
      if (config.loggingEnabled) {
        _log('Console: ${consoleMessage.message}');
      }
    },
  );

  await _headlessWebView!.run();

  // Set up proxy if available
  if (_proxy != null) {
    await setProxy(_proxy!);
  }

  // Clear cookies and cache if configured
  if (config.clearCookies) {
    await CookieManager.instance().deleteAllCookies();
  }

  if (config.clearCache) {
    await InAppWebViewController.clearAllCache();
  }
}