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+
57namespace 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