Skip to content

Commit ce0d13b

Browse files
committed
Introduce an internal PageTarget subclass
1 parent 962993c commit ce0d13b

File tree

4 files changed

+225
-197
lines changed

4 files changed

+225
-197
lines changed

lib/PuppeteerSharp/Browser.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -478,16 +478,25 @@ private Target CreateTarget(TargetInfo targetInfo, CDPSession session)
478478
context = _defaultContext;
479479
}
480480

481+
if (_isPageTargetFunc(targetInfo))
482+
{
483+
return new PageTarget(
484+
targetInfo,
485+
session,
486+
context,
487+
TargetManager,
488+
(bool isAutoAttachEmulated) => Connection.CreateSessionAsync(targetInfo, isAutoAttachEmulated),
489+
IgnoreHTTPSErrors,
490+
DefaultViewport,
491+
ScreenshotTaskQueue);
492+
}
493+
481494
return new Target(
482495
targetInfo,
483496
session,
484497
context,
485498
TargetManager,
486-
(bool isAutoAttachEmulated) => Connection.CreateSessionAsync(targetInfo, isAutoAttachEmulated),
487-
IgnoreHTTPSErrors,
488-
DefaultViewport,
489-
ScreenshotTaskQueue,
490-
_isPageTargetFunc);
499+
(bool isAutoAttachEmulated) => Connection.CreateSessionAsync(targetInfo, isAutoAttachEmulated));
491500
}
492501
}
493502
}

lib/PuppeteerSharp/ITarget.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public interface ITarget
5151
Task<ICDPSession> CreateCDPSessionAsync();
5252

5353
/// <summary>
54-
/// Returns the <see cref="IPage"/> associated with the target. If the target is not <c>"page"</c> or <c>"background_page"</c> returns <c>null</c>.
54+
/// Returns the <see cref="IPage"/> associated with the target. If the target is not <c>"page"</c>, <c>"webview"</c> or <c>"background_page"</c> returns <c>null</c>.
5555
/// </summary>
5656
/// <returns>a task that returns a <see cref="IPage"/>.</returns>
5757
Task<IPage> PageAsync();

lib/PuppeteerSharp/PageTarget.cs

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using PuppeteerSharp.Helpers;
4+
5+
namespace PuppeteerSharp
6+
{
7+
internal class PageTarget : Target
8+
{
9+
private readonly bool _ignoreHTTPSErrors;
10+
private readonly ViewPortOptions _defaultViewport;
11+
private readonly TaskQueue _screenshotTaskQueue;
12+
13+
public PageTarget(TargetInfo targetInfo, CDPSession session, BrowserContext context, ITargetManager targetManager, Func<bool, Task<CDPSession>> sessionFactory, bool ignoreHTTPSErrors, ViewPortOptions defaultViewport, TaskQueue screenshotTaskQueue)
14+
: base(targetInfo, session, context, targetManager, sessionFactory)
15+
{
16+
_ignoreHTTPSErrors = ignoreHTTPSErrors;
17+
_defaultViewport = defaultViewport;
18+
_screenshotTaskQueue = screenshotTaskQueue;
19+
PageTask = null;
20+
}
21+
22+
internal Task<IPage> PageTask { get; set; }
23+
24+
/// <inheritdoc/>
25+
public override async Task<IPage> PageAsync()
26+
{
27+
if (PageTask == null)
28+
{
29+
var session = Session ?? await SessionFactory(true).ConfigureAwait(false);
30+
31+
return await Page.CreateAsync(
32+
session,
33+
this,
34+
_ignoreHTTPSErrors,
35+
_defaultViewport,
36+
_screenshotTaskQueue).ConfigureAwait(false);
37+
}
38+
39+
return await PageTask.ConfigureAwait(false);
40+
}
41+
42+
protected override void Initialize()
43+
{
44+
_ = InitializedTaskWrapper.Task.ContinueWith(
45+
async initializedTask =>
46+
{
47+
var success = initializedTask.Result;
48+
if (!success)
49+
{
50+
return;
51+
}
52+
53+
var opener = Opener as PageTarget;
54+
55+
var openerPageTask = opener?.PageTask;
56+
if (openerPageTask == null || Type != TargetType.Page)
57+
{
58+
return;
59+
}
60+
61+
var openerPage = (Page)await openerPageTask.ConfigureAwait(false);
62+
if (!openerPage.HasPopupEventListeners)
63+
{
64+
return;
65+
}
66+
67+
var popupPage = await PageAsync().ConfigureAwait(false);
68+
openerPage.OnPopup(popupPage);
69+
},
70+
TaskScheduler.Default);
71+
}
72+
73+
protected override void CheckIfInitialized()
74+
{
75+
if (!IsInitialized && (TargetInfo.Type != TargetType.Page || !string.IsNullOrEmpty(TargetInfo.Url)))
76+
{
77+
IsInitialized = true;
78+
InitializedTaskWrapper.TrySetResult(true);
79+
}
80+
}
81+
}
82+
}

0 commit comments

Comments
 (0)