Skip to content

Commit 89b7d8e

Browse files
authored
Merge acda14f into 2bf01fa
2 parents 2bf01fa + acda14f commit 89b7d8e

13 files changed

Lines changed: 109 additions & 34 deletions

‎CefSharp.Core.Runtime/Internals/ClientAdapter.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1311,7 +1311,7 @@ namespace CefSharp
13111311
//Call GetObjects with the list of names provided (will default to all if the list is empty
13121312
//Previously we only sent a response if there were bound objects, now we always send
13131313
//a response so the promise is resolved.
1314-
auto objs = objectRepository->GetObjects(names);
1314+
auto objs = objectRepository->GetObjects(StringUtils::ToClr(frame->GetURL()), names);
13151315

13161316
auto msg = CefProcessMessage::Create(kJavascriptRootObjectResponse);
13171317
auto responseArgList = msg->GetArgumentList();

‎CefSharp.Core.Runtime/ManagedCefBrowserAdapter.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ namespace CefSharp
5151

5252
if (objectRepositorySettings->LegacyBindingEnabled)
5353
{
54-
auto legacyBoundObjects = objectRepository->GetLegacyBoundObjects();
54+
auto legacyBoundObjects = objectRepository->GetLegacyBoundObjects(address);
5555

5656
legacyBindingEnabled = objectRepository->HasBoundObjects;
5757

‎CefSharp.Core.Runtime/ManagedCefBrowserAdapter.h‎

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,18 +68,10 @@ namespace CefSharp
6868
}
6969

7070
_webBrowserInternal = webBrowserInternal;
71-
_javaScriptObjectRepository = gcnew CefSharp::Internals::JavascriptObjectRepository();
71+
_javaScriptObjectRepository = CefSharpSettings::ObjectFactory->CreateJavascriptObjectRepository(_webBrowserInternal);
7272
_javascriptCallbackFactory = gcnew CefSharp::Internals::JavascriptCallbackFactory(_clientAdapter->GetPendingTaskRepository());
7373

74-
if (CefSharpSettings::ConcurrentTaskExecution)
75-
{
76-
_methodRunnerQueue = gcnew CefSharp::Internals::ConcurrentMethodRunnerQueue(_javaScriptObjectRepository);
77-
}
78-
else
79-
{
80-
_methodRunnerQueue = gcnew CefSharp::Internals::MethodRunnerQueue(_javaScriptObjectRepository);
81-
}
82-
74+
_methodRunnerQueue = CefSharpSettings::ObjectFactory->CreateMethodRunnerQueue(_webBrowserInternal, _javaScriptObjectRepository);
8375
_methodRunnerQueue->MethodInvocationComplete += gcnew EventHandler<MethodInvocationCompleteArgs^>(this, &ManagedCefBrowserAdapter::MethodInvocationComplete);
8476
}
8577

‎CefSharp.Test/Framework/ConcurrentMethodRunnerQueueTest.cs‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,12 @@ public async Task ShouldCallMethodAsync()
122122
const string expected = "Echo Me!";
123123
const string methodName = "AsyncWaitTwoSeconds";
124124

125-
var mockObjectRepository = new Mock<IJavascriptObjectRepositoryInternal>();
126-
mockObjectRepository.Setup(x => x.TryCallMethodAsync(1, methodName, It.IsAny<object[]>())).ReturnsAsync(new TryCallMethodResult(true, expected, string.Empty));
127125
var methodInvocation = new MethodInvocation(1, "1", 1, methodName, 1);
128126
methodInvocation.Parameters.Add(expected);
129127

128+
var mockObjectRepository = new Mock<IJavascriptObjectRepositoryInternal>();
129+
mockObjectRepository.Setup(x => x.TryCallMethodAsync(methodInvocation)).ReturnsAsync(new TryCallMethodResult(true, expected, string.Empty));
130+
130131
using var methodRunnerQueue = new ConcurrentMethodRunnerQueue(mockObjectRepository.Object);
131132

132133
var evt = await AssertEx.RaisesAsync<MethodInvocationCompleteArgs>(

‎CefSharp.Test/JavascriptBinding/JavaScriptObjectRepositoryTests.cs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public void ShouldRegisterJavascriptObjectBindWhenNamespaceIsNull()
4141
#endif
4242
Assert.True(javascriptObjectRepository.IsBound(name));
4343

44-
var boundObjects = javascriptObjectRepository.GetObjects(new List<string> { name });
44+
var boundObjects = javascriptObjectRepository.GetObjects("example.com", new List<string> { name });
4545
Assert.Single(boundObjects);
4646

4747
var result = javascriptObjectRepository.TryCallMethod(boundObjects[0].Id, "getExampleString", new object[0]);
@@ -74,7 +74,7 @@ public void ShouldRegisterJavascriptObjectPropertyBindWhenNamespaceIsNull()
7474
javascriptObjectRepository.Register(name, new NoNamespaceClass(), false, bindingOptions);
7575
Assert.True(javascriptObjectRepository.IsBound(name));
7676

77-
var boundObjects = javascriptObjectRepository.GetObjects(new List<string> { name });
77+
var boundObjects = javascriptObjectRepository.GetObjects("example.com", new List<string> { name });
7878
Assert.Single(boundObjects);
7979

8080
object getResult, setResult = 100;

‎CefSharp.Test/JavascriptBinding/JavascriptBindingTests.cs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ public async Task ShouldFireResolveObject()
210210

211211
Assert.NotNull(evt);
212212
Assert.Equal("first", evt.Arguments.ObjectName);
213+
Assert.Equal("https://cefsharp.example/HelloWorld.html", evt.Arguments.Url);
213214
}
214215

