opal-browser 0.2.0 → 0.3.3

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 (202) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/build.yml +78 -0
  3. data/.gitignore +3 -0
  4. data/CHANGELOG.md +11 -0
  5. data/Gemfile +17 -3
  6. data/LICENSE +2 -1
  7. data/README.md +131 -54
  8. data/Rakefile +29 -1
  9. data/config.ru +20 -3
  10. data/docs/polyfills.md +24 -0
  11. data/examples/2048/Gemfile +6 -0
  12. data/examples/2048/README.md +13 -0
  13. data/examples/2048/app/application.rb +169 -0
  14. data/examples/2048/config.ru +9 -0
  15. data/examples/canvas/Gemfile +6 -0
  16. data/examples/canvas/README.md +9 -0
  17. data/examples/canvas/app/application.rb +55 -0
  18. data/examples/canvas/config.ru +9 -0
  19. data/examples/component/Gemfile +6 -0
  20. data/examples/component/README.md +10 -0
  21. data/examples/component/app/application.rb +66 -0
  22. data/examples/component/config.ru +9 -0
  23. data/examples/integrations/README.md +24 -0
  24. data/examples/integrations/dynamic-rack-opal-sprockets-server/Gemfile +6 -0
  25. data/examples/integrations/dynamic-rack-opal-sprockets-server/README.md +16 -0
  26. data/examples/integrations/dynamic-rack-opal-sprockets-server/app/application.rb +6 -0
  27. data/examples/integrations/dynamic-rack-opal-sprockets-server/config.ru +9 -0
  28. data/examples/integrations/dynamic-roda-roda-sprockets/.gitignore +1 -0
  29. data/examples/integrations/dynamic-roda-roda-sprockets/Gemfile +7 -0
  30. data/examples/integrations/dynamic-roda-roda-sprockets/README.md +22 -0
  31. data/examples/integrations/dynamic-roda-roda-sprockets/Rakefile +4 -0
  32. data/examples/integrations/dynamic-roda-roda-sprockets/app/application.rb +6 -0
  33. data/examples/integrations/dynamic-roda-roda-sprockets/app.rb +32 -0
  34. data/examples/integrations/dynamic-roda-roda-sprockets/config.ru +3 -0
  35. data/examples/integrations/dynamic-roda-tilt/.gitignore +1 -0
  36. data/examples/integrations/dynamic-roda-tilt/Gemfile +8 -0
  37. data/examples/integrations/dynamic-roda-tilt/README.md +17 -0
  38. data/examples/integrations/dynamic-roda-tilt/Rakefile +6 -0
  39. data/examples/integrations/dynamic-roda-tilt/app/application.rb +6 -0
  40. data/examples/integrations/dynamic-roda-tilt/app.rb +50 -0
  41. data/examples/integrations/dynamic-roda-tilt/config.ru +3 -0
  42. data/examples/integrations/dynamic-sinatra-opal-sprockets-server/Gemfile +7 -0
  43. data/examples/integrations/dynamic-sinatra-opal-sprockets-server/README.md +16 -0
  44. data/examples/integrations/dynamic-sinatra-opal-sprockets-server/app/application.rb +6 -0
  45. data/examples/integrations/dynamic-sinatra-opal-sprockets-server/config.ru +29 -0
  46. data/examples/integrations/static-bash/.gitignore +2 -0
  47. data/examples/integrations/static-bash/Gemfile +3 -0
  48. data/examples/integrations/static-bash/README.md +8 -0
  49. data/examples/integrations/static-bash/app/application.rb +6 -0
  50. data/examples/integrations/static-bash/build.sh +4 -0
  51. data/examples/integrations/static-bash/index.html +10 -0
  52. data/examples/integrations/static-bash-opal-parser/.gitignore +3 -0
  53. data/examples/integrations/static-bash-opal-parser/Gemfile +3 -0
  54. data/examples/integrations/static-bash-opal-parser/README.md +10 -0
  55. data/examples/integrations/static-bash-opal-parser/build.sh +4 -0
  56. data/examples/integrations/static-bash-opal-parser/index.html +19 -0
  57. data/examples/integrations/static-rake/.gitignore +1 -0
  58. data/examples/integrations/static-rake/Gemfile +4 -0
  59. data/examples/integrations/static-rake/README.md +7 -0
  60. data/examples/integrations/static-rake/Rakefile +10 -0
  61. data/examples/integrations/static-rake/app/application.rb +6 -0
  62. data/examples/integrations/static-rake/index.html +9 -0
  63. data/examples/integrations/static-rake-guard/.gitignore +1 -0
  64. data/examples/integrations/static-rake-guard/Gemfile +6 -0
  65. data/examples/integrations/static-rake-guard/Guardfile +3 -0
  66. data/examples/integrations/static-rake-guard/README.md +10 -0
  67. data/examples/integrations/static-rake-guard/Rakefile +10 -0
  68. data/examples/integrations/static-rake-guard/app/application.rb +6 -0
  69. data/examples/integrations/static-rake-guard/index.html +9 -0
  70. data/examples/svg/.gitignore +1 -0
  71. data/examples/svg/Gemfile +4 -0
  72. data/examples/svg/README.md +7 -0
  73. data/examples/svg/Rakefile +10 -0
  74. data/examples/svg/app/application.rb +11 -0
  75. data/examples/svg/index.html +17 -0
  76. data/examples/svg/index.svg +6 -0
  77. data/index.html.erb +2 -3
  78. data/opal/browser/audio/node.rb +121 -0
  79. data/opal/browser/audio/param_schedule.rb +43 -0
  80. data/opal/browser/audio.rb +66 -0
  81. data/opal/browser/blob.rb +94 -0
  82. data/opal/browser/canvas/data.rb +1 -1
  83. data/opal/browser/canvas/gradient.rb +1 -1
  84. data/opal/browser/canvas/style.rb +3 -1
  85. data/opal/browser/canvas/text.rb +1 -1
  86. data/opal/browser/canvas.rb +17 -3
  87. data/opal/browser/console.rb +3 -1
  88. data/opal/browser/cookies.rb +72 -34
  89. data/opal/browser/crypto.rb +79 -0
  90. data/opal/browser/css/declaration.rb +1 -1
  91. data/opal/browser/css/rule.rb +1 -1
  92. data/opal/browser/css/style_sheet.rb +2 -2
  93. data/opal/browser/css.rb +23 -7
  94. data/opal/browser/database/sql.rb +7 -8
  95. data/opal/browser/delay.rb +16 -0
  96. data/opal/browser/dom/attribute.rb +1 -1
  97. data/opal/browser/dom/builder.rb +29 -10
  98. data/opal/browser/dom/document.rb +81 -13
  99. data/opal/browser/dom/document_fragment.rb +18 -0
  100. data/opal/browser/dom/document_or_shadow_root.rb +19 -0
  101. data/opal/browser/dom/element/attributes.rb +28 -4
  102. data/opal/browser/dom/element/button.rb +31 -0
  103. data/opal/browser/dom/element/custom.rb +177 -0
  104. data/opal/browser/dom/element/data.rb +17 -2
  105. data/opal/browser/dom/element/editable.rb +47 -0
  106. data/opal/browser/dom/element/form.rb +38 -0
  107. data/opal/browser/dom/element/iframe.rb +37 -0
  108. data/opal/browser/dom/element/image.rb +2 -0
  109. data/opal/browser/dom/element/input.rb +36 -0
  110. data/opal/browser/dom/element/media.rb +17 -0
  111. data/opal/browser/dom/element/scroll.rb +106 -74
  112. data/opal/browser/dom/element/select.rb +6 -0
  113. data/opal/browser/dom/element/size.rb +12 -0
  114. data/opal/browser/dom/element/template.rb +2 -0
  115. data/opal/browser/dom/element/textarea.rb +2 -0
  116. data/opal/browser/dom/element.rb +194 -50
  117. data/opal/browser/dom/mutation_observer.rb +2 -2
  118. data/opal/browser/dom/node.rb +53 -13
  119. data/opal/browser/dom/node_set.rb +13 -2
  120. data/opal/browser/dom/shadow_root.rb +12 -0
  121. data/opal/browser/dom/text.rb +2 -2
  122. data/opal/browser/dom.rb +38 -5
  123. data/opal/browser/effects.rb +170 -4
  124. data/opal/browser/event/all.rb +26 -0
  125. data/opal/browser/event/animation.rb +2 -0
  126. data/opal/browser/event/audio_processing.rb +2 -0
  127. data/opal/browser/event/base.rb +35 -4
  128. data/opal/browser/event/before_unload.rb +2 -0
  129. data/opal/browser/event/clipboard.rb +9 -0
  130. data/opal/browser/event/close.rb +2 -0
  131. data/opal/browser/event/composition.rb +2 -0
  132. data/opal/browser/event/custom.rb +1 -1
  133. data/opal/browser/event/data_transfer.rb +95 -0
  134. data/opal/browser/event/device_light.rb +2 -0
  135. data/opal/browser/event/device_motion.rb +2 -0
  136. data/opal/browser/event/device_orientation.rb +2 -0
  137. data/opal/browser/event/device_proximity.rb +2 -0
  138. data/opal/browser/event/drag.rb +9 -5
  139. data/opal/browser/event/focus.rb +2 -0
  140. data/opal/browser/event/gamepad.rb +3 -1
  141. data/opal/browser/event/hash_change.rb +2 -0
  142. data/opal/browser/event/keyboard.rb +14 -1
  143. data/opal/browser/event/message.rb +2 -0
  144. data/opal/browser/event/mouse.rb +10 -6
  145. data/opal/browser/event/page_transition.rb +2 -0
  146. data/opal/browser/event/pop_state.rb +2 -0
  147. data/opal/browser/event/progress.rb +2 -0
  148. data/opal/browser/event/sensor.rb +2 -0
  149. data/opal/browser/event/storage.rb +2 -0
  150. data/opal/browser/event/touch.rb +2 -0
  151. data/opal/browser/event/wheel.rb +2 -0
  152. data/opal/browser/event.rb +26 -116
  153. data/opal/browser/event_source.rb +1 -1
  154. data/opal/browser/form_data.rb +225 -0
  155. data/opal/browser/history.rb +4 -8
  156. data/opal/browser/http/request.rb +32 -10
  157. data/opal/browser/http/response.rb +5 -1
  158. data/opal/browser/http.rb +0 -2
  159. data/opal/browser/immediate.rb +0 -2
  160. data/opal/browser/location.rb +7 -1
  161. data/opal/browser/navigator.rb +105 -4
  162. data/opal/browser/polyfill/visual_viewport.rb +216 -0
  163. data/opal/browser/screen.rb +2 -2
  164. data/opal/browser/setup/base.rb +6 -0
  165. data/opal/browser/setup/full.rb +13 -0
  166. data/opal/browser/setup/large.rb +17 -0
  167. data/opal/browser/setup/mini.rb +8 -0
  168. data/opal/browser/setup/traditional.rb +10 -0
  169. data/opal/browser/socket.rb +3 -3
  170. data/opal/browser/storage.rb +2 -2
  171. data/opal/browser/support.rb +46 -22
  172. data/opal/browser/utils.rb +94 -14
  173. data/opal/browser/version.rb +1 -1
  174. data/opal/browser/visual_viewport.rb +39 -0
  175. data/opal/browser/window/size.rb +14 -0
  176. data/opal/browser/window/view.rb +15 -0
  177. data/opal/browser/window.rb +29 -16
  178. data/opal/browser.rb +1 -11
  179. data/opal-browser.gemspec +3 -3
  180. data/spec/database/sql_spec.rb +43 -35
  181. data/spec/delay_spec.rb +15 -12
  182. data/spec/dom/document_spec.rb +10 -8
  183. data/spec/dom/element/custom_spec.rb +106 -0
  184. data/spec/dom/element/subclass_spec.rb +144 -0
  185. data/spec/dom/element_spec.rb +42 -0
  186. data/spec/dom/mutation_observer_spec.rb +12 -8
  187. data/spec/dom/node_spec.rb +48 -0
  188. data/spec/dom_spec.rb +8 -0
  189. data/spec/event_source_spec.rb +15 -12
  190. data/spec/{dom/event_spec.rb → event_spec.rb} +44 -15
  191. data/spec/history_spec.rb +23 -19
  192. data/spec/http_spec.rb +19 -31
  193. data/spec/immediate_spec.rb +5 -4
  194. data/spec/interval_spec.rb +18 -9
  195. data/spec/native_cached_wrapper_spec.rb +46 -0
  196. data/spec/runner.rb +37 -62
  197. data/spec/socket_spec.rb +15 -12
  198. data/spec/spec_helper.rb +2 -1
  199. data/spec/spec_helper_promise.rb.erb +25 -0
  200. metadata +120 -16
  201. data/.travis.yml +0 -74
  202. data/opal/browser/window/scroll.rb +0 -59
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7da4f18bcba46ae940082055c721673e46573149
4
- data.tar.gz: f70ab45c0391a6e9924b0b29a3a01923a7f1bcd2
2
+ SHA256:
3
+ metadata.gz: ca31ac16a859cb8e8e2d033f9654d73f69af51fb370b84c4eea90c11d854b591
4
+ data.tar.gz: cf292f8f778e76a8a0552a57d608cafbd975653df39df2f79e6d0ea1f8600d5e
5
5
  SHA512:
