opal-browser 0.2.0.beta1 → 0.3.2

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 (218) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/build.yml +95 -0
  3. data/.gitignore +3 -0
  4. data/CHANGELOG.md +8 -0
  5. data/Gemfile +17 -3
  6. data/LICENSE +2 -1
  7. data/README.md +183 -52
  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 +8 -6
  78. data/lib/opal-browser.rb +1 -0
  79. data/opal/browser/animation_frame.rb +26 -1
  80. data/opal/browser/audio/node.rb +121 -0
  81. data/opal/browser/audio/param_schedule.rb +43 -0
  82. data/opal/browser/audio.rb +66 -0
  83. data/opal/browser/blob.rb +94 -0
  84. data/opal/browser/canvas/data.rb +1 -11
  85. data/opal/browser/canvas/gradient.rb +1 -11
  86. data/opal/browser/canvas/style.rb +3 -11
  87. data/opal/browser/canvas/text.rb +1 -11
  88. data/opal/browser/canvas.rb +17 -13
  89. data/opal/browser/console.rb +3 -1
  90. data/opal/browser/cookies.rb +78 -42
  91. data/opal/browser/crypto.rb +79 -0
  92. data/opal/browser/css/declaration.rb +1 -1
  93. data/opal/browser/css/rule.rb +1 -1
  94. data/opal/browser/css/style_sheet.rb +2 -2
  95. data/opal/browser/css.rb +23 -7
  96. data/opal/browser/database/sql.rb +193 -0
  97. data/opal/browser/delay.rb +41 -7
  98. data/opal/browser/dom/attribute.rb +13 -12
  99. data/opal/browser/dom/builder.rb +31 -17
  100. data/opal/browser/dom/document.rb +174 -42
  101. data/opal/browser/dom/document_fragment.rb +18 -0
  102. data/opal/browser/dom/document_or_shadow_root.rb +19 -0
  103. data/opal/browser/dom/element/attributes.rb +111 -0
  104. data/opal/browser/dom/element/button.rb +31 -0
  105. data/opal/browser/dom/element/custom.rb +177 -0
  106. data/opal/browser/dom/element/data.rb +82 -0
  107. data/opal/browser/dom/element/editable.rb +47 -0
  108. data/opal/browser/dom/element/form.rb +38 -0
  109. data/opal/browser/dom/element/iframe.rb +37 -0
  110. data/opal/browser/dom/element/image.rb +2 -0
  111. data/opal/browser/dom/element/input.rb +48 -1
  112. data/opal/browser/dom/element/media.rb +17 -0
  113. data/opal/browser/dom/element/offset.rb +5 -0
  114. data/opal/browser/dom/element/position.rb +11 -2
  115. data/opal/browser/dom/element/scroll.rb +123 -24
  116. data/opal/browser/dom/element/select.rb +42 -0
  117. data/opal/browser/dom/element/size.rb +17 -0
  118. data/opal/browser/dom/element/template.rb +11 -0
  119. data/opal/browser/dom/element/textarea.rb +26 -0
  120. data/opal/browser/dom/element.rb +468 -238
  121. data/opal/browser/dom/mutation_observer.rb +4 -4
  122. data/opal/browser/dom/node.rb +142 -60
  123. data/opal/browser/dom/node_set.rb +73 -44
  124. data/opal/browser/dom/shadow_root.rb +12 -0
  125. data/opal/browser/dom/text.rb +2 -2
  126. data/opal/browser/dom.rb +40 -16
  127. data/opal/browser/effects.rb +180 -3
  128. data/opal/browser/event/all.rb +26 -0
  129. data/opal/browser/{dom/event → event}/animation.rb +4 -2
  130. data/opal/browser/{dom/event → event}/audio_processing.rb +4 -2
  131. data/opal/browser/{dom/event → event}/base.rb +98 -9
  132. data/opal/browser/{dom/event → event}/before_unload.rb +4 -2
  133. data/opal/browser/{dom/event → event}/clipboard.rb +11 -2
  134. data/opal/browser/{dom/event → event}/close.rb +4 -2
  135. data/opal/browser/{dom/event → event}/composition.rb +4 -2
  136. data/opal/browser/{dom/event → event}/custom.rb +3 -3
  137. data/opal/browser/event/data_transfer.rb +95 -0
  138. data/opal/browser/{dom/event → event}/device_light.rb +4 -2
  139. data/opal/browser/{dom/event → event}/device_motion.rb +4 -2
  140. data/opal/browser/{dom/event → event}/device_orientation.rb +4 -2
  141. data/opal/browser/{dom/event → event}/device_proximity.rb +4 -2
  142. data/opal/browser/{dom/event → event}/drag.rb +11 -7
  143. data/opal/browser/{dom/event → event}/focus.rb +4 -2
  144. data/opal/browser/{dom/event → event}/gamepad.rb +5 -3
  145. data/opal/browser/{dom/event → event}/hash_change.rb +4 -2
  146. data/opal/browser/{dom/event → event}/keyboard.rb +16 -3
  147. data/opal/browser/{dom/event → event}/message.rb +4 -2
  148. data/opal/browser/{dom/event → event}/mouse.rb +12 -8
  149. data/opal/browser/{dom/event → event}/page_transition.rb +4 -2
  150. data/opal/browser/{dom/event → event}/pop_state.rb +4 -2
  151. data/opal/browser/{dom/event → event}/progress.rb +4 -2
  152. data/opal/browser/{dom/event → event}/sensor.rb +4 -2
  153. data/opal/browser/{dom/event → event}/storage.rb +4 -2
  154. data/opal/browser/{dom/event → event}/touch.rb +4 -2
  155. data/opal/browser/{dom/event → event}/ui.rb +2 -2
  156. data/opal/browser/{dom/event → event}/wheel.rb +4 -2
  157. data/opal/browser/event.rb +163 -0
  158. data/opal/browser/event_source.rb +2 -2
  159. data/opal/browser/form_data.rb +225 -0
  160. data/opal/browser/history.rb +4 -8
  161. data/opal/browser/http/binary.rb +1 -0
  162. data/opal/browser/http/headers.rb +16 -2
  163. data/opal/browser/http/request.rb +46 -48
  164. data/opal/browser/http/response.rb +5 -1
  165. data/opal/browser/http.rb +25 -2
  166. data/opal/browser/immediate.rb +9 -5
  167. data/opal/browser/interval.rb +34 -11
  168. data/opal/browser/location.rb +7 -1
  169. data/opal/browser/navigator.rb +127 -7
  170. data/opal/browser/polyfill/visual_viewport.rb +216 -0
  171. data/opal/browser/screen.rb +3 -3
  172. data/opal/browser/setup/base.rb +6 -0
  173. data/opal/browser/setup/full.rb +13 -0
  174. data/opal/browser/setup/large.rb +17 -0
  175. data/opal/browser/setup/mini.rb +8 -0
  176. data/opal/browser/setup/traditional.rb +10 -0
  177. data/opal/browser/socket.rb +8 -4
  178. data/opal/browser/storage.rb +53 -35
  179. data/opal/browser/support.rb +72 -5
  180. data/opal/browser/utils.rb +94 -14
  181. data/opal/browser/version.rb +1 -1
  182. data/opal/browser/visual_viewport.rb +39 -0
  183. data/opal/browser/window/size.rb +31 -3
  184. data/opal/browser/window/view.rb +15 -0
  185. data/opal/browser/window.rb +46 -25
  186. data/opal/browser.rb +1 -10
  187. data/opal/opal-browser.rb +1 -0
  188. data/opal-browser.gemspec +3 -3
  189. data/spec/database/sql_spec.rb +139 -0
  190. data/spec/delay_spec.rb +41 -0
  191. data/spec/dom/attribute_spec.rb +49 -0
  192. data/spec/dom/builder_spec.rb +25 -8
  193. data/spec/dom/document_spec.rb +22 -0
  194. data/spec/dom/element/attributes_spec.rb +52 -0
  195. data/spec/dom/element/custom_spec.rb +106 -0
  196. data/spec/dom/element/subclass_spec.rb +144 -0
  197. data/spec/dom/element_spec.rb +181 -4
  198. data/spec/dom/mutation_observer_spec.rb +12 -8
  199. data/spec/dom/node_set_spec.rb +44 -0
  200. data/spec/dom/node_spec.rb +48 -0
  201. data/spec/dom_spec.rb +8 -0
  202. data/spec/event_source_spec.rb +15 -12
  203. data/spec/{dom/event_spec.rb → event_spec.rb} +44 -15
  204. data/spec/history_spec.rb +23 -19
  205. data/spec/http_spec.rb +19 -31
  206. data/spec/immediate_spec.rb +5 -4
  207. data/spec/interval_spec.rb +59 -0
  208. data/spec/native_cached_wrapper_spec.rb +46 -0
  209. data/spec/runner.rb +62 -69
  210. data/spec/socket_spec.rb +16 -12
  211. data/spec/spec_helper.rb +2 -5
  212. data/spec/spec_helper_promise.rb.erb +25 -0
  213. data/spec/storage_spec.rb +1 -1
  214. metadata +172 -50
  215. data/.travis.yml +0 -60
  216. data/opal/browser/dom/event.rb +0 -253
  217. data/opal/browser/http/parameters.rb +0 -8
  218. data/opal/browser/window/scroll.rb +0 -59
