nadesiko3 3.2.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +107 -0
  3. package/bin/cnako3 +10 -0
  4. package/bin/cnako3.bat +11 -0
  5. package/bin/nako3server.bat +6 -0
  6. package/demo/ace_editor.html +90 -0
  7. package/demo/ace_editor_tabs.html +162 -0
  8. package/demo/basic.html +71 -0
  9. package/demo/browsers.html +128 -0
  10. package/demo/css/basic.css +3 -0
  11. package/demo/css/common.css +157 -0
  12. package/demo/css/editor.css +8 -0
  13. package/demo/css/flow.css +3 -0
  14. package/demo/css/index.css +3 -0
  15. package/demo/extlib/ace@1.4.12/ace.js +17 -0
  16. package/demo/extlib/ace@1.4.12/ext-code_lens.min.js +1 -0
  17. package/demo/extlib/ace@1.4.12/ext-language_tools.min.js +1 -0
  18. package/demo/extlib/ace@1.4.12/ext-options.min.js +1 -0
  19. package/demo/extlib/ace@1.4.12/ext-settings_menu.js +8 -0
  20. package/demo/extlib/ace@1.4.12/keybinding-vscode.js +8 -0
  21. package/demo/extlib/ace@1.4.12/theme-monokai.js +8 -0
  22. package/demo/extlib/ace@1.4.12/theme-xcode.js +8 -0
  23. package/demo/extlib/chart.js@3.2.1/chart.min.js +13 -0
  24. package/demo/extlib/pure-min.css +11 -0
  25. package/demo/flow.html +97 -0
  26. package/demo/graph.html +53 -0
  27. package/demo/image/nako.png +0 -0
  28. package/demo/image/nakopad-icon256.png +0 -0
  29. package/demo/image/turtle.fla +0 -0
  30. package/demo/image/turtle.png +0 -0
  31. package/demo/index.html +134 -0
  32. package/demo/js/common.js +17 -0
  33. package/demo/js/turtle3d_test.js +44 -0
  34. package/demo/js/turtle_test.js +44 -0
  35. package/demo/runscript.html +47 -0
  36. package/demo/runscript2.html +33 -0
  37. package/demo/turtle.html +58 -0
  38. package/demo/turtle2.html +141 -0
  39. package/demo/turtle3.html +278 -0
  40. package/demo/turtle3d.html +58 -0
  41. package/demo/turtle3d2.html +107 -0
  42. package/demo/version.html +24 -0
  43. package/doc/SETUP.md +172 -0
  44. package/doc/about.md +34 -0
  45. package/doc/browsers.md +60 -0
  46. package/doc/docgen.md +21 -0
  47. package/doc/editor.md +44 -0
  48. package/doc/files.md +37 -0
  49. package/doc/plugins.md +195 -0
  50. package/doc/release.md +78 -0
  51. package/doc/win32.md +57 -0
  52. package/package.json +196 -0
  53. package/release/_hash.txt +65 -0
  54. package/release/_script-tags.txt +13 -0
  55. package/release/command.json +1 -0
  56. package/release/command.json.js +1 -0
  57. package/release/command_cnako3.json +1 -0
  58. package/release/command_list.json +1 -0
  59. package/release/editor.js +2 -0
  60. package/release/editor.js.LICENSE.txt +32 -0
  61. package/release/josi.json +48 -0
  62. package/release/nako_gen_async.js +1 -0
  63. package/release/nako_gen_async.js.LICENSE.txt +595 -0
  64. package/release/plugin_caniuse.js +1 -0
  65. package/release/plugin_caniuse.js.LICENSE.txt +411 -0
  66. package/release/plugin_csv.js +1 -0
  67. package/release/plugin_csv.js.LICENSE.txt +367 -0
  68. package/release/plugin_datetime.js +1 -0
  69. package/release/plugin_datetime.js.LICENSE.txt +471 -0
  70. package/release/plugin_kansuji.js +1 -0
  71. package/release/plugin_kansuji.js.LICENSE.txt +491 -0
  72. package/release/plugin_markup.js +1 -0
  73. package/release/plugin_markup.js.LICENSE.txt +363 -0
  74. package/release/plugin_turtle.js +1 -0
  75. package/release/plugin_turtle.js.LICENSE.txt +435 -0
  76. package/release/plugin_webworker.js +1 -0
  77. package/release/plugin_webworker.js.LICENSE.txt +491 -0
  78. package/release/version.js +2 -0
  79. package/release/version.js.LICENSE.txt +32 -0
  80. package/release/wnako3.js +2 -0
  81. package/release/wnako3.js.LICENSE.txt +1 -0
  82. package/release/wnako3webworker.js +1 -0
  83. package/release/wnako3webworker.js.LICENSE.txt +847 -0
  84. package/release/yoyakugo.json +30 -0
  85. package/src/browsers.md +60 -0
  86. package/src/cnako3.js +466 -0
  87. package/src/commander_ja.js +154 -0
  88. package/src/enako3.js +69 -0
  89. package/src/era.json +22 -0
  90. package/src/index.js +5 -0
  91. package/src/nako3.js +836 -0
  92. package/src/nako3_assert.js +37 -0
  93. package/src/nako3editorfix.sfd +106 -0
  94. package/src/nako3editorfix.woff +0 -0
  95. package/src/nako3server.js +51 -0
  96. package/src/nako_colors.js +86 -0
  97. package/src/nako_errors.js +176 -0
  98. package/src/nako_gen.js +1459 -0
  99. package/src/nako_gen_async.js +1622 -0
  100. package/src/nako_global.js +113 -0
  101. package/src/nako_indent.js +480 -0
  102. package/src/nako_josi_list.js +46 -0
  103. package/src/nako_lex_rules.js +259 -0
  104. package/src/nako_lexer.js +576 -0
  105. package/src/nako_logger.js +138 -0
  106. package/src/nako_parser3.js +1768 -0
  107. package/src/nako_parser_base.js +265 -0
  108. package/src/nako_parser_const.js +37 -0
  109. package/src/nako_prepare.js +293 -0
  110. package/src/nako_reserved_words.js +35 -0
  111. package/src/nako_source_mapping.js +251 -0
  112. package/src/nako_test.js +37 -0
  113. package/src/nako_version.js +8 -0
  114. package/src/plugin_browser.js +191 -0
  115. package/src/plugin_browser_ajax.js +352 -0
  116. package/src/plugin_browser_audio.js +109 -0
  117. package/src/plugin_browser_canvas.js +462 -0
  118. package/src/plugin_browser_chart.js +296 -0
  119. package/src/plugin_browser_color.js +49 -0
  120. package/src/plugin_browser_crypto.js +26 -0
  121. package/src/plugin_browser_dialog.js +53 -0
  122. package/src/plugin_browser_dom_basic.js +322 -0
  123. package/src/plugin_browser_dom_event.js +193 -0
  124. package/src/plugin_browser_dom_parts.js +163 -0
  125. package/src/plugin_browser_geolocation.js +51 -0
  126. package/src/plugin_browser_hotkey.js +25 -0
  127. package/src/plugin_browser_html.js +59 -0
  128. package/src/plugin_browser_in_worker.js +44 -0
  129. package/src/plugin_browser_location.js +21 -0
  130. package/src/plugin_browser_speech.js +111 -0
  131. package/src/plugin_browser_storage.js +121 -0
  132. package/src/plugin_browser_system.js +12 -0
  133. package/src/plugin_browser_websocket.js +73 -0
  134. package/src/plugin_caniuse.js +24 -0
  135. package/src/plugin_csv.js +57 -0
  136. package/src/plugin_datetime.js +414 -0
  137. package/src/plugin_express.js +212 -0
  138. package/src/plugin_kansuji.js +224 -0
  139. package/src/plugin_keigo.js +55 -0
  140. package/src/plugin_markup.js +32 -0
  141. package/src/plugin_math.js +319 -0
  142. package/src/plugin_node.js +1018 -0
  143. package/src/plugin_promise.js +94 -0
  144. package/src/plugin_system.js +2109 -0
  145. package/src/plugin_test.js +38 -0
  146. package/src/plugin_turtle.js +646 -0
  147. package/src/plugin_webworker.js +334 -0
  148. package/src/plugin_weykturtle3d.js +1216 -0
  149. package/src/plugin_worker.js +92 -0
  150. package/src/repl.nako3 +63 -0
  151. package/src/turtle-elephant.png +0 -0
  152. package/src/turtle-panda.png +0 -0
  153. package/src/turtle64.png +0 -0
  154. package/src/wnako3.js +162 -0
  155. package/src/wnako3_editor.css +215 -0
  156. package/src/wnako3_editor.js +1645 -0
  157. package/src/wnako3_editor_marker_red.png +0 -0
  158. package/src/wnako3_editor_marker_red.xcf +0 -0
  159. package/src/wnako3_editor_marker_yellow.png +0 -0
  160. package/src/wnako3_editor_marker_yellow.xcf +0 -0
  161. package/src/wnako3webworker.js +70 -0
  162. package/test/ace_editor/karma.config.js +94 -0
  163. package/test/ace_editor/test/.babelrc.json +3 -0
  164. package/test/ace_editor/test/ace_editor_test.js +178 -0
  165. package/test/ace_editor/test/html/custom_context.html +140 -0
  166. package/test/async/async_basic_test.js +124 -0
  167. package/test/browser/karma.config.js +212 -0
  168. package/test/browser/test/.babelrc.json +3 -0
  169. package/test/browser/test/compare_util.js +50 -0
  170. package/test/browser/test/html/canvas_basic.html +1 -0
  171. package/test/browser/test/html/div_basic.html +2 -0
  172. package/test/browser/test/html/event_dom_form.html +4 -0
  173. package/test/browser/test/html/event_dom_scrolldiv.html +5 -0
  174. package/test/browser/test/image/canvas_test1.png +0 -0
  175. package/test/browser/test/image/canvas_test2.png +0 -0
  176. package/test/browser/test/image/canvas_test3.png +0 -0
  177. package/test/browser/test/image/canvas_test4.png +0 -0
  178. package/test/browser/test/image/canvas_test7.png +0 -0
  179. package/test/browser/test/image/canvas_test8.png +0 -0
  180. package/test/browser/test/image/canvas_test_blank.png +0 -0
  181. package/test/browser/test/image/elephant_kana.png +0 -0
  182. package/test/browser/test/image/panda_kana.png +0 -0
  183. package/test/browser/test/image/turtle_kana.png +0 -0
  184. package/test/browser/test/import_plugin_checker.js +24 -0
  185. package/test/browser/test/plugin_browser_test.js +52 -0
  186. package/test/browser/test/plugin_browser_test_ajax.js +123 -0
  187. package/test/browser/test/plugin_browser_test_color.js +18 -0
  188. package/test/browser/test/plugin_browser_test_dialog.js +72 -0
  189. package/test/browser/test/plugin_browser_test_dom_event.js +598 -0
  190. package/test/browser/test/plugin_browser_test_dom_parts.js +125 -0
  191. package/test/browser/test/plugin_browser_test_system.js +9 -0
  192. package/test/browser/test/plugin_turtle_test.js +817 -0
  193. package/test/browser/test/plugin_webworker_test.js +87 -0
  194. package/test/browser/test/require_test.js +71 -0
  195. package/test/bundled/karma.config.base.js +117 -0
  196. package/test/bundled/karma.config.js +86 -0
  197. package/test/bundled/test/.babelrc.json +3 -0
  198. package/test/bundled/test/bundled_test.js +69 -0
  199. package/test/bundled/test/html/custom_context.html +65 -0
  200. package/test/bundled/test/html/custom_debug.html +66 -0
  201. package/test/bundled/test4b.cmd +52 -0
  202. package/test/bundled/test_base/.babelrc.json +3 -0
  203. package/test/bundled/test_base/_checktool_test.js +25 -0
  204. package/test/bundled/test_base/basic_ajax_test.js +56 -0
  205. package/test/bundled/test_base/basic_async_test.js +18 -0
  206. package/test/bundled/test_base/basic_test.js +153 -0
  207. package/test/bundled/test_base/calc_test.js +132 -0
  208. package/test/bundled/test_base/css/browsers_box.css +114 -0
  209. package/test/bundled/test_base/html/custom_context.html +69 -0
  210. package/test/bundled/test_base/html/custom_debug.html +71 -0
  211. package/test/bundled/test_base/js/browsers_box.js +72 -0
  212. package/test/bundled/test_base/plugin_csv_test.js +37 -0
  213. package/test/bundled/test_base/plugin_datetime_test.js +115 -0
  214. package/test/bundled/test_base/plugin_kansuji_test.js +49 -0
  215. package/test/bundled/test_base/plugin_system_test.js +410 -0
  216. package/test/bundled/test_base/plugin_webworker_test.js +53 -0
  217. package/test/bundled/test_base/resources/ok.txt +1 -0
  218. package/test/bundled/test_base/test_utils.js +191 -0
  219. package/test/common/array_test.js +40 -0
  220. package/test/common/basic_test.js +317 -0
  221. package/test/common/calc_test.js +139 -0
  222. package/test/common/debug_test.js +16 -0
  223. package/test/common/error_test.js +16 -0
  224. package/test/common/flow_test.js +360 -0
  225. package/test/common/func_call.js +136 -0
  226. package/test/common/func_test.js +149 -0
  227. package/test/common/indent_test.js +362 -0
  228. package/test/common/lex_test.js +146 -0
  229. package/test/common/literal_test.js +72 -0
  230. package/test/common/nako_logger_test.js +26 -0
  231. package/test/common/plugin_browser_test.js +24 -0
  232. package/test/common/plugin_browser_ut_audio_test.js +88 -0
  233. package/test/common/plugin_browser_ut_color_test.js +21 -0
  234. package/test/common/plugin_browser_ut_dialog_test.js +100 -0
  235. package/test/common/plugin_browser_ut_html_test.js +13 -0
  236. package/test/common/plugin_browser_ut_system_test.js +10 -0
  237. package/test/common/plugin_csv_test.js +39 -0
  238. package/test/common/plugin_datetime_test.js +120 -0
  239. package/test/common/plugin_kansuji_test.js +59 -0
  240. package/test/common/plugin_promise_test.js +18 -0
  241. package/test/common/plugin_system_test.js +451 -0
  242. package/test/common/prepare_test.js +93 -0
  243. package/test/common/re_test.js +20 -0
  244. package/test/common/variable_scope_test.js +105 -0
  245. package/test/jsconfig.json +19 -0
  246. package/test/karma.config.js +91 -0
  247. package/test/node/add_test.nako3 +1 -0
  248. package/test/node/async_test.js +80 -0
  249. package/test/node/commander_ja_test.js +82 -0
  250. package/test/node/error_message_test.js +244 -0
  251. package/test/node/kai_test.nako3 +6 -0
  252. package/test/node/node_test.js +43 -0
  253. package/test/node/plugin_broken.js.txt +3 -0
  254. package/test/node/plugin_browser_ut_ajax_test.js +355 -0
  255. package/test/node/plugin_browser_ut_location_test.js +32 -0
  256. package/test/node/plugin_markup_test.js +44 -0
  257. package/test/node/plugin_math_test.js +42 -0
  258. package/test/node/plugin_node_test.js +93 -0
  259. package/test/node/plugin_test.js +16 -0
  260. package/test/node/relative_import_test_1.nako3 +1 -0
  261. package/test/node/relative_import_test_2.nako3 +2 -0
  262. package/test/node/require_nako3_test.js +59 -0
  263. package/test/node/requiretest.nako3 +4 -0
  264. package/test/node/requiretest_indirect.nako3 +1 -0
  265. package/test/node/requiretest_name.nako3 +5 -0
  266. package/test/node/runtime_error.nako3 +2 -0
  267. package/test/node/side_effects_test.js +106 -0
  268. package/test/node/sjis.txt +5 -0
  269. package/test/node/syntax_error.nako3 +2 -0
  270. package/test/node/wnako3_editor_test.js +360 -0
  271. package/tools/README.md +7 -0
  272. package/tools/nako3edit/html/edit.html +83 -0
  273. package/tools/nako3edit/html/edit_plugin.js +6 -0
  274. package/tools/nako3edit/html/files.html +49 -0
  275. package/tools/nako3edit/html/nako3edit.css +66 -0
  276. package/tools/nako3edit/index.nako3 +145 -0
  277. package/tools/nako3edit/run.js +12 -0
  278. package/tools/nako3server/html/edit.html +104 -0
  279. package/tools/nako3server/html/edit_plugin.js +6 -0
  280. package/tools/nako3server/html/files.html +53 -0
  281. package/tools/nako3server/html/nako3edit.css +66 -0
  282. package/tools/nako3server/index.nako3 +129 -0
  283. package/tools/nako3server/run.js +12 -0
