未验证 提交 cd501cf7 编写于 作者: E Elie Bariche 提交者: GitHub

Merge pull request #12060 from unoplatform/dev/eb/csp

perf(Animations): RenderingLoopAnimator bindings
......@@ -5,14 +5,21 @@ using System.Reflection;
using System.Runtime.InteropServices;
// using Uno.Logging;
#if NET7_0_OR_GREATER
using System.Runtime.InteropServices.JavaScript;
#endif
namespace Uno.Foundation.Interop
{
[Obfuscation(Feature = "renaming", Exclude = true)]
public sealed class JSObject
public sealed partial class JSObject
{
/// <summary>
/// Used by javascript to dispatch a method call to the managed object at <paramref name="handlePtr"/>.
/// </summary>
#if NET7_0_OR_GREATER
[JSExport]
#endif
[Obfuscation(Feature = "renaming", Exclude = true)]
public static void Dispatch(IntPtr handlePtr, string method, string parameters)
{
......
......@@ -49,6 +49,10 @@ namespace Uno.Foundation.Interop
/// </summary>
public bool IsAlive { get; private set; }
internal long JSHandle => _jsHandle;
internal nint ManagedHandle => _managedHandle;
/// <summary>
/// Metadata about the marshaled object
/// </summary>
......
......@@ -11,6 +11,7 @@
<PropertyGroup>
<NoWarn>$(NoWarn);NU1701</NoWarn>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DefineConstants>$(DefineConstants);IS_UNO_FOUNDATION_RUNTIME_WEBASSEMBLY_PROJECT</DefineConstants>
<ProduceReferenceAssembly>false</ProduceReferenceAssembly>
......
......@@ -13,6 +13,18 @@ namespace __Windows.UI.Xaml.Media.Animation
[JSImport("globalThis.Windows.UI.Xaml.Media.Animation.RenderingLoopAnimator.destroyInstance")]
internal static partial void DestroyInstance(double jsHandle);
[JSImport("globalThis.Windows.UI.Xaml.Media.Animation.RenderingLoopAnimator.disableFrameReporting")]
internal static partial void DisableFrameReporting(double jsHandle);
[JSImport("globalThis.Windows.UI.Xaml.Media.Animation.RenderingLoopAnimator.enableFrameReporting")]
internal static partial void EnableFrameReporting(double jsHandle);
[JSImport("globalThis.Windows.UI.Xaml.Media.Animation.RenderingLoopAnimator.setAnimationFramesInterval")]
internal static partial void SetAnimationFramesInterval(double jsHandle);
[JSImport("globalThis.Windows.UI.Xaml.Media.Animation.RenderingLoopAnimator.setStartFrameDelay")]
internal static partial void SetStartFrameDelay(double jsHandle, double delayMs);
}
}
}
......
......@@ -25,7 +25,11 @@ namespace Windows.UI.Xaml.Media.Animation
{
if (Handle.IsAlive)
{
#if NET7_0_OR_GREATER
NativeMethods.EnableFrameReporting(Handle.JSHandle);
#else
WebAssemblyRuntime.InvokeJSWithInterop($"{this}.EnableFrameReporting();");
#endif
}
else if (this.Log().IsEnabled(LogLevel.Debug))
{
......@@ -37,7 +41,11 @@ namespace Windows.UI.Xaml.Media.Animation
{
if (Handle.IsAlive)
{
#if NET7_0_OR_GREATER
NativeMethods.DisableFrameReporting(Handle.JSHandle);
#else
WebAssemblyRuntime.InvokeJSWithInterop($"{this}.DisableFrameReporting();");
#endif
}
else if (this.Log().IsEnabled(LogLevel.Debug))
{
......@@ -49,7 +57,11 @@ namespace Windows.UI.Xaml.Media.Animation
{
if (Handle.IsAlive)
{
#if NET7_0_OR_GREATER
NativeMethods.SetStartFrameDelay(Handle.JSHandle, delayMs);
#else
WebAssemblyRuntime.InvokeJSWithInterop($"{this}.SetStartFrameDelay({delayMs});");
#endif
}
else if (this.Log().IsEnabled(LogLevel.Debug))
{
......@@ -61,7 +73,11 @@ namespace Windows.UI.Xaml.Media.Animation
{
if (Handle.IsAlive)
{
#if NET7_0_OR_GREATER
NativeMethods.SetAnimationFramesInterval(Handle.JSHandle);
#else
WebAssemblyRuntime.InvokeJSWithInterop($"{this}.SetAnimationFramesInterval();");
#endif
}
else if (this.Log().IsEnabled(LogLevel.Debug))
{
......
......@@ -9,7 +9,13 @@ namespace Uno.UI {
const unoExports = await (<any>Module).getAssemblyExports("Uno");
const unoUIExports = await (<any>Module).getAssemblyExports("Uno.UI");
(<any>globalThis).DotnetExports = { Uno: unoExports, UnoUI: unoUIExports };
const runtimeWasmExports = await (<any>Module).getAssemblyExports("Uno.Foundation.Runtime.WebAssembly");
(<any>globalThis).DotnetExports = {
Uno: unoExports,
UnoUI: unoUIExports,
UnoFoundationRuntimeWebAssembly: runtimeWasmExports
};
}
}
}
......
......@@ -4,7 +4,13 @@
private static dispatchMethod: (handle: number, method: string, parameters: string) => number;
private static init() {
ManagedObject.dispatchMethod = (<any>Module).mono_bind_static_method("[Uno.Foundation.Runtime.WebAssembly] Uno.Foundation.Interop.JSObject:Dispatch");
const exports = (<any>globalThis).DotnetExports?.UnoFoundationRuntimeWebAssembly?.Uno?.Foundation?.Interop?.JSObject;
if (exports !== undefined) {
ManagedObject.dispatchMethod = exports.Dispatch;
} else {
ManagedObject.dispatchMethod = (<any>Module).mono_bind_static_method("[Uno.Foundation.Runtime.WebAssembly] Uno.Foundation.Interop.JSObject:Dispatch");
}
}
public static dispatch(handle: number, method: string, parameters: string): void {
......
......@@ -23,6 +23,10 @@
private constructor(private managedHandle: number) {
}
public static setStartFrameDelay(jsHandle: number, delay: number) {
RenderingLoopAnimator.getInstance(jsHandle).SetStartFrameDelay(delay);
}
public SetStartFrameDelay(delay: number) {
this.unscheduleFrame();
......@@ -31,6 +35,10 @@
}
}
public static setAnimationFramesInterval(jsHandle: number) {
RenderingLoopAnimator.getInstance(jsHandle).SetAnimationFramesInterval();
}
public SetAnimationFramesInterval() {
this.unscheduleFrame();
......@@ -39,6 +47,10 @@
}
}
public static enableFrameReporting(jsHandle: number) {
RenderingLoopAnimator.getInstance(jsHandle).EnableFrameReporting();
}
public EnableFrameReporting() {
if (this._isEnabled) {
return;
......@@ -48,6 +60,10 @@
this.scheduleAnimationFrame();
}
public static disableFrameReporting(jsHandle: number) {
RenderingLoopAnimator.getInstance(jsHandle).DisableFrameReporting();
}
public DisableFrameReporting() {
this._isEnabled = false;
this.unscheduleFrame();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册