atome-opal-browser 0.3.9.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (228) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +11 -0
  3. data/Gemfile +33 -0
  4. data/Gemfile.lock +122 -0
  5. data/LICENSE +20 -0
  6. data/README.md +301 -0
  7. data/Rakefile +63 -0
  8. data/bin/rake +7 -0
  9. data/bin/setup +8 -0
  10. data/config.ru +81 -0
  11. data/docs/polyfills.md +24 -0
  12. data/examples/2048/Gemfile +13 -0
  13. data/examples/2048/Gemfile.lock +41 -0
  14. data/examples/2048/README.md +13 -0
  15. data/examples/2048/app/application.rb +169 -0
  16. data/examples/2048/config.ru +9 -0
  17. data/examples/canvas/Gemfile +9 -0
  18. data/examples/canvas/README.md +9 -0
  19. data/examples/canvas/app/application.rb +55 -0
  20. data/examples/canvas/config.ru +9 -0
  21. data/examples/component/Gemfile +9 -0
  22. data/examples/component/Gemfile.lock +45 -0
  23. data/examples/component/README.md +10 -0
  24. data/examples/component/app/application.rb +66 -0
  25. data/examples/component/config.ru +9 -0
  26. data/examples/integrations/README.md +24 -0
  27. data/examples/integrations/dynamic-rack-opal-sprockets-server/Gemfile +7 -0
  28. data/examples/integrations/dynamic-rack-opal-sprockets-server/README.md +16 -0
  29. data/examples/integrations/dynamic-rack-opal-sprockets-server/app/application.rb +6 -0
  30. data/examples/integrations/dynamic-rack-opal-sprockets-server/config.ru +9 -0
  31. data/examples/integrations/dynamic-roda-roda-sprockets/.gitignore +1 -0
  32. data/examples/integrations/dynamic-roda-roda-sprockets/Gemfile +8 -0
  33. data/examples/integrations/dynamic-roda-roda-sprockets/README.md +22 -0
  34. data/examples/integrations/dynamic-roda-roda-sprockets/Rakefile +4 -0
  35. data/examples/integrations/dynamic-roda-roda-sprockets/app/application.rb +6 -0
  36. data/examples/integrations/dynamic-roda-roda-sprockets/app.rb +32 -0
  37. data/examples/integrations/dynamic-roda-roda-sprockets/config.ru +3 -0
  38. data/examples/integrations/dynamic-roda-tilt/.gitignore +1 -0
  39. data/examples/integrations/dynamic-roda-tilt/Gemfile +9 -0
  40. data/examples/integrations/dynamic-roda-tilt/README.md +17 -0
  41. data/examples/integrations/dynamic-roda-tilt/Rakefile +6 -0
  42. data/examples/integrations/dynamic-roda-tilt/app/application.rb +6 -0
  43. data/examples/integrations/dynamic-roda-tilt/app.rb +50 -0
  44. data/examples/integrations/dynamic-roda-tilt/config.ru +3 -0
  45. data/examples/integrations/dynamic-sinatra-opal-sprockets-server/Gemfile +10 -0
  46. data/examples/integrations/dynamic-sinatra-opal-sprockets-server/README.md +16 -0
  47. data/examples/integrations/dynamic-sinatra-opal-sprockets-server/app/application.rb +6 -0
  48. data/examples/integrations/dynamic-sinatra-opal-sprockets-server/config.ru +29 -0
  49. data/examples/integrations/static-bash/.gitignore +2 -0
  50. data/examples/integrations/static-bash/Gemfile +3 -0
  51. data/examples/integrations/static-bash/README.md +8 -0
  52. data/examples/integrations/static-bash/app/application.rb +6 -0
  53. data/examples/integrations/static-bash/build.sh +4 -0
  54. data/examples/integrations/static-bash/index.html +10 -0
  55. data/examples/integrations/static-bash-opal-parser/.gitignore +3 -0
  56. data/examples/integrations/static-bash-opal-parser/Gemfile +3 -0
  57. data/examples/integrations/static-bash-opal-parser/README.md +10 -0
  58. data/examples/integrations/static-bash-opal-parser/build.sh +4 -0
  59. data/examples/integrations/static-bash-opal-parser/index.html +19 -0
  60. data/examples/integrations/static-rake/.gitignore +1 -0
  61. data/examples/integrations/static-rake/Gemfile +7 -0
  62. data/examples/integrations/static-rake/README.md +7 -0
  63. data/examples/integrations/static-rake/Rakefile +10 -0
  64. data/examples/integrations/static-rake/app/application.rb +6 -0
  65. data/examples/integrations/static-rake/index.html +9 -0
  66. data/examples/integrations/static-rake-guard/.gitignore +1 -0
  67. data/examples/integrations/static-rake-guard/Gemfile +9 -0
  68. data/examples/integrations/static-rake-guard/Gemfile.lock +69 -0
  69. data/examples/integrations/static-rake-guard/Guardfile +3 -0
  70. data/examples/integrations/static-rake-guard/README.md +10 -0
  71. data/examples/integrations/static-rake-guard/Rakefile +10 -0
  72. data/examples/integrations/static-rake-guard/app/application.rb +6 -0
  73. data/examples/integrations/static-rake-guard/index.html +9 -0
  74. data/examples/svg/.gitignore +1 -0
  75. data/examples/svg/Gemfile +4 -0
  76. data/examples/svg/README.md +7 -0
  77. data/examples/svg/Rakefile +10 -0
  78. data/examples/svg/app/application.rb +11 -0
  79. data/examples/svg/index.html +17 -0
  80. data/examples/svg/index.svg +6 -0
  81. data/index.html.erb +24 -0
  82. data/lib/opal/browser.rb +4 -0
  83. data/lib/opal-browser.rb +1 -0
  84. data/opal/browser/animation_frame.rb +111 -0
  85. data/opal/browser/audio/node.rb +121 -0
  86. data/opal/browser/audio/param_schedule.rb +43 -0
  87. data/opal/browser/audio.rb +66 -0
  88. data/opal/browser/blob.rb +94 -0
  89. data/opal/browser/canvas/data.rb +63 -0
  90. data/opal/browser/canvas/gradient.rb +27 -0
  91. data/opal/browser/canvas/style.rb +115 -0
  92. data/opal/browser/canvas/text.rb +45 -0
  93. data/opal/browser/canvas.rb +335 -0
  94. data/opal/browser/console.rb +105 -0
  95. data/opal/browser/cookies.rb +171 -0
  96. data/opal/browser/crypto.rb +79 -0
  97. data/opal/browser/css/declaration.rb +83 -0
  98. data/opal/browser/css/rule/style.rb +16 -0
  99. data/opal/browser/css/rule.rb +48 -0
  100. data/opal/browser/css/style_sheet.rb +83 -0
  101. data/opal/browser/css/unit.rb +188 -0
  102. data/opal/browser/css.rb +40 -0
  103. data/opal/browser/database/sql.rb +193 -0
  104. data/opal/browser/delay.rb +94 -0
  105. data/opal/browser/dom/attribute.rb +26 -0
  106. data/opal/browser/dom/builder.rb +107 -0
  107. data/opal/browser/dom/cdata.rb +9 -0
  108. data/opal/browser/dom/character_data.rb +73 -0
  109. data/opal/browser/dom/comment.rb +9 -0
  110. data/opal/browser/dom/document.rb +217 -0
  111. data/opal/browser/dom/document_fragment.rb +25 -0
  112. data/opal/browser/dom/document_or_shadow_root.rb +19 -0
  113. data/opal/browser/dom/element/attributes.rb +111 -0
  114. data/opal/browser/dom/element/button.rb +31 -0
  115. data/opal/browser/dom/element/custom.rb +177 -0
  116. data/opal/browser/dom/element/data.rb +82 -0
  117. data/opal/browser/dom/element/editable.rb +47 -0
  118. data/opal/browser/dom/element/form.rb +38 -0
  119. data/opal/browser/dom/element/iframe.rb +37 -0
  120. data/opal/browser/dom/element/image.rb +25 -0
  121. data/opal/browser/dom/element/input.rb +64 -0
  122. data/opal/browser/dom/element/media.rb +43 -0
  123. data/opal/browser/dom/element/offset.rb +89 -0
  124. data/opal/browser/dom/element/position.rb +46 -0
  125. data/opal/browser/dom/element/scroll.rb +168 -0
  126. data/opal/browser/dom/element/select.rb +42 -0
  127. data/opal/browser/dom/element/size.rb +46 -0
  128. data/opal/browser/dom/element/template.rb +11 -0
  129. data/opal/browser/dom/element/textarea.rb +26 -0
  130. data/opal/browser/dom/element.rb +618 -0
  131. data/opal/browser/dom/mutation_observer.rb +178 -0
  132. data/opal/browser/dom/node.rb +504 -0
  133. data/opal/browser/dom/node_set.rb +121 -0
  134. data/opal/browser/dom/shadow_root.rb +12 -0
  135. data/opal/browser/dom/text.rb +36 -0
  136. data/opal/browser/dom.rb +124 -0
  137. data/opal/browser/effects.rb +216 -0
  138. data/opal/browser/event/all.rb +26 -0
  139. data/opal/browser/event/animation.rb +40 -0
  140. data/opal/browser/event/audio_processing.rb +35 -0
  141. data/opal/browser/event/base.rb +461 -0
  142. data/opal/browser/event/before_unload.rb +17 -0
  143. data/opal/browser/event/clipboard.rb +37 -0
  144. data/opal/browser/event/close.rb +49 -0
  145. data/opal/browser/event/composition.rb +52 -0
  146. data/opal/browser/event/custom.rb +65 -0
  147. data/opal/browser/event/data_transfer.rb +95 -0
  148. data/opal/browser/event/device_light.rb +25 -0
  149. data/opal/browser/event/device_motion.rb +53 -0
  150. data/opal/browser/event/device_orientation.rb +50 -0
  151. data/opal/browser/event/device_proximity.rb +35 -0
  152. data/opal/browser/event/drag.rb +123 -0
  153. data/opal/browser/event/focus.rb +41 -0
  154. data/opal/browser/event/gamepad.rb +62 -0
  155. data/opal/browser/event/hash_change.rb +30 -0
  156. data/opal/browser/event/keyboard.rb +128 -0
  157. data/opal/browser/event/message.rb +72 -0
  158. data/opal/browser/event/mouse.rb +258 -0
  159. data/opal/browser/event/page_transition.rb +25 -0
  160. data/opal/browser/event/pop_state.rb +35 -0
  161. data/opal/browser/event/progress.rb +45 -0
  162. data/opal/browser/event/sensor.rb +17 -0
  163. data/opal/browser/event/storage.rb +45 -0
  164. data/opal/browser/event/touch.rb +62 -0
  165. data/opal/browser/event/ui.rb +38 -0
  166. data/opal/browser/event/wheel.rb +51 -0
  167. data/opal/browser/event.rb +162 -0
  168. data/opal/browser/event_source.rb +70 -0
  169. data/opal/browser/form_data.rb +225 -0
  170. data/opal/browser/history.rb +86 -0
  171. data/opal/browser/http/binary.rb +58 -0
  172. data/opal/browser/http/headers.rb +109 -0
  173. data/opal/browser/http/request.rb +359 -0
  174. data/opal/browser/http/response.rb +119 -0
  175. data/opal/browser/http.rb +167 -0
  176. data/opal/browser/immediate.rb +161 -0
  177. data/opal/browser/interval.rb +111 -0
  178. data/opal/browser/location.rb +93 -0
  179. data/opal/browser/navigator.rb +274 -0
  180. data/opal/browser/polyfill/visual_viewport.rb +216 -0
  181. data/opal/browser/screen.rb +66 -0
  182. data/opal/browser/setup/base.rb +6 -0
  183. data/opal/browser/setup/full.rb +13 -0
  184. data/opal/browser/setup/large.rb +17 -0
  185. data/opal/browser/setup/mini.rb +8 -0
  186. data/opal/browser/setup/traditional.rb +10 -0
  187. data/opal/browser/socket.rb +123 -0
  188. data/opal/browser/storage.rb +252 -0
  189. data/opal/browser/support.rb +299 -0
  190. data/opal/browser/utils.rb +154 -0
  191. data/opal/browser/version.rb +3 -0
  192. data/opal/browser/visual_viewport.rb +39 -0
  193. data/opal/browser/window/size.rb +73 -0
  194. data/opal/browser/window/view.rb +51 -0
  195. data/opal/browser/window.rb +133 -0
  196. data/opal/browser.rb +1 -0
  197. data/opal/opal-browser.rb +1 -0
  198. data/opal-browser.gemspec +27 -0
  199. data/spec/database/sql_spec.rb +139 -0
  200. data/spec/delay_spec.rb +41 -0
  201. data/spec/dom/attribute_spec.rb +49 -0
  202. data/spec/dom/builder_spec.rb +86 -0
  203. data/spec/dom/document_spec.rb +62 -0
  204. data/spec/dom/element/attributes_spec.rb +52 -0
  205. data/spec/dom/element/custom_spec.rb +106 -0
  206. data/spec/dom/element/subclass_spec.rb +144 -0
  207. data/spec/dom/element_spec.rb +223 -0
  208. data/spec/dom/mutation_observer_spec.rb +41 -0
  209. data/spec/dom/node_set_spec.rb +44 -0
  210. data/spec/dom/node_spec.rb +214 -0
  211. data/spec/dom_spec.rb +23 -0
  212. data/spec/event_source_spec.rb +45 -0
  213. data/spec/event_spec.rb +156 -0
  214. data/spec/history_spec.rb +61 -0
  215. data/spec/http_spec.rb +76 -0
  216. data/spec/immediate_spec.rb +15 -0
  217. data/spec/interval_spec.rb +59 -0
  218. data/spec/json2.js +486 -0
  219. data/spec/native_cached_wrapper_spec.rb +46 -0
  220. data/spec/runner.rb +107 -0
  221. data/spec/sizzle.js +5 -0
  222. data/spec/socket_spec.rb +47 -0
  223. data/spec/spec_helper.rb +35 -0
  224. data/spec/spec_helper_promise.rb.erb +25 -0
  225. data/spec/storage_spec.rb +26 -0
  226. data/spec/wgxpath.install.js +49 -0
  227. data/spec/window_spec.rb +10 -0
  228. metadata +500 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9dbdd6e9d572cae1acb8b53fa2daaf4492bef554d84c2c0e989ad43d32bb34ba
