@@ -82,20 +82,7 @@ namespace CefSharp
8282 {
8383 auto javascriptObjects = DeserializeJsObjects (objects, 0 );
8484
85- for each (JavascriptObject ^ obj in Enumerable::OfType<JavascriptObject^>(javascriptObjects))
86- {
87- // Using LegacyBinding with multiple ChromiumWebBrowser instances that share the same
88- // render process and using LegacyBinding will cause problems for the limited caching implementation
89- // that exists at the moment, for now we'll remove an object if already exists, same behaviour
90- // as the new binding method.
91- // TODO: This should be removed when https://github.com/cefsharp/CefSharp/issues/2306
92- // Is complete as objects will be stored at the browser level
93- if (_javascriptObjects->ContainsKey (obj->JavascriptName ))
94- {
95- _javascriptObjects->Remove (obj->JavascriptName );
96- }
97- _javascriptObjects->Add (obj->JavascriptName , obj);
98- }
85+ _javascriptObjectCache->InsertOrUpdate (browser->GetIdentifier (), javascriptObjects);
9986 }
10087 }
10188
@@ -118,6 +105,8 @@ namespace CefSharp
118105 _onBrowserDestroyed->Invoke (wrapper);
119106 delete wrapper;
120107 }
108+
109+ _javascriptObjectCache->ClearCache (browser->GetIdentifier ());
121110 };
122111
123112 void CefAppUnmanagedWrapper::OnContextCreated (CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
@@ -135,9 +124,11 @@ namespace CefSharp
135124
136125 if (_legacyBindingEnabled)
137126 {
138- if (_javascriptObjects->Count > 0 && rootObject != nullptr )
127+ auto values = _javascriptObjectCache->GetCacheValues (browser->GetIdentifier ());
128+
129+ if (values->Count > 0 && rootObject != nullptr )
139130 {
140- rootObject->Bind (_javascriptObjects-> Values , context->GetGlobal ());
131+ rootObject->Bind (values , context->GetGlobal ());
141132 }
142133 }
143134
@@ -147,13 +138,14 @@ namespace CefSharp
147138 auto global = context->GetGlobal ();
148139 auto browserWrapper = FindBrowserWrapper (browser->GetIdentifier ());
149140 auto processId = System::Diagnostics::Process::GetCurrentProcess ()->Id ;
141+ auto objectCache = _javascriptObjectCache->GetCache (browser->GetIdentifier ());
150142
151143 // TODO: JSB: Split functions into their own classes
152144 // Browser wrapper is only used for BindObjectAsync
153- auto bindObjAsyncFunction = CefV8Value::CreateFunction (kBindObjectAsync , new BindObjectAsyncHandler (_registerBoundObjectRegistry, _javascriptObjects , browserWrapper));
154- auto unBindObjFunction = CefV8Value::CreateFunction (kDeleteBoundObject , new RegisterBoundObjectHandler (_javascriptObjects ));
155- auto removeObjectFromCacheFunction = CefV8Value::CreateFunction (kRemoveObjectFromCache , new RegisterBoundObjectHandler (_javascriptObjects ));
156- auto isObjectCachedFunction = CefV8Value::CreateFunction (kIsObjectCached , new RegisterBoundObjectHandler (_javascriptObjects ));
145+ auto bindObjAsyncFunction = CefV8Value::CreateFunction (kBindObjectAsync , new BindObjectAsyncHandler (_registerBoundObjectRegistry, objectCache , browserWrapper));
146+ auto unBindObjFunction = CefV8Value::CreateFunction (kDeleteBoundObject , new RegisterBoundObjectHandler (objectCache ));
147+ auto removeObjectFromCacheFunction = CefV8Value::CreateFunction (kRemoveObjectFromCache , new RegisterBoundObjectHandler (objectCache ));
148+ auto isObjectCachedFunction = CefV8Value::CreateFunction (kIsObjectCached , new RegisterBoundObjectHandler (objectCache ));
157149 auto postMessageFunction = CefV8Value::CreateFunction (kPostMessage , new JavascriptPostMessageHandler (rootObject == nullptr ? nullptr : rootObject->CallbackRegistry ));
158150 auto promiseHandlerFunction = CefV8Value::CreateFunction (kSendEvalScriptResponse , new JavascriptPromiseHandler ());
159151
@@ -627,15 +619,7 @@ namespace CefSharp
627619 auto javascriptObjects = DeserializeJsObjects (argList, 1 );
628620
629621 // Caching of JavascriptObjects
630- // TODO: JSB Should caching be configurable? On a per object basis?
631- for each (JavascriptObject ^ obj in Enumerable::OfType<JavascriptObject^>(javascriptObjects))
632- {
633- if (_javascriptObjects->ContainsKey (obj->JavascriptName ))
634- {
635- _javascriptObjects->Remove (obj->JavascriptName );
636- }
637- _javascriptObjects->Add (obj->JavascriptName , obj);
638- }
622+ _javascriptObjectCache->InsertOrUpdate (browser->GetIdentifier (), javascriptObjects);
639623
640624 auto rootObject = GetJsRootObjectWrapper (browser->GetIdentifier (), frame->GetIdentifier ());
641625
0 commit comments