@@ -77,20 +77,7 @@ namespace CefSharp
7777 {
7878 auto javascriptObjects = DeserializeJsObjects (objects, 0 );
7979
80- for each (JavascriptObject ^ obj in Enumerable::OfType<JavascriptObject^>(javascriptObjects))
81- {
82- // Using LegacyBinding with multiple ChromiumWebBrowser instances that share the same
83- // render process and using LegacyBinding will cause problems for the limited caching implementation
84- // that exists at the moment, for now we'll remove an object if already exists, same behaviour
85- // as the new binding method.
86- // TODO: This should be removed when https://github.com/cefsharp/CefSharp/issues/2306
87- // Is complete as objects will be stored at the browser level
88- if (_javascriptObjects->ContainsKey (obj->JavascriptName ))
89- {
90- _javascriptObjects->Remove (obj->JavascriptName );
91- }
92- _javascriptObjects->Add (obj->JavascriptName , obj);
93- }
80+ _javascriptObjectCache->InsertOrUpdate (browser->GetIdentifier (), javascriptObjects);
9481 }
9582 }
9683
@@ -113,6 +100,8 @@ namespace CefSharp
113100 _onBrowserDestroyed->Invoke (wrapper);
114101 delete wrapper;
115102 }
103+
104+ _javascriptObjectCache->ClearCache (browser->GetIdentifier ());
116105 };
117106
118107 void CefAppUnmanagedWrapper::OnContextCreated (CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
@@ -130,9 +119,11 @@ namespace CefSharp
130119
131120 if (_legacyBindingEnabled)
132121 {
133- if (_javascriptObjects->Count > 0 && rootObject != nullptr )
122+ auto values = _javascriptObjectCache->GetCacheValues (browser->GetIdentifier ());
123+
124+ if (values->Count > 0 && rootObject != nullptr )
134125 {
135- rootObject->Bind (_javascriptObjects-> Values , context->GetGlobal ());
126+ rootObject->Bind (values , context->GetGlobal ());
136127 }
137128 }
138129
@@ -142,13 +133,14 @@ namespace CefSharp
142133 auto global = context->GetGlobal ();
143134 auto browserWrapper = FindBrowserWrapper (browser->GetIdentifier ());
144135 auto processId = System::Diagnostics::Process::GetCurrentProcess ()->Id ;
136+ auto objectCache = _javascriptObjectCache->GetCache (browser->GetIdentifier ());
145137
146138 // TODO: JSB: Split functions into their own classes
147139 // Browser wrapper is only used for BindObjectAsync
148- auto bindObjAsyncFunction = CefV8Value::CreateFunction (kBindObjectAsync , new BindObjectAsyncHandler (_registerBoundObjectRegistry, _javascriptObjects , browserWrapper));
149- auto unBindObjFunction = CefV8Value::CreateFunction (kDeleteBoundObject , new RegisterBoundObjectHandler (_javascriptObjects ));
150- auto removeObjectFromCacheFunction = CefV8Value::CreateFunction (kRemoveObjectFromCache , new RegisterBoundObjectHandler (_javascriptObjects ));
151- auto isObjectCachedFunction = CefV8Value::CreateFunction (kIsObjectCached , new RegisterBoundObjectHandler (_javascriptObjects ));
140+ auto bindObjAsyncFunction = CefV8Value::CreateFunction (kBindObjectAsync , new BindObjectAsyncHandler (_registerBoundObjectRegistry, objectCache , browserWrapper));
141+ auto unBindObjFunction = CefV8Value::CreateFunction (kDeleteBoundObject , new RegisterBoundObjectHandler (objectCache ));
142+ auto removeObjectFromCacheFunction = CefV8Value::CreateFunction (kRemoveObjectFromCache , new RegisterBoundObjectHandler (objectCache ));
143+ auto isObjectCachedFunction = CefV8Value::CreateFunction (kIsObjectCached , new RegisterBoundObjectHandler (objectCache ));
152144 auto postMessageFunction = CefV8Value::CreateFunction (kPostMessage , new JavascriptPostMessageHandler (rootObject == nullptr ? nullptr : rootObject->CallbackRegistry ));
153145 auto promiseHandlerFunction = CefV8Value::CreateFunction (kSendEvalScriptResponse , new JavascriptPromiseHandler ());
154146
@@ -621,15 +613,7 @@ namespace CefSharp
621613 auto javascriptObjects = DeserializeJsObjects (argList, 1 );
622614
623615 // Caching of JavascriptObjects
624- // TODO: JSB Should caching be configurable? On a per object basis?
625- for each (JavascriptObject ^ obj in Enumerable::OfType<JavascriptObject^>(javascriptObjects))
626- {
627- if (_javascriptObjects->ContainsKey (obj->JavascriptName ))
628- {
629- _javascriptObjects->Remove (obj->JavascriptName );
630- }
631- _javascriptObjects->Add (obj->JavascriptName , obj);
632- }
616+ _javascriptObjectCache->InsertOrUpdate (browser->GetIdentifier (), javascriptObjects);
633617
634618 auto rootObject = GetJsRootObjectWrapper (browser->GetIdentifier (), frame->GetIdentifier ());
635619
0 commit comments