@@ -1,6 +1,8 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class DeviceMotion < Event
4
+ handles 'devicemotion'
5
+
4
6
  def self.supported?
5
7
  Browser.supports? 'Event.DeviceMotion'
6
8
  end
@@ -48,4 +50,4 @@ class DeviceMotion < Event
48
50
  alias_native :interval
49
51
  end
50
52
 
51
- end; end; end
53
+ end; end
@@ -1,6 +1,8 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class DeviceOrientation < Event
4
+ handles 'deviceorientation'
5
+
4
6
  def self.supported?
5
7
  Browser.supports? 'Event.DeviceOrientation'
6
8
  end
@@ -45,4 +47,4 @@ class DeviceOrientation < Event
45
47
  alias_native :gamma
46
48
  end
47
49
 
48
- end; end; end
50
+ end; end
@@ -1,6 +1,8 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class DeviceProximity < Event
4
+ handles 'deviceproximity'
5
+
4
6
  def self.supported?
5
7
  Browser.supports? 'Event.DeviceProximity'
6
8
  end
@@ -30,4 +32,4 @@ class DeviceProximity < Event
30
32
  alias_native :max
31
33
  end
32
34
 
33
- end; end; end
35
+ end; end
@@ -1,14 +1,16 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
- # TODO: handle transfers
4
3
  class Drag < Event
