@@ -62,7 +62,11 @@ namespace CefSharp
6262 _onBrowserCreated->Invoke (wrapper);
6363
6464 // Multiple CefBrowserWrappers created when opening popups
65- _browserWrappers->TryAdd (browser->GetIdentifier (), wrapper);
65+ auto browserId = browser->GetIdentifier ();
66+ _browserWrappers->TryAdd (browserId, wrapper);
67+
68+ auto javascriptBindingSettings = gcnew JavascriptBindingSettings ();
69+ _browserJavascriptBindingSettings->TryAdd (browserId, javascriptBindingSettings);
6670
6771 if (!extraInfo.get ())
6872 {
@@ -103,19 +107,19 @@ namespace CefSharp
103107
104108 if (extraInfo->HasKey (" JavascriptBindingApiEnabled" ))
105109 {
106- wrapper ->JavascriptBindingApiEnabled = extraInfo->GetBool (" JavascriptBindingApiEnabled" );
110+ javascriptBindingSettings ->JavascriptBindingApiEnabled = extraInfo->GetBool (" JavascriptBindingApiEnabled" );
107111 }
108112
109113 if (extraInfo->HasKey (" JavascriptBindingApiHasAllowOrigins" ))
110114 {
111- wrapper ->JavascriptBindingApiHasAllowOrigins = extraInfo->GetBool (" JavascriptBindingApiHasAllowOrigins" );
115+ javascriptBindingSettings ->JavascriptBindingApiHasAllowOrigins = extraInfo->GetBool (" JavascriptBindingApiHasAllowOrigins" );
112116
113- if (wrapper ->JavascriptBindingApiHasAllowOrigins )
117+ if (javascriptBindingSettings ->JavascriptBindingApiHasAllowOrigins )
114118 {
115119 auto allowOrigins = extraInfo->GetList (" JavascriptBindingApiAllowOrigins" );
116120 if (allowOrigins.get () && allowOrigins->IsValid ())
117121 {
118- wrapper ->JavascriptBindingApiAllowOrigins = allowOrigins->Copy ();
122+ javascriptBindingSettings ->JavascriptBindingApiAllowOrigins = allowOrigins->Copy ();
119123 }
120124 }
121125 }
@@ -136,6 +140,9 @@ namespace CefSharp
136140 _onBrowserDestroyed->Invoke (wrapper);
137141 delete wrapper;
138142 }
143+
144+ // Don't remove javascript settings because cef is unreliable in calling OnBrowserCreated/OnBrowserDestroyed consistently:
145+ // https://github.com/cefsharp/CefSharp/issues/5228
139146 };
140147
141148 void CefAppUnmanagedWrapper::OnContextCreated (CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
@@ -165,9 +172,10 @@ namespace CefSharp
165172 }
166173 }
167174
168- auto browserWrapper = FindBrowserWrapper (browser->GetIdentifier ());
175+ JavascriptBindingSettings^ javascriptBindingSettings = nullptr ;
176+ _browserJavascriptBindingSettings->TryGetValue (browser->GetIdentifier (), javascriptBindingSettings);
169177
170- if (browserWrapper != nullptr && browserWrapper-> JavascriptBindingApiEnabled && IsJavascriptBindingApiAllowed (browserWrapper , frame))
178+ if (IsJavascriptBindingApiAllowed (javascriptBindingSettings , frame))
171179 {
172180 // TODO: Look at adding some sort of javascript mapping layer to reduce the code duplication
173181 auto global = context->GetGlobal ();
@@ -347,14 +355,24 @@ namespace CefSharp
347355 return rootObject;
348356 }
349357
350- bool CefAppUnmanagedWrapper::IsJavascriptBindingApiAllowed (CefBrowserWrapper^ browserWrapper , CefRefPtr<CefFrame> frame)
358+ bool CefAppUnmanagedWrapper::IsJavascriptBindingApiAllowed (JavascriptBindingSettings^ javascriptBindingSettings , CefRefPtr<CefFrame> frame)
351359 {
352- if (browserWrapper == nullptr || !browserWrapper->JavascriptBindingApiHasAllowOrigins )
360+ if (javascriptBindingSettings == nullptr )
361+ {
362+ return false ;
363+ }
364+
365+ if (!javascriptBindingSettings->JavascriptBindingApiEnabled )
366+ {
367+ return false ;
368+ }
369+
370+ if (!javascriptBindingSettings->JavascriptBindingApiHasAllowOrigins )
353371 {
354372 return true ;
355373 }
356374
357- auto allowOrigins = browserWrapper ->JavascriptBindingApiAllowOrigins ;
375+ auto allowOrigins = javascriptBindingSettings ->JavascriptBindingApiAllowOrigins ;
358376 if (!allowOrigins.get ())
359377 {
360378 return false ;
0 commit comments