Skip to content

Commit 8e58174

Browse files
committed
Core - FrameHandler track frame lifecycle
- FrameHandler now tracks frame creation and removal and reuses the IFrame reference - CefFrameWrapper no longer throws exception if accessing Identifier for invalid frame, this appears to be a valid use case now which makes sense otherwise we'd never be able to identify the frame. Resolves #3588
1 parent 3affa0b commit 8e58174

File tree

3 files changed

+32
-6
lines changed

3 files changed

+32
-6
lines changed

CefSharp.Core.Runtime/Internals/CefFrameWrapper.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,6 @@ String^ CefFrameWrapper::Name::get()
311311
Int64 CefFrameWrapper::Identifier::get()
312312
{
313313
ThrowIfDisposed();
314-
ThrowIfFrameInvalid();
315314

316315
return _frame->GetIdentifier();
317316
}

CefSharp.WinForms.Example/BrowserTabUserControl.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public BrowserTabUserControl(Action<string, int?> openNewTab, string url, bool m
4242
browser.JsDialogHandler = new JsDialogHandler();
4343
browser.DownloadHandler = new DownloadHandler();
4444
browser.AudioHandler = new CefSharp.Handler.AudioHandler();
45+
browser.FrameHandler = new CefSharp.Handler.FrameHandler();
4546

4647
if (multiThreadedMessageLoopEnabled)
4748
{

CefSharp/Handler/FrameHandler.cs

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
//
33
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
44

5+
using System.Collections.Generic;
6+
57
namespace CefSharp.Handler
68
{
79
/// <summary>
@@ -10,10 +12,16 @@ namespace CefSharp.Handler
1012
/// </summary>
1113
public class FrameHandler : IFrameHandler
1214
{
15+
private Dictionary<long, IFrame> frames = new Dictionary<long, IFrame>();
16+
1317
/// <inheritdoc/>
1418
void IFrameHandler.OnFrameAttached(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame)
1519
{
16-
OnFrameAttached(chromiumWebBrowser, browser, frame);
20+
//If we have a reference to the frame then we'll reuse that for memory management purposes
21+
//The frame param massed on here is stack allocated so will be disposed when out of scope.
22+
var storedFrame = GetFrameById(frame.Identifier);
23+
24+
OnFrameAttached(chromiumWebBrowser, browser, storedFrame ?? frame);
1725
}
1826

1927
/// <summary>
@@ -25,12 +33,14 @@ void IFrameHandler.OnFrameAttached(IWebBrowser chromiumWebBrowser, IBrowser brow
2533
/// <param name="frame">the frame object</param>
2634
protected virtual void OnFrameAttached(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame)
2735
{
28-
36+
2937
}
3038

3139
/// <inheritdoc/>
3240
void IFrameHandler.OnFrameCreated(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame)
3341
{
42+
frames.Add(frame.Identifier, frame);
43+
3444
OnFrameCreated(chromiumWebBrowser, browser, frame);
3545
}
3646

@@ -45,12 +55,14 @@ void IFrameHandler.OnFrameCreated(IWebBrowser chromiumWebBrowser, IBrowser brows
4555
/// <param name="frame">the frame object</param>
4656
protected virtual void OnFrameCreated(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame)
4757
{
48-
58+
4959
}
5060

5161
/// <inheritdoc/>
5262
void IFrameHandler.OnFrameDetached(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame)
5363
{
64+
frames.Remove(frame.Identifier);
65+
5466
OnFrameDetached(chromiumWebBrowser, browser, frame);
5567
}
5668

@@ -66,13 +78,17 @@ void IFrameHandler.OnFrameDetached(IWebBrowser chromiumWebBrowser, IBrowser brow
6678
/// <param name="frame">the frame object</param>
6779
protected virtual void OnFrameDetached(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame)
6880
{
69-
81+
7082
}
7183

7284
/// <inheritdoc/>
7385
void IFrameHandler.OnMainFrameChanged(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame oldFrame, IFrame newFrame)
7486
{
75-
OnMainFrameChanged(chromiumWebBrowser, browser, oldFrame, newFrame);
87+
//If we have a reference to the frame then we'll reuse that for memory management purposes
88+
//The frame param massed on here is stack allocated so will be disposed when out of scope.
89+
var storedFrame = newFrame == null ? null : GetFrameById(newFrame.Identifier);
90+
91+
OnMainFrameChanged(chromiumWebBrowser, browser, oldFrame, storedFrame ?? newFrame);
7692
}
7793

7894
/// <summary>
@@ -101,5 +117,15 @@ protected virtual void OnMainFrameChanged(IWebBrowser chromiumWebBrowser, IBrows
101117
{
102118

103119
}
120+
121+
private IFrame GetFrameById(long frameId)
122+
{
123+
if(frames.TryGetValue(frameId, out var frame))
124+
{
125+
return frame;
126+
}
127+
128+
return null;
129+
}
104130
}
105131
}

0 commit comments

Comments
 (0)