4
+ handles 'drag', 'dragend', 'dragenter', 'dragexit', 'dragleave', 'dragover',
5
+ 'dragstart', 'drop'
6
+
5
7
  def self.supported?
6
8
  Browser.supports? 'Event.Drag'
7
9
  end
8
10
 
9
11
  class Definition < Definition
10
12
  class Client
11
- include Native
13
+ include Native::Wrapper
12
14
 
13
15
  def x=(value)
14
16
  `#@native.clientX = #{value}`
@@ -20,7 +22,7 @@ class Drag < Event
20
22
  end
21
23
 
22
24
  class Screen
23
- include Native
25
+ include Native::Wrapper
24
26
 
25
27
  def x=(value)
26
28
  `#@native.screenX = #{value}`
@@ -60,7 +62,7 @@ class Drag < Event
60
62
  end
61
63
 
62
64
  def transfer=(value)
63
- `#@native.dataTransfer = #{Native.convert(elem)}`
65
+ `#@native.dataTransfer = #{Native.convert(value)}`
64
66
  end
65
67
  end
66
68
 
@@ -110,10 +112,12 @@ class Drag < Event
110
112
  DOM(`#@native.relatedTarget`)
111
113
  end
112
114
 
115
+ # Returns a {DataTransfer} related to this event
116
+ #
113
117
  # @see https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer
114
118
  def transfer
115
- raise NotImplementedError
119
+ DataTransfer.new(`#@native.dataTransfer`)
116
120
  end
117
121
  end
118
122
 
119
- end; end; end
123
+ end; end
@@ -1,6 +1,8 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class Focus < UI
4
+ handles 'blur', 'focus', 'focusin', 'focusout'
5
+
4
6
  def self.supported?
5
7
  Browser.supports? 'Event.Focus'
6
8
  end
@@ -36,4 +38,4 @@ class Focus < UI
36
38
  end
37
39
  end
38
40
 
39
- end; end; end
41
+ end; end
@@ -1,6 +1,8 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class Gamepad < Event
4
+ handles 'gamepadconnected', 'gamepaddisconnected'
5
+
4
6
  def self.supported?
5
7
  Browser.supports? 'Event.Gamepad'
6
8
  end
@@ -29,7 +31,7 @@ class Gamepad < Event
29
31
 
30
32
  if Browser.supports? 'Event.constructor'
31
33
  def self.construct(name, desc)
