Skip to content

Commit a97b6d3

Browse files
committed
1. Added a possibility to debug in Visual Studio by adding the debugger statement to script code;
2. In JavaScript engine settings was added one new property - `EnableDebugging` (default `false`).
1 parent c3642d1 commit a97b6d3

File tree

6 files changed

+174
-54
lines changed

6 files changed

+174
-54
lines changed

src/MsieJavaScriptEngine/JsEngineSettings.cs

+11
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,16 @@
55
/// </summary>
66
public sealed class JsEngineSettings
77
{
8+
/// <summary>
9+
/// Gets or sets a flag for whether to enable script debugging features
10+
/// (only works in the <code>ChakraIeJsRt</code> and <code>ChakraEdgeJsRt</code> modes)
11+
/// </summary>
12+
public bool EnableDebugging
13+
{
14+
get;
15+
set;
16+
}
17+
818
/// <summary>
919
/// Gets or sets a JavaScript engine mode
1020
/// </summary>
@@ -38,6 +48,7 @@ public bool UseJson2Library
3848
/// </summary>
3949
public JsEngineSettings()
4050
{
51+
EnableDebugging = false;
4152
EngineMode = JsEngineMode.Auto;
4253
UseEcmaScript5Polyfill = false;
4354
UseJson2Library = false;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
namespace MsieJavaScriptEngine.JsRt
2+
{
3+
using Helpers;
4+
5+
/// <summary>
6+
/// Base class of the Chakra JsRT JavaScript engine
7+
/// </summary>
8+
internal abstract class ChakraJsRtJsEngineBase : IInnerJsEngine
9+
{
10+
/// <summary>
11+
/// JavaScript engine mode
12+
/// </summary>
13+
protected readonly JsEngineMode _engineMode;
14+
15+
/// <summary>
16+
/// Name of JavaScript engine mode
17+
/// </summary>
18+
protected readonly string _engineModeName;
19+
20+
/// <summary>
21+
/// Flag for whether to enable script debugging features
22+
/// </summary>
23+
protected readonly bool _enableDebugging;
24+
25+
/// <summary>
26+
/// Flag indicating whether debugging started
27+
/// </summary>
28+
private bool _debuggingStarted;
29+
30+
31+
/// <summary>
32+
/// Constructs instance of the Chakra JsRT JavaScript engine
33+
/// </summary>
34+
/// <param name="engineMode">JavaScript engine mode</param>
35+
/// <param name="enableDebugging">Flag for whether to enable script debugging features</param>
36+
protected ChakraJsRtJsEngineBase(JsEngineMode engineMode, bool enableDebugging)
37+
{
38+
_engineMode = engineMode;
39+
_engineModeName = JsEngineModeHelpers.GetModeName(engineMode);
40+
_enableDebugging = enableDebugging;
41+
}
42+
43+
44+
/// <summary>
45+
/// Starts debugging
46+
/// </summary>
47+
protected void StartDebugging()
48+
{
49+
if (!_debuggingStarted)
50+
{
51+
InnerStartDebugging();
52+
_debuggingStarted = true;
53+
}
54+
}
55+
56+
protected abstract void InnerStartDebugging();
57+
58+
#region IInnerJsEngine implementation
59+
60+
public abstract string Mode { get; }
61+
62+
63+
public abstract object Evaluate(string expression);
64+
65+
public abstract void Execute(string code);
66+
67+
public abstract object CallFunction(string functionName, params object[] args);
68+
69+
public abstract bool HasVariable(string variableName);
70+
71+
public abstract object GetVariableValue(string variableName);
72+
73+
public abstract void SetVariableValue(string variableName, object value);
74+
75+
public abstract void RemoveVariable(string variableName);
76+
77+
public abstract void EmbedHostObject(string itemName, object value);
78+
79+
#endregion
80+
81+
#region IDisposable implementation
82+
83+
public abstract void Dispose();
84+
85+
#endregion
86+
}
87+
}

src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs

+29-26
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,14 @@
55
using System.Linq;
66

77
using Constants;
8-
using Helpers;
98
using Resources;
109
using Utilities;
1110

1211
/// <summary>
1312
/// “Edge” JsRT version of Chakra JavaScript engine
1413
/// </summary>
15-
internal sealed class ChakraEdgeJsRtJsEngine : IInnerJsEngine
14+
internal sealed class ChakraEdgeJsRtJsEngine : ChakraJsRtJsEngineBase
1615
{
17-
/// <summary>
18-
/// JavaScript engine mode
19-
/// </summary>
20-
private readonly JsEngineMode _engineMode;
21-
22-
/// <summary>
23-
/// Name of JavaScript engine mode
24-
/// </summary>
25-
private readonly string _engineModeName;
26-
2716
/// <summary>
2817
/// Instance of JavaScript runtime
2918
/// </summary>
@@ -58,11 +47,10 @@ internal sealed class ChakraEdgeJsRtJsEngine : IInnerJsEngine
5847
/// <summary>
5948
/// Constructs instance of the Chakra “Edge” JsRT JavaScript engine
6049
/// </summary>
61-
public ChakraEdgeJsRtJsEngine()
50+
/// <param name="enableDebugging">Flag for whether to enable script debugging features</param>
51+
public ChakraEdgeJsRtJsEngine(bool enableDebugging)
52+
: base(JsEngineMode.ChakraEdgeJsRt, enableDebugging)
6253
{
63-
_engineMode = JsEngineMode.ChakraEdgeJsRt;
64-
_engineModeName = JsEngineModeHelpers.GetModeName(_engineMode);
65-
6654
try
6755
{
6856
_jsRuntime = CreateJsRuntime();
@@ -335,11 +323,21 @@ private JsRuntimeException ConvertJsExceptionToJsRuntimeException(
335323
return jsEngineException;
336324
}
337325

326+
protected override void InnerStartDebugging()
327+
{
328+
EdgeJsContext.StartDebugging();
329+
}
330+
338331
private void InvokeScript(Action action)
339332
{
340333
lock (_runSynchronizer)
341334
using (new EdgeJsScope(_jsContext))
342335
{
336+
if (_enableDebugging)
337+
{
338+
StartDebugging();
339+
}
340+
343341
try
344342
{
345343
action();
@@ -356,6 +354,11 @@ private T InvokeScript<T>(Func<T> func)
356354
lock (_runSynchronizer)
357355
using (new EdgeJsScope(_jsContext))
358356
{
357+
if (_enableDebugging)
358+
{
359+
StartDebugging();
360+
}
361+
359362
try
360363
{
361364
return func();
@@ -387,12 +390,12 @@ private void Dispose(bool disposing)
387390

388391
#region IInnerJsEngine implementation
389392

390-
public string Mode
393+
public override string Mode
391394
{
392395
get { return _engineModeName; }
393396
}
394397

395-
public object Evaluate(string expression)
398+
public override object Evaluate(string expression)
396399
{
397400
object result = InvokeScript(() =>
398401
{
@@ -404,12 +407,12 @@ public object Evaluate(string expression)
404407
return result;
405408
}
406409

407-
public void Execute(string code)
410+
public override void Execute(string code)
408411
{
409412
InvokeScript(() => EdgeJsContext.RunScript(code));
410413
}
411414

412-
public object CallFunction(string functionName, params object[] args)
415+
public override object CallFunction(string functionName, params object[] args)
413416
{
414417
object result = InvokeScript(() =>
415418
{
@@ -435,7 +438,7 @@ public object CallFunction(string functionName, params object[] args)
435438
return result;
436439
}
437440

438-
public bool HasVariable(string variableName)
441+
public override bool HasVariable(string variableName)
439442
{
440443
bool result = InvokeScript(() =>
441444
{
@@ -455,7 +458,7 @@ public bool HasVariable(string variableName)
455458
return result;
456459
}
457460

458-
public object GetVariableValue(string variableName)
461+
public override object GetVariableValue(string variableName)
459462
{
460463
object result = InvokeScript(() =>
461464
{
@@ -468,7 +471,7 @@ public object GetVariableValue(string variableName)
468471
return result;
469472
}
470473

471-
public void SetVariableValue(string variableName, object value)
474+
public override void SetVariableValue(string variableName, object value)
472475
{
473476
InvokeScript(() =>
474477
{
@@ -479,7 +482,7 @@ public void SetVariableValue(string variableName, object value)
479482
});
480483
}
481484

482-
public void RemoveVariable(string variableName)
485+
public override void RemoveVariable(string variableName)
483486
{
484487
InvokeScript(() =>
485488
{
@@ -493,7 +496,7 @@ public void RemoveVariable(string variableName)
493496
});
494497
}
495498

496-
public void EmbedHostObject(string itemName, object value)
499+
public override void EmbedHostObject(string itemName, object value)
497500
{
498501
InvokeScript(() =>
499502
{
@@ -511,7 +514,7 @@ public void EmbedHostObject(string itemName, object value)
511514
/// <summary>
512515
/// Destroys object
513516
/// </summary>
514-
public void Dispose()
517+
public override void Dispose()
515518
{
516519
Dispose(true /* disposing */);
517520
GC.SuppressFinalize(this);

0 commit comments

Comments
 (0)