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 ))
@@ -100,6 +101,16 @@ namespace CefSharp
100101 }
101102
102103 _jsBindingApiEnabled = extraInfo->GetBool (" JavascriptBindingApiEnabled" );
104+ _jsBindingApiHasAllowOrigins = extraInfo->GetBool (" JavascriptBindingApiHasAllowOrigins" );
105+
106+ if (_jsBindingApiHasAllowOrigins)
107+ {
108+ auto allowOrigins = extraInfo->GetList (" JavascriptBindingApiAllowOrigins" );
109+ if (allowOrigins.get () && allowOrigins->IsValid ())
110+ {
111+ _jsBindingApiAllowOrigins = allowOrigins->Copy ();
112+ }
113+ }
103114
104115 if (extraInfo->HasKey (" JsBindingPropertyName" ) || extraInfo->HasKey (" JsBindingPropertyNameCamelCase" ))
105116 {
@@ -149,50 +160,88 @@ namespace CefSharp
149160
150161 if (_jsBindingApiEnabled)
151162 {
152- // TODO: Look at adding some sort of javascript mapping layer to reduce the code duplication
153- auto global = context->GetGlobal ();
154- auto browserWrapper = FindBrowserWrapper (browser->GetIdentifier ());
155- auto processId = System::Diagnostics::Process::GetCurrentProcess ()->Id ;
156-
157- // TODO: JSB: Split functions into their own classes
158- // Browser wrapper is only used for BindObjectAsync
159- auto bindObjAsyncFunction = CefV8Value::CreateFunction (kBindObjectAsync , new BindObjectAsyncHandler (_registerBoundObjectRegistry, _javascriptObjects, rootObject));
160- auto unBindObjFunction = CefV8Value::CreateFunction (kDeleteBoundObject , new RegisterBoundObjectHandler (_javascriptObjects));
161- auto removeObjectFromCacheFunction = CefV8Value::CreateFunction (kRemoveObjectFromCache , new RegisterBoundObjectHandler (_javascriptObjects));
162- auto isObjectCachedFunction = CefV8Value::CreateFunction (kIsObjectCached , new RegisterBoundObjectHandler (_javascriptObjects));
163- auto postMessageFunction = CefV8Value::CreateFunction (kPostMessage , new JavascriptPostMessageHandler (rootObject == nullptr ? nullptr : rootObject->CallbackRegistry ));
164- auto promiseHandlerFunction = CefV8Value::CreateFunction (kSendEvalScriptResponse , new JavascriptPromiseHandler ());
165-
166- // By default We'll support both CefSharp and cefSharp, for those who prefer the JS style
167- auto createCefSharpObj = !_jsBindingPropertyName.empty ();
168- auto createCefSharpObjCamelCase = !_jsBindingPropertyNameCamelCase.empty ();
169-
170- if (createCefSharpObj)
163+ auto createObjects = true ;
164+
165+ if (_jsBindingApiHasAllowOrigins)
171166 {
172- auto cefSharpObj = CefV8Value::CreateObject (nullptr , nullptr );
173- cefSharpObj->SetValue (kBindObjectAsync , bindObjAsyncFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
174- cefSharpObj->SetValue (kDeleteBoundObject , unBindObjFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
175- cefSharpObj->SetValue (kRemoveObjectFromCache , removeObjectFromCacheFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
176- cefSharpObj->SetValue (kIsObjectCached , isObjectCachedFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
177- cefSharpObj->SetValue (kPostMessage , postMessageFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
178- cefSharpObj->SetValue (kSendEvalScriptResponse , promiseHandlerFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
179- cefSharpObj->SetValue (kRenderProcessId , CefV8Value::CreateInt (processId), CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
180-
181- global->SetValue (_jsBindingPropertyName, cefSharpObj, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY );
167+ createObjects = false ;
168+
169+ auto frameUrl = frame->GetURL ();
170+
171+ CefURLParts frameUrlParts;
172+
173+ if (CefParseURL (frameUrl, frameUrlParts))
174+ {
175+ auto frameUrlOrigin = CefString (frameUrlParts.origin .str , frameUrlParts.origin .length );
176+ auto clrframeUrlOrigin = StringUtils::ToClr (frameUrlOrigin);
177+
178+ auto size = static_cast <int >(_jsBindingApiAllowOrigins->GetSize ());
179+
180+ for (int i = 0 ; i < size; i++)
181+ {
182+ auto origin = _jsBindingApiAllowOrigins->GetString (i);
183+
184+ auto clrOrigin = StringUtils::ToClr (origin);
185+
186+ auto originEqual = String::Compare (clrframeUrlOrigin, clrOrigin, StringComparison::InvariantCultureIgnoreCase);
187+
188+ if (originEqual == 0 )
189+ {
190+ createObjects = true ;
191+
192+ break ;
193+ }
194+ }
195+ }
182196 }
183197
184- if (createCefSharpObjCamelCase )
198+ if (createObjects )
185199 {
186- auto cefSharpObjCamelCase = CefV8Value::CreateObject (nullptr , nullptr );
187- cefSharpObjCamelCase->SetValue (kBindObjectAsyncCamelCase , bindObjAsyncFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
188- cefSharpObjCamelCase->SetValue (kDeleteBoundObjectCamelCase , unBindObjFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
189- cefSharpObjCamelCase->SetValue (kRemoveObjectFromCacheCamelCase , removeObjectFromCacheFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
190- cefSharpObjCamelCase->SetValue (kIsObjectCachedCamelCase , isObjectCachedFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
191- cefSharpObjCamelCase->SetValue (kPostMessageCamelCase , postMessageFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
192- cefSharpObjCamelCase->SetValue (kSendEvalScriptResponseCamelCase , promiseHandlerFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
193- cefSharpObjCamelCase->SetValue (kRenderProcessIdCamelCase , CefV8Value::CreateInt (processId), CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
194-
195- global->SetValue (_jsBindingPropertyNameCamelCase, cefSharpObjCamelCase, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY );
200+ // TODO: Look at adding some sort of javascript mapping layer to reduce the code duplication
201+ auto global = context->GetGlobal ();
202+ auto browserWrapper = FindBrowserWrapper (browser->GetIdentifier ());
203+ auto processId = System::Diagnostics::Process::GetCurrentProcess ()->Id ;
204+
205+ // TODO: JSB: Split functions into their own classes
206+ // Browser wrapper is only used for BindObjectAsync
207+ auto bindObjAsyncFunction = CefV8Value::CreateFunction (kBindObjectAsync , new BindObjectAsyncHandler (_registerBoundObjectRegistry, _javascriptObjects, rootObject));
208+ auto unBindObjFunction = CefV8Value::CreateFunction (kDeleteBoundObject , new RegisterBoundObjectHandler (_javascriptObjects));
209+ auto removeObjectFromCacheFunction = CefV8Value::CreateFunction (kRemoveObjectFromCache , new RegisterBoundObjectHandler (_javascriptObjects));
210+ auto isObjectCachedFunction = CefV8Value::CreateFunction (kIsObjectCached , new RegisterBoundObjectHandler (_javascriptObjects));
211+ auto postMessageFunction = CefV8Value::CreateFunction (kPostMessage , new JavascriptPostMessageHandler (rootObject == nullptr ? nullptr : rootObject->CallbackRegistry ));
212+ auto promiseHandlerFunction = CefV8Value::CreateFunction (kSendEvalScriptResponse , new JavascriptPromiseHandler ());
213+
214+ // By default We'll support both CefSharp and cefSharp, for those who prefer the JS style
215+ auto createCefSharpObj = !_jsBindingPropertyName.empty ();
216+ auto createCefSharpObjCamelCase = !_jsBindingPropertyNameCamelCase.empty ();
217+
218+ if (createCefSharpObj)
219+ {
220+ auto cefSharpObj = CefV8Value::CreateObject (nullptr , nullptr );
221+ cefSharpObj->SetValue (kBindObjectAsync , bindObjAsyncFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
222+ cefSharpObj->SetValue (kDeleteBoundObject , unBindObjFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
223+ cefSharpObj->SetValue (kRemoveObjectFromCache , removeObjectFromCacheFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
224+ cefSharpObj->SetValue (kIsObjectCached , isObjectCachedFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
225+ cefSharpObj->SetValue (kPostMessage , postMessageFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
226+ cefSharpObj->SetValue (kSendEvalScriptResponse , promiseHandlerFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
227+ cefSharpObj->SetValue (kRenderProcessId , CefV8Value::CreateInt (processId), CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
228+
229+ global->SetValue (_jsBindingPropertyName, cefSharpObj, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY );
230+ }
231+
232+ if (createCefSharpObjCamelCase)
233+ {
234+ auto cefSharpObjCamelCase = CefV8Value::CreateObject (nullptr , nullptr );
235+ cefSharpObjCamelCase->SetValue (kBindObjectAsyncCamelCase , bindObjAsyncFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
236+ cefSharpObjCamelCase->SetValue (kDeleteBoundObjectCamelCase , unBindObjFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
237+ cefSharpObjCamelCase->SetValue (kRemoveObjectFromCacheCamelCase , removeObjectFromCacheFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
238+ cefSharpObjCamelCase->SetValue (kIsObjectCachedCamelCase , isObjectCachedFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
239+ cefSharpObjCamelCase->SetValue (kPostMessageCamelCase , postMessageFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
240+ cefSharpObjCamelCase->SetValue (kSendEvalScriptResponseCamelCase , promiseHandlerFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
241+ cefSharpObjCamelCase->SetValue (kRenderProcessIdCamelCase , CefV8Value::CreateInt (processId), CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE );
242+
243+ global->SetValue (_jsBindingPropertyNameCamelCase, cefSharpObjCamelCase, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY );
244+ }
196245 }
197246 }
198247
0 commit comments