32
- `new GamepadEvent(#{name}, {
34
+ `return new GamepadEvent(#{name}, {
33
35
  bubbles: desc.bubbles,
34
36
  cancelable: desc.cancelable,
35
37
  gamepad: desc })`
@@ -57,4 +59,4 @@ class Gamepad < Event
57
59
  end
58
60
  end
59
61
 
60
- end; end; end
62
+ end; end
@@ -1,6 +1,8 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class HashChange < Event
4
+ handles 'hashchange'
5
+
4
6
  def self.supported?
5
7
  Browser.supports? 'Event.HashChange'
6
8
  end
@@ -25,4 +27,4 @@ class HashChange < Event
25
27
  alias_native :new, :newURL
26
28
  end
27
29
 
28
- end; end; end
30
+ end; end
@@ -1,6 +1,8 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class Keyboard < UI
4
+ handles 'keydown', 'keypress', 'keyup'
5
+
4
6
  def self.supported?
5
7
  Browser.supports? 'Event.Keyboard'
6
8
  end
@@ -85,8 +87,19 @@ class Keyboard < UI
85
87
  alias_native :locale
86
88
  alias_native :repeat?, :repeat
87
89
 
90
+ # IE 11 at least has different names for those keys.
91
+ IE_MAP = {
92
+ 'Down' => 'ArrowDown',
93
+ 'Up' => 'ArrowUp',
94
+ 'Left' => 'ArrowLeft',
95
+ 'Right' => 'ArrowRight',
96
+ 'Esc' => 'Escape',
97
+ 'Del' => 'Delete'
98
+ }
99
+
88
100
  def key
89
- `#@native.key || #@native.keyIdentifier || nil`
101
+ key = `#@native.key || #@native.keyIdentifier || nil`
102
+ IE_MAP[key] || key
90
103
  end
91
104
 
92
105
  def code
@@ -112,4 +125,4 @@ class Keyboard < UI
112
125
  end
113
126
  end
114
127
 
115
- end; end; end
128
+ end; end
@@ -1,8 +1,10 @@
1
1
  require 'buffer'
2
2
 
3
- module Browser; module DOM; class Event
3
+ module Browser; class Event
4
4
 
5
5
  class Message < Event
6
+ handles 'message'
7
+
6
8
  def self.supported?
7
9
  Browser.supports? 'Event.Message'
8
10
  end
@@ -67,4 +69,4 @@ class Message < Event
67
69
  end
68
70
  end
69
71
 
70
- end; end; end
72
+ end; end
@@ -1,13 +1,17 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class Mouse < UI
4
+ handles 'click', 'contextmenu', 'dblclick', 'mousedown', 'mouseenter',
5
+ 'mouseleave', 'mousemove', 'mouseout', 'mouseover', 'mouseup',
6
+ 'show'
7
+
4
8
  def self.supported?
5
9
  not $$[:MouseEvent].nil?
6
10
  end
7
11
 
8
12
  class Definition < UI::Definition
9
13
  class Client
10
- include Native
14
+ include Native::Wrapper
11
15
 
12
16
  def x=(value)
13
17
  `#@native.clientX = #{value}`
@@ -19,7 +23,7 @@ class Mouse < UI
19
23
  end
20
24
 
21
25
  class Layer
22
- include Native
26
+ include Native::Wrapper
23
27
 
24
28
  def x=(value)
25
29
  `#@native.layerX = #{value}`
@@ -31,7 +35,7 @@ class Mouse < UI
31
35
  end
32
36
 
33
37
  class Offset
34
- include Native
38
+ include Native::Wrapper
35
39
 
36
40
  def x=(value)
37
41
  `#@native.offsetX = #{value}`
@@ -43,7 +47,7 @@ class Mouse < UI
43
47
  end
44
48
 
45
49
  class Page
46
- include Native
50
+ include Native::Wrapper
47
51
 
48
52
  def x=(value)
49
53
  `#@native.pageX = #{value}`
@@ -55,7 +59,7 @@ class Mouse < UI
55
59
  end
56
60
 
57
61
  class Screen
58
- include Native
62
+ include Native::Wrapper
59
63
 
60
64
  def x=(value)
61
65
  `#@native.screenX = #{value}`
@@ -67,7 +71,7 @@ class Mouse < UI
67
71
  end
68
72
 
69
73
  class Ancestor
70
- include Native
74
+ include Native::Wrapper
71
75
 
72
76
  def x=(value)
73
77
  `#@native.x = #{value}`
@@ -251,4 +255,4 @@ class Mouse < UI
251
255
  end
