Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix JsonDynamic related object serialisation problem in Jint. #16298

Merged
merged 32 commits into from
Jun 30, 2024
Merged
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
354e3bf
Adds missing features back to JsonDynamicValue and other dynamic wrap…
gvkries Jun 11, 2024
caabce8
Merge branch 'main' into gvkries/dyn-16233
gvkries Jun 11, 2024
8a47148
Update src/OrchardCore/OrchardCore.Abstractions/Json/Dynamic/JsonDyna…
sebastienros Jun 11, 2024
1527ee3
Update src/OrchardCore/OrchardCore.Abstractions/Json/Dynamic/JsonDyna…
sebastienros Jun 11, 2024
fdb3cf0
Update src/OrchardCore/OrchardCore.Abstractions/Json/Dynamic/JsonDyna…
sebastienros Jun 11, 2024
0befa3e
Formatting
sebastienros Jun 11, 2024
de86c47
Added JsonConverters for the dynamic wrappers.
gvkries Jun 12, 2024
e7dce82
Merge branch 'gvkries/dyn-16233' of https://github.com/gvkries/Orchar…
gvkries Jun 12, 2024
826aac9
Update src/OrchardCore/OrchardCore.Abstractions/Json/Dynamic/JsonDyna…
gvkries Jun 12, 2024
70990bc
add WarpObjectHandler
hyzx86 Jun 12, 2024
96d18f5
Merge branch 'main' into hyzx86/dyn-jint
hyzx86 Jun 12, 2024
bddf276
fix unit test
hyzx86 Jun 12, 2024
c8789c9
Merge branch 'hyzx86/dyn-jint' of https://github.com/hyzx86/OrchardCo…
hyzx86 Jun 12, 2024
d042d79
clear
hyzx86 Jun 12, 2024
783f040
Merge branch 'main' into hyzx86/dyn-jint
hyzx86 Jun 15, 2024
c35994b
Merge branch 'main' into hyzx86/dyn-jint
hyzx86 Jun 16, 2024
bf0baf8
Merge branch 'main' into hyzx86/dyn-jint
hyzx86 Jun 18, 2024
3567000
Merge branch 'main' into hyzx86/dyn-jint
hyzx86 Jun 20, 2024
2605f15
Merge branch 'main' into hyzx86/dyn-jint
hyzx86 Jun 21, 2024
892a206
Merge branch 'main' into hyzx86/dyn-jint
hyzx86 Jun 21, 2024
af94e8a
resolve confilict
hyzx86 Jun 26, 2024
b5d49ef
remove extra files
hyzx86 Jun 26, 2024
eaa35fc
restore changes
hyzx86 Jun 26, 2024
0dce707
resove changes
hyzx86 Jun 26, 2024
aacc3e5
fix build
hyzx86 Jun 26, 2024
41f41d8
convet to JsonValue
hyzx86 Jun 26, 2024
dd3377c
Update test/OrchardCore.Tests/Data/JsonDynamicTests.cs
hyzx86 Jun 27, 2024
23796c9
Update test/OrchardCore.Tests/Data/JsonDynamicTests.cs
hyzx86 Jun 27, 2024
423c8bf
Update JsonDynamicTests.cs
hyzx86 Jun 27, 2024
a3d6cf3
Merge branch 'main' into hyzx86/dyn-jint
hyzx86 Jun 28, 2024
ee3a54d
Apply suggestions from code review
hyzx86 Jun 30, 2024
8e5da43
Merge branch 'main' into hyzx86/dyn-jint
hyzx86 Jun 30, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text.Json.Dynamic;
using System.Text.Json.Nodes;
using Jint;
using Jint.Native;
using Jint.Runtime.Interop;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.FileProviders;
Expand All @@ -23,7 +22,28 @@ public JavaScriptEngine(IMemoryCache memoryCache)

