Skip to content

Commit 1b8082d

Browse files
committed
Extended to enable #28
1 parent c7ed869 commit 1b8082d

File tree

7 files changed

+40
-38
lines changed

7 files changed

+40
-38
lines changed

src/AngleSharp.Scripting.JavaScript.Tests/ComponentTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ static async Task<String> RunScriptComponent(String script)
1414
var cfg = Configuration.Default.With(service);
1515
var html = String.Concat("<!doctype html><script>", script, "</script>");
1616
var document = await BrowsingContext.New(cfg).OpenAsync(m => m.Content(html));
17-
var value = service.Engine.GetJint(document).GetValue("assert");
17+
var value = service.Engine.GetOrCreateJint(document).GetValue("assert");
1818
return value.AsString();
1919
}
2020

src/AngleSharp.Scripting.JavaScript.Tests/FireEventTests.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public async Task InvokeLoadEventFromJsAndCustomEventFromJsAndCs()
5353
</script>
5454
</body>";
5555
var document = await BrowsingContext.New(cfg).OpenAsync(m => m.Content(html));
56-
var log = service.Engine.GetJint(document).GetValue("log").AsArray();
56+
var log = service.Engine.GetOrCreateJint(document).GetValue("log").AsArray();
5757

5858
document.AddEventListener("hello", (s, ev) =>
5959
{
@@ -86,7 +86,7 @@ public async Task AddClickHandlerClassicallyWillExecute()
8686
</script>
8787
</body>";
8888
var document = await BrowsingContext.New(cfg).OpenAsync(m => m.Content(html));
89-
var clicked = service.Engine.GetJint(document).GetValue("clicked").AsBoolean();
89+
var clicked = service.Engine.GetOrCreateJint(document).GetValue("clicked").AsBoolean();
9090
Assert.IsTrue(clicked);
9191
}
9292

@@ -108,7 +108,7 @@ public async Task AddAndRemoveClickHandlerWontExecute()
108108
</script>
109109
</body>";
110110
var document = await BrowsingContext.New(cfg).OpenAsync(m => m.Content(html));
111-
var clicked = service.Engine.GetJint(document).GetValue("clicked").AsBoolean();
111+
var clicked = service.Engine.GetOrCreateJint(document).GetValue("clicked").AsBoolean();
112112
Assert.IsFalse(clicked);
113113
}
114114

@@ -129,7 +129,7 @@ public async Task AddAndInvokeClickHandlerWillChangeCapturedValue()
129129
</script>
130130
</body>";
131131
var document = await BrowsingContext.New(cfg).OpenAsync(m => m.Content(html));
132-
var clicked = service.Engine.GetJint(document).GetValue("clicked").AsBoolean();
132+
var clicked = service.Engine.GetOrCreateJint(document).GetValue("clicked").AsBoolean();
133133
Assert.IsTrue(clicked);
134134
}
135135
}

src/AngleSharp.Scripting.JavaScript.Tests/InteractionTests.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public async Task ReadStoredJavaScriptValueFromCSharp()
1616
var cfg = Configuration.Default.With(service);
1717
var html = "<!doctype html><script>var foo = 'test';</script>";
1818
var document = await BrowsingContext.New(cfg).OpenAsync(m => m.Content(html));
19-
var foo = service.Engine.GetJint(document).GetValue("foo");
19+
var foo = service.Engine.GetOrCreateJint(document).GetValue("foo");
2020
Assert.AreEqual(Types.String, foo.Type);
2121
Assert.AreEqual("test", foo.AsString());
2222
}
@@ -28,7 +28,7 @@ public async Task RunJavaScriptFunctionFromCSharp()
2828
var cfg = Configuration.Default.With(service);
2929
var html = "<!doctype html><script>function square(x) { return x * x; }</script>";
3030
var document = await BrowsingContext.New(cfg).OpenAsync(m => m.Content(html));
31-
var square = service.Engine.GetJint(document).GetValue("square");
31+
var square = service.Engine.GetOrCreateJint(document).GetValue("square");
3232
var result = square.Invoke(4);
3333
Assert.AreEqual(Types.Number, result.Type);
3434
Assert.AreEqual(16.0, result.AsNumber());
@@ -54,7 +54,7 @@ public async Task AccessCSharpInstanceMembersFromJavaScript()
5454
service.Engine.External["person"] = new Person { Age = 20, Name = "Foobar" };
5555
var html = "<!doctype html><script>var str = person.Name + ' is ' + person.Age + ' years old';</script>";
5656
var document = await BrowsingContext.New(cfg).OpenAsync(m => m.Content(html));
57-
var str = service.Engine.GetJint(document).GetValue("str");
57+
var str = service.Engine.GetOrCreateJint(document).GetValue("str");
5858
Assert.AreEqual(Types.String, str.Type);
5959
Assert.AreEqual("Foobar is 20 years old", str.AsString());
6060
}

