Skip to content

Commit

Permalink
Drop object factory from execution context (#645)
Browse files Browse the repository at this point in the history
* Drop object factory from execution context

* cr
  • Loading branch information
kblok authored and Meir017 committed Sep 28, 2018
1 parent ad30cf5 commit 085ff89
Show file tree
Hide file tree
Showing 6 changed files with 19 additions and 22 deletions.
13 changes: 7 additions & 6 deletions lib/PuppeteerSharp/ExecutionContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,13 @@ public class ExecutionContext
internal ExecutionContext(
CDPSession client,
ContextPayload contextPayload,
Func<ExecutionContext, dynamic, JSHandle> objectHandleFactory,
Frame frame)
{
_client = client;
_contextId = contextPayload.Id;
ObjectHandleFactory = objectHandleFactory;
Frame = frame;
}

internal Func<ExecutionContext, dynamic, JSHandle> ObjectHandleFactory { get; set; }

/// <summary>
/// Frame associated with this execution context.
/// </summary>
Expand Down Expand Up @@ -127,7 +123,7 @@ public async Task<dynamic> QueryObjectsAsync(JSHandle prototypeHandle)
{"prototypeObjectId", objectId.ToString()}
}).ConfigureAwait(false);

return ObjectHandleFactory(this, response.objects);
return CreateJSHandle(response.objects);
}

internal async Task<JSHandle> EvaluateExpressionHandleAsync(string script)
Expand Down Expand Up @@ -179,6 +175,11 @@ internal async Task<JSHandle> EvaluateFunctionHandleAsync(string script, params
}
}

internal JSHandle CreateJSHandle(dynamic remoteObject)
=> (remoteObject.subtype == "node" && Frame != null)
? new ElementHandle(this, _client, remoteObject, Frame.FrameManager.Page, Frame.FrameManager)
: new JSHandle(this, _client, remoteObject);

private async Task<T> EvaluateAsync<T>(Task<JSHandle> handleEvaluator)
{
var handle = await handleEvaluator.ConfigureAwait(false);
Expand Down Expand Up @@ -212,7 +213,7 @@ private async Task<JSHandle> EvaluateHandleAsync(string method, dynamic args)
GetExceptionMessage(response.exceptionDetails.ToObject<EvaluateExceptionDetails>()));
}

return ObjectHandleFactory(this, response.result);
return CreateJSHandle(response.result);
}

private object FormatArgument(object arg)
Expand Down
9 changes: 6 additions & 3 deletions lib/PuppeteerSharp/Frame.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,9 @@ public class Frame
internal List<string> LifecycleEvents { get; }
internal string NavigationURL { get; private set; }

