Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
titaniumnetwork-dev
GitHub Repository: titaniumnetwork-dev/Ultraviolet
Path: blob/main/src/client/dom/attr.js
305 views
1
import EventEmitter from "events";
2
import HookEvent from "../hook.js";
3
4
/**
5
* @typedef {import('../index').default} UVClient
6
*/
7
8
class AttrApi extends EventEmitter {
9
/**
10
*
11
* @param {UVClient} ctx
12
*/
13
constructor(ctx) {
14
super();
15
this.ctx = ctx;
16
this.window = ctx.window;
17
this.Attr = this.window.Attr || {};
18
this.attrProto = this.Attr.prototype || {};
19
this.value = ctx.nativeMethods.getOwnPropertyDescriptor(
20
this.attrProto,
21
"value"
22
);
23
this.name = ctx.nativeMethods.getOwnPropertyDescriptor(
24
this.attrProto,
25
"name"
26
);
27
this.getNamedItem = this.attrProto.getNamedItem || null;
28
this.setNamedItem = this.attrProto.setNamedItem || null;
29
this.removeNamedItem = this.attrProto.removeNamedItem || null;
30
this.getNamedItemNS = this.attrProto.getNamedItemNS || null;
31
this.setNamedItemNS = this.attrProto.setNamedItemNS || null;
32
this.removeNamedItemNS = this.attrProto.removeNamedItemNS || null;
33
this.item = this.attrProto.item || null;
34
}
35
overrideNameValue() {
36
this.ctx.overrideDescriptor(this.attrProto, "name", {
37
get: (target, that) => {
38
const event = new HookEvent({ value: target.call(that) }, target, that);
39
this.emit("name", event);
40
41
if (event.intercepted) return event.returnValue;
42
return event.data.value;
43
},
44
});
45
46
this.ctx.overrideDescriptor(this.attrProto, "value", {
47
get: (target, that) => {
48
const event = new HookEvent(
49
{
50
name: this.name.get.call(that),
51
value: target.call(that),
52
},
53
target,
54
that
55
);
56
this.emit("getValue", event);
57
58
if (event.intercepted) return event.returnValue;
59
return event.data.value;
60
},
61
set: (target, that, [val]) => {
62
const event = new HookEvent(
63
{ name: this.name.get.call(that), value: val },
64
target,
65
that
66
);
67
this.emit("setValue", event);
68
69
if (event.intercepted) return event.returnValue;
70
event.target.call(event.that, event.data.value);
71
},
72
});
73
}
74
overrideItemMethods() {
75
this.ctx.override(this.attrProto, "getNamedItem", (target, that, args) => {
76
if (!args.length) return target.apply(that, args);
77
let [name] = args;
78
79
const event = new HookEvent({ name }, target, that);
80
this.emit("getNamedItem", event);
81
82
if (event.intercepted) return event.returnValue;
83
return event.target.call(event.that, event.data.name);
84
});
85
this.ctx.override(this.attrProto, "setNamedItem", (target, that, args) => {
86
if (2 > args.length) return target.apply(that, args);
87
let [name, value] = args;
88
89
const event = new HookEvent({ name, value }, target, that);
90
this.emit("setNamedItem", event);
91
92
if (event.intercepted) return event.returnValue;
93
return event.target.call(event.that, event.data.name, event.data.value);
94
});
95
this.ctx.override(
96
this.attrProto,
97
"removeNamedItem",
98
(target, that, args) => {
99
if (!args.length) return target.apply(that, args);
100
let [name] = args;
101
102
const event = new HookEvent({ name }, target, that);
103
this.emit("removeNamedItem", event);
104
105
if (event.intercepted) return event.returnValue;
106
return event.target.call(event.that, event.data.name);
107
}
108
);
109
this.ctx.override(this.attrProto, "item", (target, that, args) => {
110
if (!args.length) return target.apply(that, args);
111
let [index] = args;
112
113
const event = new HookEvent({ index }, target, that);
114
this.emit("item", event);
115
116
if (event.intercepted) return event.returnValue;
117
return event.target.call(event.that, event.data.name);
118
});
119
this.ctx.override(
120
this.attrProto,
121
"getNamedItemNS",
122
(target, that, args) => {
123
if (2 > args.length) return target.apply(that, args);
124
let [namespace, localName] = args;
125
126
const event = new HookEvent({ namespace, localName }, target, that);
127
this.emit("getNamedItemNS", event);
128
129
if (event.intercepted) return event.returnValue;
130
return event.target.call(
131
event.that,
132
event.data.namespace,
133
event.data.localName
134
);
135
}
136
);
137
this.ctx.override(
138
this.attrProto,
139
"setNamedItemNS",
140
(target, that, args) => {
141
if (!args.length) return target.apply(that, args);
142
let [attr] = args;
143
144
const event = new HookEvent({ attr }, target, that);
145
this.emit("setNamedItemNS", event);
146
147
if (event.intercepted) return event.returnValue;
148
return event.target.call(event.that, event.data.name);
149
}
150
);
151
this.ctx.override(
152
this.attrProto,
153
"removeNamedItemNS",
154
(target, that, args) => {
155
if (2 > args.length) return target.apply(that, args);
156
let [namespace, localName] = args;
157
158
const event = new HookEvent({ namespace, localName }, target, that);
159
this.emit("removeNamedItemNS", event);
160
161
if (event.intercepted) return event.returnValue;
162
return event.target.call(
163
event.that,
164
event.data.namespace,
165
event.data.localName
166
);
167
}
168
);
169
}
170
}
171
172
export default AttrApi;
173
174