@@ -0,0 +1,598 @@
1
+ /* global __html__ */
2
+ import { CompareUtil, waitTimer, assert } from './compare_util'
3
+
4
+ const htmlPath = 'test/html/'
5
+
6
+ export default (nako) => {
7
+ const cu = new CompareUtil(nako)
8
+
9
+ describe('DOMイベント', () => {
10
+ describe('汎用命令', () => {
11
+ const createMouseEvent = (type, t) => {
12
+ const box = t.target.getBoundingClientRect()
13
+ const x = 30
14
+ const y = 10
15
+ if (MouseEvent && MouseEvent.length > 0) {
16
+ return new MouseEvent(type, {
17
+ view: window,
18
+ bubbles: true,
19
+ cancelable: true,
20
+ button: t.btn || 0,
21
+ buttons: t.btns || 1,
22
+ clientX: box.left + x,
23
+ clientY: box.top + y,
24
+ screenX: window.screenLeft + box.left + x,
25
+ screenY: window.screenTop + box.top + y,
26
+ pageX: window.scrollX + box.left + x,
27
+ pageY: window.scrollY + box.top + y
28
+ })
29
+ } else {
30
+ const evt = new UIEvent(type, {
31
+ view: window,
32
+ bubbles: true,
33
+ cancelable: true
34
+ })
35
+ evt.button = t.btn || 0,
36
+ evt.buttons = t.btns || 1,
37
+ evt.clientX = box.left + x,
38
+ evt.clientY = box.top + y,
39
+ evt.screenX = window.screenLeft + box.left + x,
40
+ evt.screenY = window.screenTop + box.top + y,
41
+ evt.pageX = window.scrollX + box.left + x,
42
+ evt.pageY = window.scrollY + box.top + y
43
+ return evt
44
+ }
45
+ }
46
+
47
+ const check_event_set = (selectmethod) => {
48
+ document.body.innerHTML = __html__[htmlPath+'event_dom_form.html']
49
+
50
+ const code = `
51
+ 要素は${selectmethod}
52
+ 要素の「onclick」に「ボタンクリック」をDOMイベント設定する。
53
+ ●ボタンクリックとは
54
+ 「C:設定」を報告する。
55
+ ここまで。
56
+ `
57
+ const cr = window.cr
58
+ cr.reset()
59
+ nako.run(code)
60
+
61
+ const e = document.getElementById('button')
62
+ if (e) {
63
+ const evt = createMouseEvent('click', { target: e })
64
+ e.dispatchEvent(evt)
65
+ }
66
+
67
+ assert.ok(cr.isCalled, 'イベント呼び出し')
68
+ assert.strictEqual(cr.getMessageAsJson(), '["C:設定"]')
69
+ }
70
+
71
+ const check_event_fire = (selectmethod) => {
72
+ document.body.innerHTML = __html__[htmlPath+'event_dom_form.html']
73
+
74
+ const code = `
75
+ 要素は${selectmethod}
76
+ 要素の「click」がDOMイベント発火した時には、
77
+ 「C:設定」を報告する。
78
+ ここまで。
79
+ `
80
+ const cr = window.cr
81
+ cr.reset()
82
+ nako.run(code)
83
+
84
+ const e = document.getElementById('button')
85
+ if (e) {
86
+ const evt = createMouseEvent('click', { target: e })
87
+ e.dispatchEvent(evt)
88
+ }
89
+
90
+ assert.ok(cr.isCalled, 'イベント呼び出し')
91
+ assert.strictEqual(cr.getMessageAsJson(), '["C:設定"]')
92
+ }
93
+
94
+ const check_event_add = (selectmethod) => {
95
+ document.body.innerHTML = __html__[htmlPath+'event_dom_form.html']
96
+
97
+ const code = `
98
+ 要素は${selectmethod}
99
+ 要素の「click」に「ボタンクリック」をDOMイベント追加する。
100
+ ●ボタンクリックとは
101
+ 「C:追加」を報告する。
102
+ ここまで。
103
+ `
104
+ const cr = window.cr
105
+ cr.reset()
106
+ nako.run(code)
107
+
108
+ const e = document.getElementById('button')
109
+ if (e) {
110
+ const evt = createMouseEvent('click', { target: e })
111
+ e.dispatchEvent(evt)
112
+ }
113
+
114
+ assert.ok(cr.isCalled, 'イベント呼び出し')
115
+ assert.strictEqual(cr.getMessageAsJson(), '["C:追加"]')
116
+ }
117
+
118
+ const check_event_remove = (selectmethod) => {
119
+ document.body.innerHTML = __html__[htmlPath+'event_dom_form.html']
120
+
121
+ const code = `
122
+ 要素は${selectmethod}
123
+ 要素の「click」に「ボタンクリック」をDOMイベント追加する。
124
+ 要素の「click」から「ボタンクリック」をDOMイベント削除する。
125
+ ●ボタンクリックとは
126
+ 「C:追加」を報告する。
127
+ ここまで。
128
+ `
129
+ const cr = window.cr
130
+ cr.reset()
131
+ nako.run(code)
132
+
133
+ const e = document.getElementById('button')
134
+ if (e) {
135
+ const evt = createMouseEvent('click', { target: e })
136
+ e.dispatchEvent(evt)
137
+ } else {
138
+ assert.fail('要素が見つからないためイベント発火に失敗しました。')
139
+ }
140
+
141
+ assert.ok(!cr.isCalled, 'イベント呼び出し')
142
+ assert.strictEqual(cr.getMessageAsJson(), '[]')
143
+ }
144
+
145
+ it('イベント設定', () => {
146
+ check_event_set('「#button」')
147
+ })
148
+ it('イベント設定 - dom', () => {
149
+ check_event_set('「button」をDOM要素ID取得')
150
+ })
151
+
152
+ it('イベント発火した時', () => {
153
+ check_event_fire('「#button」')
154
+ })
155
+ it('イベント発火した時 - dom', () => {
156
+ check_event_fire('「button」をDOM要素ID取得')
157
+ })
158
+
159
+ it('イベント追加', () => {
160
+ check_event_add('「#button」')
161
+ })
162
+ it('イベント追加 - dom', () => {
163
+ check_event_add('「button」をDOM要素ID取得')
164
+ })
165
+
166
+ it('イベント削除', () => {
167
+ check_event_remove('「#button」')
168
+ })
169
+ it('イベント削除 - dom', () => {
170
+ check_event_remove('「button」をDOM要素ID取得')
171
+ })
172
+ })
173
+
174
+ describe('読み込み時', () => {
175
+ const check_img_load = async (selectmethod) => {
176
+ document.body.innerHTML = __html__[htmlPath+'event_dom_form.html']
177
+
178
+ const code = `
179
+ IMGは「img」のDOM要素作成
180
+ IMG["id"]は「img」
181
+ 親は「form」をDOM要素ID取得
182
+ 親にIMGをDOM子要素追加
183
+ 要素は${selectmethod}
184
+ 要素を読み込んだ時には、
185
+ 「L:{IMG["naturalWidth"]},{IMG["naturalHeight"]}」を報告する。
186
+ ここまで。
187
+ IMG["src"]は「/turtle.png」
188
+ `
189
+ const cr = window.cr
190
+ cr.reset()
191
+ nako.run(code)
192
+
193
+ await waitTimer(1.0)
194
+
195
+ assert.ok(cr.isCalled, 'イベント呼び出し')
196
+ assert.strictEqual(cr.getMessageAsJson(), '["L:64,64"]')
197
+ }
198
+
199
+ it('読み込み時', async () => {
200
+ await check_img_load('「#img」')
201
+ })
202
+ it('読み込み時 - dom', async () => {
203
+ await check_img_load('「img」をDOM要素ID取得')
204
+ })
205
+ it('読み込み時 - image', async () => {
206
+ const code = `
207
+ 要素は「new Image()」をJS実行
208
+ 要素を読み込んだ時には、
209
+ 「I:{要素["naturalWidth"]},{要素["naturalHeight"]}」を報告する。
210
+ ここまで。
211
+ 要素["src"]は「/turtle.png」
212
+ `
213
+ const cr = window.cr
214
+ cr.reset()
215
+ nako.run(code)
216
+
217
+ await waitTimer(1.0)
218
+
219
+ assert.ok(cr.isCalled, 'イベント呼び出し')
220
+ assert.strictEqual(cr.getMessageAsJson(), '["I:64,64"]')
221
+ })
222
+ })
223
+
224
+ describe('フォーム', () => {
225
+ const createSubmitEvent = (t) => {
226
+ if (SubmitEvent && SubmitEvent.length > 0) {
227
+ return new SubmitEvent('submit', {
228
+ bubbles: true,
229
+ cancelable: true,
230
+ submitter: t.submitter
231
+ })
232
+ } else {
233
+ const evt = new Event('submit', {
234
+ bubbles: true,
235
+ cancelable: true
236
+ })
237
+ evt.submitter = t.submitter
238
+ return evt
239
+ }
240
+ }
241
+
242
+ const check_form_submit = (selectmethod) => {
243
+ document.body.innerHTML = __html__[htmlPath+'event_dom_form.html']
244
+
245
+ const code = `
246
+ 要素は${selectmethod}
247
+ 要素をフォーム送信した時には、
248
+ WINDOW["event"]をDOMイベント処理停止する。
249
+ 「SUBMITED」を報告する。
250
+ ここまで。
251
+ `
252
+ const cr = window.cr
253
+ cr.reset()
254
+ nako.run(code)
255
+
256
+ const e = document.getElementById('form')
257
+ if (e) {
258
+ e.addEventListener('submit', (event) => {
259
+ event.preventDefault()
260
+ })
261
+
262
+ const btn = document.getElementById('submit')
263
+ let evt = createSubmitEvent({ submitter: btn })
264
+ e.dispatchEvent(evt)
265
+ }
266
+
267
+ assert.ok(cr.isCalled, 'イベント呼び出し')
268
+ assert.strictEqual(cr.getMessageAsJson(), '["SUBMITED"]')
269
+ }
270
+
271
+ it('フォーム送信', () => {
272
+ check_form_submit('「#form」')
273
+ })
274
+
275
+ it('フォーム送信 - dom', () => {
276
+ check_form_submit('「form」をDOM要素ID取得')
277
+ })
278
+ })
279
+
280
+ describe('キーボード', () => {
281
+ const createKeyboardEvent = (type, t) => {
282
+ const box = t.target.getBoundingClientRect()
283
+ const { x, y } = t
284
+ if (KeyboardEvent && KeyboardEvent.length > 0) {
285
+ return new KeyboardEvent(type, {
286
+ view: window,
287
+ bubbles: true,
288
+ cancelable: true,
289
+ key: t.key || 0,
290
+ code: t.code || 0
291
+ })
292
+ } else {
293
+ const evt = new UIEvent(type, {
294
+ view: window,
295
+ bubbles: true,
296
+ cancelable: true
297
+ })
298
+ evt.key = t.key || '',
299
+ evt.code = t.code || ''
300
+ return evt
301
+ }
302
+ }
303
+
304
+ const check_event_key = (selectmethod) => {
305
+ document.body.innerHTML = __html__[htmlPath+'event_dom_scrolldiv.html']
306
+ window.scrollX = 50
307
+ window.scrollY = 50
308
+
309
+ const code = `
310
+ 要素は${selectmethod}
311
+ 要素をキー押した時には、
312
+ 「D:{押キー}」を報告する。
313
+ ここまで。
314
+ 要素をキー離した時には、
315
+ 「U:{押キー}」を報告する。
316
+ ここまで。
317
+ 要素をキータイピングした時には、
318
+ 「P:{押キー}」を報告する。
319
+ ここまで。
320
+ `
321
+ const cr = window.cr
322
+ cr.reset()
323
+ nako.run(code)
324
+
325
+ const e = document.getElementById('tgt')
326
+ if (e) {
327
+ const targetOffsets = [
328
+ { target: e, key: 'A', code: 'D' },
329
+ { target: e, key: 'C', code: 'E' },
330
+ { target: e, key: 'Q', code: 'W' }
331
+ ]
332
+
333
+ let evt = createKeyboardEvent('keydown', targetOffsets[0])
334
+ e.dispatchEvent(evt)
335
+
336
+ evt = createKeyboardEvent('keyup', targetOffsets[1])
337
+ e.dispatchEvent(evt)
338
+
339
+ evt = createKeyboardEvent('keypress', targetOffsets[2])
340
+ e.dispatchEvent(evt)
341
+ }
342
+
343
+ assert.ok(cr.isCalled, 'イベント呼び出し')
344
+ assert.strictEqual(cr.getMessageAsJson(), '["D:A","U:C","P:Q"]')
345
+ }
346
+
347
+ it('キーボード押・話・押下', () => {
348
+ check_event_key('「#tgt」')
349
+ })
350
+ it('キーボード押・話・押下 - dom', () => {
351
+ check_event_key('「tgt」をDOM要素ID取得')
352
+ })
353
+ })
354
+
355
+ describe('マウス', () => {
356
+ const createMouseEvent = (type, t) => {
357
+ const box = t.target.getBoundingClientRect()
358
+ const { x, y } = t
359
+ if (MouseEvent && MouseEvent.length > 0) {
360
+ return new MouseEvent(type, {
361
+ view: window,
362
+ bubbles: true,
363
+ cancelable: true,
364
+ button: t.btn || 0,
365
+ buttons: t.btns || 0,
366
+ clientX: box.left + x,
367
+ clientY: box.top + y,
368
+ screenX: window.screenLeft + box.left + x,
369
+ screenY: window.screenTop + box.top + y,
370
+ pageX: window.scrollX + box.left + x,
371
+ pageY: window.scrollY + box.top + y
372
+ })
373
+ } else {
374
+ const evt = new UIEvent(type, {
375
+ view: window,
376
+ bubbles: true,
377
+ cancelable: true
378
+ })
379
+ evt.button = t.btn || 0,
380
+ evt.buttons = t.btns || 0,
381
+ evt.clientX = box.left + x,
382
+ evt.clientY = box.top + y,
383
+ evt.screenX = window.screenLeft + box.left + x,
384
+ evt.screenY = window.screenTop + box.top + y,
385
+ evt.pageX = window.scrollX + box.left + x,
386
+ evt.pageY = window.scrollY + box.top + y
387
+ return evt
388
+ }
389
+ }
390
+
391
+ const check_event_mouse = (selectmethod) => {
392
+ document.body.innerHTML = __html__[htmlPath+'event_dom_scrolldiv.html']
393
+ window.scrollX = 50
394
+ window.scrollY = 50
395
+
396
+ const code = `
397
+ 要素は${selectmethod}
398
+ 要素をクリックした時には、
399
+ 「C:」を報告する。
400
+ ここまで。
401
+ 要素をマウス押した時には、
402
+ 「D:{マウスX},{マウスY}」を報告する。
403
+ ここまで。
404
+ 要素をマウス移動した時には、
405
+ 「M:{マウスX},{マウスY}」を報告する。
406
+ ここまで。
407
+ 要素をマウス離した時には、
408
+ 「U:{マウスX},{マウスY}」を報告する。
409
+ ここまで。
410
+ `
411
+ const cr = window.cr
412
+ cr.reset()
413
+ nako.run(code)
414
+
415
+ const e = document.getElementById('tgt')
416
+ if (e) {
417
+ const targetOffsets = [
418
+ { target: e, x: 0, y: 0, btn: 0, btns: 1 },
419
+ { target: e, x: 30, y: 35, btn: 1, btns: 3 },
420
+ { target: e, x: 30, y: 40, btn: 0, btns: 3 },
421
+ { target: e, x: 20, y: 35, btn: 1, btns: 2 }
422
+ ]
423
+
424
+ let evt = createMouseEvent('click', targetOffsets[0])
425
+ e.dispatchEvent(evt)
426
+
427
+ evt = createMouseEvent('mousedown', targetOffsets[1])
428
+ e.dispatchEvent(evt)
429
+
430
+ evt = createMouseEvent('mousemove', targetOffsets[2])
431
+ e.dispatchEvent(evt)
432
+
433
+ evt = createMouseEvent('mouseup', targetOffsets[3])
434
+ e.dispatchEvent(evt)
435
+ }
436
+
437
+ assert.ok(cr.isCalled, 'イベント呼び出し')
438
+ assert.strictEqual(cr.getMessageAsJson(), '["C:","D:30,35","M:30,40","U:20,35"]')
439
+ }
440
+
441
+ it('マウス押・離・クリック', () => {
442
+ check_event_mouse('「#tgt」')
443
+ })
444
+ it('マウス押・離・クリック - dom', () => {
445
+ check_event_mouse('「tgt」をDOM要素ID取得')
446
+ })
447
+ })
448
+
449
+ describe('タッチ', () => {
450
+ const createTouches = (infos) => {
451
+ const touches = []
452
+ const createTouchFactory = () => {
453
+ if (Touch && TouchEvent && Touch.length > 0 && TouchEvent.length > 0) {
454
+ return (params) => {
455
+ return new Touch(params)
456
+ }
457
+ } else {
458
+ return (params) => {
459
+ return params
460
+ }
461
+ }
462
+ }
463
+ const createTouch = createTouchFactory()
464
+
465
+ infos.forEach(t => {
466
+ const box = t.target.getBoundingClientRect()
467
+ const { x, y } = t
468
+ const params = {
469
+ identifier: t.id,
470
+ target: t.target,
471
+ clientX: box.left + x,
472
+ clientY: box.top + y,
473
+ screenX: window.screenLeft + box.left + x,
474
+ screenY: window.screenTop + box.top + y,
475
+ pageX: window.scrollX + box.left + x,
476
+ pageY: window.scrollY + box.top + y,
477
+ radiusX: t.r || 1.0,
478
+ radiusY: t.r || 1.0
479
+ }
480
+ touches.push(createTouch(params))
481
+ })
482
+ return touches
483
+ }
484
+ const createTouchEvent = (type, touches) => {
485
+ if (Touch && TouchEvent && Touch.length > 0 && TouchEvent.length > 0) {
486
+ return new TouchEvent(type, {
487
+ view: window,
488
+ bubbles: true,
489
+ cancelable: true,
490
+ changedTouches: touches.changed,
491
+ targetTouches: touches.target,
492
+ touches: touches.all
493
+ })
494
+ } else {
495
+ const evt = new UIEvent(type, {
496
+ view: window,
497
+ bubbles: true,
498
+ cancelable: true
499
+ })
500
+ evt.changedTouches = touches.changed
501
+ evt.targetTouches = touches.target
502
+ evt.touches = touches.all
503
+ return evt
504
+ }
505
+ }
506
+ const check_event_touch = (selectmethod) => {
507
+ document.body.innerHTML = __html__[htmlPath+'event_dom_scrolldiv.html']
508
+ window.scrollX = 50
509
+ window.scrollY = 50
510
+
511
+ const code = `
512
+ 要素は${selectmethod}
513
+ 要素をタッチ開始した時には、
514
+ 「S:{タッチX},{タッチY}」を報告する。
515
+ タッチ配列を反復する。
516
+ これはそれ
517
+ 「{これ[0]},{これ[1]}」を報告する。
518
+ ここまで。
519
+ ここまで。
520
+ 要素をタッチ終了した時には、
521
+ 「E:{タッチX},{タッチY}」を報告する。
522
+ タッチ配列を反復する。
523
+ これはそれ
524
+ 「{これ[0]},{これ[1]}」を報告する。
525
+ ここまで。
526
+ ここまで。
527
+ 要素をタッチした時には、
528
+ 「M:{タッチX},{タッチY}」を報告する。
529
+ タッチ配列を反復する。
530
+ これはそれ
531
+ 「{これ[0]},{これ[1]}」を報告する。
532
+ ここまで。
533
+ ここまで。
534
+ 要素をタッチキャンセルした時には、
535
+ 「C:{タッチX},{タッチY}」を報告する。
536
+ タッチ配列を反復する。
537
+ これはそれ
538
+ 「{これ[0]},{これ[1]}」を報告する。
539
+ ここまで。
540
+ ここまで。
541
+ `
542
+ const cr = window.cr
543
+ cr.reset()
544
+ nako.run(code)
545
+
546
+ const e = document.getElementById('tgt')
547
+ if (e) {
548
+ const targetOffsets = [
549
+ { target: e, id: 42, x: 20, y: 30, r: 5 },
550
+ { target: e, id: 43, x: 30, y: 35, r: 2 },
551
+ { target: e, id: 42, x: 25, y: 35, r: 3 },
552
+ { target: e, id: 42, x: 20, y: 35, r: 1 },
553
+ { target: e, id: 43, x: 30, y: 35, r: 5 }
554
+ ]
555
+ const touchesList = createTouches(targetOffsets)
556
+
557
+ let evt = createTouchEvent('touchstart', {
558
+ changed: [ touchesList[0], touchesList[1] ],
559
+ target: [ touchesList[0], touchesList[1] ],
560
+ all: [ touchesList[0], touchesList[1] ]
561
+ })
562
+ e.dispatchEvent(evt)
563
+
564
+ evt = createTouchEvent('touchmove', {
565
+ changed: [ touchesList[2] ],
566
+ target: [ touchesList[2], touchesList[1] ],
567
+ all: [ touchesList[2], touchesList[1] ]
568
+ })
569
+ e.dispatchEvent(evt)
570
+
571
+ evt = createTouchEvent('touchcancel', {
572
+ changed: [ touchesList[3] ],
573
+ target: [ touchesList[1] ],
574
+ all: [ touchesList[1] ]
575
+ })
576
+ e.dispatchEvent(evt)
577
+
578
+ evt = createTouchEvent('touchend', {
579
+ changed: [ touchesList[4] ],
580
+ target: [],
581
+ all: []
582
+ })
583
+ e.dispatchEvent(evt)
584
+ }
585
+
586
+ assert.ok(cr.isCalled, 'イベント呼び出し')
587
+ assert.strictEqual(cr.getMessageAsJson(), '["S:20,30","20,30","30,35","M:25,35","25,35","C:20,35","20,35","E:30,35","30,35"]')
588
+ }
589
+
590
+ it('タッチ開始・終了・移動・キャンセル', () => {
591
+ check_event_touch('「#tgt」')
592
+ })
593
+ it('タッチ開始・終了・移動・キャンセル - dom', () => {
594
+ check_event_touch('「tgt」をDOM要素ID取得')
595
+ })
596
+ })
597
+ })
598
+ }