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,37 +1,122 @@
1
1
  module Browser; module DOM; class Element < Node
2
2
 
3
+ # @todo Consider using the new interfaces which allow for optional
4
+ # smooth transitions.
3
5
  class Scroll
6
+ attr_reader :element
7
+
8
+ # @private
4
9
  def initialize(element)
5
10
  @element = element
6
11
  @native = element.to_n
12
+
13
+ # Portable support for Window#scroll and Document#scroll
14
+ @scrolling_native = @native
15
+ if [Document, Window].include?(@element.class)
16
+ # If we are a window, let's become a document first.
17
+ if defined? `#@scrolling_native.document`
18
+ @scrolling_native = `#@scrolling_native.document`
19
+ end
20
+ # There were slight disagreements in the past which element
21
+ # should we handle.
22
+ if defined? `#@scrolling_native.documentElement.scrollTop`
23
+ @scrolling_native = `#@scrolling_native.documentElement`
24
+ elsif defined? `#@scrolling_native.body.scrollTop`
25
+ @scrolling_native = `#@scrolling_native.body`
26
+ end
27
+ end
7
28
  end
8
29
 
9
- if Browser.supports? 'Element.scroll'
10
- def to(what)
11
- x = what[:x] || self.x
12
- y = what[:y] || self.y
30
+ # @overload to(x, y)
31
+ #
32
+ # Scroll to the given x and y.
33
+ #
34
+ # @param x [Integer] scroll to x on the x axis
35
+ # @param y [Integer] scroll to y on the y axis
36
+ #
37
+ # @overload to(hash)
38
+ #
39
+ # Scroll to the given x and y.
40
+ #
41
+ # @param hash [Hash] the descriptor
42
+ #
43
+ # @option hash [Integer] :x scroll to x on the x axis
44
+ # @option hash [Integer] :y scroll to y on the y axis
45
+ #
46
+ # @overload to(symbol)
47
+ #
48
+ # Scroll to :top or to :bottom
49
+ #
50
+ # @param symbol [Symbol] either :top or :bottom
51
+ def to(*args)
52
+ x, y = nil, nil
53
+ case args.first
54
+ when Hash
55
+ x = args.first[:x]
56
+ y = args.first[:y]
57
+ when :top
58
+ y = 0
59
+ when :bottom
60
+ y = 99999999
61
+ else
62
+ x, y = args
63
+ end
64
+
65
+ set(x, y) if x || y
13
66
 
14
- `#@native.scrollTop = #{y}`
15
- `#@native.scrollLeft = #{x}`
67
+ self
68
+ end
69
+
70
+ # @overload by(x, y)
71
+ #
72
+ # Scroll by the given x and y.
73
+ #
74
+ # @param x [Integer] scroll by x on the x axis
75
+ # @param y [Integer] scroll by y on the y axis
76
+ #
77
+ # @overload by(hash)
78
+ #
79
+ # Scroll by the given x and y.
80
+ #
81
+ # @param hash [Hash] the descriptor
82
+ #
83
+ # @option hash [Integer] :x scroll by x on the x axis
84
+ # @option hash [Integer] :y scroll by y on the y axis
85
+ def by(*args)
86
+ case args.first
87
+ when Hash
88
+ x = args.first[:x] || 0
89
+ y = args.first[:y] || 0
90
+ else
91
+ x, y = args
16
92
  end
17
93
 
18
- def position
19
- Browser::Position.new(`#@native.scrollLeft`, `#@native.scrollTop`)
94
+ set_by(x, y)
95
+
96
+ self
97
+ end
98
+
99
+ if Browser.supports? 'Element.scrollBy'
100
+ private def set_by(x, y)
101
+ `#@scrolling_native.scrollBy(#{x}, #{y})`
102
+ end
103
+ else
104
+ private def set_by(x, y)
105
+ set(self.x + x, self.y + y)
20
106
  end
21
- elsif Browser.supports? 'Element.pageOffset'
22
- def to(what)
23
- x = what[:x] || self.x
24
- y = what[:y] || self.y
107
+ end
25
108
 
26
- `#@native.pageYOffset = #{y}`
27
- `#@native.pageXOffset = #{x}`
109
+ if Browser.supports? 'Element.scroll'
110
+ private def set(x=nil, y=nil)
111
+ `#@scrolling_native.scrollTop = #{y}` if y
112
+ `#@scrolling_native.scrollLeft = #{x}` if x
28
113
  end
29
114
 
30
115
  def position
31
- Position.new(`#@native.pageXOffset`, `#@native.pageYOffset`)
116
+ Browser::Position.new(`#@scrolling_native.scrollLeft`, `#@scrolling_native.scrollTop`)
32
117
  end
33
118
  else
34
- def to(what)
119
+ private def set(x=nil, y=nil)
35
120
  raise NotImplementedError, 'scroll on element unsupported'
36
121
  end
37
122
 
@@ -40,29 +125,43 @@ class Scroll
40
125
  end