252
256
  end
253
257
 
254
- end; end; end
258
+ end; end
@@ -1,6 +1,8 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class PageTransition < Event
4
+ handles 'pagehide', 'pageshow'
5
+
4
6
  def self.supported?
5
7
  Browser.supports? 'Event.PageTransition'
6
8
  end
@@ -20,4 +22,4 @@ class PageTransition < Event
20
22
  alias_native :persisted?, :persisted
21
23
  end
22
24
 
23
- end; end; end
25
+ end; end
@@ -1,6 +1,8 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class PopState < Event
4
+ handles 'popstate'
5
+
4
6
  def self.supported?
5
7
  Browser.supports? 'Event.PopState'
6
8
  end
@@ -30,4 +32,4 @@ class PopState < Event
30
32
  alias_native :state
31
33
  end
32
34
 
33
- end; end; end
35
+ end; end
@@ -1,6 +1,8 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class Progress < Event
4
+ handles 'progress', 'load', 'loadend', 'loadstart'
5
+
4
6
  def self.supported?
5
7
  Browser.supports? 'Event.Progress'
6
8
  end
@@ -40,4 +42,4 @@ class Progress < Event
40
42
  alias_native :total
41
43
  end
42
44
 
43
- end; end; end
45
+ end; end
@@ -1,6 +1,8 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class Sensor < Event
4
+ handles 'compassneedscalibration', 'userproximity'
5
+
4
6
  def self.supported?
5
7
  Browser.supports? 'Event.Sensor'
6
8
  end
@@ -12,4 +14,4 @@ class Sensor < Event
12
14
  end if supported?
13
15
  end
14
16
 
15
- end; end; end
17
+ end; end
@@ -1,6 +1,8 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class Storage < Event
4
+ handles 'storage'
5
+
4
6
  def self.supported?
5
7
  Browser.supports? 'Event.Storage'
6
8
  end
@@ -40,4 +42,4 @@ class Storage < Event
40
42
  alias_native :url
41
43
  end
42
44
 
43
- end; end; end
45
+ end; end
@@ -1,6 +1,8 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class Touch < Event
4
+ handles 'touchcancel', 'touchend', 'touchleave', 'touchmove', 'touchstart'
5
+
4
6
  def self.supported?
5
7
  Browser.supports? 'Event.Touch'
6
8
  end
@@ -57,4 +59,4 @@ class Touch < Event
57
59
  end
58
60
  end
59
61
 
60
- end; end; end
62
+ end; end
@@ -1,4 +1,4 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class UI < Event
4
4
  def self.supported?
@@ -35,4 +35,4 @@ class UI < Event
35
35
  alias_native :view
36
36
  end
37
37
 
38
- end; end; end
38
+ end; end
@@ -1,6 +1,8 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class Wheel < UI
4
+ handles 'wheel', 'mousewheel'
5
+
4
6
  def self.supported?
5
7
  not $$[:WheelEvent].nil?
6
8
  end
@@ -46,4 +48,4 @@ class Wheel < UI
46
48
  end
47
49
  end
48
50
 