internal Frame(CDPSession client, Frame parentFrame, string frameId)
internal Frame(FrameManager frameManager, CDPSession client, Frame parentFrame, string frameId)
{
FrameManager = frameManager;
_client = client;
ParentFrame = parentFrame;
Id = frameId;
Expand Down Expand Up @@ -92,6 +93,8 @@ internal Frame(CDPSession client, Frame parentFrame, string frameId)
/// Gets the parent frame, if any. Detached frames and main frames return <c>null</c>
/// </summary>
public Frame ParentFrame { get; private set; }

internal FrameManager FrameManager { get; }
#endregion

#region Public Methods
Expand Down Expand Up @@ -403,7 +406,7 @@ public async Task<ElementHandle> AddStyleTag(AddTagOptions options)

if (!string.IsNullOrEmpty(options.Path))
{
string contents = await AsyncFileHelper.ReadAllText(options.Path).ConfigureAwait(false);
var contents = await AsyncFileHelper.ReadAllText(options.Path).ConfigureAwait(false);
contents += "//# sourceURL=" + options.Path.Replace("\n", string.Empty);
var context = await GetExecutionContextAsync().ConfigureAwait(false);
return (await context.EvaluateFunctionHandleAsync(addStyleContent, contents).ConfigureAwait(false)) as ElementHandle;
Expand Down Expand Up @@ -475,7 +478,7 @@ async Task<ElementHandle> AddScriptTagPrivate(string script, string urlOrContent

if (!string.IsNullOrEmpty(options.Path))
{
string contents = await AsyncFileHelper.ReadAllText(options.Path).ConfigureAwait(false);
var contents = await AsyncFileHelper.ReadAllText(options.Path).ConfigureAwait(false);
contents += "//# sourceURL=" + options.Path.Replace("\n", string.Empty);
return await AddScriptTagPrivate(addScriptContent, contents, options.Type).ConfigureAwait(false);
}
Expand Down
14 changes: 4 additions & 10 deletions lib/PuppeteerSharp/FrameManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,13 @@ namespace PuppeteerSharp
internal class FrameManager
{
private readonly CDPSession _client;
private readonly Page _page;
private Dictionary<int, ExecutionContext> _contextIdToContext;
private readonly ILogger _logger;

internal FrameManager(CDPSession client, FrameTree frameTree, Page page)
{
_client = client;
_page = page;
Page = page;
Frames = new Dictionary<string, Frame>();
_contextIdToContext = new Dictionary<int, ExecutionContext>();
_logger = _client.Connection.LoggerFactory.CreateLogger<FrameManager>();
Expand All @@ -34,16 +33,12 @@ internal FrameManager(CDPSession client, FrameTree frameTree, Page page)

internal Dictionary<string, Frame> Frames { get; set; }
internal Frame MainFrame { get; set; }
internal Page Page { get; }

#endregion

#region Public Methods

internal JSHandle CreateJSHandle(ExecutionContext context, dynamic remoteObject)
=> remoteObject.subtype == "node"
? new ElementHandle(context, _client, remoteObject, _page, this)
: new JSHandle(context, _client, remoteObject);

internal ExecutionContext ExecutionContextById(int contextId)
{
_contextIdToContext.TryGetValue(contextId, out var context);
Expand Down Expand Up @@ -149,7 +144,6 @@ private void OnExecutionContextCreated(ContextPayload contextPayload)
var context = new ExecutionContext(
_client,
contextPayload,
(ctx, remoteObject) => CreateJSHandle(ctx, remoteObject),
frame);

_contextIdToContext[contextPayload.Id] = context;
Expand Down Expand Up @@ -199,7 +193,7 @@ private void OnFrameNavigated(FramePayload framePayload)
else
{
// Initial main frame navigation.
frame = new Frame(_client, null, framePayload.Id);
frame = new Frame(this, _client, null, framePayload.Id);
}

Frames[framePayload.Id] = frame;
Expand Down Expand Up @@ -248,7 +242,7 @@ private void OnFrameAttached(string frameId, string parentFrameId)
if (!Frames.ContainsKey(frameId) && Frames.ContainsKey(parentFrameId))
{
var parentFrame = Frames[parentFrameId];
var frame = new Frame(_client, parentFrame, frameId);
var frame = new Frame(this, _client, parentFrame, frameId);
Frames[frame.Id] = frame;
FrameAttached?.Invoke(this, new FrameEventArgs(frame));
}
Expand Down
2 changes: 1 addition & 1 deletion lib/PuppeteerSharp/JSHandle.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public async Task<Dictionary<string, JSHandle>> GetPropertiesAsync()
continue;
}

result.Add(property.name.ToString(), ExecutionContext.ObjectHandleFactory(ExecutionContext, property.value));
result.Add(property.name.ToString(), ExecutionContext.CreateJSHandle(property.value));
}
return result;
}
Expand Down
2 changes: 1 addition & 1 deletion lib/PuppeteerSharp/Page.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1964,7 +1964,7 @@ private void OnDialog(PageJavascriptDialogOpeningResponse message)
private async Task OnConsoleAPI(PageConsoleResponse message)
{
var ctx = _frameManager.ExecutionContextById(message.ExecutionContextId);
var values = message.Args.Select<dynamic, JSHandle>(i => _frameManager.CreateJSHandle(ctx, i)).ToArray();
var values = message.Args.Select<dynamic, JSHandle>(i => ctx.CreateJSHandle(i)).ToArray();
await AddConsoleMessage(message.Type, values);
}

Expand Down
1 change: 0 additions & 1 deletion lib/PuppeteerSharp/Worker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,6 @@ private void OnExecutionContextCreated(MessageEventArgs e)
_executionContext = new ExecutionContext(
_client,
e.MessageData.SelectToken("context").ToObject<ContextPayload>(),
_jsHandleFactory,
null);
_executionContextCallback.TrySetResult(_executionContext);
}
Expand Down

0 comments on commit 085ff89

Please sign in to comment.