Skip to content

Commit 37f1a59

Browse files
committed
Improved extensibility
1 parent ee0396b commit 37f1a59

4 files changed

Lines changed: 132 additions & 91 deletions

File tree

src/AngleSharp.Js.Tests/EcoTests.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,16 @@ public async Task GetCssSheetRuleFromJavaScript()
1616
var document = await context.OpenAsync(r => r.Content($"<style>{style}</style><div></div><script>{script}</script>"));
1717
Assert.AreEqual("rgba(255, 0, 0, 1)", document.QuerySelector("div").TextContent);
1818
}
19+
20+
[Test]
21+
public async Task GetCssInlineStyleFromJavaScript()
22+
{
23+
var config = Configuration.Default.WithCss().WithJs();
24+
var context = BrowsingContext.New(config);
25+
var style = "color: blue;";
26+
var script = "var color = document.querySelector('div').style.color; document.querySelector('div').textContent = color;";
27+
var document = await context.OpenAsync(r => r.Content($"<div style='{style}'></div><script>{script}</script>"));
28+
Assert.AreEqual("rgba(0, 0, 255, 1)", document.QuerySelector("div").TextContent);
29+
}
1930
}
2031
}

src/AngleSharp.Js.Tests/PseudoPropertiesTests.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace AngleSharp.Js.Tests
1+
namespace AngleSharp.Js.Tests
22
{
33
using NUnit.Framework;
44
using System.Threading.Tasks;
@@ -7,12 +7,26 @@
77
public class PseudoPropertiesTests
88
{
99
[Test]
10-
public async Task GetScrollLeftOfElement()
10+
public async Task GetScrollLeftOfDiv()
1111
{
1212
var result = await "document.createElement('div').scrollLeft".EvalScriptAsync();
1313
Assert.AreEqual("0", result);
1414
}
1515

16+
[Test]
17+
public async Task GetScrollTopOfParagraph()
18+
{
19+
var result = await "document.createElement('p').scrollTop".EvalScriptAsync();
20+
Assert.AreEqual("0", result);
21+
}
22+
23+
[Test]
24+
public async Task GetClientWidthOfButton()
25+
{
26+
var result = await "document.createElement('button').clientWidth".EvalScriptAsync();
27+
Assert.AreEqual("0", result);
28+
}
29+
1630
[Test]
1731
public async Task GetScrollLeftOfDocument()
1832
{
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
namespace AngleSharp.Js
2+
{
3+
using AngleSharp.Attributes;
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Linq;
7+
using System.Reflection;
8+
9+
static class Extensibility
10+
{
11+
public static IDictionary<String, ExtensionEntry> GetExtensions(this IEnumerable<MethodInfo> methods)
12+
{
13+
var entries = new Dictionary<String, ExtensionEntry>();
14+
15+
foreach (var method in methods)
16+
{
17+
var names = method.GetCustomAttributes<DomNameAttribute>()
18+
.Select(m => m.OfficialName);
19+
var accessors = method.GetCustomAttributes<DomAccessorAttribute>()
20+
.Select(m => m.Type);
21+
var isEvent = method.GetCustomAttribute<DomEventAttribute>() != null;
22+
var forward = method.GetCustomAttribute<DomPutForwardsAttribute>();
23+
24+
foreach (var name in names)
25+
{
26+
if (!entries.TryGetValue(name, out var entry))
27+
{
28+
entry = new ExtensionEntry
29+
{
30+
Forward = forward,
31+
};
32+
entries.Add(name, entry);
33+
}
34+
35+
if (accessors.Any())
36+
{
37+
var accessor = accessors.FirstOrDefault();
38+
39+
if (isEvent)
40+
{
41+
switch (accessor)
42+
{
43+
case Accessors.Deleter:
44+
entry.Remover = method;
45+
break;
46+
case Accessors.Setter:
47+
entry.Adder = method;
48+
break;
49+
}
50+
}
51+
else
52+
{
53+
switch (accessor)
54+
{
55+
case Accessors.Setter:
56+
entry.Setter = method;
57+
break;
58+
case Accessors.Getter:
59+
entry.Getter = method;
60+
break;
61+
}
62+
}
63+
}
64+
else
65+
{
66+
entry.Other = method;
67+
}
68+
}
69+
}
70+
71+
return entries;
72+
}
73+
74+
public class ExtensionEntry
75+
{
76+
public MethodInfo Getter;
77+
public MethodInfo Setter;
78+
public MethodInfo Adder;
79+
public MethodInfo Remover;
80+
public MethodInfo Other;
81+
public DomPutForwardsAttribute Forward;
82+
}
83+
}
84+
}

src/AngleSharp.Js/Proxies/DomPrototypeInstance.cs

Lines changed: 21 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -118,73 +118,9 @@ private void SetNormalEvents(IEnumerable<EventInfo> eventInfos)
118118
}
119119
}
120120

121-
private void SetEvent(String name, MethodInfo adder, MethodInfo remover)
122-
{
123-
var eventInstance = new DomEventInstance(_instance, adder, remover);
124-
FastSetProperty(name, new PropertyDescriptor(eventInstance.Getter, eventInstance.Setter, false, false));
125-
}
126-
127121
private void SetExtensionMethods(IEnumerable<MethodInfo> methods)
128122
{
129-
var entries = new Dictionary<String, ExtensionEntry>();
130-
131-
foreach (var method in methods)
132-
{
133-
var names = method.GetCustomAttributes<DomNameAttribute>()
134-
.Select(m => m.OfficialName);
135-
var accessors = method.GetCustomAttributes<DomAccessorAttribute>()
136-
.Select(m => m.Type);
137-
var isEvent = method.GetCustomAttribute<DomEventAttribute>() != null;
138-
var forward = method.GetCustomAttribute<DomPutForwardsAttribute>();
139-
140-
foreach (var name in names)
141-
{
142-
if (!entries.TryGetValue(name, out var entry))
143-
{
144-
entry = new ExtensionEntry
145-
{
146-
Forward = forward,
147-
};
148-
entries.Add(name, entry);
149-
}
150-
151-
if (accessors.Any())
152-
{
153-
var accessor = accessors.FirstOrDefault();
154-
155-
if (isEvent)
156-
{
157-
switch (accessor)
158-
{
159-
case Accessors.Deleter:
160-
entry.Remover = method;
161-
break;
162-
case Accessors.Setter:
163-
entry.Adder = method;
164-
break;
165-
}
166-
}
167-
else
168-
{
169-
switch (accessor)
170-
{
171-
case Accessors.Setter:
172-
entry.Setter = method;
173-
break;
174-
case Accessors.Getter:
175-
entry.Getter = method;
176-
break;
177-
}
178-
}
179-
}
180-
else
181-
{
182-
entry.Other = method;
183-
}
184-
}
185-
}
186-
187-
foreach (var entry in entries)
123+
foreach (var entry in methods.GetExtensions())
188124
{
189125
var name = entry.Key;
190126
var value = entry.Value;
@@ -207,16 +143,6 @@ private void SetExtensionMethods(IEnumerable<MethodInfo> methods)
207143
}
208144
}
209145

210-
class ExtensionEntry
211-
{
212-
public MethodInfo Getter;
213-
public MethodInfo Setter;
214-
public MethodInfo Adder;
215-
public MethodInfo Remover;
216-
public MethodInfo Other;
217-
public DomPutForwardsAttribute Forward;
218-
}
219-
220146
private void SetNormalProperties(IEnumerable<PropertyInfo> properties)
221147
{
222148
foreach (var property in properties)
@@ -240,6 +166,26 @@ private void SetNormalProperties(IEnumerable<PropertyInfo> properties)
240166
}
241167
}
242168

