public async Task <Response> NavigateFrameAsync(Frame frame, string url, NavigationOptions options) { var referrer = string.IsNullOrEmpty(options.Referer) ? NetworkManager.ExtraHTTPHeaders?.GetValueOrDefault(MessageKeys.Referer) : options.Referer; var requests = new Dictionary <string, Request>(); var timeout = options?.Timeout ?? DefaultNavigationTimeout; using (var watcher = new LifecycleWatcher(this, frame, timeout, options)) { try { var navigateTask = NavigateAsync(Client, url, referrer, frame.Id); var task = await Task.WhenAny( watcher.TimeoutOrTerminationTask, navigateTask).ConfigureAwait(false); await task; task = await Task.WhenAny( watcher.TimeoutOrTerminationTask, _ensureNewDocumentNavigation?watcher.NewDocumentNavigationTask : watcher.SameDocumentNavigationTask ).ConfigureAwait(false); await task; } catch (Exception ex) { throw new NavigationException(ex.Message, ex); } return(watcher.NavigationResponse); } }
public async Task <Response> WaitForFrameNavigationAsync(Frame frame, NavigationOptions options = null) { var timeout = options?.Timeout ?? TimeoutSettings.NavigationTimeout; using (var watcher = new LifecycleWatcher(this, frame, options?.WaitUntil, timeout)) { var raceTask = await Task.WhenAny( watcher.NewDocumentNavigationTask, watcher.SameDocumentNavigationTask, watcher.TimeoutOrTerminationTask).ConfigureAwait(false); await raceTask.ConfigureAwait(false); return(watcher.NavigationResponse); } }
internal async Task SetContentAsync(string html, NavigationOptions options = null) { var waitUntil = options?.WaitUntil ?? new[] { WaitUntilNavigation.Load }; var timeout = options?.Timeout ?? _timeoutSettings.NavigationTimeout; // We rely upon the fact that document.open() will reset frame lifecycle with "init" // lifecycle event. @see https://crrev.com/608658 await EvaluateFunctionAsync(@"html => { document.open(); document.write(html); document.close(); }", html).ConfigureAwait(false); var watcher = new LifecycleWatcher(_frameManager, Frame, waitUntil, timeout); var watcherTask = await Task.WhenAny( watcher.TimeoutOrTerminationTask, watcher.LifecycleTask).ConfigureAwait(false); await watcherTask.ConfigureAwait(false); }