4
+ data.tar.gz: b5bb70c2406c0143d4b1a5a2be3bba7151d707e20615965134a09b2a894b046c
5
+ SHA512:
6
+ metadata.gz: 8b75e9ed30ed18b07bad5356fb1df35dfcb63ee9ca16ccdb7011f740a01b3dec97e6893a1917c26fe48043385e3b3b680b2aa631073e9c814b1cca8e43fd4892
7
+ data.tar.gz: 84a211f8fc03ac41e5e9af2d9028b00b2ca8f6745f020983a1ac5d1114e63e3276f8ec53f792a1ba9e44affae18ab05599e29446a18042d61b901d8f719a7bc9
data/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ ## 0.3.3
2
+ * Compatibility fix for Opal 1.4
3
+
4
+ ## 0.3.2
5
+ * Cookie: refactor the module
6
+ * Note in documentation it's available as `$document.cookies` and it's the preferred way to access it
7
+ * Always encode a cookie with JSON, unless a new parameter `raw:` is provided
8
+
9
+ ## 0.3.1
10
+ * Element#inner_dom: Reduce flickering - first build tree, then insert it
11
+ * NodeSet#to_a to be aliased to #to_ary
data/Gemfile ADDED
@@ -0,0 +1,33 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ # specs
5
+ gem 'rake'
6
+ gem 'rack'
7
+ gem 'sinatra'
8
+ gem 'sinatra-websocket'
9
+ gem 'opal-rspec'
10
+ gem 'opal-sprockets'
11
+ # Force build of eventmachine... I wish we could find a way to not use
12
+ # this unmaintained library anymore.
13
+ gem 'eventmachine', github: 'eventmachine/eventmachine'
14
+ gem 'thin', github: 'macournoyer/thin' unless RUBY_PLATFORM =~ /mingw/
15
+
16
+ # runner
17
+ gem 'selenium-webdriver', require: false
18
+ gem 'rest-client', require: false
19
+ gem 'webdrivers', require: false
20
+ gem 'rexml', require: false
21
+
22
+ # browser
23
+ case ENV['OPAL_VERSION']
24
+ when nil
25
+ # noop
26
+ when ->(path) { File.exist? path }
27
+ gem 'opal', path: ENV['OPAL_VERSION']
28
+ when /\./
29
+ gem 'opal', "~> #{ENV['OPAL_VERSION']}.0a"
30
+ else
31
+ gem 'opal', github: 'opal/opal', ref: ENV['OPAL_VERSION']
32
+ end
33
+
data/Gemfile.lock ADDED
@@ -0,0 +1,122 @@
1
+ GIT
2
+ remote: https://github.com/eventmachine/eventmachine.git
3
+ revision: df4ab0068e5e9f504096584093a74510d0dac6c8
4
+ specs:
5
+ eventmachine (1.3.0.dev.1)
6
+
7
+ GIT
8
+ remote: https://github.com/macournoyer/thin.git
9
+ revision: 10607a2663fc282d67f98a930f954dc407fd056d
10
+ specs:
11
+ thin (1.8.1)
12
+ daemons (~> 1.0, >= 1.0.9)
13
+ eventmachine (~> 1.0, >= 1.0.4)
14
+ rack (>= 1, < 3)
15
+
16
+ PATH
17
+ remote: .
18
+ specs:
19
+ opal-browser (0.3.9.3)
20
+ opal (>= 1.0, < 2.0)
21
+ paggio (~> 0.3.0)
22
+
23
+ GEM
24
+ remote: https://rubygems.org/
25
+ specs:
26
+ addressable (2.8.1)
27
+ public_suffix (>= 2.0.2, < 6.0)
28
+ ast (2.4.2)
29
+ childprocess (4.1.0)
30
+ concurrent-ruby (1.1.10)
31
+ daemons (1.4.1)
32
+ domain_name (0.5.20190701)
33
+ unf (>= 0.0.5, < 1.0.0)
34
+ em-websocket (0.3.8)
35
+ addressable (>= 2.1.1)
36
+ eventmachine (>= 0.12.9)
37
+ http-accept (1.7.0)
38
+ http-cookie (1.0.5)
39
+ domain_name (~> 0.5)
40
+ mime-types (3.4.1)
41
+ mime-types-data (~> 3.2015)
42
+ mime-types-data (3.2022.0105)
43
+ mustermann (3.0.0)
44
+ ruby2_keywords (~> 0.0.1)
45
+ netrc (0.11.0)
46
+ nokogiri (1.13.9-arm64-darwin)
47
+ racc (~> 1.4)
48
+ opal (1.5.1)
49
+ ast (>= 2.3.0)
50
+ parser (~> 3.0, >= 3.0.3.2)
51
+ opal-rspec (0.8.0)
52
+ opal (>= 1.0.0, < 2.0)
53
+ opal-sprockets (< 2.0)
54
+ rake (>= 12.0)
55
+ opal-sprockets (1.0.3)
56
+ opal (>= 1.0, < 2.0)
57
+ sprockets (~> 4.0)
58
+ tilt (>= 1.4)
59
+ paggio (0.3.0)
60
+ parser (3.1.2.1)
61
+ ast (~> 2.4.1)
62
+ public_suffix (5.0.0)
63
+ racc (1.6.0)
64
+ rack (2.2.4)
65
+ rack-protection (3.0.2)
66
+ rack
67
+ rake (13.0.6)
68
+ rest-client (2.1.0)
69
+ http-accept (>= 1.7.0, < 2.0)
70
+ http-cookie (>= 1.0.2, < 2.0)
71
+ mime-types (>= 1.16, < 4.0)
72
+ netrc (~> 0.8)
73
+ rexml (3.2.5)
74
+ ruby2_keywords (0.0.5)
75
+ rubyzip (2.3.2)
76
+ selenium-webdriver (4.5.0)
77
+ childprocess (>= 0.5, < 5.0)
78
+ rexml (~> 3.2, >= 3.2.5)
79
+ rubyzip (>= 1.2.2, < 3.0)
80
+ websocket (~> 1.0)
81
+ sinatra (3.0.2)
82
+ mustermann (~> 3.0)
83
+ rack (~> 2.2, >= 2.2.4)
84
+ rack-protection (= 3.0.2)
85
+ tilt (~> 2.0)
86
+ sinatra-websocket (0.3.1)
87
+ em-websocket (~> 0.3.6)
88
+ eventmachine
89
+ thin (>= 1.3.1, < 2.0.0)
90
+ sprockets (4.1.1)
91
+ concurrent-ruby (~> 1.0)
92
+ rack (> 1, < 3)
93
+ tilt (2.0.11)
94
+ unf (0.1.4)
95
+ unf_ext
96
+ unf_ext (0.0.8.2)
97
+ webdrivers (5.2.0)
98
+ nokogiri (~> 1.6)
99
+ rubyzip (>= 1.3.0)
100
+ selenium-webdriver (~> 4.0)
101
+ websocket (1.2.9)
102
+
103
+ PLATFORMS
104
+ arm64-darwin-22
105
+
106
+ DEPENDENCIES
107
+ eventmachine!
108
+ opal-browser!
109
+ opal-rspec
110
+ opal-sprockets
111
+ rack
112
+ rake
113
+ rest-client
114
+ rexml
115
+ selenium-webdriver
116
+ sinatra
117
+ sinatra-websocket
118
+ thin!
119
+ webdrivers
120
+
121
+ BUNDLED WITH
122
+ 2.3.24
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (C) 2013-2018 by meh
2
+ Copyright (C) 2019-2021 hmdne and the Opal-Browser contributors
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in
12
+ all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,301 @@
1
+ Opal-Browser - Client side web development in pure Ruby, using Opal
2
+ ===================================================================
3
+
4
+ [![Gem Version](https://badge.fury.io/rb/opal-browser.svg)](http://badge.fury.io/rb/opal-browser)
5
+ [![Code Climate](https://img.shields.io/codeclimate/maintainability-percentage/opal/opal-browser.svg)](https://codeclimate.com/github/opal/opal-browser)
6
+ [![Build Status](https://github.com/opal/opal-browser/workflows/build/badge.svg)](https://github.com/opal/opal-browser/actions?query=workflow%3Abuild)
7
+ [![Join Chat](https://img.shields.io/badge/slack-join%20chat-46BC99?logo=slack&style=flat)](https://slack.opalrb.com/)
8
+ [![Stack Overflow](https://img.shields.io/badge/stackoverflow-%23opalrb-orange.svg?style=flat)](https://stackoverflow.com/questions/ask?tags=opalrb,opal-browser)
9
+ [![Documentation](https://img.shields.io/badge/docs-updated-blue.svg)](https://rubydoc.info/gems/opal-browser)
10
+
11
+ This library aims to be a full-blown wrapper for all the browser API as defined by
12
+ HTML5.
13
+
14
+ It provides a very JQuery-like interface to DOM, but itself it doesn't use nor
15
+ require JQuery nor opal-jquery (which is an alternative library for interfacing
16
+ the web browser). The main difference though is that Opal-Browser goes far beyond
17
+ what JQuery does.
18
+
19
+ Usage
20
+ =====
21
+
22
+ _Gemfile_
23
+
24
+ ```ruby
25
+ source 'https://rubygems.org/'
26
+
27
+ gem 'opal-browser'
28
+ ```
29
+
30
+ _Server side (config.ru, Rakefile, Rails, Sinatra, Roda, etc. - not needed for static compilation)_
31
+
32
+ ```ruby
33
+ require 'opal-browser'
34
+ # Your server code here
35
+ ```
36
+
37
+ _Browser side_
38
+
39
+ ```ruby
40
+ require 'opal'
41
+ require 'native'
42
+ require 'promise'
43
+ require 'browser/setup/full'
44
+
45
+ # Your Opal code here
46
+ $document.body << "Hello world!"
47
+ ```
48
+
49
+ _Static Compile Opal + Opal-Browser library_
50
+
51
+ ```bash
52
+ bundle exec opal -c -q opal-browser -p native -p promise -p browser/setup/full -e '#' -E > opal-browser.js
53
+ ```
54
+
55
+ _Static Compile your application_
56
+
57
+ ```bash
58
+ bundle exec opal -Oc -s opal -s native -s promise -s browser/setup/full app/application.rb > application.js
59
+ ```
60
+
61
+ _And load it in HTML!_
62
+
63
+ ```html
64
+ <!DOCTYPE html>
65
+ <html>
66
+ <head>
67
+ <title>My Application</title>
68
+ </head>
69
+ <body>
70
+ <script src='opal-browser.js' onload='Opal.require("native"); Opal.require("promise"); Opal.require("browser/setup/full");'></script>
71
+ <script src='application.js'></script>
72
+ </body>
73
+ </html>
74
+ ```
75
+
76
+ See the `examples/integrations/` directory for various ideas on how to quickly start
77
+ development using opal-browser.
78
+
79
+ Features
80
+ ========
81
+ This is a list of many currently wrapped features and some details on them.
82
+
83
+ DOM
84
+ ---
85
+ DOM support is complete as far as I know, it has a very Nokogiri feel to it
86
+ with obvious differences where relevant (for instance, event handling).
87
+
88
+ ```ruby
89
+ $document.ready do
90
+ alert "yo dawg, I'm all loaded up in here"
91
+ end
92
+ ```
93
+
94
+ It also supports a markaby inspired builder DSL (using Paggio) which generates
95
+ DOM nodes directly instead of creating a string.
96
+
97
+ ```ruby
98
+ $document.ready do
99
+ DOM {
100
+ div.info {
101
+ span.red "I'm all cooked up."
102
+ }
103
+ }.append_to($document.body)
104
+ end
105
+ ```
106
+
107
+ Events
108
+ ------
109
+
110
+ Add an event to a given element:
111
+
112
+ ```ruby
113
+ $document.at_css("button").on(:click) do |e|
114
+ e.prevent # Prevent the default action (eg. form submission)
115
+ # You can also use `e.stop` to stop propagating the event to other handlers.
116
+ alert "Button clicked!"
117
+ end
118
+ ```
119
+
120
+ Or add it to a parent element and use a delegator, so that an event gets fired
121
+ when any button children of `$document` is clicked:
122
+
123
+ ```ruby
124
+ $document.on(:click, "button") do |e|
125
+ e.prevent
126
+ # e.on is a button that has been clicked
127
+ e.on.inner_text = "Clicked!"
128
+ end
129
+ ```
130
+
131
+ Run an event once with `#one` instead of `#on`, or disable an event with `#off`.
132
+
133
+ CSSOM
134
+ -----
135
+ CSSOM support (using Paggio) is still incomplete but the useful parts are
136
+ implemented, this includes a DSL for generating a CSS style and the same DSL
137
+ is also used to change style declarations (which can either belong to a
138
+ `DOM::Element` or a `CSS::Rule::Style`).
139
+
140
+ ```ruby
141
+ $document.body.style.apply {
142
+ background color: 'black'
143
+ color 'white'
144
+ font family: 'Verdana'
145
+ }
146
+ ```
147
+
148
+ AJAX & SJAX
149
+ -----------
150
+ The `XMLHttpRequest` API has been wrapped completely, it also optionally
151
+ supports binary results as typed-arrays.
152
+
153
+ It easily allows for synchronous and asynchronous requests.
154
+
155
+ ```ruby
156
+ require 'browser/http'
157
+
158
+ Browser::HTTP.get "/something.json" do
159
+ on :success do |res|
160
+ alert res.json.inspect
161
+ end
162
+ end
163
+ ```
164
+
165
+ WebSocket
166
+ ---------
167
+ Websockets have been fully wrapped and they are easily configurable with
168
+ blocks.
169
+
170
+ ```ruby
171
+ require 'browser/socket'
172
+
173
+ Browser::Socket.new 'ws://echo.websocket.org' do
174
+ on :open do
175
+ every 1 do
176
+ puts "ping"
177
+ end
178
+ end
179
+
180
+ on :message do |e|
181
+ log "Received #{e.data}"
182
+ end
183
+ end
184
+ ```
185
+
186
+ EventSource
187
+ -----------
188
+ Event sources have been implemented and are easily configurable with blocks.
189
+
190
+ ```ruby
191
+ require 'browser/event_source'
192
+
193
+ Browser::EventSource.new '/events' do |es|
194
+ es.on :message do |e|
195
+ alert e.data
196
+ end
197
+
198
+ es.on :custom do |e|
199
+ alert "custom #{e.data}"
200
+ end
201
+ end
202
+ ```
203
+
204
+ History
205
+ -------
206
+ The HTML5 History API has been fully wrapped.
207
+
208
+ ```ruby
209
+ current = $window.history.current
210
+ $window.history.replace("?get=params")
211
+ $window.history.push("?get=params")
212
+ $window.history.back
213
+
214
+ $window.on :popstate do |e|
215
+ p "User clicked a back button! He is now on #{$window.history.current}"
216
+ end
217
+ ```
218
+
219
+ Storage
220
+ -------
221
+ The HTML5 Storage API has been wrapped and it exports a single Storage class
222
+ that uses the most appropriate and available API to store data locally.
223
+
224
+ ```ruby
225
+ require 'browser/storage'
226
+
227
+ $storage = $window.storage
228
+ $storage[:hello] = "world"
229
+ ```
230
+
231
+ Database SQL
232
+ ------------
233
+ WebSQL has been fully wrapped (Chromium-only)
234
+
235
+ ```ruby
236
+ require 'browser/database/sql'
237
+
238
+ db = Browser::Database::SQL.new 'test'
239
+ db.transaction {|t|
240
+ t.query('CREATE TABLE test(ID INTEGER PRIMARY KEY ASC, text TEXT)').then {
241
+ t.query('INSERT INTO test (id, text) VALUES(?, ?)', 1, 'huehue')
242
+ }.then {
243
+ t.query('INSERT INTO test (id, text) VALUES(?, ?)', 2, 'jajaja')
244
+ }.then {
245
+ t.query('SELECT * FROM test')
246
+ }.then {|r|
247
+ r.each {|row|
248
+ alert row.inspect
249
+ }
250
+ }
251
+ }
252
+ ```
253
+
254
+ Browser support
255
+ ===============
256
+
257
+ * Edge (Current - 3) to Current
258
+ * Firefox (Current - 3) to Current
259
+ * Chrome (Current - 3) to Current
260
+ * Safari (Current - 3) to Current
261
+ * Opera (Current - 3) to Current
262
+
263
+ Any problem above browsers should be considered and reported as a bug.
264
+
265
+ (Current - 3) to Current denotes that we support the current major stable version
266
+ of the browser and 3 versions preceding it. For example, if the current version
267
+ of a browser is 24.x, we support all versions between 21.x to 24.x.
268
+
269
+ We will accept compatibility patches for even earlier browser versions. Opal-Browser
270
+ is written in such a way, that it integrates a robust compatibility check system,
271
+ similar to Modernizr, and the history of this library goes even as far as supporting
272
+ Internet Explorer 6.
273
+
274
+ See the [polyfills documentation](docs/polyfills.md) if you wish to polyfill some
275
+ behaviors not supported by the ancient web browsers (like `querySelectorAll`).
276
+
277
+ License
278
+ =======
279
+
280
+ (The MIT License)
281
+
282
+ Copyright (C) 2013-2018 by meh<br>
283
+ Copyright (C) 2019-2021 hmdne and the Opal-Browser contributors
284
+
285
+ Permission is hereby granted, free of charge, to any person obtaining a copy
286
+ of this software and associated documentation files (the "Software"), to deal
287
+ in the Software without restriction, including without limitation the rights
288
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
289
+ copies of the Software, and to permit persons to whom the Software is
290
+ furnished to do so, subject to the following conditions:
291
+
292
+ The above copyright notice and this permission notice shall be included in
293
+ all copies or substantial portions of the Software.
294
+
295
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
296
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
297
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
298
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
299
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
300
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
301
+ THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,63 @@
1
+ require 'bundler'
2
+ Bundler.require
3
+ require 'bundler/gem_tasks'
4
+
5
+ require 'webdrivers'
6
+ load 'webdrivers/Rakefile'
7
+
8
+ require 'opal/rspec/rake_task'
9
+ Opal::RSpec::RakeTask.new(:broken_rspec) do |_, task|
10
+ task.default_path = 'spec'
11
+ task.pattern = 'spec/**/*_spec.{rb,opal}'
12
+ end
13
+
14
+ task(:nil) {}
15
+
16
+ %w[chrome edge gecko safari].each do |i|
17
+ dependency = nil
18
+ if %w[chrome edge gecko].include? i
19
+ dependency = "webdrivers:#{i}driver:update"
20
+ end
21
+ desc "Run Selenium tests with #{i}"
22
+ task :"selenium_#{i}" => dependency do
23
+ server = Process.spawn("bundle", "exec", "rackup")
24
+ at_exit { Process.kill(9, server) rescue nil }
25
+ sleep 2
26
+ ENV['BROWSER'] = i
27
+ load 'spec/runner.rb'
28
+ ensure
29
+ Process.kill(9, server) rescue nil
30
+ end
31
+ end
32
+
33
+ task :default => :selenium_chrome
34
+
35
+ task :build_gh_pages do
36
+ require 'fileutils'
37
+
38
+ output_dir = __dir__+"/gh-pages/examples/"
39
+ FileUtils.mkdir_p output_dir
40
+
41
+ Dir['examples/*'].reject { |i| i =~ /integrations|svg/ }.each do |example_path|
42
+ example = File.basename(example_path)
43
+
44
+ output_example_dir = output_dir+"/"+example
45
+ FileUtils.mkdir_p output_example_dir
46
+
47
+ Dir.chdir(example_path) do
48
+ Bundler.with_unbundled_env do
49
+ `bundle install`
50
+ `bundle exec opal -qopal-browser -c app/application.rb > #{output_example_dir}/app.js`
51
+ end
52
+ File.write("#{output_example_dir}/index.html", <<~HTML)
53
+ <!DOCTYPE html>
54
+ <html>
55
+ <head></head>
56
+ <body>
57
+ <script src="app.js"></script>
58
+ </body>
59
+ </html>
60
+ HTML
61
+ end
62
+ end
63
+ end
data/bin/rake ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "rubygems"
5
+ require "bundler/setup"
6
+
7
+ load Gem.bin_path("rake", "rake")
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ gem install bundler --conservative
7
+
8
+ bundle update
data/config.ru ADDED
@@ -0,0 +1,81 @@
1
+ require 'bundler'
2
+ Bundler.require
3
+
4
+ apps = []
5
+
6
+ sprockets_env = Opal::RSpec::SprocketsEnvironment.new(spec_pattern = 'spec/**/*_spec.{rb,opal}',
7
+ spec_exclude_pattern = nil,
8
+ spec_files = nil,
9
+ default_path = 'spec')
10
+
11
+ apps << Opal::Sprockets::Server.new(sprockets: sprockets_env) { |s|
12
+ s.main = 'opal/rspec/sprockets_runner'
13
+ s.append_path 'spec'
14
+ s.index_path = 'index.html.erb'
15
+ s.debug = true
16
+ }
17
+
18
+ apps << Class.new(Sinatra::Base) {
19
+ get '/http' do
20
+ "lol"
21
+ end
22
+
23
+ post '/http' do
24
+ if params['lol'] == 'wut'
25
+ "ok"
26
+ else
27
+ "fail"
28
+ end
29
+ end
30
+
31
+ put '/http' do
32
+ if params['lol'] == 'wut'
33
+ "ok"
34
+ else
35
+ "fail"
36
+ end
37
+ end
38
+
39
+ delete '/http' do
40
+ "lol"
41
+ end
42
+
43
+ post '/http-file' do
44
+ if params['lol'] == 'wut' &&
45
+ params['file'][:filename] == 'yay.txt' &&
46
+ params['file'][:tempfile].read == 'content'
47
+
48
+ "ok"
49
+ else
50
+ "fail"
51
+ end
52
+ end
53
+
54
+ get '/events' do
55
+ headers 'Content-Type' => 'text/event-stream'
56
+
57
+ stream do |out|
58
+ sleep 0.2
59
+
60
+ out << "data: lol\n" << "\n"
61
+ out << "event: custom\n" << "data: omg\n" << "\n"
62
+ out << "data: wut\n" << "\n"
63
+
64
+ sleep 10
65
+ end
66
+ end
67
+
68
+ get '/socket' do
69
+ request.websocket do |ws|
70
+ ws.onopen do
71
+ ws.send 'lol'
72
+ end
73
+
74
+ ws.onmessage do |msg|
75
+ ws.send msg
76
+ end
77
+ end
78
+ end
79
+ }
80
+
81
+ run Rack::Cascade.new(apps)
data/docs/polyfills.md ADDED
@@ -0,0 +1,24 @@
1
+ CSS selectors
2
+ -------------
3
+ Older browsers do not support CSS selector in queries, this means you'll need
4
+ external polyfills for this.
5
+
6
+ The suggested polyfill is [Sizzle](http://sizzlejs.com/), require it **before**
7
+ opal-browser.
8
+
9
+ JSON parsing
10
+ ------------
11
+ Older browsers don't support JSON parsing natively, this means you'll need
12
+ external polyfills for this.
13
+
14
+ The suggested polyfill is [json2](https://github.com/douglascrockford/JSON-js),
15
+ require it **before** opal-browser.
16
+
17
+ XPath support
18
+ -------------
19
+ Not all browsers support XPath queries, I'm looking at you Internet Explorer,
20
+ this means you'll need external polyfills for this.
21
+
22
+ The suggested polyfill is
23
+ [wgxpath](https://code.google.com/p/wicked-good-xpath/), require it **before**
24
+ opal-browser.
@@ -0,0 +1,13 @@
1
+ source "https://rubygems.org"
2
+ gem 'opal'
3
+ gem 'rake', "~> 13.0"
4
+ gem 'puma'
5
+ gem 'rack', '~> 2.2'
6
+ gem "opal-sprockets"
7
+ gem "opal-browser", path: "../.."
8
+
9
+
10
+
11
+
12
+
13
+