215216
[Fact]

‎CefSharp/CefSharpSettings.cs‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
44

55
using System;
6+
using CefSharp.Internals;
67

78
namespace CefSharp
89
{
@@ -11,6 +12,8 @@ namespace CefSharp
1112
/// </summary>
1213
public static class CefSharpSettings
1314
{
15+
private static ICefSharpObjectFactory objectFactory = new CefSharpObjectFactory();
16+
1417
/// <summary>
1518
/// Set default values for CefSharpSettings
1619
/// </summary>
@@ -95,5 +98,21 @@ static CefSharpSettings()
9598
/// property.
9699
/// </remarks>
97100
public static CefRuntimeStyle? RuntimeStyle { get; set; }
101+
102+
/// <summary>
103+
/// Provide a custom instance of <see cref="ICefSharpObjectFactory"/> to
104+
/// customise/extend core CefSharp functionality.
105+
/// </summary>
106+
/// <remarks>
107+
/// A new instance of <see cref="ICefSharpObjectFactory"/>
108+
/// </remarks>
109+
public static ICefSharpObjectFactory ObjectFactory
110+
{
111+
get { return objectFactory; }
112+
set
113+
{
114+
objectFactory = value ?? throw new ArgumentNullException(nameof(value));
115+
}
116+
}
98117
}
99118
}

‎CefSharp/Event/JavascriptBindingEventArgs.cs‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,22 @@ public class JavascriptBindingEventArgs : EventArgs
2121
/// </summary>
2222
public string ObjectName { get; private set; }
2323

24+
/// <summary>
25+
/// URL of frame the <see cref="IJavascriptObjectRepository.ResolveObject"/> call originated from.
26+
/// </summary>
27+
public string Url { get; private set; }
28+
2429
/// <summary>
2530
/// Constructor
2631
/// </summary>
2732
/// <param name="objectRepository">object repository</param>
33+
/// <param name="url">URL of frame the <see cref="IJavascriptObjectRepository.ResolveObject"/> call originated from.</param>
2834
/// <param name="name">object name</param>
29-
public JavascriptBindingEventArgs(IJavascriptObjectRepository objectRepository, string name)
35+
public JavascriptBindingEventArgs(IJavascriptObjectRepository objectRepository, string url, string name)
3036
{
3137
ObjectRepository = objectRepository;
3238
ObjectName = name;
39+
Url = url;
3340
}
3441
}
3542
}

‎CefSharp/ICefSharpObjectFactory.cs‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright © 2025 The CefSharp Authors. All rights reserved.
2+
//
3+
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
4+
5+
using CefSharp.Internals;
6+
7+
namespace CefSharp
8+
{
9+
/// <summary>
10+
/// Implement this interface to core ChromiumWebBrowser components
11+
/// </summary>
12+
public interface ICefSharpObjectFactory
13+
{
14+
/// <summary>
15+
/// Creates a new instance of <see cref="IMethodRunnerQueue"/>
16+
/// </summary>
17+
/// <param name="webBrowser">The ChromiumWebBrowser instance.</param>
18+
/// <param name="javascriptObjectRepository">Javascript Object Repository</param>
19+
/// <returns>Returns a new instance of <see cref="IMethodRunnerQueue"/>. Cannot be null.</returns>
20+
IMethodRunnerQueue CreateMethodRunnerQueue(IWebBrowser webBrowser, IJavascriptObjectRepositoryInternal javascriptObjectRepository);
21+
22+
/// <summary>
23+
/// Creates a new instance of <see cref="IJavascriptObjectRepositoryInternal"/
24+
/// </summary>
25+
/// <param name="webBrowser">The ChromiumWebBrowser instance.</param>
26+
/// <returns>Returns a new instance of <see cref="IJavascriptObjectRepositoryInternal"/>. Cannot be null.</returns>
27+
IJavascriptObjectRepositoryInternal CreateJavascriptObjectRepository(IWebBrowser webBrowser);
28+
}
29+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Copyright © 2025 The CefSharp Authors. All rights reserved.
2+
//
3+
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
4+
5+
namespace CefSharp.Internals
6+
{
7+
public sealed class CefSharpObjectFactory : ICefSharpObjectFactory
8+
{
9+
public IJavascriptObjectRepositoryInternal CreateJavascriptObjectRepository(IWebBrowser webBrowser)
10+
{
11+
return new JavascriptObjectRepository();
12+
}
13+
14+
public IMethodRunnerQueue CreateMethodRunnerQueue(IWebBrowser webBrowser, IJavascriptObjectRepositoryInternal javascriptObjectRepository)
15+
{
16+
if (CefSharpSettings.ConcurrentTaskExecution)
17+
{
18+
return new ConcurrentMethodRunnerQueue(javascriptObjectRepository);
19+
}
20+
21+
return new MethodRunnerQueue(javascriptObjectRepository);
22+
}
23+
}
24+
}

0 commit comments

Comments
 (0)