49
- end; end; end
51
+ end; end
@@ -0,0 +1,163 @@
1
+ require 'browser/event/base'
2
+
3
+ module Browser
4
+
5
+ class Event
6
+ def self.aliases
7
+ @aliases ||= {
8
+ 'dom:load' => 'DOMContentLoaded',
9
+ 'hover' => 'mouse:over'
10
+ }
11
+ end
12
+
13
+ def self.name_for(name)
14
+ (aliases[name] || name).gsub(?:, '')
15
+ end
16
+
17
+ def self.handlers
18
+ @handlers ||= {}
19
+ end
20
+
21
+ def self.handles(*events)
22
+ events.each { |event| Event.handlers[event] = self }
23
+ end
24
+
25
+ # Those events don't have interesting properties to warrant a custom class
26
+ # or are not currently implemented.
27
+ handles 'abort', 'afterprint', 'beforeprint', 'cached', 'canplay',
28
+ 'canplaythrough', 'change', 'chargingchange', 'chargingtimechange',
29
+ 'checking', 'close', 'dischargingtimechange', 'DOMContentLoaded',
30
+ 'downloading', 'durationchange', 'emptied', 'ended', 'error',
31
+ 'fullscreenchange', 'fullscreenerror', 'input', 'invalid',
32
+ 'levelchange', 'loadeddata', 'loadedmetadata', 'noupdate', 'obsolete',
33
+ 'offline', 'online', 'open', 'orientationchange', 'pause',
34
+ 'pointerlockchange', 'pointerlockerror', 'play', 'playing',
35
+ 'ratechange', 'readystatechange', 'reset', 'seeked', 'seeking',
36
+ 'stalled', 'submit', 'success', 'suspend', 'timeupdate', 'updateready',
37
+ 'visibilitychange', 'volumechange', 'waiting'
38
+
39
+ def self.class_for(name)
40
+ @handlers[name_for(name)] || Custom
41
+ end
42
+
43
+ def self.supported?
44
+ true
45
+ end
46
+
47
+ def self.create(name, *args, &block)
48
+ name = name_for(name)
49
+ klass = class_for(name)
50
+
51
+ event = klass.new(klass.construct(name, klass.const_get(:Definition).new(&block)))
52
+ event.arguments = args
53
+
54
+ event
55
+ end
56
+
57
+ if Browser.supports? 'Event.constructor'
58
+ def self.construct(name, desc)
59
+ `new Event(#{name}, #{desc})`
60
+ end
61
+ elsif Browser.supports? 'Event.create'
62
+ def self.construct(name, desc)
63
+ %x{
64
+ var event = document.createEvent("HTMLEvents");
65
+ event.initEvent(name, desc.bubbles, desc.cancelable);
66
+
67
+ #{return Native(`event`).merge!(desc)};
68
+ }
69
+ end
70
+ elsif Browser.supports? 'Event.createObject'
71
+ def self.construct(name, desc)
72
+ Native(`document.createEventObject()`) \
73
+ .merge!(desc) \
74
+ .merge!(`{ type: name }`) \
75
+ .to_n
76
+ end
77
+ else
78
+ def self.construct(name, desc)
79
+ Native(desc).merge!(`{ type: name }`).to_n
80
+ end
81
+ end
82
+
83
+ def self.new(value, callback = nil)
84
+ return super unless self == Event
85
+
86
+ klass = class_for(callback ? callback.name : `value.type`)
87
+
88
+ if klass == Event
89
+ super
90
+ else
91
+ klass.new(value, callback)
92
+ end
93
+ end
94
+
95
+ attr_reader :callback
96
+ attr_writer :on
97
+
98
+ def initialize(event, callback = nil)
99
+ super(event)
100
+
101
+ @callback = callback
102
+ end
103
+
104
+ def name
105
+ `#@native.type`
106
+ end
107
+
108
+ def on
109
+ @on || Target.convert(`#@native.currentTarget`)
110
+ end
111
+
112
+ def target
113
+ Target.convert(`#@native.srcElement || #@native.target`)
114
+ end
115
+
116
+ def arguments
117
+ `#@native.arguments || []`
118
+ end
119
+
120
+ def arguments=(args)
121
+ `#@native.arguments = #{args}`
122
+ end
123
+
124
+ alias_native :bubbles?, :bubbles
125
+ alias_native :cancelable?, :cancelable
126
+ alias_native :data
127
+ alias_native :phase, :eventPhase
128
+ alias_native :at, :timeStamp
129
+
130
+ def off
131
+ @callback.off if @callback
132
+ end
133
+
134
+ def stopped?
135
+ `!!#@native.stopped`
136
+ end
137
+
138
+ def stop
139
+ `#@native.stopPropagation()` if defined?(`#@native.stopPropagation`)
140
+ `#@native.stopped = true`
141
+ end
142
+
143
+ def prevent
144
+ `#@native.preventDefault()` if defined?(`#@native.preventDefault`)
145
+ `#@native.prevented = true`
146
+ end
147
+
148
+ def prevented?
149
+ `!!#@native.prevented`
150
+ end
151
+
152
+ def stop!
153
+ prevent
154
+ stop
155
+ end
156
+ end
157
+
158
+ end
159
+
160
+ require 'browser/event/ui'
161
+ require 'browser/event/mouse'
162
+ require 'browser/event/keyboard'
163
+ require 'browser/event/custom'
@@ -9,8 +9,8 @@ class EventSource
9
9
  Browser.supports? :EventSource
10
10
  end
11
11
 
12
- include Native
13
- include DOM::Event::Target
12
+ include Native::Wrapper
13
+ include Event::Target
14
14
 
15
15
  target {|value|
16
16
  EventSource.new(value) if Native.is_a?(value, `window.EventSource`)