| 
2 | 2 | using System.Collections.Generic;  | 
3 | 3 | using System.Diagnostics;  | 
4 | 4 | using System.IO;  | 
5 |  | -using System.Linq;  | 
6 | 5 | using System.Text.Json;  | 
7 | 6 | using System.Threading.Tasks;  | 
8 |  | -using System.Timers;  | 
9 | 7 | using PuppeteerSharp.Cdp;  | 
10 | 8 | using PuppeteerSharp.Cdp.Messaging;  | 
11 | 9 | using PuppeteerSharp.Helpers;  | 
@@ -43,14 +41,10 @@ public abstract class Page : IPage  | 
43 | 41 | 
 
  | 
44 | 42 |         private readonly TaskQueue _screenshotTaskQueue;  | 
45 | 43 |         private readonly ConcurrentSet<Func<IRequest, Task>> _requestInterceptionTask = [];  | 
46 |  | -        private readonly ConcurrentSet<IRequest> _requests = new();  | 
47 |  | -        private readonly TaskCompletionSource<bool> _closeTaskCompletionSource =  | 
48 |  | -            new(TaskCreationOptions.RunContinuationsAsynchronously);  | 
49 | 44 | 
 
  | 
50 | 45 |         internal Page(TaskQueue screenshotTaskQueue)  | 
51 | 46 |         {  | 
52 | 47 |             _screenshotTaskQueue = screenshotTaskQueue;  | 
53 |  | -            Request += (_, e) => _requests.Add(e.Request);  | 
54 | 48 |         }  | 
55 | 49 | 
 
  | 
56 | 50 |         /// <inheritdoc/>  | 
@@ -234,9 +228,6 @@ public int DefaultTimeout  | 
234 | 228 |         /// </summary>  | 
235 | 229 |         protected ScreenshotOptions ScreenshotBurstModeOptions { get; set; }  | 
236 | 230 | 
 
  | 
237 |  | -        private int NumRequestsInProgress  | 
238 |  | -            => _requests.Count(r => r.Response == null);  | 
239 |  | - | 
240 | 231 |         /// <inheritdoc/>  | 
241 | 232 |         public abstract Task SetGeolocationAsync(GeolocationOption options);  | 
242 | 233 | 
 
  | 
@@ -692,58 +683,7 @@ public Task<IResponse> WaitForNavigationAsync(NavigationOptions options = null)  | 
692 | 683 |             => MainFrame.WaitForNavigationAsync(options);  | 
693 | 684 | 
 
  | 
694 | 685 |         /// <inheritdoc/>  | 
695 |  | -        public async Task WaitForNetworkIdleAsync(WaitForNetworkIdleOptions options = null)  | 
696 |  | -        {  | 
697 |  | -            var timeout = options?.Timeout ?? DefaultTimeout;  | 
698 |  | -            var idleTime = options?.IdleTime ?? 500;  | 
699 |  | - | 
700 |  | -            var networkIdleTcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);  | 
701 |  | - | 
702 |  | -            var idleTimer = new Timer { Interval = idleTime, };  | 
703 |  | - | 
704 |  | -            idleTimer.Elapsed += (_, _) => { networkIdleTcs.TrySetResult(true); };  | 
705 |  | - | 
706 |  | -            void Evaluate()  | 
707 |  | -            {  | 
708 |  | -                idleTimer.Stop();  | 
709 |  | - | 
710 |  | -                if (NumRequestsInProgress <= (options?.Concurrency ?? 0))  | 
711 |  | -                {  | 
712 |  | -                    idleTimer.Start();  | 
713 |  | -                }  | 
714 |  | -            }  | 
715 |  | - | 
716 |  | -            void RequestEventListener(object sender, RequestEventArgs e) => Evaluate();  | 
717 |  | -            void ResponseEventListener(object sender, ResponseCreatedEventArgs e) => Evaluate();  | 
718 |  | - | 
719 |  | -            void Cleanup()  | 
720 |  | -            {  | 
721 |  | -                idleTimer.Stop();  | 
722 |  | -                idleTimer.Dispose();  | 
723 |  | - | 
724 |  | -                Request -= RequestEventListener;  | 
725 |  | -                Response -= ResponseEventListener;  | 
726 |  | -            }  | 
727 |  | - | 
728 |  | -            Request += RequestEventListener;  | 
729 |  | -            Response += ResponseEventListener;  | 
730 |  | - | 
731 |  | -            Evaluate();  | 
732 |  | - | 
733 |  | -            await Task.WhenAny(networkIdleTcs.Task, _closeTaskCompletionSource.Task).WithTimeout(timeout, t =>  | 
734 |  | -            {  | 
735 |  | -                Cleanup();  | 
736 |  | - | 
737 |  | -                return new TimeoutException($"Timeout of {t.TotalMilliseconds} ms exceeded");  | 
738 |  | -            }).ConfigureAwait(false);  | 
739 |  | - | 
740 |  | -            Cleanup();  | 
741 |  | - | 
742 |  | -            if (_closeTaskCompletionSource.Task.IsFaulted)  | 
743 |  | -            {  | 
744 |  | -                await _closeTaskCompletionSource.Task.ConfigureAwait(false);  | 
745 |  | -            }  | 
746 |  | -        }  | 
 | 686 | +        public abstract Task WaitForNetworkIdleAsync(WaitForNetworkIdleOptions options = null);  | 
747 | 687 | 
 
  | 
748 | 688 |         /// <inheritdoc/>  | 
749 | 689 |         public Task<IRequest> WaitForRequestAsync(string url, WaitForOptions options = null)  | 
@@ -945,11 +885,7 @@ protected void OnRequest(IRequest request)  | 
945 | 885 |         /// <summary>  | 
946 | 886 |         /// Raises the <see cref="Close"/> event.  | 
947 | 887 |         /// </summary>  | 
948 |  | -        protected void OnClose()  | 
949 |  | -        {  | 
950 |  | -            _closeTaskCompletionSource?.TrySetException(new TargetClosedException("Target closed", "Session closed"));  | 
951 |  | -            Close?.Invoke(this, EventArgs.Empty);  | 
952 |  | -        }  | 
 | 888 | +        protected void OnClose() => Close?.Invoke(this, EventArgs.Empty);  | 
953 | 889 | 
 
  | 
954 | 890 |         /// <summary>  | 
955 | 891 |         /// Raises the <see cref="Console"/> event.  | 
 | 
0 commit comments