blockly 7.20211209.2 → 8.0.0

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 (262) hide show
  1. package/blockly.d.ts +18963 -18432
  2. package/blockly.min.js +852 -844
  3. package/blockly_compressed.js +669 -664
  4. package/blockly_compressed.js.map +1 -1
  5. package/blocks/blocks.js +47 -0
  6. package/blocks/colour.js +13 -3
  7. package/blocks/lists.js +22 -13
  8. package/blocks/logic.js +13 -3
  9. package/blocks/loops.js +24 -11
  10. package/blocks/math.js +12 -3
  11. package/blocks/procedures.js +41 -27
  12. package/blocks/text.js +22 -13
  13. package/blocks/variables.js +14 -3
  14. package/blocks/variables_dynamic.js +13 -3
  15. package/blocks_compressed.js +146 -141
  16. package/blocks_compressed.js.map +1 -1
  17. package/core/block.js +1869 -1814
  18. package/core/block_drag_surface.js +201 -200
  19. package/core/block_dragger.js +377 -373
  20. package/core/block_svg.js +1593 -1479
  21. package/core/blockly.js +8 -22
  22. package/core/blocks.js +9 -2
  23. package/core/browser_events.js +22 -5
  24. package/core/bubble.js +841 -797
  25. package/core/bubble_dragger.js +213 -206
  26. package/core/bump_objects.js +2 -2
  27. package/core/clipboard.js +9 -9
  28. package/core/comment.js +353 -332
  29. package/core/common.js +46 -17
  30. package/core/component_manager.js +181 -174
  31. package/core/config.js +87 -0
  32. package/core/connection.js +595 -584
  33. package/core/connection_checker.js +242 -244
  34. package/core/connection_db.js +235 -230
  35. package/core/contextmenu.js +9 -6
  36. package/core/contextmenu_items.js +1 -2
  37. package/core/contextmenu_registry.js +93 -89
  38. package/core/css.js +474 -474
  39. package/core/delete_area.js +45 -42
  40. package/core/drag_target.js +57 -56
  41. package/core/dropdowndiv.js +153 -163
  42. package/core/events/events.js +2 -2
  43. package/core/events/events_abstract.js +89 -77
  44. package/core/events/events_block_base.js +37 -36
  45. package/core/events/events_block_change.js +130 -124
  46. package/core/events/events_block_create.js +73 -71
  47. package/core/events/events_block_delete.js +84 -82
  48. package/core/events/events_block_drag.js +50 -49
  49. package/core/events/events_block_move.js +147 -140
  50. package/core/events/events_bubble_open.js +51 -50
  51. package/core/events/events_click.js +48 -44
  52. package/core/events/events_comment_base.js +72 -69
  53. package/core/events/events_comment_change.js +63 -61
  54. package/core/events/events_comment_create.js +44 -42
  55. package/core/events/events_comment_delete.js +42 -40
  56. package/core/events/events_comment_move.js +106 -104
  57. package/core/events/events_marker_move.js +65 -64
  58. package/core/events/events_selected.js +46 -45
  59. package/core/events/events_theme_change.js +36 -35
  60. package/core/events/events_toolbox_item_select.js +46 -45
  61. package/core/events/events_trashcan_open.js +37 -36
  62. package/core/events/events_ui.js +47 -46
  63. package/core/events/events_ui_base.js +30 -29
  64. package/core/events/events_var_base.js +37 -36
  65. package/core/events/events_var_create.js +50 -48
  66. package/core/events/events_var_delete.js +50 -48
  67. package/core/events/events_var_rename.js +51 -49
  68. package/core/events/events_viewport.js +66 -65
  69. package/core/events/utils.js +29 -14
  70. package/core/events/workspace_events.js +49 -55
  71. package/core/extensions.js +4 -3
  72. package/core/field.js +1061 -997
  73. package/core/field_angle.js +462 -442
  74. package/core/field_checkbox.js +194 -182
  75. package/core/field_colour.js +519 -505
  76. package/core/field_dropdown.js +617 -598
  77. package/core/field_image.js +229 -220
  78. package/core/field_label.js +102 -91
  79. package/core/field_label_serializable.js +42 -41
  80. package/core/field_multilineinput.js +372 -358
  81. package/core/field_number.js +272 -253
  82. package/core/field_textinput.js +499 -467
  83. package/core/field_variable.js +458 -420
  84. package/core/flyout_base.js +1005 -952
  85. package/core/flyout_button.js +277 -260
  86. package/core/flyout_horizontal.js +304 -302
  87. package/core/flyout_metrics_manager.js +64 -64
  88. package/core/flyout_vertical.js +306 -300
  89. package/core/generator.js +459 -446
  90. package/core/gesture.js +829 -813
  91. package/core/grid.js +166 -163
  92. package/core/icon.js +168 -159
  93. package/core/inject.js +7 -5
  94. package/core/input.js +257 -248
  95. package/core/insertion_marker_manager.js +655 -624
  96. package/core/internal_constants.js +0 -129
  97. package/core/keyboard_nav/ast_node.js +605 -596
  98. package/core/keyboard_nav/basic_cursor.js +166 -165
  99. package/core/keyboard_nav/cursor.js +99 -97
  100. package/core/keyboard_nav/marker.js +83 -79
  101. package/core/keyboard_nav/tab_navigate_cursor.js +18 -23
  102. package/core/marker_manager.js +153 -141
  103. package/core/menu.js +377 -372
  104. package/core/menuitem.js +223 -217
  105. package/core/metrics_manager.js +403 -390
  106. package/core/mutator.js +468 -437
  107. package/core/names.js +229 -188
  108. package/core/options.js +290 -284
  109. package/core/procedures.js +29 -17
  110. package/core/registry.js +19 -16
  111. package/core/rendered_connection.js +482 -463
  112. package/core/renderers/common/block_rendering.js +9 -3
  113. package/core/renderers/common/constants.js +1119 -1112
  114. package/core/renderers/common/debug.js +14 -0
  115. package/core/renderers/common/debugger.js +338 -316
  116. package/core/renderers/common/drawer.js +380 -370
  117. package/core/renderers/common/i_path_object.js +2 -2
  118. package/core/renderers/common/info.js +626 -618
  119. package/core/renderers/common/marker_svg.js +579 -541
  120. package/core/renderers/common/path_object.js +203 -200
  121. package/core/renderers/common/renderer.js +220 -218
  122. package/core/renderers/geras/constants.js +36 -36
  123. package/core/renderers/geras/drawer.js +155 -147
  124. package/core/renderers/geras/highlight_constants.js +244 -238
  125. package/core/renderers/geras/highlighter.js +231 -179
  126. package/core/renderers/geras/info.js +392 -369
  127. package/core/renderers/geras/measurables/inline_input.js +25 -19
  128. package/core/renderers/geras/measurables/statement_input.js +23 -17
  129. package/core/renderers/geras/path_object.js +106 -121
  130. package/core/renderers/geras/renderer.js +96 -98
  131. package/core/renderers/measurables/base.js +30 -18
  132. package/core/renderers/measurables/bottom_row.js +83 -80
  133. package/core/renderers/measurables/connection.js +22 -15
  134. package/core/renderers/measurables/external_value_input.js +35 -22
  135. package/core/renderers/measurables/field.js +35 -20
  136. package/core/renderers/measurables/hat.js +18 -13
  137. package/core/renderers/measurables/icon.js +24 -17
  138. package/core/renderers/measurables/in_row_spacer.js +15 -13
  139. package/core/renderers/measurables/inline_input.js +43 -33
  140. package/core/renderers/measurables/input_connection.js +41 -28
  141. package/core/renderers/measurables/input_row.js +50 -44
  142. package/core/renderers/measurables/jagged_edge.js +14 -12
  143. package/core/renderers/measurables/next_connection.js +16 -14
  144. package/core/renderers/measurables/output_connection.js +26 -20
  145. package/core/renderers/measurables/previous_connection.js +16 -15
  146. package/core/renderers/measurables/round_corner.js +20 -18
  147. package/core/renderers/measurables/row.js +184 -168
  148. package/core/renderers/measurables/spacer_row.js +38 -23
  149. package/core/renderers/measurables/square_corner.js +18 -16
  150. package/core/renderers/measurables/statement_input.js +23 -20
  151. package/core/renderers/measurables/top_row.js +88 -85
  152. package/core/renderers/minimalist/constants.js +8 -7
  153. package/core/renderers/minimalist/drawer.js +11 -10
  154. package/core/renderers/minimalist/info.js +18 -18
  155. package/core/renderers/minimalist/renderer.js +40 -39
  156. package/core/renderers/thrasos/info.js +258 -248
  157. package/core/renderers/thrasos/renderer.js +20 -20
  158. package/core/renderers/zelos/constants.js +898 -873
  159. package/core/renderers/zelos/drawer.js +186 -169
  160. package/core/renderers/zelos/info.js +502 -479
  161. package/core/renderers/zelos/marker_svg.js +129 -115
  162. package/core/renderers/zelos/measurables/bottom_row.js +31 -30
  163. package/core/renderers/zelos/measurables/inputs.js +22 -21
  164. package/core/renderers/zelos/measurables/row_elements.js +14 -13
  165. package/core/renderers/zelos/measurables/top_row.js +34 -33
  166. package/core/renderers/zelos/path_object.js +181 -180
  167. package/core/renderers/zelos/renderer.js +91 -92
  168. package/core/scrollbar.js +759 -713
  169. package/core/scrollbar_pair.js +250 -245
  170. package/core/serialization/blocks.js +19 -9
  171. package/core/serialization/workspaces.js +3 -2
  172. package/core/shortcut_registry.js +286 -277
  173. package/core/sprites.js +31 -0
  174. package/core/theme.js +135 -141
  175. package/core/theme_manager.js +147 -143
  176. package/core/toolbox/category.js +602 -576
  177. package/core/toolbox/collapsible_category.js +226 -227
  178. package/core/toolbox/separator.js +70 -61
  179. package/core/toolbox/toolbox.js +934 -927
  180. package/core/toolbox/toolbox_item.js +115 -99
  181. package/core/tooltip.js +108 -35
  182. package/core/touch.js +8 -3
  183. package/core/touch_gesture.js +254 -251
  184. package/core/trashcan.js +606 -595
  185. package/core/utils/coordinate.js +97 -95
  186. package/core/utils/dom.js +2 -2
  187. package/core/utils/global.js +2 -0
  188. package/core/utils/rect.js +41 -37
  189. package/core/utils/sentinel.js +25 -0
  190. package/core/utils/size.js +30 -27
  191. package/core/utils/svg.js +18 -16
  192. package/core/variable_map.js +325 -341
  193. package/core/variable_model.js +55 -54
  194. package/core/variables.js +9 -2
  195. package/core/variables_dynamic.js +3 -1
  196. package/core/warning.js +126 -120
  197. package/core/widgetdiv.js +4 -4
  198. package/core/workspace.js +685 -664
  199. package/core/workspace_audio.js +124 -118
  200. package/core/workspace_comment.js +308 -298
  201. package/core/workspace_comment_svg.js +1029 -951
  202. package/core/workspace_drag_surface_svg.js +147 -140
  203. package/core/workspace_dragger.js +70 -71
  204. package/core/workspace_svg.js +2322 -2297
  205. package/core/xml.js +30 -20
  206. package/core/zoom_controls.js +431 -439
  207. package/dart_compressed.js +40 -43
  208. package/dart_compressed.js.map +1 -1
  209. package/generators/dart/colour.js +56 -64
  210. package/generators/dart/lists.js +61 -50
  211. package/generators/dart/math.js +160 -148
  212. package/generators/dart/text.js +83 -61
  213. package/generators/javascript/colour.js +37 -34
  214. package/generators/javascript/lists.js +50 -43
  215. package/generators/javascript/math.js +123 -139
  216. package/generators/javascript/text.js +67 -81
  217. package/generators/lua/colour.js +25 -23
  218. package/generators/lua/lists.js +97 -69
  219. package/generators/lua/logic.js +1 -2
  220. package/generators/lua/math.js +182 -144
  221. package/generators/lua/text.js +116 -99
  222. package/generators/php/colour.js +38 -32
  223. package/generators/php/lists.js +109 -89
  224. package/generators/php/math.js +90 -81
  225. package/generators/php/text.js +63 -61
  226. package/generators/python/colour.js +18 -18
  227. package/generators/python/lists.js +38 -30
  228. package/generators/python/loops.js +12 -8
  229. package/generators/python/math.js +104 -106
  230. package/generators/python/text.js +34 -30
  231. package/javascript_compressed.js +37 -39
  232. package/javascript_compressed.js.map +1 -1
  233. package/lua_compressed.js +39 -42
  234. package/lua_compressed.js.map +1 -1
  235. package/msg/az.js +2 -2
  236. package/msg/be.js +4 -4
  237. package/msg/cs.js +15 -15
  238. package/msg/de.js +1 -1
  239. package/msg/diq.js +1 -1
  240. package/msg/eo.js +1 -1
  241. package/msg/es.js +1 -1
  242. package/msg/fa.js +1 -1
  243. package/msg/fr.js +4 -4
  244. package/msg/he.js +1 -1
  245. package/msg/hr.js +2 -2
  246. package/msg/hy.js +2 -2
  247. package/msg/id.js +12 -12
  248. package/msg/inh.js +14 -14
  249. package/msg/ja.js +7 -7
  250. package/msg/lv.js +29 -29
  251. package/msg/pa.js +3 -3
  252. package/msg/smn.js +436 -0
  253. package/msg/te.js +1 -1
  254. package/msg/yue.js +1 -1
  255. package/msg/zh-hans.js +3 -3
  256. package/msg/zh-hant.js +3 -3
  257. package/package.json +7 -6
  258. package/php_compressed.js +38 -42
  259. package/php_compressed.js.map +1 -1
  260. package/python_compressed.js +26 -25
  261. package/python_compressed.js.map +1 -1
  262. package/blocks/all.js +0 -23