6
- metadata.gz: e193b212a1d022644320910c25550cfb9f1db89667f07ea1c594ef5c70aff102a3184b68099f7cd7e9e0d8f6d4904e1dc429c678fbe6fb913d20df64c2c5f610
7
- data.tar.gz: 03ed1d8246750cae5bae479b3146de89217ab57af51e5e95d1889247e74a7e6a4fdfad38447f1d0e8290b356924dfa4fd46c899469fa3b95c2bc568ad9c8d644
6
+ metadata.gz: 60b6ebdb57718727af8443be34513c614d49d6a182a7a1189bf37ecf2998e8895a8ed6b321455be04e45ce94815e762d93cd1ad3d35b9bf8c1257b5a9face39e
7
+ data.tar.gz: 0eda48ea9ba83c04929266bb2c664290d22389a6ff16aef4faab3b4a055c7510ed2e9734d6f6d7b409a79ecb56086627df559ea2c0d8ce3281a9e13472731adc
@@ -0,0 +1,78 @@
1
+ name: build
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ - "*-stable"
8
+ - "*/ci-check"
9
+ pull_request: {}
10
+
11
+ jobs:
12
+ rake:
13
+ name: ${{ matrix.combo.name }}
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ combo:
18
+ - name: Chromium/Linux/Opal-master
19
+ opal: master
20
+ - name: Chromium/Linux/Opal-1.4
21
+ opal: 1.4
22
+ - name: Chromium/Linux/Opal-1.3/PromiseV2
23
+ opal: 1.3
24
+ promise: v2
25
+ - name: Chromium/Linux/Opal-1.3
26
+ opal: 1.3
27
+ - name: Chromium/Linux/Opal-1.0
28
+ opal: '1.0'
29
+ - name: Chromium/Linux/Ruby-2.7
30
+ ruby: 2.7
31
+ - name: Chromium/Linux/Ruby-2.6
32
+ ruby: 2.6
33
+ - name: Firefox/Linux
34
+ browser: gecko
35
+ - name: Chromium/Windows
36
+ os: windows-latest
37
+ - name: Firefox/Windows
38
+ browser: gecko
39
+ os: windows-latest
40
+ - name: Edge/Windows
41
+ browser: edge
42
+ os: windows-latest
43
+ - name: Chromium/macOS
44
+ os: macos-latest
45
+ - name: Firefox/macOS
46
+ browser: gecko
47
+ os: macos-latest
48
+ - name: Safari/macOS
49
+ browser: safari
50
+ os: macos-latest
51
+
52
+ runs-on: ${{ matrix.combo.os || 'ubuntu-latest' }}
53
+
54
+ steps:
55
+ - uses: actions/checkout@v2
56
+ - name: set environment variables
57
+ run: |
58
+ echo "OPAL_VERSION=${{ matrix.combo.opal || '1.3' }}" >> $GITHUB_ENV
59
+ echo "OPAL_BROWSER_PROMISE=${{ matrix.combo.promise || 'v1' }}" >> $GITHUB_ENV
60
+ - uses: ruby/setup-ruby@v1
61
+ with:
62
+ ruby-version: ${{ matrix.combo.ruby || '3.0' }}
63
+ - run: bundle lock
64
+ - uses: actions/cache@v2
65
+ with:
66
+ path: ./vendor/bundle
67
+ key: ${{ runner.os }}-${{ matrix.combo.ruby || '3.0' }}-gems-${{ matrix.combo.opal || '1.3' }}-${{ github.ref }}-${{ hashFiles('**/Gemfile.lock') }}
68
+ restore-keys: |
69
+ ${{ runner.os }}-${{ matrix.combo.ruby || '3.0' }}-gems-${{ matrix.combo.opal || '1.3' }}-${{ github.ref }}
70
+ ${{ runner.os }}-${{ matrix.combo.ruby || '3.0' }}-gems-${{ matrix.combo.opal || '1.3' }}-master
71
+ ${{ runner.os }}-${{ matrix.combo.ruby || '3.0' }}-gems-${{ matrix.combo.opal || '1.3' }}-
72
+ ${{ runner.os }}-${{ matrix.combo.ruby || '3.0' }}-gems-
73
+ - name: bundle install
74
+ run: |
75
+ bundle config path $PWD/vendor/bundle
76
+ bundle install --jobs 4 --retry 3
77
+ bundle clean
78
+ - run: bundle exec rake selenium_${{ matrix.combo.browser || 'chrome' }}
data/.gitignore CHANGED
@@ -3,3 +3,6 @@ vendor
3
3
  .bundle