41
126
  end
42
127
 
128
+ # @!attribute [r] x
129
+ # @return [Integer] the scroll position on the x axis
43
130
  def x
44
131
  position.x
45
132
  end
46
133
 
134
+ # @!attribute [r] y
135
+ # @return [Integer] the scroll position on the y axis
47
136
  def y
48
137
  position.y
49
138
  end
50
139
 
140
+ # @!attribute [r] height
141
+ # @return [Integer] the height of the scroll
51
142
  def height
52
- `#@native.scrollHeight`
143
+ `#@scrolling_native.scrollHeight`
53
144
  end
54
145
 
146
+ # @!attribute [r] width
147
+ # @return [Integer] the width of the scroll
55
148
  def width
56
- `#@native.scrollWidth`
149
+ `#@scrolling_native.scrollWidth`
57
150
  end
58
151
 
59
- def by(what)
60
- x = what[:x] || 0
61
- y = what[:y] || 0
62
-
63
- `#@native.scrollBy(#{x}, #{y})`
152
+ if Browser.supports? 'Element.scrollIntoViewIfNeeded'
153
+ def into_view(align = true)
154
+ `#@scrolling_native.scrollIntoViewIfNeeded(align)`
155
+ end
156
+ else
157
+ # Non-standard. Not supported by modern Firefox. Use {#into_view!}
158
+ def into_view(align = true)
159
+ raise NotImplementedError
160
+ end
161
+ end
64
162
 
65
- self
163
+ def into_view!(align = true)
164
+ `#@scrolling_native.scrollIntoView(align)`
66
165
  end
67
166
  end
68
167
 
@@ -0,0 +1,42 @@
1
+ module Browser; module DOM; class Element < Node
2
+
3
+ class Select < Element
4
+ def_selector "select"
5
+
6
+ def value
7
+ %x{
8
+ if (#@native.value == "") {
9
+ return nil;
10
+ }
11
+ else {
12
+ return #@native.value;
13
+ }
14
+ }
15
+ end
16
+
17
+ def value= value
18
+ `#@native.value = #{value.to_n}`
19
+ end
20
+
21
+ def labels
22
+ NodeSet[Native::Array.new(`#@native.labels`)]
23
+ end
24
+
25
+ def options
26
+ NodeSet[Native::Array.new(`#@native.options`)]
27
+ end
28
+
29
+ def option
30
+ DOM(`#@native.options[#@native.selectedIndex]`)
31
+ end
32
+
33
+ def index
34
+ `#@native.selectedIndex`
35
+ end
36
+
37
+ alias_native :multiple?, :multiple
38
+ alias_native :required?, :required
39
+ alias_native :length
40
+ end
41
+
42
+ end; end; end
@@ -3,12 +3,15 @@ module Browser; module DOM; class Element < Node
3
3
  class Size
4
4
  attr_reader :element
5
5
 
6
+ # @private
6
7
  def initialize(element, *inc)
7
8
  @element = element
8
9
  @native = element.to_n
9
10
  @include = inc
10
11
  end
11
12
 
13
+ # @!attribute width
14
+ # @return [Integer] the element width
12
15
  def width
13
16
  `#@native.offsetWidth`
14
17
  end
@@ -17,6 +20,8 @@ class Size
17
20
  @element.style[:width] = value
18
21
  end
19
22
 
23
+ # @!attribute height
24
+ # @return [Integer] the element height
20
25
  def height
21
26
  `#@native.offsetHeight`
22
27
  end
@@ -24,6 +29,18 @@ class Size
24
29
  def height=(value)
25
30
  @element.style[:height] = value
26
31
  end
32
+
33
+ # @!attribute client_width
34
+ # @return [Integer] the content-box width of an element
35
+ def client_width
36
+ `#@native.clientWidth`
37
+ end
38
+
39
+ # @!attribute client_height
40
+ # @return [Integer] the content-box height of an element
41
+ def client_height
42
+ `#@native.clientHeight`
43
+ end
27
44
  end
28
45
 
29
46
  end; end; end
@@ -0,0 +1,11 @@
1
+ module Browser; module DOM; class Element < Node
2
+
3
+ class Template < Element
4
+ def_selector "template"
5
+
6
+ def content
7
+ DOM(`#@native.content`)
8
+ end
9
+ end
10
+
11
+ end; end; end
@@ -0,0 +1,26 @@
1
+ module Browser; module DOM; class Element < Node
2
+
3
+ class Textarea < Element
4
+ def_selector "textarea"
5
+
6
+ def value
7
+ %x{
8
+ if (#@native.value == "") {
9
+ return nil;
10
+ }
11
+ else {
12
+ return #@native.value;
13
+ }
14
+ }
15
+ end
16
+
17
+ def value=(value)
18
+ `#@native.value = #{value}`
19
+ end
20
+
21
+ def clear
22
+ `#@native.value = ''`
23
+ end
24
+ end
25
+
26
+ end; end; end