src/AngleSharp.Scripting.JavaScript.nuspec

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
<copyright>Copyright 2016, AngleSharp</copyright>
1515
<tags>html html5 css css3 dom javascript scripting library js scripts runtime jint anglesharp angle</tags>
1616
<dependencies>
17-
<dependency id="AngleSharp" version="0.9.7" />
18-
<dependency id="Jint" version="2.8.0" />
17+
<dependency id="AngleSharp" version="0.9.8" />
18+
<dependency id="Jint" version="2.9.1" />
1919
</dependencies>
2020
</metadata>
2121
</package>

src/AngleSharp.Scripting.JavaScript/EngineInstance.cs

+6-6
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ sealed class EngineInstance
1212
{
1313
#region Fields
1414

15-
readonly Dictionary<Object, DomNodeInstance> _objects;
16-
readonly Engine _engine;
17-
readonly LexicalEnvironment _lexicals;
18-
readonly LexicalEnvironment _variables;
19-
readonly DomNodeInstance _window;
20-
readonly DomConstructors _constructors;
15+
private readonly Dictionary<Object, DomNodeInstance> _objects;
16+
private readonly Engine _engine;
17+
private readonly LexicalEnvironment _lexicals;
18+
private readonly LexicalEnvironment _variables;
19+
private readonly DomNodeInstance _window;
20+
private readonly DomConstructors _constructors;
2121

2222
#endregion
2323

src/AngleSharp.Scripting.JavaScript/JavaScriptEngine.cs

+23-21
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ public class JavaScriptEngine : IScriptEngine
1919
{
2020
#region Fields
2121

22-
readonly ConditionalWeakTable<IWindow, EngineInstance> _contexts;
23-
readonly Dictionary<String, Object> _external;
22+
private readonly ConditionalWeakTable<IWindow, EngineInstance> _contexts;
23+
private readonly Dictionary<String, Object> _external;
2424

2525
#endregion
2626

@@ -60,20 +60,13 @@ public String Type
6060
#region Methods
6161

6262
/// <summary>
63-
/// Gets the associated Jint engine, if any.
63+
/// Gets the associated Jint engine or creates it.
6464
/// </summary>
6565
/// <param name="document">The current document.</param>
66-
/// <returns>The engine object, if any.</returns>
67-
public Engine GetJint(IDocument document)
66+
/// <returns>The engine object.</returns>
67+
public Engine GetOrCreateJint(IDocument document)
6868
{
69-
var instance = default(EngineInstance);
70-
71-
if (_contexts.TryGetValue(document.DefaultView, out instance))
72-
{
73-
return instance.Jint;
74-
}
75-
76-
return null;
69+
return GetOrCreateInstance(document).Jint;
7770
}
7871

7972
/// <summary>
@@ -84,20 +77,29 @@ public Engine GetJint(IDocument document)
8477
/// <param name="cancel">The cancellation token to transport.</param>
8578
public async Task EvaluateScriptAsync(IResponse response, ScriptOptions options, CancellationToken cancel)
8679
{
87-
var instance = default(EngineInstance);
88-
var objectContext = options.Document.DefaultView;
89-
9080
using (var reader = new StreamReader(response.Content, options.Encoding ?? Encoding.UTF8, true))
9181
{
9282
var content = await reader.ReadToEndAsync().ConfigureAwait(false);
83+
GetOrCreateInstance(options.Document).RunScript(content);
84+
}
85+
}
9386

94-
if (!_contexts.TryGetValue(objectContext, out instance))
95-
{
96-
_contexts.Add(objectContext, instance = new EngineInstance(objectContext, _external));
97-
}
87+
#endregion
88+
89+
#region Helpers
9890

99-
instance.RunScript(content);
91+
private EngineInstance GetOrCreateInstance(IDocument document)
92+
{
93+
var instance = default(EngineInstance);
94+
var objectContext = document.DefaultView;
95+
96+
if (!_contexts.TryGetValue(objectContext, out instance))
97+
{
98+
instance = new EngineInstance(objectContext, _external);
99+
_contexts.Add(objectContext, instance);
100100
}
101+
102+
return instance;
101103
}
102104

103105
#endregion

src/AngleSharp.Scripting.JavaScript/Services/JavaScriptProvider.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
/// </summary>
1111
public class JavaScriptProvider : IScriptingProvider
1212
{
13-
readonly JavaScriptEngine _engine;
13+
private readonly JavaScriptEngine _engine;
1414

1515
/// <summary>
1616
/// Creates a new scripting service.

0 commit comments

Comments
 (0)