4
4
  copycat
5
5
  doc
6
+ .yardoc
7
+ screenshot.png
8
+ /pkg
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 CHANGED
@@ -2,15 +2,29 @@ source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
4
  # specs
5
+ gem 'rake'
5
6
  gem 'rack'
6
7
  gem 'sinatra'
7
8
  gem 'sinatra-websocket'
8
- gem 'opal-rspec', '0.4.0.beta1'
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/
9
15
 
10
16
  # runner
11
17
  gem 'selenium-webdriver', require: false
12
18
  gem 'rest-client', require: false
19
+ gem 'webdrivers', require: false
20
+ gem 'rexml', require: false
13
21
 
14
22
  # browser
15
- gem 'opal', github: 'opal/opal'
16
- gem 'paggio', github: 'meh/paggio'
23
+ case ENV['OPAL_VERSION']
24
+ when nil
25
+ when /\./
26
+ gem 'opal', "~> #{ENV['OPAL_VERSION']}.0a"
27
+ else
28
+ gem 'opal', github: 'opal/opal', ref: ENV['OPAL_VERSION']
29
+ end
30
+
data/LICENSE CHANGED
@@ -1,4 +1,5 @@
1
- Copyright (C) 2014 by meh
1
+ Copyright (C) 2013-2018 by meh
2
+ Copyright (C) 2019-2021 hmdne and the Opal-Browser contributors
2
3
 