@@ -31,282 +31,280 @@ const {RenderedConnection} = goog.requireType('Blockly.RenderedConnection');
31
31
  /**
32
32
  * Class for connection type checking logic.
33
33
  * @implements {IConnectionChecker}
34
- * @constructor
35
34
  * @alias Blockly.ConnectionChecker
36
35
  */
37
- const ConnectionChecker = function() {};
36
+ class ConnectionChecker {
37
+ /**
38
+ * Check whether the current connection can connect with the target
39
+ * connection.
40
+ * @param {Connection} a Connection to check compatibility with.
41
+ * @param {Connection} b Connection to check compatibility with.
42
+ * @param {boolean} isDragging True if the connection is being made by
43
+ * dragging a block.
44
+ * @param {number=} opt_distance The max allowable distance between the
45
+ * connections for drag checks.
46
+ * @return {boolean} Whether the connection is legal.
47
+ * @public
48
+ */
49
+ canConnect(a, b, isDragging, opt_distance) {
50
+ return this.canConnectWithReason(a, b, isDragging, opt_distance) ===
51
+ Connection.CAN_CONNECT;
52
+ }
38
53
 
39
- /**
40
- * Check whether the current connection can connect with the target
41
- * connection.
42
- * @param {Connection} a Connection to check compatibility with.
43
- * @param {Connection} b Connection to check compatibility with.
44
- * @param {boolean} isDragging True if the connection is being made by dragging
45
- * a block.
46
- * @param {number=} opt_distance The max allowable distance between the
47
- * connections for drag checks.
48
- * @return {boolean} Whether the connection is legal.
49
- * @public
50
- */
51
- ConnectionChecker.prototype.canConnect = function(
52
- a, b, isDragging, opt_distance) {
53
- return this.canConnectWithReason(a, b, isDragging, opt_distance) ===
54
- Connection.CAN_CONNECT;
55
- };
54
+ /**
55
+ * Checks whether the current connection can connect with the target
56
+ * connection, and return an error code if there are problems.
57
+ * @param {Connection} a Connection to check compatibility with.
58
+ * @param {Connection} b Connection to check compatibility with.
59
+ * @param {boolean} isDragging True if the connection is being made by
60
+ * dragging a block.
61
+ * @param {number=} opt_distance The max allowable distance between the
62
+ * connections for drag checks.
63
+ * @return {number} Connection.CAN_CONNECT if the connection is legal,
64
+ * an error code otherwise.
65
+ * @public
66
+ */
67
+ canConnectWithReason(a, b, isDragging, opt_distance) {
68
+ const safety = this.doSafetyChecks(a, b);
69
+ if (safety !== Connection.CAN_CONNECT) {
70
+ return safety;
71
+ }
56
72
 
57
- /**
58
- * Checks whether the current connection can connect with the target
59
- * connection, and return an error code if there are problems.
60
- * @param {Connection} a Connection to check compatibility with.
61
- * @param {Connection} b Connection to check compatibility with.
62
- * @param {boolean} isDragging True if the connection is being made by dragging
63
- * a block.
64
- * @param {number=} opt_distance The max allowable distance between the
65
- * connections for drag checks.
66
- * @return {number} Connection.CAN_CONNECT if the connection is legal,
67
- * an error code otherwise.
68
- * @public
69
- */
70
- ConnectionChecker.prototype.canConnectWithReason = function(
71
- a, b, isDragging, opt_distance) {
72
- const safety = this.doSafetyChecks(a, b);
73
- if (safety !== Connection.CAN_CONNECT) {
74
- return safety;
75
- }
73
+ // If the safety checks passed, both connections are non-null.
74
+ const connOne = /** @type {!Connection} **/ (a);
75
+ const connTwo = /** @type {!Connection} **/ (b);
76
+ if (!this.doTypeChecks(connOne, connTwo)) {
77
+ return Connection.REASON_CHECKS_FAILED;
78
+ }
76
79
 
77
- // If the safety checks passed, both connections are non-null.
78
- const connOne = /** @type {!Connection} **/ (a);
79
- const connTwo = /** @type {!Connection} **/ (b);
80
- if (!this.doTypeChecks(connOne, connTwo)) {
81
- return Connection.REASON_CHECKS_FAILED;
82
- }
80
+ if (isDragging &&
81
+ !this.doDragChecks(
82
+ /** @type {!RenderedConnection} **/ (a),
83
+ /** @type {!RenderedConnection} **/ (b), opt_distance || 0)) {
84
+ return Connection.REASON_DRAG_CHECKS_FAILED;
85
+ }
83
86
 
84
- if (isDragging &&
85
- !this.doDragChecks(
86
- /** @type {!RenderedConnection} **/ (a),
87
- /** @type {!RenderedConnection} **/ (b), opt_distance || 0)) {
88
- return Connection.REASON_DRAG_CHECKS_FAILED;
87
+ return Connection.CAN_CONNECT;
89
88
  }
90
89
 
91
- return Connection.CAN_CONNECT;
92
- };
93
-
94
- /**
95
- * Helper method that translates a connection error code into a string.
96
- * @param {number} errorCode The error code.
97
- * @param {Connection} a One of the two connections being checked.
98
- * @param {Connection} b The second of the two connections being
99
- * checked.
100
- * @return {string} A developer-readable error string.
101
- * @public
102
- */
103
- ConnectionChecker.prototype.getErrorMessage = function(errorCode, a, b) {
104
- switch (errorCode) {
105
- case Connection.REASON_SELF_CONNECTION:
106
- return 'Attempted to connect a block to itself.';
107
- case Connection.REASON_DIFFERENT_WORKSPACES:
108
- // Usually this means one block has been deleted.
109
- return 'Blocks not on same workspace.';
110
- case Connection.REASON_WRONG_TYPE:
111
- return 'Attempt to connect incompatible types.';
112
- case Connection.REASON_TARGET_NULL:
113
- return 'Target connection is null.';
114
- case Connection.REASON_CHECKS_FAILED: {
115
- const connOne = /** @type {!Connection} **/ (a);
116
- const connTwo = /** @type {!Connection} **/ (b);
117
- let msg = 'Connection checks failed. ';
118
- msg += connOne + ' expected ' + connOne.getCheck() + ', found ' +
119
- connTwo.getCheck();
120
- return msg;
90
+ /**
91
+ * Helper method that translates a connection error code into a string.
92
+ * @param {number} errorCode The error code.
93
+ * @param {Connection} a One of the two connections being checked.
94
+ * @param {Connection} b The second of the two connections being
95
+ * checked.
96
+ * @return {string} A developer-readable error string.
97
+ * @public
98
+ */
99
+ getErrorMessage(errorCode, a, b) {
100
+ switch (errorCode) {
101
+ case Connection.REASON_SELF_CONNECTION:
102
+ return 'Attempted to connect a block to itself.';
103
+ case Connection.REASON_DIFFERENT_WORKSPACES:
104
+ // Usually this means one block has been deleted.
105
+ return 'Blocks not on same workspace.';
106
+ case Connection.REASON_WRONG_TYPE:
107
+ return 'Attempt to connect incompatible types.';
108
+ case Connection.REASON_TARGET_NULL:
109
+ return 'Target connection is null.';
110
+ case Connection.REASON_CHECKS_FAILED: {
111
+ const connOne = /** @type {!Connection} **/ (a);
112
+ const connTwo = /** @type {!Connection} **/ (b);
113
+ let msg = 'Connection checks failed. ';
114
+ msg += connOne + ' expected ' + connOne.getCheck() + ', found ' +
115
+ connTwo.getCheck();
116
+ return msg;
117
+ }
118
+ case Connection.REASON_SHADOW_PARENT:
119
+ return 'Connecting non-shadow to shadow block.';
120
+ case Connection.REASON_DRAG_CHECKS_FAILED:
121
+ return 'Drag checks failed.';
122
+ case Connection.REASON_PREVIOUS_AND_OUTPUT:
123
+ return 'Block would have an output and a previous connection.';
124
+ default:
125
+ return 'Unknown connection failure: this should never happen!';
121
126
  }
122
- case Connection.REASON_SHADOW_PARENT:
123
- return 'Connecting non-shadow to shadow block.';
124
- case Connection.REASON_DRAG_CHECKS_FAILED:
125
- return 'Drag checks failed.';
126
- case Connection.REASON_PREVIOUS_AND_OUTPUT:
127
- return 'Block would have an output and a previous connection.';
128
- default:
129
- return 'Unknown connection failure: this should never happen!';
130
127
  }
131
- };
132
128
 
133
- /**
134
- * Check that connecting the given connections is safe, meaning that it would
135
- * not break any of Blockly's basic assumptions (e.g. no self connections).
136
- * @param {Connection} a The first of the connections to check.
137
- * @param {Connection} b The second of the connections to check.
138
- * @return {number} An enum with the reason this connection is safe or unsafe.
139
- * @public
140
- */
141
- ConnectionChecker.prototype.doSafetyChecks = function(a, b) {
142
- if (!a || !b) {
143
- return Connection.REASON_TARGET_NULL;
144
- }
145
- let superiorBlock;
146
- let inferiorBlock;
147
- let superiorConnection;
148
- let inferiorConnection;
149
- if (a.isSuperior()) {
150
- superiorBlock = a.getSourceBlock();
151
- inferiorBlock = b.getSourceBlock();
152
- superiorConnection = a;
153
- inferiorConnection = b;
154
- } else {
155
- inferiorBlock = a.getSourceBlock();
156
- superiorBlock = b.getSourceBlock();
157
- inferiorConnection = a;
158
- superiorConnection = b;
159
- }
160
- if (superiorBlock === inferiorBlock) {
161
- return Connection.REASON_SELF_CONNECTION;
162
- } else if (
163
- inferiorConnection.type !==
164
- internalConstants.OPPOSITE_TYPE[superiorConnection.type]) {
165
- return Connection.REASON_WRONG_TYPE;
166
- } else if (superiorBlock.workspace !== inferiorBlock.workspace) {
167
- return Connection.REASON_DIFFERENT_WORKSPACES;
168
- } else if (superiorBlock.isShadow() && !inferiorBlock.isShadow()) {
169
- return Connection.REASON_SHADOW_PARENT;
170
- } else if (
171
- inferiorConnection.type === ConnectionType.OUTPUT_VALUE &&
172
- inferiorBlock.previousConnection &&
173
- inferiorBlock.previousConnection.isConnected()) {
174
- return Connection.REASON_PREVIOUS_AND_OUTPUT;
175
- } else if (
176
- inferiorConnection.type === ConnectionType.PREVIOUS_STATEMENT &&
177
- inferiorBlock.outputConnection &&
178
- inferiorBlock.outputConnection.isConnected()) {
179
- return Connection.REASON_PREVIOUS_AND_OUTPUT;
129
+ /**
130
+ * Check that connecting the given connections is safe, meaning that it would
131
+ * not break any of Blockly's basic assumptions (e.g. no self connections).
132
+ * @param {Connection} a The first of the connections to check.
133
+ * @param {Connection} b The second of the connections to check.
134
+ * @return {number} An enum with the reason this connection is safe or unsafe.
135
+ * @public
136
+ */
137
+ doSafetyChecks(a, b) {
138
+ if (!a || !b) {
139
+ return Connection.REASON_TARGET_NULL;
140
+ }
141
+ let superiorBlock;
142
+ let inferiorBlock;
143
+ let superiorConnection;
144
+ let inferiorConnection;
145
+ if (a.isSuperior()) {
146
+ superiorBlock = a.getSourceBlock();
147
+ inferiorBlock = b.getSourceBlock();
148
+ superiorConnection = a;
149
+ inferiorConnection = b;
150
+ } else {
151
+ inferiorBlock = a.getSourceBlock();
152
+ superiorBlock = b.getSourceBlock();
153
+ inferiorConnection = a;
154
+ superiorConnection = b;
155
+ }
156
+ if (superiorBlock === inferiorBlock) {
157
+ return Connection.REASON_SELF_CONNECTION;
158
+ } else if (
159
+ inferiorConnection.type !==
160
+ internalConstants.OPPOSITE_TYPE[superiorConnection.type]) {
161
+ return Connection.REASON_WRONG_TYPE;
162
+ } else if (superiorBlock.workspace !== inferiorBlock.workspace) {
163
+ return Connection.REASON_DIFFERENT_WORKSPACES;
164
+ } else if (superiorBlock.isShadow() && !inferiorBlock.isShadow()) {
165
+ return Connection.REASON_SHADOW_PARENT;
166
+ } else if (
167
+ inferiorConnection.type === ConnectionType.OUTPUT_VALUE &&
168
+ inferiorBlock.previousConnection &&
169
+ inferiorBlock.previousConnection.isConnected()) {
170
+ return Connection.REASON_PREVIOUS_AND_OUTPUT;
171
+ } else if (
172
+ inferiorConnection.type === ConnectionType.PREVIOUS_STATEMENT &&
173
+ inferiorBlock.outputConnection &&
174
+ inferiorBlock.outputConnection.isConnected()) {
175
+ return Connection.REASON_PREVIOUS_AND_OUTPUT;
176
+ }
177
+ return Connection.CAN_CONNECT;
180
178
  }
181
- return Connection.CAN_CONNECT;
182
- };
183
179
 
184
- /**
185
- * Check whether this connection is compatible with another connection with
186
- * respect to the value type system. E.g. square_root("Hello") is not
187
- * compatible.
188
- * @param {!Connection} a Connection to compare.
189
- * @param {!Connection} b Connection to compare against.
190
- * @return {boolean} True if the connections share a type.
191
- * @public
192
- */
193
- ConnectionChecker.prototype.doTypeChecks = function(a, b) {
194
- const checkArrayOne = a.getCheck();
195
- const checkArrayTwo = b.getCheck();
180
+ /**
181
+ * Check whether this connection is compatible with another connection with
182
+ * respect to the value type system. E.g. square_root("Hello") is not
183
+ * compatible.
184
+ * @param {!Connection} a Connection to compare.
185
+ * @param {!Connection} b Connection to compare against.
186
+ * @return {boolean} True if the connections share a type.
187
+ * @public
188
+ */
189
+ doTypeChecks(a, b) {
190
+ const checkArrayOne = a.getCheck();
191
+ const checkArrayTwo = b.getCheck();
196
192
 
197
- if (!checkArrayOne || !checkArrayTwo) {
198
- // One or both sides are promiscuous enough that anything will fit.
199
- return true;
200
- }
201
- // Find any intersection in the check lists.
202
- for (let i = 0; i < checkArrayOne.length; i++) {
203
- if (checkArrayTwo.indexOf(checkArrayOne[i]) !== -1) {
193
+ if (!checkArrayOne || !checkArrayTwo) {
194
+ // One or both sides are promiscuous enough that anything will fit.
204
195
  return true;
205
196
  }
206
- }
207
- // No intersection.
208
- return false;
209
- };
210
-
211
- /**
212
- * Check whether this connection can be made by dragging.
213
- * @param {!RenderedConnection} a Connection to compare.
214
- * @param {!RenderedConnection} b Connection to compare against.
215
- * @param {number} distance The maximum allowable distance between connections.
216
- * @return {boolean} True if the connection is allowed during a drag.
217
- * @public
218
- */
219
- ConnectionChecker.prototype.doDragChecks = function(a, b, distance) {
220
- if (a.distanceFrom(b) > distance) {
197
+ // Find any intersection in the check lists.
198
+ for (let i = 0; i < checkArrayOne.length; i++) {
199
+ if (checkArrayTwo.indexOf(checkArrayOne[i]) !== -1) {
200
+ return true;
201
+ }
202
+ }
203
+ // No intersection.
221
204
  return false;
222
205
  }
223
206
 
224
- // Don't consider insertion markers.
225
- if (b.getSourceBlock().isInsertionMarker()) {
226
- return false;
227
- }
207
+ /**
208
+ * Check whether this connection can be made by dragging.
209
+ * @param {!RenderedConnection} a Connection to compare.
210
+ * @param {!RenderedConnection} b Connection to compare against.
211
+ * @param {number} distance The maximum allowable distance between
212
+ * connections.
213
+ * @return {boolean} True if the connection is allowed during a drag.
214
+ * @public
215
+ */
216
+ doDragChecks(a, b, distance) {
217
+ if (a.distanceFrom(b) > distance) {
218
+ return false;
219
+ }
228
220
 
229
- switch (b.type) {
230
- case ConnectionType.PREVIOUS_STATEMENT:
231
- return this.canConnectToPrevious_(a, b);
232
- case ConnectionType.OUTPUT_VALUE: {
233
- // Don't offer to connect an already connected left (male) value plug to
234
- // an available right (female) value plug.
235
- if ((b.isConnected() && !b.targetBlock().isInsertionMarker()) ||
236
- a.isConnected()) {
237
- return false;
238
- }
239
- break;
221
+ // Don't consider insertion markers.
222
+ if (b.getSourceBlock().isInsertionMarker()) {
223
+ return false;
240
224
  }
241
- case ConnectionType.INPUT_VALUE: {
242
- // Offering to connect the left (male) of a value block to an already
243
- // connected value pair is ok, we'll splice it in.
244
- // However, don't offer to splice into an immovable block.
245
- if (b.isConnected() && !b.targetBlock().isMovable() &&
246
- !b.targetBlock().isShadow()) {
247
- return false;
225
+
226
+ switch (b.type) {
227
+ case ConnectionType.PREVIOUS_STATEMENT:
228
+ return this.canConnectToPrevious_(a, b);
229
+ case ConnectionType.OUTPUT_VALUE: {
230
+ // Don't offer to connect an already connected left (male) value plug to
231
+ // an available right (female) value plug.
232
+ if ((b.isConnected() && !b.targetBlock().isInsertionMarker()) ||
233
+ a.isConnected()) {
234
+ return false;
235
+ }
236
+ break;
248
237
  }
249
- break;
250
- }
251
- case ConnectionType.NEXT_STATEMENT: {
252
- // Don't let a block with no next connection bump other blocks out of the
253
- // stack. But covering up a shadow block or stack of shadow blocks is
254
- // fine. Similarly, replacing a terminal statement with another terminal
255
- // statement is allowed.
256
- if (b.isConnected() && !a.getSourceBlock().nextConnection &&
257
- !b.targetBlock().isShadow() && b.targetBlock().nextConnection) {
258
- return false;
238
+ case ConnectionType.INPUT_VALUE: {
239
+ // Offering to connect the left (male) of a value block to an already
240
+ // connected value pair is ok, we'll splice it in.
241
+ // However, don't offer to splice into an immovable block.
242
+ if (b.isConnected() && !b.targetBlock().isMovable() &&
243
+ !b.targetBlock().isShadow()) {
244
+ return false;
245
+ }
246
+ break;
247
+ }
248
+ case ConnectionType.NEXT_STATEMENT: {
249
+ // Don't let a block with no next connection bump other blocks out of
250
+ // the stack. But covering up a shadow block or stack of shadow blocks
251
+ // is fine. Similarly, replacing a terminal statement with another
252
+ // terminal statement is allowed.
253
+ if (b.isConnected() && !a.getSourceBlock().nextConnection &&
254
+ !b.targetBlock().isShadow() && b.targetBlock().nextConnection) {
255
+ return false;
256
+ }
257
+ break;
259
258
  }
260
- break;
259
+ default:
260
+ // Unexpected connection type.
261
+ return false;
261
262
  }
262
- default:
263
- // Unexpected connection type.
263
+
264
+ // Don't let blocks try to connect to themselves or ones they nest.
265
+ if (common.draggingConnections.indexOf(b) !== -1) {
264
266
  return false;
265
- }
267
+ }
266
268
 
267
- // Don't let blocks try to connect to themselves or ones they nest.
268
- if (common.draggingConnections.indexOf(b) !== -1) {
269
- return false;
269
+ return true;
270
270
  }
271
271
 
272
- return true;
273
- };
274
-
275
- /**
276
- * Helper function for drag checking.
277
- * @param {!Connection} a The connection to check, which must be a
278
- * statement input or next connection.
279
- * @param {!Connection} b A nearby connection to check, which
280
- * must be a previous connection.
281
- * @return {boolean} True if the connection is allowed, false otherwise.
282
- * @protected
283
- */
284
- ConnectionChecker.prototype.canConnectToPrevious_ = function(a, b) {
285
- if (a.targetConnection) {
286
- // This connection is already occupied.
287
- // A next connection will never disconnect itself mid-drag.
288
- return false;
289
- }
272
+ /**
273
+ * Helper function for drag checking.
274
+ * @param {!Connection} a The connection to check, which must be a
275
+ * statement input or next connection.
276
+ * @param {!Connection} b A nearby connection to check, which
277
+ * must be a previous connection.
278
+ * @return {boolean} True if the connection is allowed, false otherwise.
279
+ * @protected
280
+ */
281
+ canConnectToPrevious_(a, b) {
282
+ if (a.targetConnection) {
283
+ // This connection is already occupied.
284
+ // A next connection will never disconnect itself mid-drag.
285
+ return false;
286
+ }
290
287
 
291
- // Don't let blocks try to connect to themselves or ones they nest.
292
- if (common.draggingConnections.indexOf(b) !== -1) {
293
- return false;
294
- }
288
+ // Don't let blocks try to connect to themselves or ones they nest.
289
+ if (common.draggingConnections.indexOf(b) !== -1) {
290
+ return false;
291
+ }
295
292
 
296
- if (!b.targetConnection) {
297
- return true;
298
- }
293
+ if (!b.targetConnection) {
294
+ return true;
295
+ }
299
296
 
300
- const targetBlock = b.targetBlock();
301
- // If it is connected to a real block, game over.
302
- if (!targetBlock.isInsertionMarker()) {
303
- return false;
297
+ const targetBlock = b.targetBlock();
298
+ // If it is connected to a real block, game over.
299
+ if (!targetBlock.isInsertionMarker()) {
300
+ return false;
301
+ }
302
+ // If it's connected to an insertion marker but that insertion marker
303
+ // is the first block in a stack, it's still fine. If that insertion
304
+ // marker is in the middle of a stack, it won't work.
305
+ return !targetBlock.getPreviousBlock();
304
306
  }
305
- // If it's connected to an insertion marker but that insertion marker
306
- // is the first block in a stack, it's still fine. If that insertion
307
- // marker is in the middle of a stack, it won't work.
308
- return !targetBlock.getPreviousBlock();
309
- };
307
+ }
310
308
 
311
309
  registry.register(
312
310
  registry.Type.CONNECTION_CHECKER, registry.DEFAULT, ConnectionChecker);