Skip to content

Commit 12fe189

Browse files
committed
Merge branch 'dmjio-miso.js'
2 parents eb077e4 + 7eefe9f commit 12fe189

File tree

8 files changed

+817
-1
lines changed

8 files changed

+817
-1
lines changed

frameworks/keyed/misojs/.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
dist
2+
result
3+
4+
miso-latest.json
5+
nixpkgs-latest.json

frameworks/keyed/misojs/README.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# miso.js-1.3.0.0-keyed
2+
3+
[Miso](https://haskell-miso.org) is a tasty [Haskell](https://www.haskell.org/) front-end framework.
4+
5+
## Installation
6+
7+
`npm run build-prod`
8+
9+
Now you can start benchmarks by running
10+
```
11+
cd webdriver-ts
12+
yarn selenium --count 3 --framework miso.js-1.3.0.0-keyed
13+
```
14+
(^ see [Running a single framework with the automated benchmark driver](../README#4-running-a-single-framework-with-the-automated-benchmark-driver))
15+
16+
An interactive table of results can be generated by
17+
```
18+
cd webdriver-ts
19+
yarn interactive-results
20+
```
21+
(^ see [Optional 7. Building the interactive results table](../README#optional-7-building-the-interactive-results-table))

frameworks/keyed/misojs/delegate.js

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
window = typeof window === 'undefined' ? {} : window;
2+
window['oldCallbacks'] = [];
3+
window['currentCallbacks'] = [];
4+
5+
/* Callbacks in ghcjs need to be released. With this function one can register
6+
callbacks that should be released right before diffing.
7+
*/
8+
window['registerCallback'] = function registerCallback(cb) {
9+
window['currentCallbacks'].push(cb);
10+
};
11+
12+
/* Swaps out the new calbacks for old callbacks.
13+
The old callbacks should be cleared once the new callbacks have replaced them.
14+
*/
15+
window['swapCallbacks'] = function swapCallbacks() {
16+
window['oldCallbacks'] = window['currentCallbacks'];
17+
window['currentCallbacks'] = [];
18+
};
19+
20+
/* This releases the old callbacks. */
21+
window['releaseCallbacks'] = function releaseCallbacks() {
22+
for (var i in window['oldCallbacks'])
23+
h$release(window['oldCallbacks'][i]);
24+
25+
window['oldCallbacks'] = [];
26+
};
27+
28+
/* event delegation algorithm */
29+
window['delegate'] = function delegate(mountPointElement, events, getVTree) {
30+
for (var event in events) {
31+
mountPointElement.addEventListener(events[event][0], function(e) {
32+
getVTree(function (obj) {
33+
window['delegateEvent'](e, obj, window['buildTargetToElement'](mountPointElement, e.target), []);
34+
});
35+
}, events[event][1]);
36+
}
37+
};
38+
39+
/* Accumulate parent stack as well for propagation */
40+
window['delegateEvent'] = function delegateEvent (event, obj, stack, parentStack) {
41+
42+
/* base case, not found */
43+
if (!stack.length) return;
44+
45+
/* stack not length 1, recurse */
46+
else if (stack.length > 1) {
47+
if (obj['domRef'] === stack[0]) parentStack.unshift(obj);
48+
for (var o = 0; o < obj.children.length; o++) {
49+
if (obj.children[o]['type'] === 'vtext') continue;
50+
delegateEvent ( event
51+
, obj.children[o]
52+
, stack.slice(1)
53+
, parentStack
54+
);
55+
}
56+
}
57+
58+
/* stack.length == 1 */
59+
else {
60+
if (obj['domRef'] === stack[0]) {
61+
var eventObj = obj['events'][event.type];
62+
if (eventObj) {
63+
var options = eventObj.options;
64+
if (options['preventDefault'])
65+
event.preventDefault();
66+
eventObj['runEvent'](event);
67+
if (!options['stopPropagation'])
68+
window['propogateWhileAble'] (parentStack, event);
69+
} else {
70+
/* still propagate to parent handlers even if event not defined */
71+
window['propogateWhileAble'] (parentStack, event);
72+
}
73+
}
74+
}
75+
};
76+
77+
window['buildTargetToElement'] = function buildTargetToElement (element, target) {
78+
var stack = [];
79+
while (element !== target) {
80+
stack.unshift (target);
81+
target = target.parentNode;
82+
}
83+
return stack;
84+
};
85+
86+
window['propogateWhileAble'] = function propogateWhileAble (parentStack, event) {
87+
for (var i = 0; i < parentStack.length; i++) {
88+
if (parentStack[i]['events'][event.type]) {
89+
var eventObj = parentStack[i]['events'][event.type],
90+
options = eventObj['options'];
91+
if (options['preventDefault']) event.preventDefault();
92+
eventObj['runEvent'](event);
93+
if (options['stopPropagation']) break;
94+
}
95+
}
96+
};
97+
98+
/* Walks down obj following the path described by `at`, then filters primitive
99+
values (string, numbers and booleans)*/
100+
window['objectToJSON'] = function objectToJSON (at, obj) {
101+
/* If at is of type [[MisoString]] */
102+
if (typeof at[0] == 'object') {
103+
var ret = [];
104+
for (var i = 0; i < at.length; i++)
105+
ret.push(window['objectToJSON'](at[i], obj));
106+
return ret;
107+
}
108+
109+
for (var i in at) obj = obj[at[i]];
110+
111+
/* If obj is a list-like object */
112+
if (obj instanceof Array) {
113+
var newObj = [];
114+
for (var i = 0; i < obj.length; i++)
115+
newObj.push(window['objectToJSON']([], obj[i]));
116+
return newObj;
117+
}
118+
119+
/* If obj is a non-list-like object */
120+
var newObj = {};
121+
for (var i in obj){
122+
/* bug in safari, throws TypeError if the following fields are referenced on a checkbox */
123+
/* https://stackoverflow.com/a/25569117/453261 */
124+
/* https://html.spec.whatwg.org/multipage/input.html#do-not-apply */
125+
if (obj['type'] == 'checkbox' && (i === 'selectionDirection' || i === 'selectionStart' || i === 'selectionEnd'))
126+
continue;
127+
if (typeof obj[i] == 'string' || typeof obj[i] == 'number' || typeof obj[i] == 'boolean')
128+
newObj[i] = obj[i];
129+
}
130+
return newObj;
131+
};

0 commit comments

Comments
 (0)