3
4
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
5
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,18 +1,33 @@
1
- Browser support for Opal
2
- ========================
1
+ Opal-Browser - Client side web development in pure Ruby, using Opal
2
+ ===================================================================
3
3
 
4
- [![Build Status](https://secure.travis-ci.org/opal/opal-browser.svg?branch=master)](http://travis-ci.org/opal/opal-browser)
5
4
  [![Gem Version](https://badge.fury.io/rb/opal-browser.svg)](http://badge.fury.io/rb/opal-browser)
6
- [![Code Climate](http://img.shields.io/codeclimate/github/opal/opal-browser.svg)](https://codeclimate.com/github/opal/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)
7
10
 
8
-
9
- This library aims to be a full-blown wrapper for all the browser API including
11
+ This library aims to be a full-blown wrapper for all the browser API as defined by
10
12
  HTML5.
11
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
+
12
19
  Usage
13
20
  =====
14
21
 
15
- _Server side (config.ru, Rakefile, Rails, Sinatra, etc.)_
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)_
16
31
 
17
32
  ```ruby
18
33
  require 'opal-browser'
@@ -23,15 +38,47 @@ _Browser side_
23
38
 
24
39
  ```ruby
25
40
  require 'opal'
26
- require 'browser'
41
+ require 'native'
42
+ require 'promise'
43
+ require 'browser/setup/full'
44
+
27
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
28
59
  ```
29
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
+ ```
30
75
 
76
+ See the `examples/integrations/` directory for various ideas on how to quickly start
77
+ development using opal-browser.
31
78
 
32
79
  Features
33
80
  ========
34
- This is a list of the currently wrapped features and some details on them.
81
+ This is a list of many currently wrapped features and some details on them.
35
82
 
36
83
  DOM
37
84
  ---
@@ -44,8 +91,8 @@ $document.ready do
44
91
  end
45
92
  ```
46
93
 
47
- It also supports a markaby inspired builder DSL which generates DOM nodes
48
- directly instead of creating a string.
94
+ It also supports a markaby inspired builder DSL (using Paggio) which generates
95
+ DOM nodes directly instead of creating a string.
49
96
 
50
97
  ```ruby
51
98
  $document.ready do
@@ -57,12 +104,38 @@ $document.ready do
57
104
  end
58
105
  ```
59
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
+
60
133
  CSSOM
61
134
  -----
62
- CSSOM support is still incomplete but the useful parts are implemented, this
63
- includes a DSL for generating a CSS style and the same DSL is also used to
64
- change style declarations (which can either belong to a `DOM::Element` or a
65
- `CSS::Rule::Style`).
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`).
66
139
 
67
140
  ```ruby
68
141
  $document.body.style.apply {
@@ -80,6 +153,8 @@ supports binary results as typed-arrays.
80
153
  It easily allows for synchronous and asynchronous requests.
81
154
 
82
155
  ```ruby
156
+ require 'browser/http'
157
+
83
158
  Browser::HTTP.get "/something.json" do
84
159
  on :success do |res|
85
160
  alert res.json.inspect
@@ -93,6 +168,8 @@ Websockets have been fully wrapped and they are easily configurable with
93
168
  blocks.
94
169
 
95
170
  ```ruby
171
+ require 'browser/socket'
172
+
96
173
  Browser::Socket.new 'ws://echo.websocket.org' do
97
174
  on :open do
98
175
  every 1 do
@@ -111,6 +188,8 @@ EventSource
111
188
  Event sources have been implemented and are easily configurable with blocks.
112
189
 
113
190
  ```ruby
191
+ require 'browser/event_source'
192
+
114
193
  Browser::EventSource.new '/events' do |es|
115
194
  es.on :message do |e|
116
195
  alert e.data
@@ -126,16 +205,36 @@ History
126
205
  -------
127
206
  The HTML5 History API has been fully wrapped.
128
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
+
129
219
  Storage
130
220
  -------
131
221
  The HTML5 Storage API has been wrapped and it exports a single Storage class
132
222
  that uses the most appropriate and available API to store data locally.
133
223
 
224
+ ```ruby
225
+ require 'browser/storage'
226
+
227
+ $storage = $window.storage
228
+ $storage[:hello] = "world"
229
+ ```
230
+
134
231
  Database SQL
135
232
  ------------
136
- WebSQL has been fully wrapped.
233
+ WebSQL has been fully wrapped (Chromium-only)
137
234
 
138
235
  ```ruby
236
+ require 'browser/database/sql'
237
+
139
238
  db = Browser::Database::SQL.new 'test'
140
239
  db.transaction {|t|
141
240
  t.query('CREATE TABLE test(ID INTEGER PRIMARY KEY ASC, text TEXT)').then {
@@ -155,55 +254,33 @@ db.transaction {|t|
155
254
  Browser support
156
255
  ===============
157
256
 
158
- * Internet Explorer 6+
159
- * Firefox (Current - 1) or Current
160
- * Chrome (Current - 1) or Current
161
- * Safari 5.1+
162
- * Opera 12.1x or (Current - 1) or Current
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
163
262
 
164
263
  Any problem above browsers should be considered and reported as a bug.
165
264
 
166
- (Current - 1) or Current denotes that we support the current stable version of
167
- the browser and the version that preceded it. For example, if the current
168
- version of a browser is 24.x, we support the 24.x and 23.x versions.
169
-
170
- 12.1x or (Current - 1) or Current denotes that we support Opera 12.1x as well
171
- as last 2 versions of Opera. For example, if the current Opera version is 20.x,
172
- we support Opera 12.1x, 19.x and 20.x but not Opera 15.x through 18.x.
173
-
174
- Cross-browser testing sponsored by [BrowserStack](http://browserstack.com).
175
-
176
- CSS selectors
177
- -------------
178
- Older browsers do not support CSS selector in queries, this means you'll need
179
- external polyfills for this.
180
-
181
- The suggested polyfill is [Sizzle](http://sizzlejs.com/), require it **before**
182
- opal-browser.
183
-
184
- JSON parsing
185
- ------------
186
- Older browsers don't support JSON parsing natively, this means you'll need
187
- external polyfills for this.
188
-
189
- The suggested polyfill is [json2](https://github.com/douglascrockford/JSON-js),
190
- require it **before** opal-browser.
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.
191
268
 
192
- XPath support
193
- -------------
194
- Not all browsers support XPath queries, I'm looking at you Internet Explorer,
195
- this means you'll need external polyfills for this.
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.
196
273
 
197
- The suggested polyfill is
198
- [wgxpath](https://code.google.com/p/wicked-good-xpath/), require it **before**
199
- opal-browser.
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`).
200
276
 
201
277
  License
202
278
  =======
203
279
 
204
280
  (The MIT License)
205
281
 
206
- Copyright (C) 2014 by meh
282
+ Copyright (C) 2013-2018 by meh<br>
283
+ Copyright (C) 2019-2021 hmdne and the Opal-Browser contributors
207
284
 
208
285
  Permission is hereby granted, free of charge, to any person obtaining a copy
209
286
  of this software and associated documentation files (the "Software"), to deal
data/Rakefile CHANGED
@@ -1,5 +1,33 @@
1
1
  require 'bundler'
2
2
  Bundler.require
3
+ require 'bundler/gem_tasks'
4
+
5
+ require 'webdrivers'
6
+ load 'webdrivers/Rakefile'
3
7
 
4
8
  require 'opal/rspec/rake_task'
5
- Opal::RSpec::RakeTask.new(:default)
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
data/config.ru CHANGED
@@ -2,11 +2,17 @@ require 'bundler'
2
2
  Bundler.require
3
3
 
4
4
  apps = []
5
- apps << Opal::Server.new { |s|
6
- s.append_path 'spec'
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|
7
12
  s.main = 'opal/rspec/sprockets_runner'
13
+ s.append_path 'spec'
8
14
  s.index_path = 'index.html.erb'
9
- s.debug = false
15
+ s.debug = true
10
16
  }
11
17
 
12
18
  apps << Class.new(Sinatra::Base) {
@@ -34,6 +40,17 @@ apps << Class.new(Sinatra::Base) {
34
40
  "lol"
35
41
  end
36
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
+
37
54
  get '/events' do
38
55
  headers 'Content-Type' => 'text/event-stream'
39
56
 
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,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "opal-sprockets"
4
+ gem "puma"
5
+ gem "rack"
6
+ gem "opal-browser", path: "../.."
@@ -0,0 +1,13 @@
1
+ 2048 clone with Opal-Browser
2
+ ============================
3
+
4
+ A 167 line implementation of 2048, but in Ruby inside a browser!
5
+
6
+ To install, run:
7
+
8
+ $ bundle install
9
+
10
+ Start server
11
+ ------------
12
+
13
+ $ bundle exec rackup