• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

luttje / Key2Joy / 6517266969

14 Oct 2023 11:05AM UTC coverage: 12.469% (+0.2%) from 12.308%
6517266969

push

github

web-flow
Implementing plugins for better separation (#39)

* Start implementing plugins for better separation
* massive refactor in attempt to split appdomains for plugins
* (breaks old mapping profiles)
* Fix error when switching from mouse button trigger to keyboard trigger and clicking in the combobox where the mouse button capture textbox is.
* Simplify code by removing legacy
* SImplify grouping actions
* Fix profile and add helpful opposite mapping generator tool
* Change solution hierarchy
* Restrict AppDomain plugins went from Zone.MyComputer -> .Internet
* create keypair in ci
* Install the .NET framework tools
* Run command in workflow
* Plugin permissions. Plugins disabled by default
* update readme (icon is no longer used)
* Plugin action runs in seperated process
* Remove unused dependencies.
* Fix action name display for mapping
* Fix Lua plugin script calls (NOTE: laggy when using MessageBox)
* convert project to sdk style
* Add editorconfig and start cleaning up
* Fix documentation. Update namespaces to match files (breaks profiles)
* Include all projects in tests, disable building docs on debug
* Add messagebox script action
* Add tests for pluginhost
* Remove administrator from window title test
* add some icons to ui
* Add enabling/disabling plugins
* Close plugins when Key2Joy shuts down
* Fix appcommand failing
* Fix plugin permission form crashing. Fix plugin load exception not showing warning
* Handle plugin host closing better when app has crashed
* Seperate host and client logic in remote event subscriber
* Ensure the PluginHost shuts down if the app crashes
* Better error output for plugins
* Fix cmd interop not working, add some tests
* also generate docs on plugins
* Fix build order with docs
* Fix enum script parameters and ensure actions share environment scopes
* Fix _wpftmp folders being created dotnet/wpf#2930
* Fix sequence action. Add disabled trigger/action for unloaded plugins on start... (continued)

180 of 1703 branches covered (0.0%)

Branch coverage included in aggregate %.

6419 of 6419 new or added lines in 207 files covered. (100.0%)

1035 of 8041 relevant lines covered (12.87%)

8445.05 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/Core/Key2Joy.Core/Mapping/Actions/Scripting/JavascriptScriptAction.cs
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
using System.Threading.Tasks;
5
using Jint;
6
using Jint.Native;
7
using Jint.Native.Object;
8
using Jint.Runtime.Descriptors;
9
using Jint.Runtime.Interop;
10
using Key2Joy.Contracts;
11
using Key2Joy.Contracts.Mapping;
12
using Key2Joy.Contracts.Mapping.Actions;
13
using Key2Joy.Contracts.Mapping.Triggers;
14
using Key2Joy.Plugins;
15
using Key2Joy.Util;
16

17
namespace Key2Joy.Mapping.Actions.Scripting;
18

19
[Action(
20
    Description = "Javascript Action",
21
    NameFormat = "Javascript Script: {0}",
22
    GroupName = "Scripting",
23
    GroupImage = "script_code"
24
)]
25
public class JavascriptAction : BaseScriptActionWithEnvironment<Engine>
26
{
27
    public JavascriptAction(string name)
28
        : base(name) => this.ImageResource = "JS";
×
29

30
    public override async Task Execute(AbstractInputBag inputBag)
31
    {
×
32
        try
33
        {
×
34
            lock (LockObject)
×
35
            {
×
36
                this.Environment.Execute(this.GetExecutableScript());
×
37
            }
×
38
        }
×
39
        catch (Jint.Runtime.JavaScriptException ex)
×
40
        {
×
41
            Output.WriteLine(ex);
×
42
        }
×
43

44
        await base.Execute(inputBag);
×
45
    }
×
46

47
    public override void RegisterScriptingEnum(ExposedEnumeration enumeration)
48
    {
×
49
        StringBuilder enumInjectScript = new();
×
50
        enumInjectScript.Append(enumeration.Name + " = {");
×
51

52
        foreach (var kvp in enumeration.KeyValues)
×
53
        {
×
54
            var enumKey = kvp.Key;
×
55
            var enumValue = kvp.Value;
×
56

57
            enumInjectScript.Append(enumKey);
×
58
            enumInjectScript.Append(": ");
×
59
            enumInjectScript.Append(enumValue);
×
60

61
            enumInjectScript.Append(",\n");
×
62
        }
×
63

64
        enumInjectScript.Append("};");
×
65

66
        var enumInjection = enumInjectScript.ToString();
×
67
        this.Environment.Execute(enumInjection);
×
68

69
        //this.environment.Execute($"Print(JSON.stringify({enumInjection}))");
70
    }
×
71

72
    public override void RegisterScriptingMethod(ExposedMethod exposedMethod, AbstractAction instance)
73
    {
×
74
        exposedMethod.Prepare(instance);
×
75

76
        var functionName = exposedMethod.FunctionName;
×
77
        var parents = functionName.Split('.');
×
78
        var methodInfo = exposedMethod.GetExecutorMethodInfo();
×
79
        var @delegate = new DelegateWrapper(this.Environment, methodInfo.CreateDelegate(exposedMethod));
×
80

81
        if (parents.Length > 1)
×
82
        {
×
83
            var currentObject = this.Environment.Realm.GlobalObject;
×
84

85
            for (var i = 0; i < parents.Length; i++)
×
86
            {
×
87
                if (i != parents.Length - 1)
×
88
                {
×
89
                    if (!currentObject.TryGetValue(parents[i], out var child))
×
90
                    {
×
91
                        child = new JsObject(this.Environment);
×
92
                    }
×
93

94
                    if (child is not ObjectInstance childObject)
×
95
                    {
×
96
                        throw new NotImplementedException($"Tried using a non object({parents[i]}) as object parent while registering function: {functionName}!");
×
97
                    }
98

99
                    currentObject.FastSetProperty(parents[i], new PropertyDescriptor(childObject, false, true, true));
×
100
                    currentObject = childObject;
×
101
                }
×
102
                else
103
                {
×
104
                    currentObject.FastSetProperty(parents[i], new PropertyDescriptor(@delegate, false, true, true));
×
105
                }
×
106
            }
×
107

108
            return;
×
109
        }
110

111
        this.Environment.SetValue(
×
112
            functionName,
×
113
            methodInfo);
×
114
    }
×
115

116
    public override Engine MakeEnvironment() => new Engine(options =>
×
117
    {
×
118
        options.Interop.AllowSystemReflection = true;
×
119
    });
×
120

121
    public override void RegisterEnvironmentObjects()
122
    {
×
123
        this.Environment.SetValue("Print", new Action<object[]>(this.Print));
×
124

125
        base.RegisterEnvironmentObjects();
×
126
    }
×
127

128
    public override void OnStartListening(AbstractTriggerListener listener, ref IList<AbstractAction> otherActions) => base.OnStartListening(listener, ref otherActions);
×
129

130
    public override void OnStopListening(AbstractTriggerListener listener)
131
    {
×
132
        base.OnStopListening(listener);
×
133

134
        this.Environment = null;
×
135
    }
×
136

137
    public override bool Equals(object obj)
138
    {
×
139
        if (obj is not JavascriptAction action)
×
140
        {
×
141
            return false;
×
142
        }
143

144
        return action.Name == this.Name
×
145
            && action.Script == this.Script;
×
146
    }
×
147
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc