opal 0.11.0.rc1 → 0.11.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 (493) hide show
  1. checksums.yaml +4 -4
  2. data/.jshintrc +1 -1
  3. data/.travis.yml +14 -2
  4. data/CHANGELOG.md +30 -5
  5. data/HACKING.md +2 -2
  6. data/README.md +4 -5
  7. data/appveyor.yml +3 -4
  8. data/bin +1 -0
  9. data/docs/headless_chrome.md +105 -0
  10. data/docs/rspec.md +2 -19
  11. data/{bin → exe}/opal +0 -0
  12. data/{bin → exe}/opal-build +0 -0
  13. data/{bin → exe}/opal-mspec +0 -0
  14. data/{bin → exe}/opal-repl +0 -0
  15. data/lib/opal.rb +1 -0
  16. data/lib/opal/ast/builder.rb +0 -4
  17. data/lib/opal/builder.rb +69 -15
  18. data/lib/opal/builder_processors.rb +8 -7
  19. data/lib/opal/cli.rb +1 -1
  20. data/lib/opal/cli_options.rb +1 -1
  21. data/lib/opal/cli_runners.rb +1 -1
  22. data/lib/opal/cli_runners/applescript.rb +0 -1
  23. data/lib/opal/cli_runners/chrome.js +135 -0
  24. data/lib/opal/cli_runners/chrome.rb +100 -0
  25. data/lib/opal/cli_runners/nashorn.rb +0 -1
  26. data/lib/opal/cli_runners/node_modules/.bin/chrome-remote-interface +1 -0
  27. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/LICENSE +18 -0
  28. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/README.md +843 -0
  29. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/bin/client.js +326 -0
  30. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/chrome-remote-interface.js +11 -0
  31. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/index.js +39 -0
  32. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/api.js +84 -0
  33. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/chrome.js +289 -0
  34. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/defaults.js +4 -0
  35. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/devtools.js +245 -0
  36. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/external-request.js +23 -0
  37. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/protocol.json +13303 -0
  38. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/websocket-wrapper.js +32 -0
  39. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/package.json +128 -0
  40. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/webpack.config.js +55 -0
  41. data/lib/opal/cli_runners/node_modules/commander/Readme.md +195 -0
  42. data/lib/opal/cli_runners/node_modules/commander/index.js +851 -0
  43. data/lib/opal/cli_runners/node_modules/commander/package.json +92 -0
  44. data/lib/opal/cli_runners/node_modules/ultron/LICENSE +22 -0
  45. data/lib/opal/cli_runners/node_modules/ultron/index.js +138 -0
  46. data/lib/opal/cli_runners/node_modules/ultron/package.json +112 -0
  47. data/lib/opal/cli_runners/node_modules/ws/LICENSE +21 -0
  48. data/lib/opal/cli_runners/node_modules/ws/README.md +259 -0
  49. data/lib/opal/cli_runners/node_modules/ws/SECURITY.md +33 -0
  50. data/lib/opal/cli_runners/node_modules/ws/index.js +15 -0
  51. data/lib/opal/cli_runners/node_modules/ws/lib/BufferUtil.fallback.js +56 -0
  52. data/lib/opal/cli_runners/node_modules/ws/lib/BufferUtil.js +15 -0
  53. data/lib/opal/cli_runners/node_modules/ws/lib/ErrorCodes.js +28 -0
  54. data/lib/opal/cli_runners/node_modules/ws/lib/EventTarget.js +158 -0
  55. data/lib/opal/cli_runners/node_modules/ws/lib/Extensions.js +69 -0
  56. data/lib/opal/cli_runners/node_modules/ws/lib/PerMessageDeflate.js +339 -0
  57. data/lib/opal/cli_runners/node_modules/ws/lib/Receiver.js +520 -0
  58. data/lib/opal/cli_runners/node_modules/ws/lib/Sender.js +438 -0
  59. data/lib/opal/cli_runners/node_modules/ws/lib/Validation.fallback.js +9 -0
  60. data/lib/opal/cli_runners/node_modules/ws/lib/Validation.js +17 -0
  61. data/lib/opal/cli_runners/node_modules/ws/lib/WebSocket.js +705 -0
  62. data/lib/opal/cli_runners/node_modules/ws/lib/WebSocketServer.js +336 -0
  63. data/lib/opal/cli_runners/node_modules/ws/package.json +122 -0
  64. data/lib/opal/cli_runners/nodejs.rb +0 -1
  65. data/lib/opal/cli_runners/package.json +5 -0
  66. data/lib/opal/cli_runners/server.rb +0 -1
  67. data/lib/opal/compiler.rb +8 -18
  68. data/lib/opal/deprecations.rb +1 -1
  69. data/lib/opal/eof_content.rb +36 -0
  70. data/lib/opal/nodes.rb +0 -1
  71. data/lib/opal/nodes/args/kwarg.rb +8 -6
  72. data/lib/opal/nodes/args/kwoptarg.rb +12 -6
  73. data/lib/opal/nodes/call.rb +3 -2
  74. data/lib/opal/nodes/call_special.rb +10 -1
  75. data/lib/opal/nodes/definitions.rb +5 -3
  76. data/lib/opal/nodes/helpers.rb +4 -8
  77. data/lib/opal/nodes/literal.rb +13 -1
  78. data/lib/opal/nodes/logic.rb +19 -32
  79. data/lib/opal/nodes/node_with_args.rb +1 -1
  80. data/lib/opal/nodes/scope.rb +1 -0
  81. data/lib/opal/nodes/super.rb +0 -4
  82. data/lib/opal/nodes/variables.rb +11 -0
  83. data/lib/opal/parser.rb +24 -19
  84. data/lib/opal/path_reader.rb +17 -4
  85. data/lib/opal/rewriter.rb +5 -1
  86. data/lib/opal/rewriters/base.rb +37 -34
  87. data/lib/opal/rewriters/binary_operator_assignment.rb +0 -3
  88. data/lib/opal/rewriters/for_rewriter.rb +93 -0
  89. data/lib/opal/rewriters/hashes/key_duplicates_rewriter.rb +58 -0
  90. data/lib/opal/rewriters/js_reserved_words.rb +5 -8
  91. data/lib/opal/rewriters/logical_operator_assignment.rb +0 -1
  92. data/lib/opal/simple_server.rb +1 -0
  93. data/lib/opal/util.rb +1 -1
  94. data/lib/opal/version.rb +1 -1
  95. data/opal.gemspec +32 -30
  96. data/opal/corelib/array.rb +53 -30
  97. data/opal/corelib/boolean.rb +11 -3
  98. data/opal/corelib/comparable.rb +16 -0
  99. data/opal/corelib/constants.rb +3 -3
  100. data/opal/corelib/enumerable.rb +48 -1
  101. data/opal/corelib/file.rb +54 -11
  102. data/opal/corelib/hash.rb +98 -0
  103. data/opal/corelib/io.rb +2 -2
  104. data/opal/corelib/kernel.rb +28 -11
  105. data/opal/corelib/marshal/read_buffer.rb +288 -150
  106. data/opal/corelib/marshal/write_buffer.rb +27 -2
  107. data/opal/corelib/nil.rb +11 -3
  108. data/opal/corelib/number.rb +90 -20
  109. data/opal/corelib/numeric.rb +3 -3
  110. data/opal/corelib/random.rb +1 -1
  111. data/opal/corelib/range.rb +22 -22
  112. data/opal/corelib/regexp.rb +45 -4
  113. data/opal/corelib/runtime.js +25 -9
  114. data/opal/corelib/string.rb +1 -1
  115. data/opal/corelib/string/encoding.rb +21 -29
  116. data/opal/corelib/string/inheritance.rb +1 -1
  117. data/opal/corelib/struct.rb +0 -5
  118. data/opal/corelib/time.rb +1 -1
  119. data/stdlib/buffer/array.rb +4 -2
  120. data/stdlib/date.rb +46 -12
  121. data/stdlib/headless_chrome.rb +11 -0
  122. data/stdlib/nodejs/file.rb +36 -11
  123. data/stdlib/nodejs/io.rb +8 -0
  124. data/stdlib/nodejs/stacktrace.rb +116 -100
  125. data/stdlib/opal-builder.rb +1 -0
  126. data/stdlib/opal-platform.rb +6 -6
  127. data/stdlib/opal/platform.rb +2 -2
  128. data/stdlib/rbconfig.rb +1 -1
  129. data/stdlib/securerandom.rb +1 -1
  130. data/tasks/testing.rake +58 -26
  131. data/tasks/testing/opal_rspec_smoketest.Gemfile +5 -12
  132. metadata +64 -733
  133. data/lib/opal/cli_runners/phantom.js +0 -69
  134. data/lib/opal/cli_runners/phantomjs.rb +0 -29
  135. data/lib/opal/hike_path_finder.rb +0 -19
  136. data/lib/opal/nodes/for.rb +0 -75
  137. data/spec/README.md +0 -10
  138. data/spec/filters/bugs/array.rb +0 -16
  139. data/spec/filters/bugs/basicobject.rb +0 -13
  140. data/spec/filters/bugs/bigdecimal.rb +0 -146
  141. data/spec/filters/bugs/class.rb +0 -11
  142. data/spec/filters/bugs/comparable.rb +0 -5
  143. data/spec/filters/bugs/complex.rb +0 -3
  144. data/spec/filters/bugs/date.rb +0 -94
  145. data/spec/filters/bugs/enumerable.rb +0 -43
  146. data/spec/filters/bugs/enumerator.rb +0 -40
  147. data/spec/filters/bugs/exception.rb +0 -72
  148. data/spec/filters/bugs/file.rb +0 -8
  149. data/spec/filters/bugs/float.rb +0 -39
  150. data/spec/filters/bugs/hash.rb +0 -15
  151. data/spec/filters/bugs/inheritance.rb +0 -5
  152. data/spec/filters/bugs/integer.rb +0 -30
  153. data/spec/filters/bugs/io.rb +0 -8
  154. data/spec/filters/bugs/kernel.rb +0 -168
  155. data/spec/filters/bugs/language.rb +0 -190
  156. data/spec/filters/bugs/marshal.rb +0 -41
  157. data/spec/filters/bugs/method.rb +0 -60
  158. data/spec/filters/bugs/module.rb +0 -158
  159. data/spec/filters/bugs/numeric.rb +0 -8
  160. data/spec/filters/bugs/pathname.rb +0 -7
  161. data/spec/filters/bugs/proc.rb +0 -37
  162. data/spec/filters/bugs/random.rb +0 -7
  163. data/spec/filters/bugs/range.rb +0 -36
  164. data/spec/filters/bugs/rational.rb +0 -4
  165. data/spec/filters/bugs/regexp.rb +0 -158
  166. data/spec/filters/bugs/set.rb +0 -41
  167. data/spec/filters/bugs/singleton.rb +0 -6
  168. data/spec/filters/bugs/string.rb +0 -98
  169. data/spec/filters/bugs/stringscanner.rb +0 -71
  170. data/spec/filters/bugs/struct.rb +0 -4
  171. data/spec/filters/bugs/time.rb +0 -35
  172. data/spec/filters/bugs/unboundmethod.rb +0 -17
  173. data/spec/filters/unsupported/array.rb +0 -167
  174. data/spec/filters/unsupported/basicobject.rb +0 -14
  175. data/spec/filters/unsupported/bignum.rb +0 -55
  176. data/spec/filters/unsupported/class.rb +0 -4
  177. data/spec/filters/unsupported/delegator.rb +0 -5
  178. data/spec/filters/unsupported/enumerable.rb +0 -11
  179. data/spec/filters/unsupported/enumerator.rb +0 -13
  180. data/spec/filters/unsupported/file.rb +0 -4
  181. data/spec/filters/unsupported/fixnum.rb +0 -14
  182. data/spec/filters/unsupported/float.rb +0 -46
  183. data/spec/filters/unsupported/freeze.rb +0 -75
  184. data/spec/filters/unsupported/hash.rb +0 -43
  185. data/spec/filters/unsupported/integer.rb +0 -3
  186. data/spec/filters/unsupported/kernel.rb +0 -32
  187. data/spec/filters/unsupported/language.rb +0 -22
  188. data/spec/filters/unsupported/marshal.rb +0 -46
  189. data/spec/filters/unsupported/matchdata.rb +0 -33
  190. data/spec/filters/unsupported/math.rb +0 -3
  191. data/spec/filters/unsupported/pathname.rb +0 -3
  192. data/spec/filters/unsupported/privacy.rb +0 -279
  193. data/spec/filters/unsupported/proc.rb +0 -3
  194. data/spec/filters/unsupported/random.rb +0 -4
  195. data/spec/filters/unsupported/range.rb +0 -7
  196. data/spec/filters/unsupported/regexp.rb +0 -69
  197. data/spec/filters/unsupported/set.rb +0 -4
  198. data/spec/filters/unsupported/singleton.rb +0 -6
  199. data/spec/filters/unsupported/string.rb +0 -546
  200. data/spec/filters/unsupported/struct.rb +0 -6
  201. data/spec/filters/unsupported/symbol.rb +0 -20
  202. data/spec/filters/unsupported/taint.rb +0 -30
  203. data/spec/filters/unsupported/thread.rb +0 -7
  204. data/spec/filters/unsupported/time.rb +0 -202
  205. data/spec/lib/builder_processors_spec.rb +0 -27
  206. data/spec/lib/builder_spec.rb +0 -89
  207. data/spec/lib/cli_runners/phantomjs_spec.rb +0 -39
  208. data/spec/lib/cli_spec.rb +0 -240
  209. data/spec/lib/compiler/call_spec.rb +0 -732
  210. data/spec/lib/compiler_spec.rb +0 -294
  211. data/spec/lib/config_spec.rb +0 -110
  212. data/spec/lib/dependency_resolver_spec.rb +0 -40
  213. data/spec/lib/deprecations_spec.rb +0 -16
  214. data/spec/lib/fixtures/complex_sprockets.js.rb.erb +0 -4
  215. data/spec/lib/fixtures/file_with_directives.js +0 -2
  216. data/spec/lib/fixtures/jst_file.js.jst +0 -1
  217. data/spec/lib/fixtures/no_requires.rb +0 -1
  218. data/spec/lib/fixtures/opal_file.rb +0 -2
  219. data/spec/lib/fixtures/require_tree_test.rb +0 -3
  220. data/spec/lib/fixtures/required_file.js +0 -1
  221. data/spec/lib/fixtures/required_tree_test/required_file1.rb +0 -1
  222. data/spec/lib/fixtures/required_tree_test/required_file2.rb +0 -1
  223. data/spec/lib/fixtures/requires.rb +0 -7
  224. data/spec/lib/fixtures/source_location_test.rb +0 -7
  225. data/spec/lib/fixtures/source_map.rb +0 -1
  226. data/spec/lib/fixtures/source_map/subfolder/other_file.rb +0 -1
  227. data/spec/lib/fixtures/sprockets_file.js.rb +0 -3
  228. data/spec/lib/fixtures/sprockets_require_tree_test.rb +0 -3
  229. data/spec/lib/hike_path_finder_spec.rb +0 -23
  230. data/spec/lib/path_reader_spec.rb +0 -36
  231. data/spec/lib/paths_spec.rb +0 -18
  232. data/spec/lib/rewriters/binary_operator_assignment_spec.rb +0 -151
  233. data/spec/lib/rewriters/block_to_iter_spec.rb +0 -28
  234. data/spec/lib/rewriters/dot_js_syntax_spec.rb +0 -108
  235. data/spec/lib/rewriters/explicit_writer_return_spec.rb +0 -186
  236. data/spec/lib/rewriters/js_reserved_words_spec.rb +0 -116
  237. data/spec/lib/rewriters/logical_operator_assignment_spec.rb +0 -202
  238. data/spec/lib/rewriters/opal_engine_check_spec.rb +0 -82
  239. data/spec/lib/rewriters/rubyspec/filters_rewriter_spec.rb +0 -53
  240. data/spec/lib/shared/path_finder_shared.rb +0 -19
  241. data/spec/lib/shared/path_reader_shared.rb +0 -31
  242. data/spec/lib/simple_server_spec.rb +0 -54
  243. data/spec/lib/spec_helper.rb +0 -100
  244. data/spec/mspec-opal/formatters.rb +0 -236
  245. data/spec/mspec-opal/runner.rb +0 -173
  246. data/spec/opal/compiler/irb_spec.rb +0 -44
  247. data/spec/opal/core/arity_spec.rb +0 -142
  248. data/spec/opal/core/array/intersection_spec.rb +0 -38
  249. data/spec/opal/core/array/minus_spec.rb +0 -38
  250. data/spec/opal/core/array/select_spec.rb +0 -14
  251. data/spec/opal/core/array/set_range_to_array_spec.rb +0 -7
  252. data/spec/opal/core/array/union_spec.rb +0 -38
  253. data/spec/opal/core/array/uniq_spec.rb +0 -49
  254. data/spec/opal/core/date_spec.rb +0 -191
  255. data/spec/opal/core/enumerable/all_break_spec.rb +0 -5
  256. data/spec/opal/core/enumerable/any_break_spec.rb +0 -5
  257. data/spec/opal/core/enumerable/collect_break_spec.rb +0 -13
  258. data/spec/opal/core/enumerable/count_break_spec.rb +0 -5
  259. data/spec/opal/core/enumerable/detect_break_spec.rb +0 -5
  260. data/spec/opal/core/enumerable/drop_while_break_spec.rb +0 -5
  261. data/spec/opal/core/enumerable/each_slice_break.rb +0 -6
  262. data/spec/opal/core/enumerable/each_with_index_break_spec.rb +0 -5
  263. data/spec/opal/core/enumerable/each_with_object_break_spec.rb +0 -5
  264. data/spec/opal/core/enumerable/find_all_break_spec.rb +0 -5
  265. data/spec/opal/core/enumerable/find_index_break_spec.rb +0 -5
  266. data/spec/opal/core/enumerable/grep_break_spec.rb +0 -5
  267. data/spec/opal/core/enumerable/max_break_spec.rb +0 -5
  268. data/spec/opal/core/enumerable/max_by_break_spec.rb +0 -5
  269. data/spec/opal/core/enumerable/min_break_spec.rb +0 -5
  270. data/spec/opal/core/enumerable/min_by_break_spec.rb +0 -5
  271. data/spec/opal/core/enumerable/none_break_spec.rb +0 -5
  272. data/spec/opal/core/enumerable/one_break_spec.rb +0 -5
  273. data/spec/opal/core/enumerable/reduce_break_spec.rb +0 -5
  274. data/spec/opal/core/enumerable/take_while_break_spec.rb +0 -5
  275. data/spec/opal/core/enumerator/with_index_spec.rb +0 -6
  276. data/spec/opal/core/exception_spec.rb +0 -30
  277. data/spec/opal/core/fixtures/class.rb +0 -124
  278. data/spec/opal/core/fixtures/class_variables.rb +0 -0
  279. data/spec/opal/core/fixtures/constants.rb +0 -33
  280. data/spec/opal/core/fixtures/require_tree_files/file 1.rb +0 -1
  281. data/spec/opal/core/fixtures/require_tree_files/file 2.rb +0 -1
  282. data/spec/opal/core/fixtures/require_tree_files/file 3.rb +0 -1
  283. data/spec/opal/core/fixtures/require_tree_files/file 4.rb +0 -1
  284. data/spec/opal/core/fixtures/require_tree_files/file 5.rb +0 -1
  285. data/spec/opal/core/fixtures/require_tree_files/nested/nested 1.rb +0 -1
  286. data/spec/opal/core/fixtures/require_tree_files/nested/nested 2.rb +0 -1
  287. data/spec/opal/core/fixtures/require_tree_files/other/other 1.rb +0 -1
  288. data/spec/opal/core/fixtures/require_tree_with_dot/file 1.rb +0 -1
  289. data/spec/opal/core/fixtures/require_tree_with_dot/file 2.rb +0 -1
  290. data/spec/opal/core/fixtures/require_tree_with_dot/file 3.rb +0 -1
  291. data/spec/opal/core/fixtures/require_tree_with_dot/index.rb +0 -3
  292. data/spec/opal/core/hash/has_value_spec.rb +0 -13
  293. data/spec/opal/core/hash/internals_spec.rb +0 -332
  294. data/spec/opal/core/helpers_spec.rb +0 -14
  295. data/spec/opal/core/kernel/Array_spec.rb +0 -10
  296. data/spec/opal/core/kernel/at_exit_spec.rb +0 -70
  297. data/spec/opal/core/kernel/block_given_spec.rb +0 -30
  298. data/spec/opal/core/kernel/class_spec.rb +0 -6
  299. data/spec/opal/core/kernel/define_singleton_method_spec.rb +0 -21
  300. data/spec/opal/core/kernel/equal_value_spec.rb +0 -12
  301. data/spec/opal/core/kernel/extend_spec.rb +0 -21
  302. data/spec/opal/core/kernel/format_spec.rb +0 -122
  303. data/spec/opal/core/kernel/freeze_spec.rb +0 -15
  304. data/spec/opal/core/kernel/instance_eval_spec.rb +0 -28
  305. data/spec/opal/core/kernel/instance_variable_defined_spec.rb +0 -15
  306. data/spec/opal/core/kernel/instance_variable_get_spec.rb +0 -14
  307. data/spec/opal/core/kernel/instance_variable_set_spec.rb +0 -10
  308. data/spec/opal/core/kernel/instance_variables_spec.rb +0 -110
  309. data/spec/opal/core/kernel/loop_spec.rb +0 -23
  310. data/spec/opal/core/kernel/match_spec.rb +0 -5
  311. data/spec/opal/core/kernel/method_spec.rb +0 -31
  312. data/spec/opal/core/kernel/methods_spec.rb +0 -25
  313. data/spec/opal/core/kernel/nil_spec.rb +0 -7
  314. data/spec/opal/core/kernel/p_spec.rb +0 -15
  315. data/spec/opal/core/kernel/printf_spec.rb +0 -11
  316. data/spec/opal/core/kernel/proc_spec.rb +0 -13
  317. data/spec/opal/core/kernel/raise_spec.rb +0 -13
  318. data/spec/opal/core/kernel/rand_spec.rb +0 -19
  319. data/spec/opal/core/kernel/require_tree_spec.rb +0 -18
  320. data/spec/opal/core/kernel/respond_to_spec.rb +0 -44
  321. data/spec/opal/core/kernel/send_spec.rb +0 -56
  322. data/spec/opal/core/kernel/sprintf_spec.rb +0 -5
  323. data/spec/opal/core/language/arguments/mlhs_arg_spec.rb +0 -19
  324. data/spec/opal/core/language/class_spec.rb +0 -55
  325. data/spec/opal/core/language/constant_lookup_spec.rb +0 -38
  326. data/spec/opal/core/language/equal_spec.rb +0 -8
  327. data/spec/opal/core/language/fixtures/array.rb +0 -11
  328. data/spec/opal/core/language/fixtures/block.rb +0 -57
  329. data/spec/opal/core/language/fixtures/break.rb +0 -240
  330. data/spec/opal/core/language/fixtures/ensure.rb +0 -72
  331. data/spec/opal/core/language/fixtures/literal_lambda.rb +0 -7
  332. data/spec/opal/core/language/fixtures/metaclass.rb +0 -33
  333. data/spec/opal/core/language/fixtures/module.rb +0 -24
  334. data/spec/opal/core/language/fixtures/next.rb +0 -128
  335. data/spec/opal/core/language/fixtures/return.rb +0 -118
  336. data/spec/opal/core/language/fixtures/send.rb +0 -111
  337. data/spec/opal/core/language/fixtures/send_1.9.rb +0 -22
  338. data/spec/opal/core/language/fixtures/super.rb +0 -308
  339. data/spec/opal/core/language/fixtures/variables.rb +0 -58
  340. data/spec/opal/core/language/fixtures/yield.rb +0 -28
  341. data/spec/opal/core/language/heredoc_spec.rb +0 -42
  342. data/spec/opal/core/language/keyword_arguments_spec.rb +0 -11
  343. data/spec/opal/core/language/predefined_spec.rb +0 -138
  344. data/spec/opal/core/language/regexp_spec.rb +0 -20
  345. data/spec/opal/core/language/rescue_spec.rb +0 -18
  346. data/spec/opal/core/language/safe_navigator_spec.rb +0 -7
  347. data/spec/opal/core/language/send_spec.rb +0 -222
  348. data/spec/opal/core/language/string_spec.rb +0 -44
  349. data/spec/opal/core/language/ternary_operator_spec.rb +0 -20
  350. data/spec/opal/core/language/versions/array_1.9.rb +0 -39
  351. data/spec/opal/core/language/versions/block_1.9.rb +0 -0
  352. data/spec/opal/core/language/versions/break_1.9.rb +0 -0
  353. data/spec/opal/core/language/versions/case_1.9.rb +0 -20
  354. data/spec/opal/core/language/versions/def_2_0_spec.rb +0 -58
  355. data/spec/opal/core/language/versions/hash_1_9_spec.rb +0 -23
  356. data/spec/opal/core/language/versions/literal_lambda_1.9.rb +0 -143
  357. data/spec/opal/core/language/versions/not_1.9.rb +0 -22
  358. data/spec/opal/core/language/versions/send_1.9.rb +0 -241
  359. data/spec/opal/core/language/versions/symbol_1.9.rb +0 -15
  360. data/spec/opal/core/language/versions/variables_1.9.rb +0 -8
  361. data/spec/opal/core/language_spec.rb +0 -77
  362. data/spec/opal/core/marshal/dump_spec.rb +0 -53
  363. data/spec/opal/core/marshal/load_spec.rb +0 -7
  364. data/spec/opal/core/method/to_proc_spec.rb +0 -28
  365. data/spec/opal/core/module/alias_method_spec.rb +0 -28
  366. data/spec/opal/core/module/ancestors_spec.rb +0 -11
  367. data/spec/opal/core/module/append_features_spec.rb +0 -14
  368. data/spec/opal/core/module/attr_accessor_spec.rb +0 -26
  369. data/spec/opal/core/module/const_defined_spec.rb +0 -84
  370. data/spec/opal/core/module/const_get_spec.rb +0 -85
  371. data/spec/opal/core/module/const_missing_spec.rb +0 -17
  372. data/spec/opal/core/module/const_set_spec.rb +0 -64
  373. data/spec/opal/core/module/constants_spec.rb +0 -49
  374. data/spec/opal/core/module/fixtures/classes.rb +0 -444
  375. data/spec/opal/core/module/method_defined_spec.rb +0 -48
  376. data/spec/opal/core/module/method_lookup_spec.rb +0 -13
  377. data/spec/opal/core/module/module_function_spec.rb +0 -25
  378. data/spec/opal/core/module/name_spec.rb +0 -41
  379. data/spec/opal/core/module/public_method_defined_spec.rb +0 -18
  380. data/spec/opal/core/module/remove_const_spec.rb +0 -22
  381. data/spec/opal/core/module/undef_method_spec.rb +0 -66
  382. data/spec/opal/core/numeric/bit_and_spec.rb +0 -7
  383. data/spec/opal/core/numeric/bit_or_spec.rb +0 -8
  384. data/spec/opal/core/numeric/bit_xor_spec.rb +0 -6
  385. data/spec/opal/core/numeric/ceil_spec.rb +0 -8
  386. data/spec/opal/core/numeric/chr_spec.rb +0 -8
  387. data/spec/opal/core/numeric/comparison_spec.rb +0 -24
  388. data/spec/opal/core/numeric/complement_spec.rb +0 -8
  389. data/spec/opal/core/numeric/divide_spec.rb +0 -10
  390. data/spec/opal/core/numeric/eql_spec.rb +0 -9
  391. data/spec/opal/core/numeric/exponent_spec.rb +0 -33
  392. data/spec/opal/core/numeric/floor_spec.rb +0 -8
  393. data/spec/opal/core/numeric/gt_spec.rb +0 -11
  394. data/spec/opal/core/numeric/gte_spec.rb +0 -12
  395. data/spec/opal/core/numeric/integer_spec.rb +0 -9
  396. data/spec/opal/core/numeric/left_shift_spec.rb +0 -21
  397. data/spec/opal/core/numeric/lt_spec.rb +0 -11
  398. data/spec/opal/core/numeric/lte_spec.rb +0 -12
  399. data/spec/opal/core/numeric/minus_spec.rb +0 -8
  400. data/spec/opal/core/numeric/modulo_spec.rb +0 -19
  401. data/spec/opal/core/numeric/multiply_spec.rb +0 -9
  402. data/spec/opal/core/numeric/next_spec.rb +0 -9
  403. data/spec/opal/core/numeric/ord_spec.rb +0 -9
  404. data/spec/opal/core/numeric/plus_spec.rb +0 -8
  405. data/spec/opal/core/numeric/pred_spec.rb +0 -7
  406. data/spec/opal/core/numeric/right_shift_spec.rb +0 -25
  407. data/spec/opal/core/numeric/step_spec.rb +0 -11
  408. data/spec/opal/core/numeric/succ_spec.rb +0 -9
  409. data/spec/opal/core/numeric/times_spec.rb +0 -36
  410. data/spec/opal/core/numeric/to_f_spec.rb +0 -7
  411. data/spec/opal/core/numeric/to_i_spec.rb +0 -7
  412. data/spec/opal/core/numeric/to_json_spec.rb +0 -8
  413. data/spec/opal/core/numeric/to_s_spec.rb +0 -26
  414. data/spec/opal/core/numeric/uminus_spec.rb +0 -9
  415. data/spec/opal/core/numeric/upto_spec.rb +0 -19
  416. data/spec/opal/core/numeric/zero_spec.rb +0 -7
  417. data/spec/opal/core/object_id_spec.rb +0 -56
  418. data/spec/opal/core/proc/call_spec.rb +0 -21
  419. data/spec/opal/core/proc/element_reference_spec.rb +0 -21
  420. data/spec/opal/core/proc/proc_tricks_spec.rb +0 -7
  421. data/spec/opal/core/runtime/begin_spec.rb +0 -39
  422. data/spec/opal/core/runtime/block_spec.rb +0 -23
  423. data/spec/opal/core/runtime/bridged_classes_spec.rb +0 -123
  424. data/spec/opal/core/runtime/constants_spec.rb +0 -13
  425. data/spec/opal/core/runtime/donate_spec.rb +0 -53
  426. data/spec/opal/core/runtime/eval_spec.rb +0 -5
  427. data/spec/opal/core/runtime/is_a_spec.rb +0 -36
  428. data/spec/opal/core/runtime/main_methods_spec.rb +0 -27
  429. data/spec/opal/core/runtime/method_missing_spec.rb +0 -68
  430. data/spec/opal/core/runtime/method_spec.rb +0 -31
  431. data/spec/opal/core/runtime/operator_call_spec.rb +0 -13
  432. data/spec/opal/core/runtime/paren_spec.rb +0 -14
  433. data/spec/opal/core/runtime/rescue_spec.rb +0 -106
  434. data/spec/opal/core/runtime/return_spec.rb +0 -38
  435. data/spec/opal/core/runtime/singleton_class_spec.rb +0 -13
  436. data/spec/opal/core/runtime/super_spec.rb +0 -223
  437. data/spec/opal/core/runtime/truthy_spec.rb +0 -63
  438. data/spec/opal/core/runtime/variables_spec.rb +0 -20
  439. data/spec/opal/core/runtime_spec.rb +0 -58
  440. data/spec/opal/core/source_map_spec.rb +0 -49
  441. data/spec/opal/core/string_spec.rb +0 -32
  442. data/spec/opal/core/time_spec.rb +0 -38
  443. data/spec/opal/javascript_api_spec.rb +0 -16
  444. data/spec/opal/stdlib/erb/erb_spec.rb +0 -30
  445. data/spec/opal/stdlib/erb/inline_block.opalerb +0 -3
  446. data/spec/opal/stdlib/erb/quoted.opalerb +0 -1
  447. data/spec/opal/stdlib/erb/simple.opalerb +0 -1
  448. data/spec/opal/stdlib/js_spec.rb +0 -66
  449. data/spec/opal/stdlib/json/ext_spec.rb +0 -48
  450. data/spec/opal/stdlib/json/parse_spec.rb +0 -37
  451. data/spec/opal/stdlib/native/alias_native_spec.rb +0 -27
  452. data/spec/opal/stdlib/native/array_spec.rb +0 -11
  453. data/spec/opal/stdlib/native/each_spec.rb +0 -13
  454. data/spec/opal/stdlib/native/element_reference_spec.rb +0 -16
  455. data/spec/opal/stdlib/native/exposure_spec.rb +0 -33
  456. data/spec/opal/stdlib/native/ext_spec.rb +0 -19
  457. data/spec/opal/stdlib/native/hash_spec.rb +0 -67
  458. data/spec/opal/stdlib/native/initialize_spec.rb +0 -17
  459. data/spec/opal/stdlib/native/method_missing_spec.rb +0 -51
  460. data/spec/opal/stdlib/native/native_alias_spec.rb +0 -19
  461. data/spec/opal/stdlib/native/native_class_spec.rb +0 -18
  462. data/spec/opal/stdlib/native/native_module_spec.rb +0 -13
  463. data/spec/opal/stdlib/native/native_reader_spec.rb +0 -22
  464. data/spec/opal/stdlib/native/native_writer_spec.rb +0 -30
  465. data/spec/opal/stdlib/native/new_spec.rb +0 -92
  466. data/spec/opal/stdlib/native/struct_spec.rb +0 -12
  467. data/spec/opal/stdlib/promise/always_spec.rb +0 -49
  468. data/spec/opal/stdlib/promise/error_spec.rb +0 -15
  469. data/spec/opal/stdlib/promise/rescue_spec.rb +0 -53
  470. data/spec/opal/stdlib/promise/then_spec.rb +0 -79
  471. data/spec/opal/stdlib/promise/trace_spec.rb +0 -51
  472. data/spec/opal/stdlib/promise/value_spec.rb +0 -15
  473. data/spec/opal/stdlib/promise/when_spec.rb +0 -34
  474. data/spec/opal/stdlib/source_map_spec.rb +0 -8
  475. data/spec/opal/stdlib/strscan/scan_spec.rb +0 -11
  476. data/spec/opal/stdlib/template/paths_spec.rb +0 -10
  477. data/spec/opal/stdlib/thread/mutex_spec.rb +0 -40
  478. data/spec/opal/stdlib/thread/thread_queue_spec.rb +0 -32
  479. data/spec/opal/stdlib/thread/thread_spec.rb +0 -60
  480. data/spec/ruby_specs +0 -122
  481. data/spec/spec_helper.rb +0 -27
  482. data/spec/support/match_helpers.rb +0 -57
  483. data/spec/support/mspec_rspec_adapter.rb +0 -33
  484. data/spec/support/rewriters_helper.rb +0 -24
  485. data/stdlib/phantomjs.rb +0 -17
  486. data/tasks/testing/sprockets-phantomjs.js +0 -54
  487. data/test/nodejs/fixtures/hello.rb +0 -1
  488. data/test/nodejs/test_dir.rb +0 -17
  489. data/test/nodejs/test_file.rb +0 -87
  490. data/test/nodejs/test_io.rb +0 -18
  491. data/test/nodejs/test_opal_builder.rb +0 -12
  492. data/test/opal/test_keyword.rb +0 -590
  493. data/test/opal/unsupported_and_bugs.rb +0 -39
