1
0

interpreter.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. "use strict";
  2. exports.__esModule = true;
  3. function serialize_event(event) {
  4. var _a, _b;
  5. switch (event.type) {
  6. case "copy":
  7. case "cut":
  8. case "past":
  9. return {};
  10. case "compositionend":
  11. case "compositionstart":
  12. case "compositionupdate":
  13. var data = event.data;
  14. return {
  15. data: data
  16. };
  17. case "keydown":
  18. case "keypress":
  19. case "keyup":
  20. var _c = event, charCode = _c.charCode, key = _c.key, altKey = _c.altKey, ctrlKey = _c.ctrlKey, metaKey = _c.metaKey, keyCode = _c.keyCode, shiftKey = _c.shiftKey, location_1 = _c.location, repeat = _c.repeat, which = _c.which;
  21. return {
  22. char_code: charCode,
  23. key: key,
  24. alt_key: altKey,
  25. ctrl_key: ctrlKey,
  26. meta_key: metaKey,
  27. key_code: keyCode,
  28. shift_key: shiftKey,
  29. location: location_1,
  30. repeat: repeat,
  31. which: which,
  32. locale: "locale"
  33. };
  34. case "focus":
  35. case "blur":
  36. return {};
  37. case "change":
  38. var target = event.target;
  39. var value = void 0;
  40. if (target.type === "checkbox" || target.type === "radio") {
  41. value = target.checked ? "true" : "false";
  42. }
  43. else {
  44. value = (_a = target.value) !== null && _a !== void 0 ? _a : target.textContent;
  45. }
  46. return {
  47. value: value
  48. };
  49. case "input":
  50. case "invalid":
  51. case "reset":
  52. case "submit": {
  53. var target_1 = event.target;
  54. var value_1 = (_b = target_1.value) !== null && _b !== void 0 ? _b : target_1.textContent;
  55. if (target_1.type == "checkbox") {
  56. value_1 = target_1.checked ? "true" : "false";
  57. }
  58. return {
  59. value: value_1
  60. };
  61. }
  62. case "click":
  63. case "contextmenu":
  64. case "doubleclick":
  65. case "drag":
  66. case "dragend":
  67. case "dragenter":
  68. case "dragexit":
  69. case "dragleave":
  70. case "dragover":
  71. case "dragstart":
  72. case "drop":
  73. case "mousedown":
  74. case "mouseenter":
  75. case "mouseleave":
  76. case "mousemove":
  77. case "mouseout":
  78. case "mouseover":
  79. case "mouseup": {
  80. var _d = event, altKey_1 = _d.altKey, button = _d.button, buttons = _d.buttons, clientX = _d.clientX, clientY = _d.clientY, ctrlKey_1 = _d.ctrlKey, metaKey_1 = _d.metaKey, pageX = _d.pageX, pageY = _d.pageY, screenX_1 = _d.screenX, screenY_1 = _d.screenY, shiftKey_1 = _d.shiftKey;
  81. return {
  82. alt_key: altKey_1,
  83. button: button,
  84. buttons: buttons,
  85. client_x: clientX,
  86. client_y: clientY,
  87. ctrl_key: ctrlKey_1,
  88. meta_key: metaKey_1,
  89. page_x: pageX,
  90. page_y: pageY,
  91. screen_x: screenX_1,
  92. screen_y: screenY_1,
  93. shift_key: shiftKey_1
  94. };
  95. }
  96. case "pointerdown":
  97. case "pointermove":
  98. case "pointerup":
  99. case "pointercancel":
  100. case "gotpointercapture":
  101. case "lostpointercapture":
  102. case "pointerenter":
  103. case "pointerleave":
  104. case "pointerover":
  105. case "pointerout": {
  106. var _e = event, altKey_2 = _e.altKey, button = _e.button, buttons = _e.buttons, clientX = _e.clientX, clientY = _e.clientY, ctrlKey_2 = _e.ctrlKey, metaKey_2 = _e.metaKey, pageX = _e.pageX, pageY = _e.pageY, screenX_2 = _e.screenX, screenY_2 = _e.screenY, shiftKey_2 = _e.shiftKey, pointerId = _e.pointerId, width = _e.width, height = _e.height, pressure = _e.pressure, tangentialPressure = _e.tangentialPressure, tiltX = _e.tiltX, tiltY = _e.tiltY, twist = _e.twist, pointerType = _e.pointerType, isPrimary = _e.isPrimary;
  107. return {
  108. alt_key: altKey_2,
  109. button: button,
  110. buttons: buttons,
  111. client_x: clientX,
  112. client_y: clientY,
  113. ctrl_key: ctrlKey_2,
  114. meta_key: metaKey_2,
  115. page_x: pageX,
  116. page_y: pageY,
  117. screen_x: screenX_2,
  118. screen_y: screenY_2,
  119. shift_key: shiftKey_2,
  120. pointer_id: pointerId,
  121. width: width,
  122. height: height,
  123. pressure: pressure,
  124. tangential_pressure: tangentialPressure,
  125. tilt_x: tiltX,
  126. tilt_y: tiltY,
  127. twist: twist,
  128. pointer_type: pointerType,
  129. is_primary: isPrimary
  130. };
  131. }
  132. case "select":
  133. return {};
  134. case "touchcancel":
  135. case "touchend":
  136. case "touchmove":
  137. case "touchstart": {
  138. var _f = event, altKey_3 = _f.altKey, ctrlKey_3 = _f.ctrlKey, metaKey_3 = _f.metaKey, shiftKey_3 = _f.shiftKey;
  139. return {
  140. // changed_touches: event.changedTouches,
  141. // target_touches: event.targetTouches,
  142. // touches: event.touches,
  143. alt_key: altKey_3,
  144. ctrl_key: ctrlKey_3,
  145. meta_key: metaKey_3,
  146. shift_key: shiftKey_3
  147. };
  148. }
  149. case "scroll":
  150. return {};
  151. case "wheel": {
  152. var _g = event, deltaX = _g.deltaX, deltaY = _g.deltaY, deltaZ = _g.deltaZ, deltaMode = _g.deltaMode;
  153. return {
  154. delta_x: deltaX,
  155. delta_y: deltaY,
  156. delta_z: deltaZ,
  157. delta_mode: deltaMode
  158. };
  159. }
  160. case "animationstart":
  161. case "animationend":
  162. case "animationiteration": {
  163. var _h = event, animationName = _h.animationName, elapsedTime = _h.elapsedTime, pseudoElement = _h.pseudoElement;
  164. return {
  165. animation_name: animationName,
  166. elapsed_time: elapsedTime,
  167. pseudo_element: pseudoElement
  168. };
  169. }
  170. case "transitionend": {
  171. var _j = event, propertyName = _j.propertyName, elapsedTime = _j.elapsedTime, pseudoElement = _j.pseudoElement;
  172. return {
  173. property_name: propertyName,
  174. elapsed_time: elapsedTime,
  175. pseudo_element: pseudoElement
  176. };
  177. }
  178. case "abort":
  179. case "canplay":
  180. case "canplaythrough":
  181. case "durationchange":
  182. case "emptied":
  183. case "encrypted":
  184. case "ended":
  185. case "error":
  186. case "loadeddata":
  187. case "loadedmetadata":
  188. case "loadstart":
  189. case "pause":
  190. case "play":
  191. case "playing":
  192. case "progress":
  193. case "ratechange":
  194. case "seeked":
  195. case "seeking":
  196. case "stalled":
  197. case "suspend":
  198. case "timeupdate":
  199. case "volumechange":
  200. case "waiting":
  201. return {};
  202. case "toggle":
  203. return {};
  204. default:
  205. return {};
  206. }
  207. }
  208. var bool_attrs = {
  209. allowfullscreen: true,
  210. allowpaymentrequest: true,
  211. async: true,
  212. autofocus: true,
  213. autoplay: true,
  214. checked: true,
  215. controls: true,
  216. "default": true,
  217. defer: true,
  218. disabled: true,
  219. formnovalidate: true,
  220. hidden: true,
  221. ismap: true,
  222. itemscope: true,
  223. loop: true,
  224. multiple: true,
  225. muted: true,
  226. nomodule: true,
  227. novalidate: true,
  228. open: true,
  229. playsinline: true,
  230. readonly: true,
  231. required: true,
  232. reversed: true,
  233. selected: true,
  234. truespeed: true
  235. };
  236. var Interpreter = /** @class */ (function () {
  237. function Interpreter(root) {
  238. this.root = root;
  239. this.stack = [root];
  240. this.listeners = {};
  241. this.lastNodeWasText = false;
  242. this.nodes = [root];
  243. }
  244. Interpreter.prototype.top = function () {
  245. return this.stack[this.stack.length - 1];
  246. };
  247. Interpreter.prototype.pop = function () {
  248. return this.stack.pop();
  249. };
  250. Interpreter.prototype.PushRoot = function (edit) {
  251. var id = edit.root;
  252. var node = this.nodes[id];
  253. this.stack.push(node);
  254. };
  255. Interpreter.prototype.AppendChildren = function (edit) {
  256. var root = this.stack[this.stack.length - (1 + edit.many)];
  257. var to_add = this.stack.splice(this.stack.length - edit.many);
  258. for (var i = 0; i < edit.many; i++) {
  259. root.appendChild(to_add[i]);
  260. }
  261. };
  262. Interpreter.prototype.ReplaceWith = function (edit) {
  263. var root = this.nodes[edit.root];
  264. var els = this.stack.splice(this.stack.length - edit.m);
  265. root.replaceWith.apply(root, els);
  266. };
  267. Interpreter.prototype.InsertAfter = function (edit) {
  268. var old = this.nodes[edit.root];
  269. var new_nodes = this.stack.splice(this.stack.length - edit.n);
  270. old.after.apply(old, new_nodes);
  271. };
  272. Interpreter.prototype.InsertBefore = function (edit) {
  273. var old = this.nodes[edit.root];
  274. var new_nodes = this.stack.splice(this.stack.length - edit.n);
  275. old.before.apply(old, new_nodes);
  276. };
  277. Interpreter.prototype.Remove = function (edit) {
  278. var node = this.nodes[edit.root];
  279. if (node !== undefined) {
  280. node.remove();
  281. }
  282. };
  283. Interpreter.prototype.CreateTextNode = function (edit) {
  284. // todo: make it so the types are okay
  285. var node = document.createTextNode(edit.text);
  286. this.nodes[edit.root] = node;
  287. this.stack.push(node);
  288. };
  289. Interpreter.prototype.CreateElement = function (edit) {
  290. var el = document.createElement(edit.tag);
  291. el.setAttribute("dioxus-id", "".concat(edit.root));
  292. this.nodes[edit.root] = el;
  293. this.stack.push(el);
  294. };
  295. Interpreter.prototype.CreateElementNs = function (edit) {
  296. var el = document.createElementNS(edit.ns, edit.tag);
  297. this.stack.push(el);
  298. this.nodes[edit.root] = el;
  299. };
  300. Interpreter.prototype.CreatePlaceholder = function (edit) {
  301. var el = document.createElement("pre");
  302. el.hidden = true;
  303. this.stack.push(el);
  304. this.nodes[edit.root] = el;
  305. };
  306. Interpreter.prototype.RemoveEventListener = function (edit) { };
  307. Interpreter.prototype.NewEventListener = function (edit, handler) {
  308. var event_name = edit.event_name;
  309. var mounted_node_id = edit.root;
  310. var scope = edit.scope;
  311. console.log('new event listener', event_name, mounted_node_id, scope);
  312. var element = this.nodes[edit.root];
  313. element.setAttribute("dioxus-event-".concat(event_name), "".concat(scope, ".").concat(mounted_node_id));
  314. if (!this.listeners[event_name]) {
  315. this.listeners[event_name] = handler;
  316. this.root.addEventListener(event_name, handler);
  317. }
  318. };
  319. Interpreter.prototype.SetText = function (edit) {
  320. this.nodes[edit.root].textContent = edit.text;
  321. };
  322. Interpreter.prototype.SetAttribute = function (edit) {
  323. // console.log("setting attr", edit);
  324. var name = edit.field;
  325. var value = edit.value;
  326. var ns = edit.ns;
  327. var node = this.nodes[edit.root];
  328. if (ns == "style") {
  329. // @ts-ignore
  330. node.style[name] = value;
  331. }
  332. else if (ns != null || ns != undefined) {
  333. node.setAttributeNS(ns, name, value);
  334. }
  335. else {
  336. switch (name) {
  337. case "value":
  338. if (value != node.value) {
  339. node.value = value;
  340. }
  341. break;
  342. case "checked":
  343. node.checked = value === "true";
  344. break;
  345. case "selected":
  346. node.selected = value === "true";
  347. break;
  348. case "dangerous_inner_html":
  349. node.innerHTML = value;
  350. break;
  351. default:
  352. // https://github.com/facebook/react/blob/8b88ac2592c5f555f315f9440cbb665dd1e7457a/packages/react-dom/src/shared/DOMProperty.js#L352-L364
  353. if (value == "false" && bool_attrs.hasOwnProperty(name)) {
  354. node.removeAttribute(name);
  355. }
  356. else {
  357. node.setAttribute(name, value);
  358. }
  359. }
  360. }
  361. };
  362. Interpreter.prototype.RemoveAttribute = function (edit) {
  363. var name = edit.name;
  364. var node = this.nodes[edit.root];
  365. node.removeAttribute(name);
  366. if (name === "value") {
  367. node.value = "";
  368. }
  369. if (name === "checked") {
  370. node.checked = false;
  371. }
  372. if (name === "selected") {
  373. node.selected = false;
  374. }
  375. };
  376. Interpreter.prototype.handleEdits = function (edits) {
  377. console.log("handling edits ", edits);
  378. this.stack.push(this.root);
  379. var _loop_1 = function (edit) {
  380. switch (edit.type) {
  381. case "AppendChildren":
  382. this_1.AppendChildren(edit);
  383. break;
  384. case "ReplaceWith":
  385. this_1.ReplaceWith(edit);
  386. break;
  387. case "InsertAfter":
  388. this_1.InsertAfter(edit);
  389. break;
  390. case "InsertBefore":
  391. this_1.InsertBefore(edit);
  392. break;
  393. case "Remove":
  394. this_1.Remove(edit);
  395. break;
  396. case "CreateTextNode":
  397. this_1.CreateTextNode(edit);
  398. break;
  399. case "CreateElement":
  400. this_1.CreateElement(edit);
  401. break;
  402. case "CreateElementNs":
  403. this_1.CreateElementNs(edit);
  404. break;
  405. case "CreatePlaceholder":
  406. this_1.CreatePlaceholder(edit);
  407. break;
  408. case "RemoveEventListener":
  409. this_1.RemoveEventListener(edit);
  410. break;
  411. case "NewEventListener":
  412. // todo: only on desktop should we make our own handler
  413. var handler = function (event) {
  414. var target = event.target;
  415. console.log("event", event);
  416. if (target != null) {
  417. var real_id = target.getAttribute("dioxus-id");
  418. var should_prevent_default = target.getAttribute("dioxus-prevent-default");
  419. var contents = serialize_event(event);
  420. if (should_prevent_default === "on".concat(event.type)) {
  421. event.preventDefault();
  422. }
  423. if (real_id == null) {
  424. return;
  425. }
  426. window.rpc.call("user_event", {
  427. event: edit.event_name,
  428. mounted_dom_id: parseInt(real_id),
  429. contents: contents
  430. });
  431. }
  432. };
  433. this_1.NewEventListener(edit, handler);
  434. break;
  435. case "SetText":
  436. this_1.SetText(edit);
  437. break;
  438. case "SetAttribute":
  439. this_1.SetAttribute(edit);
  440. break;
  441. case "RemoveAttribute":
  442. this_1.RemoveAttribute(edit);
  443. break;
  444. }
  445. };
  446. var this_1 = this;
  447. for (var _i = 0, edits_1 = edits; _i < edits_1.length; _i++) {
  448. var edit = edits_1[_i];
  449. _loop_1(edit);
  450. }
  451. };
  452. return Interpreter;
  453. }());
  454. function main() {
  455. var root = window.document.getElementById("main");
  456. if (root != null) {
  457. window.interpreter = new Interpreter(root);
  458. window.rpc.call("initialize");
  459. }
  460. }
  461. main();