169+
private void SetNormalMethods(IEnumerable<MethodInfo> methods)
170+
{
171+
foreach (var method in methods)
172+
{
173+
var names = method.GetCustomAttributes<DomNameAttribute>()
174+
.Select(m => m.OfficialName);
175+
176+
foreach (var name in names)
177+
{
178+
SetMethod(name, method);
179+
}
180+
}
181+
}
182+
183+
private void SetEvent(String name, MethodInfo adder, MethodInfo remover)
184+
{
185+
var eventInstance = new DomEventInstance(_instance, adder, remover);
186+
FastSetProperty(name, new PropertyDescriptor(eventInstance.Getter, eventInstance.Setter, false, false));
187+
}
188+
243189
private void SetProperty(String name, MethodInfo getter, MethodInfo setter, DomPutForwardsAttribute putsForward)
244190
{
245191
FastSetProperty(name, new PropertyDescriptor(
@@ -280,20 +226,6 @@ private void SetIndexer(PropertyInfo property, ParameterInfo[] indexParameters)
280226
}
281227
}
282228

283-
private void SetNormalMethods(IEnumerable<MethodInfo> methods)
284-
{
285-
foreach (var method in methods)
286-
{
287-
var names = method.GetCustomAttributes<DomNameAttribute>()
288-
.Select(m => m.OfficialName);
289-
290-
foreach (var name in names)
291-
{
292-
SetMethod(name, method);
293-
}
294-
}
295-
}
296-
297229
private void SetMethod(String name, MethodInfo method)
298230
{
299231
//TODO Jint

0 commit comments

Comments
 (0)