public IScriptingScope CreateScope(IEnumerable<GlobalMethod> methods, IServiceProvider serviceProvider, IFileProvider fileProvider, string basePath)
{
var engine = new Engine();
var engine = new Engine(options =>
{
options.SetWrapObjectHandler(static (e, target, type) =>
{
if (target is JsonDynamicObject dynamicObject)
{
return ObjectWrapper.Create(e, (JsonObject)dynamicObject, type);
}

if (target is JsonDynamicArray dynamicArray)
{
return ObjectWrapper.Create(e, (JsonArray)dynamicArray, type);
}

// if (target is JsonDynamicValue dynamicValue)
// {
// return ObjectWrapper.Create(e, dynamicValue, type);
// }

return ObjectWrapper.Create(e, target, type);
});
});

foreach (var method in methods)
{
Expand All @@ -45,7 +65,7 @@ static void ThrowInvalidScopeTypeException()
ThrowInvalidScopeTypeException();
}

var parsedAst = _memoryCache.GetOrCreate(script, static entry => Engine.PrepareScript((string) entry.Key));
var parsedAst = _memoryCache.GetOrCreate(script, static entry => Engine.PrepareScript((string)entry.Key));

var result = jsScope.Engine.Evaluate(parsedAst).ToObject();

Expand Down
57 changes: 47 additions & 10 deletions test/OrchardCore.Tests/Data/JsonDynamicTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
using System.Text.Json.Nodes;
using OrchardCore.ContentFields.Fields;
using OrchardCore.ContentManagement;
using OrchardCore.Scripting;
using OrchardCore.Tests.Apis.Context;

namespace OrchardCore.Tests.Data;

Expand Down Expand Up @@ -721,7 +723,7 @@ public void JsonDynamicValueIsComparableToInt32()
dynamic myDynamic = new JsonDynamicValue(JsonValue.Create(value));

Assert.True(value >= myDynamic);
Assert.True(value + 10 > myDynamic);
Assert.True(value + 10 > myDynamic);

Assert.False(value - 10 >= myDynamic);
Assert.False(value > myDynamic);
Expand Down Expand Up @@ -793,26 +795,61 @@ public void JsonDynamicValueIsComparableToString()
[Fact]
public void SerializingJsonDynamicValueMustWriteValueOnly()
{
// Arrange
var contentItem = new ContentItem();
contentItem.Alter<TestPart>(part =>
{
part.TextFieldProp = new TextField { Text = "test" };
part.NumericFieldProp = new NumericField { Value = 123 };
part.BooleanFieldProp = new BooleanField { Value = true };
});
// Arrange
var contentItem = GetContentTestData();

dynamic contentExpando = new ExpandoObject();
contentExpando.content = contentItem.Content;
var contentStr = JConvert.SerializeObject((ExpandoObject)contentExpando);

// Act
Assert.Equal("{\"content\":{\"TestPart\":{\"TextFieldProp\":{\"Text\":\"test\"},\"NumericFieldProp\":{\"Value\":123},\"BooleanFieldProp\":{\"Value\":true}}}}", contentStr);

// Arrange
dynamic expandoValue = new ExpandoObject();
expandoValue.stringValue = contentItem.Content.TestPart.TextFieldProp.Text;
expandoValue.numberValue = contentItem.Content.TestPart.NumericFieldProp.Value;
expandoValue.booleanValue = contentItem.Content.TestPart.BooleanFieldProp.Value;
var jsonStr = JConvert.SerializeObject((ExpandoObject)expandoValue);

// Assert
// Act
Assert.Equal("{\"stringValue\":\"test\",\"numberValue\":123,\"booleanValue\":true}", jsonStr);
}

[Fact]
public async Task SerializingJsonDynamicValueInScripting()
{
using var context = new SiteContext();
await context.InitializeAsync();
await context.UsingTenantScopeAsync(scope =>
{
var getTestContent = new GlobalMethod
{
Name = "getTestContent",
Method = sp => () => GetContentTestData()
};
var scriptingEngine = scope.ServiceProvider.GetRequiredService<IScriptingEngine>();
var scriptingScope = scriptingEngine.CreateScope([getTestContent], scope.ServiceProvider, null, null);
var contentStr = (string)scriptingEngine.Evaluate(scriptingScope, "return JSON.stringify(getTestContent().Content)");

Assert.Equal("{\"TestPart\":{\"TextFieldProp\":{\"Text\":\"test\"},\"NumericFieldProp\":{\"Value\":123},\"BooleanFieldProp\":{\"Value\":true}}}", contentStr);

return Task.CompletedTask;
});
}

private static ContentItem GetContentTestData()
{
var contentItem = new ContentItem();
contentItem.Alter<TestPart>(part =>
{
part.TextFieldProp = new TextField { Text = "test" };
part.NumericFieldProp = new NumericField { Value = 123 };
part.BooleanFieldProp = new BooleanField { Value = true };
});
return contentItem;
}

public sealed class TestPart : ContentPart
{
public TextField TextFieldProp { get; set; }
Expand Down
Loading