@@ -0,0 +1,289 @@
1
+ 'use strict';
2
+
3
+ const EventEmitter = require('events');
4
+ const util = require('util');
5
+
6
+ const WebSocket = require('ws');
7
+
8
+ const api = require('./api');
9
+ const defaults = require('./defaults');
10
+ const devtools = require('./devtools');
11
+
12
+ class ProtocolError extends Error {
13
+ constructor(response) {
14
+ super(response.message);
15
+ Object.assign(this, response);
16
+ }
17
+ }
18
+
19
+ class Chrome extends EventEmitter {
20
+ constructor(options, notifier) {
21
+ super();
22
+ // options
23
+ const defaultTarget = function (targets) {
24
+ // prefer type = 'page' inspectabe targets as they represents
25
+ // browser tabs (fall back to the first instectable target
26
+ // otherwise)
27
+ let backup;
28
+ let target = targets.find((target) => {
29
+ if (target.webSocketDebuggerUrl) {
30
+ backup = backup || target;
31
+ return target.type === 'page';
32
+ } else {
33
+ return false;
34
+ }
35
+ });
36
+ target = target || backup;
37
+ if (target) {
38
+ return target;
39
+ } else {
40
+ throw new Error('No inspectable targets');
41
+ }
42
+ };
43
+ options = options || {};
44
+ this.host = options.host || defaults.HOST;
45
+ this.port = options.port || defaults.PORT;
46
+ this.secure = !!(options.secure);
47
+ this.protocol = options.protocol;
48
+ this.remote = !!(options.remote);
49
+ this.target = options.target ||
50
+ /* backward compatibility */ options.tab || options.chooseTab
51
+ || defaultTarget;
52
+ // locals
53
+ EventEmitter.call(this);
54
+ this._notifier = notifier;
55
+ this._callbacks = {};
56
+ this._nextCommandId = 1;
57
+ // operations
58
+ start.call(this);
59
+ }
60
+ }
61
+
62
+ // avoid misinterpreting protocol's members as custom util.inspect functions
63
+ Chrome.prototype.inspect = function (depth, options) {
64
+ options.customInspect = false;
65
+ return util.inspect(this, options);
66
+ };
67
+
68
+ Chrome.prototype.send = function (method, params, callback) {
69
+ const chrome = this;
70
+ if (typeof params === 'function') {
71
+ callback = params;
72
+ params = undefined;
73
+ }
74
+ // return a promise when a callback is not provided
75
+ if (typeof callback === 'function') {
76
+ enqueueCommand.call(chrome, method, params, callback);
77
+ } else {
78
+ return new Promise(function (fulfill, reject) {
79
+ enqueueCommand.call(chrome, method, params, function (error, response) {
80
+ if (error) {
81
+ reject(new ProtocolError(response));
82
+ } else {
83
+ fulfill(response);
84
+ }
85
+ });
86
+ });
87
+ }
88
+ };
89
+
90
+ Chrome.prototype.close = function (callback) {
91
+ const chrome = this;
92
+ function closeWebSocket(callback) {
93
+ // don't notify on user-initiated shutdown ('disconnect' event)
94
+ chrome._ws.removeAllListeners('close');
95
+ chrome._ws.close();
96
+ chrome._ws.once('close', function () {
97
+ chrome._ws.removeAllListeners();
98
+ callback();
99
+ });
100
+ }
101
+ if (typeof callback === 'function') {
102
+ closeWebSocket(callback);
103
+ } else {
104
+ return new Promise(function (fulfill, reject) {
105
+ closeWebSocket(fulfill);
106
+ });
107
+ }
108
+ };
109
+
110
+ // send a command to the remote endpoint and register a callback for the reply
111
+ function enqueueCommand(method, params, callback) {
112
+ const chrome = this;
113
+ const id = chrome._nextCommandId++;
114
+ const message = {'id': id, 'method': method, 'params': params || {}};
115
+ chrome._ws.send(JSON.stringify(message));
116
+ chrome._callbacks[id] = callback;
117
+ }
118
+
119
+ // initiate the connection process
120
+ function start() {
121
+ const chrome = this;
122
+ const options = {'host': chrome.host, 'port': chrome.port, 'secure': chrome.secure};
123
+ Promise.all([
124
+ // fetch the protocol and prepare the API
125
+ fetchProtocol.call(chrome, options).then(api.prepare.bind(chrome)),
126
+ // in the meanwhile fetch the WebSocket debugger URL
127
+ fetchDebuggerURL.call(chrome, options)
128
+ ]).then(function (values) {
129
+ // finally connect to the WebSocket
130
+ const url = values[1];
131
+ return connectToWebSocket.call(chrome, url);
132
+ }).then(function () {
133
+ // since the handler is executed synchronously, the emit() must be
134
+ // performed in the next tick so that uncaught errors in the client code
135
+ // are not intercepted by the Promise mechanism and therefore reported
136
+ // via the 'error' event
137
+ process.nextTick(function () {
138
+ chrome._notifier.emit('connect', chrome);
139
+ });
140
+ }).catch(function (err) {
141
+ chrome._notifier.emit('error', err);
142
+ });
143
+ }
144
+
145
+ // fetch the protocol according to 'protocol' and 'remote'
146
+ function fetchProtocol(options) {
147
+ const chrome = this;
148
+ return new Promise(function (fulfill, reject) {
149
+ // if a protocol has been provided then use it
150
+ if (chrome.protocol) {
151
+ fulfill(chrome.protocol);
152
+ }
153
+ // otherwise user either the local or the remote version
154
+ else {
155
+ options.remote = chrome.remote;
156
+ devtools.Protocol(options).then(function (protocol) {
157
+ fulfill(protocol.descriptor);
158
+ }).catch(reject);
159
+ }
160
+ });
161
+ }
162
+
163
+ // extract the debugger URL from a target-like object
164
+ function fetchFromObject(fulfill, reject, target) {
165
+ const url = (target || {}).webSocketDebuggerUrl;
166
+ if (url) {
167
+ fulfill(url);
168
+ } else {
169
+ const targetStr = JSON.stringify(target, null, 4);
170
+ const err = new Error('Invalid target ' + targetStr);
171
+ reject(err);
172
+ }
173
+ }
174
+
175
+ // fetch the WebSocket URL according to 'target'
176
+ function fetchDebuggerURL(options) {
177
+ const chrome = this;
178
+ return new Promise(function (fulfill, reject) {
179
+ // note: when DevTools are open or another WebSocket is connected to a
180
+ // given target the 'webSocketDebuggerUrl' field is not available
181
+ let userTarget = chrome.target;
182
+ switch (typeof userTarget) {
183
+ case 'string':
184
+ // use default host and port if omitted (and a relative URL is specified)
185
+ if (userTarget.startsWith('/')) {
186
+ const prefix = 'ws://' + chrome.host + ':' + chrome.port;
187
+ userTarget = prefix + userTarget;
188
+ }
189
+ // a WebSocket URL is specified by the user (e.g., node-inspector)
190
+ if (userTarget.match(/^wss?:/i)) {
191
+ fulfill(userTarget);
192
+ }
193
+ // a target id is specified by the user
194
+ else {
195
+ devtools.List(options).then(function (targets) {
196
+ return targets.find(function (target) {
197
+ return target.id === userTarget;
198
+ });
199
+ }).then(function (target) {
200
+ fetchFromObject(fulfill, reject, target);
201
+ }).catch(reject);
202
+ }
203
+ break;
204
+ case 'object':
205
+ // a target object is specified by the user
206
+ fetchFromObject(fulfill, reject, userTarget);
207
+ break;
208
+ case 'function':
209
+ // a function is specified by the user
210
+ devtools.List(options).then(function (targets) {
211
+ const result = userTarget(targets);
212
+ if (typeof result === 'number') {
213
+ return targets[result];
214
+ } else {
215
+ return result;
216
+ }
217
+ }).then(function (target) {
218
+ fetchFromObject(fulfill, reject, target);
219
+ }).catch(reject);
220
+ break;
221
+ default:
222
+ reject(new Error('Invalid target argument "' + chrome.target + '"'));
223
+ }
224
+ });
225
+ }
226
+
227
+ // establish the WebSocket connection and start processing user commands
228
+ function connectToWebSocket(url) {
229
+ const chrome = this;
230
+ return new Promise(function (fulfill, reject) {
231
+ // create the WebSocket
232
+ try {
233
+ if (chrome.secure) {
234
+ url = url.replace(/^ws:/i, 'wss:');
235
+ }
236
+ chrome._ws = new WebSocket(url);
237
+ } catch (err) {
238
+ // handles bad URLs
239
+ reject(err);
240
+ return;
241
+ }
242
+ // set up event handlers
243
+ chrome._ws.on('open', function () {
244
+ fulfill();
245
+ });
246
+ chrome._ws.on('message', function (data) {
247
+ const message = JSON.parse(data);
248
+ handleMessage.call(chrome, message);
249
+ });
250
+ chrome._ws.on('close', function (code) {
251
+ chrome.emit('disconnect');
252
+ });
253
+ chrome._ws.on('error', function (err) {
254
+ reject(err);
255
+ });
256
+ });
257
+ }
258
+
259
+ // handle the messages read from the WebSocket
260
+ function handleMessage(message) {
261
+ const chrome = this;
262
+ // command response
263
+ if (message.id) {
264
+ const callback = chrome._callbacks[message.id];
265
+ if (!callback) {
266
+ return;
267
+ }
268
+ // interpret the lack of both 'error' and 'result' as success
269
+ // (this may happen with node-inspector)
270
+ if (message.error) {
271
+ callback(true, message.error);
272
+ } else {
273
+ callback(false, message.result || {});
274
+ }
275
+ // unregister command response callback
276
+ delete chrome._callbacks[message.id];
277
+ // notify when there are no more pending commands
278
+ if (Object.keys(chrome._callbacks).length === 0) {
279
+ chrome.emit('ready');
280
+ }
281
+ }
282
+ // event
283
+ else if (message.method) {
284
+ chrome.emit('event', message);
285
+ chrome.emit(message.method, message.params);
286
+ }
287
+ }
288
+
289
+ module.exports = Chrome;
@@ -0,0 +1,4 @@
1
+ 'use strict';
2
+
3
+ module.exports.HOST = 'localhost';
4
+ module.exports.PORT = 9222;
@@ -0,0 +1,245 @@
1
+ 'use strict';
2
+
3
+ const http = require('http');
4
+ const https = require('https');
5
+
6
+ const defaults = require('./defaults');
7
+ const externalRequest = require('./external-request');
8
+
9
+ // callback(err, protocol)
10
+ module.exports.Protocol = promisesWrapper(function (options, callback) {
11
+ // if the local protocol is requested
12
+ if (!options.remote) {
13
+ const localDescriptor = require('./protocol.json');
14
+ callback(null, {
15
+ 'remote': false,
16
+ 'descriptor': localDescriptor
17
+ });
18
+ return;
19
+ }
20
+ // try to fecth the browser version information and the protocol (remotely)
21
+ module.exports.Version(options, function (err, info) {
22
+ if (err) {
23
+ callback(err);
24
+ return;
25
+ }
26
+ // fetch the reported browser info (Node.js returns an array)
27
+ const browser = (info[0] || info).Browser;
28
+ // use the proper protocol fetcher
29
+ let fetcher;
30
+ if (browser.match(/^(Headless)?Chrome\//)) {
31
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=538300#c10
32
+ const firstJsonProtocolVersion = '60.0.3097.0';
33
+ const firstJsonProtocolBuild = explodeChromeVersion(firstJsonProtocolVersion)[2];
34
+ const chromeBuild = explodeChromeVersion(info.Browser.split('/')[1])[2];
35
+ if (chromeBuild < firstJsonProtocolBuild) {
36
+ fetcher = fetchFromChromeRepo;
37
+ } else {
38
+ fetcher = fetchFromHttpEndpoint;
39
+ }
40
+ } else if (browser.match(/^Microsoft Edge /)) {
41
+ fetcher = fetchFromHttpEndpoint;
42
+ } else if (browser.match(/^node.js\//)) {
43
+ fetcher = fetchFromHttpEndpoint;
44
+ } else {
45
+ callback(new Error('Unknown implementation'));
46
+ return;
47
+ }
48
+ fetcher(options, info, function (err, descriptor) {
49
+ if (err) {
50
+ callback(err);
51
+ return;
52
+ }
53
+ // use the remotely fetched descriptor
54
+ callback(null, {
55
+ 'remote': true,
56
+ 'descriptor': descriptor
57
+ });
58
+ });
59
+ });
60
+ });
61
+
62
+ module.exports.List = promisesWrapper(function (options, callback) {
63
+ options.path = '/json/list';
64
+ devToolsInterface(options, function (err, tabs) {
65
+ if (err) {
66
+ callback(err);
67
+ } else {
68
+ callback(null, JSON.parse(tabs));
69
+ }
70
+ });
71
+ });
72
+
73
+ module.exports.New = promisesWrapper(function (options, callback) {
74
+ options.path = '/json/new';
75
+ if (Object.prototype.hasOwnProperty.call(options, 'url')) {
76
+ options.path += '?' + options.url;
77
+ }
78
+ devToolsInterface(options, function (err, tab) {
79
+ if (err) {
80
+ callback(err);
81
+ } else {
82
+ callback(null, JSON.parse(tab));
83
+ }
84
+ });
85
+ });
86
+
87
+ module.exports.Activate = promisesWrapper(function (options, callback) {
88
+ options.path = '/json/activate/' + options.id;
89
+ devToolsInterface(options, function (err) {
90
+ if (err) {
91
+ callback(err);
92
+ } else {
93
+ callback(null);
94
+ }
95
+ });
96
+ });
97
+
98
+ module.exports.Close = promisesWrapper(function (options, callback) {
99
+ options.path = '/json/close/' + options.id;
100
+ devToolsInterface(options, function (err) {
101
+ if (err) {
102
+ callback(err);
103
+ } else {
104
+ callback(null);
105
+ }
106
+ });
107
+ });
108
+
109
+ module.exports.Version = promisesWrapper(function (options, callback) {
110
+ options.path = '/json/version';
111
+ devToolsInterface(options, function (err, versionInfo) {
112
+ if (err) {
113
+ callback(err);
114
+ } else {
115
+ callback(null, JSON.parse(versionInfo));
116
+ }
117
+ });
118
+ });
119
+
120
+ // options.path must be specified; callback(err, data)
121
+ function devToolsInterface(options, callback) {
122
+ options.host = options.host || defaults.HOST;
123
+ options.port = options.port || defaults.PORT;
124
+ options.secure = !!(options.secure);
125
+ externalRequest(options.secure ? https : http, options, callback);
126
+ }
127
+
128
+ // wrapper that allows to return a promise if the callback is omitted, it works
129
+ // for DevTools methods
130
+ function promisesWrapper(func) {
131
+ return function (options, callback) {
132
+ // options is an optional argument
133
+ if (typeof options === 'function') {
134
+ callback = options;
135
+ options = undefined;
136
+ }
137
+ options = options || {};
138
+ // just call the function otherwise wrap a promise around its execution
139
+ if (typeof callback === 'function') {
140
+ func(options, callback);
141
+ } else {
142
+ return new Promise(function (fulfill, reject) {
143
+ func(options, function (err, result) {
144
+ if (err) {
145
+ reject(err);
146
+ } else {
147
+ fulfill(result);
148
+ }
149
+ });
150
+ });
151
+ }
152
+ };
153
+ }
154
+
155
+ function explodeChromeVersion(v) {
156
+ return v.split('.').map(function (x) {
157
+ return parseInt(x);
158
+ });
159
+ }
160
+
161
+ // callback(err, descriptor)
162
+ // XXX this function needs a proper refactor but the inconsistency of the
163
+ // fetching process makes it useless for now
164
+ function fetchFromChromeRepo(options, info, callback) {
165
+ // attempt to fetch the protocol directly from the Chromium repository
166
+ // according to the current version
167
+ //
168
+ // Thanks to Paul Irish.
169
+ // (see https://github.com/cyrus-and/chrome-remote-interface/issues/10#issuecomment-146032907)
170
+ const webKitVersion = info['WebKit-Version'];
171
+ const v8Version = info['V8-Version'];
172
+ const match = webKitVersion.match(/\s\(@(\b[0-9a-f]{5,40}\b)/);
173
+ const hash = match[1];
174
+ const fromChromiumDotOrg = (hash <= 202666);
175
+ let urls;
176
+ if (fromChromiumDotOrg) {
177
+ urls = [`https://src.chromium.org/blink/trunk/Source/devtools/protocol.json?p=${hash}`];
178
+ } else {
179
+ const lastBeforeSplitChromeVersion = '53.0.2758.1'; // before the split (https://crbug.com/580337)
180
+ const lastBeforeV8ChromeVersion = '55.0.2854.3'; // before using the JSON from the V8 repo
181
+ const chromeVersion = explodeChromeVersion(info.Browser.split('/')[1]);
182
+ // according to https://www.chromium.org/developers/version-numbers (patch not meaningful)
183
+ const beforeSplit = (chromeVersion[2] <= explodeChromeVersion(lastBeforeSplitChromeVersion)[2]);
184
+ const beforeFromV8 = (chromeVersion[2] <= explodeChromeVersion(lastBeforeV8ChromeVersion)[2]);
185
+ if (beforeSplit) {
186
+ urls = [`https://chromium.googlesource.com/chromium/src/+/${hash}/third_party/WebKit/Source/devtools/protocol.json?format=TEXT`];
187
+ } else if (beforeFromV8) {
188
+ urls = [`https://chromium.googlesource.com/chromium/src/+/${hash}/third_party/WebKit/Source/core/inspector/browser_protocol.json?format=TEXT`,
189
+ `https://chromium.googlesource.com/chromium/src/+/${hash}/third_party/WebKit/Source/platform/v8_inspector/js_protocol.json?format=TEXT`];
190
+ } else if (v8Version) {
191
+ urls = [`https://chromium.googlesource.com/chromium/src/+/${hash}/third_party/WebKit/Source/core/inspector/browser_protocol.json?format=TEXT`,
192
+ `https://chromium.googlesource.com/v8/v8/+/${v8Version}/src/inspector/js_protocol.json?format=TEXT`];
193
+ } else {
194
+ console.error('Warning: the protocol might be outdated, see: https://groups.google.com/d/topic/chrome-debugging-protocol/HjyOKainKus/discussion');
195
+ // releases which do not provide a V8 version get an old version of the V8 protocol
196
+ urls = [`https://chromium.googlesource.com/chromium/src/+/${hash}/third_party/WebKit/Source/core/inspector/browser_protocol.json?format=TEXT`,
197
+ `https://chromium.googlesource.com/chromium/src/+/${lastBeforeV8ChromeVersion}/third_party/WebKit/Source/platform/v8_inspector/js_protocol.json?format=TEXT`];
198
+ }
199
+ }
200
+ const descriptors = [];
201
+ urls.forEach(function (url) {
202
+ externalRequest(https, url, function (err, data) {
203
+ let descriptor;
204
+ if (!err) {
205
+ try {
206
+ // the file is served base64 encoded from googlesource.com
207
+ if (!fromChromiumDotOrg) {
208
+ data = new Buffer(data, 'base64').toString();
209
+ }
210
+ descriptor = JSON.parse(data);
211
+ } catch (_) {
212
+ // abort later
213
+ }
214
+ }
215
+ descriptors.push(descriptor);
216
+ if (descriptors.length === urls.length) {
217
+ // all must be defined
218
+ if (descriptors.indexOf(undefined) !== -1) {
219
+ callback(new Error('Cannot fetch from Chromium repo'));
220
+ return;
221
+ }
222
+ // merge the domains
223
+ descriptors.forEach(function (descriptor, i) {
224
+ if (i === 0) {
225
+ return;
226
+ }
227
+ Array.prototype.push.apply(descriptors[0].domains, descriptor.domains);
228
+ });
229
+ callback(null, descriptors[0]);
230
+ }
231
+ });
232
+ });
233
+ }
234
+
235
+ // callback(err, descriptor)
236
+ function fetchFromHttpEndpoint(options, info, callback) {
237
+ options.path = '/json/protocol';
238
+ devToolsInterface(options, function (err, descriptor) {
239
+ if (err) {
240
+ callback(err);
241
+ } else {
242
+ callback(null, JSON.parse(descriptor));
243
+ }
244
+ });
245
+ }