2323#include " Wrapper\Browser.h"
2424#include " ..\CefSharp.Core.Runtime\Internals\Messaging\Messages.h"
2525#include " ..\CefSharp.Core.Runtime\Internals\Serialization\Primitives.h"
26+ #include < include/cef_parser.h>
2627
2728using namespace System ;
2829using namespace System ::Diagnostics;
@@ -87,7 +88,7 @@ namespace CefSharp
8788 // Using LegacyBinding with multiple ChromiumWebBrowser instances that share the same
8889 // render process and using LegacyBinding will cause problems for the limited caching implementation
8990 // that exists at the moment, for now we'll remove an object if already exists, same behaviour
90- // as the new binding method.
91+ // as the new binding method.
9192 // TODO: This should be removed when https://github.com/cefsharp/CefSharp/issues/2306
9293 // Is complete as objects will be stored at the browser level
9394 if (_javascriptObjects->ContainsKey (obj->JavascriptName ))
@@ -98,16 +99,33 @@ namespace CefSharp
9899 }
99100 }
100101 }
102+ }
101103
102- _jsBindingApiEnabled = extraInfo->GetBool (" JavascriptBindingApiEnabled" );
104+ if (extraInfo->HasKey (" JavascriptBindingApiEnabled" ))
105+ {
106+ wrapper->JavascriptBindingApiEnabled = extraInfo->GetBool (" JavascriptBindingApiEnabled" );
107+ }
108+
109+ if (extraInfo->HasKey (" JavascriptBindingApiHasAllowOrigins" ))
110+ {
111+ wrapper->JavascriptBindingApiHasAllowOrigins = extraInfo->GetBool (" JavascriptBindingApiHasAllowOrigins" );
103112
104- if (extraInfo-> HasKey ( " JsBindingPropertyName " ) || extraInfo-> HasKey ( " JsBindingPropertyNameCamelCase " ) )
113+ if (wrapper-> JavascriptBindingApiHasAllowOrigins )
105114 {
106- // TODO: Create constant for these and legacy binding strings above
107- _jsBindingPropertyName = extraInfo->GetString (" JsBindingPropertyName" );
108- _jsBindingPropertyNameCamelCase = extraInfo->GetString (" JsBindingPropertyNameCamelCase" );
115+ auto allowOrigins = extraInfo->GetList (" JavascriptBindingApiAllowOrigins" );
116+ if (allowOrigins.get () && allowOrigins->IsValid ())
117+ {
118+ wrapper->JavascriptBindingApiAllowOrigins = allowOrigins->Copy ();
119+ }
109120 }
110121 }
122+
123+ if (extraInfo->HasKey (" JsBindingPropertyName" ) || extraInfo->HasKey (" JsBindingPropertyNameCamelCase" ))
124+ {
125+ // TODO: Create constant for these and legacy binding strings above
126+ _jsBindingPropertyName = extraInfo->GetString (" JsBindingPropertyName" );
127+ _jsBindingPropertyNameCamelCase = extraInfo->GetString (" JsBindingPropertyNameCamelCase" );
128+ }
111129 }
112130
113131 void CefAppUnmanagedWrapper::OnBrowserDestroyed (CefRefPtr<CefBrowser> browser)
@@ -147,11 +165,12 @@ namespace CefSharp
147165 }
148166 }
149167
150- if (_jsBindingApiEnabled)
168+ auto browserWrapper = FindBrowserWrapper (browser->GetIdentifier ());
169+
170+ if (browserWrapper != nullptr && browserWrapper->JavascriptBindingApiEnabled && IsJavascriptBindingApiAllowed (browserWrapper, frame))
151171 {
152172 // TODO: Look at adding some sort of javascript mapping layer to reduce the code duplication
153173 auto global = context->GetGlobal ();
154- auto browserWrapper = FindBrowserWrapper (browser->GetIdentifier ());
155174 auto processId = System::Diagnostics::Process::GetCurrentProcess ()->Id ;
156175
157176 // TODO: JSB: Split functions into their own classes
@@ -328,6 +347,51 @@ namespace CefSharp
328347 return rootObject;
329348 }
330349
350+ bool CefAppUnmanagedWrapper::IsJavascriptBindingApiAllowed (CefBrowserWrapper^ browserWrapper, CefRefPtr<CefFrame> frame)
351+ {
352+ if (browserWrapper == nullptr || !browserWrapper->JavascriptBindingApiHasAllowOrigins )
353+ {
354+ return true ;
355+ }
356+
357+ auto allowOrigins = browserWrapper->JavascriptBindingApiAllowOrigins ;
358+ if (!allowOrigins.get ())
359+ {
360+ return false ;
361+ }
362+
363+ auto frameUrl = frame->GetURL ();
364+
365+ CefURLParts frameUrlParts;
366+
367+ if (CefParseURL (frameUrl, frameUrlParts))
368+ {
369+ auto originStr = frameUrlParts.origin .str ;
370+ auto originLen = frameUrlParts.origin .length ;
371+
372+ if (originLen > 0 && originStr[originLen - 1 ] == L' /' )
373+ {
374+ originLen--;
375+ }
376+
377+ auto frameUrlOrigin = CefString (originStr, originLen);
378+
379+ auto size = static_cast <int >(allowOrigins->GetSize ());
380+
381+ for (int i = 0 ; i < size; i++)
382+ {
383+ auto origin = allowOrigins->GetString (i);
384+
385+ if (_wcsicmp (frameUrlOrigin.ToWString ().c_str (), origin.ToWString ().c_str ()) == 0 )
386+ {
387+ return true ;
388+ }
389+ }
390+ }
391+
392+ return false ;
393+ }
394+
331395 CefBrowserWrapper^ CefAppUnmanagedWrapper::FindBrowserWrapper(int browserId)
332396 {
333397 CefBrowserWrapper^ wrapper = nullptr ;
0 commit comments