opal-browser 0.2.0.beta1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +22 -8
  3. data/Gemfile +1 -1
  4. data/README.md +59 -5
  5. data/index.html.erb +7 -4
  6. data/lib/opal-browser.rb +1 -0
  7. data/opal-browser.gemspec +1 -1
  8. data/opal/browser.rb +1 -0
  9. data/opal/browser/animation_frame.rb +26 -1
  10. data/opal/browser/canvas.rb +0 -10
  11. data/opal/browser/canvas/data.rb +0 -10
  12. data/opal/browser/canvas/gradient.rb +0 -10
  13. data/opal/browser/canvas/style.rb +0 -10
  14. data/opal/browser/canvas/text.rb +0 -10
  15. data/opal/browser/cookies.rb +6 -8
  16. data/opal/browser/database/sql.rb +194 -0
  17. data/opal/browser/delay.rb +25 -7
  18. data/opal/browser/dom.rb +2 -11
  19. data/opal/browser/dom/attribute.rb +12 -11
  20. data/opal/browser/dom/builder.rb +4 -9
  21. data/opal/browser/dom/document.rb +105 -41
  22. data/opal/browser/dom/element.rb +317 -231
  23. data/opal/browser/dom/element/attributes.rb +87 -0
  24. data/opal/browser/dom/element/data.rb +67 -0
  25. data/opal/browser/dom/element/input.rb +12 -1
  26. data/opal/browser/dom/element/offset.rb +5 -0
  27. data/opal/browser/dom/element/position.rb +11 -2
  28. data/opal/browser/dom/element/scroll.rb +77 -10
  29. data/opal/browser/dom/element/select.rb +36 -0
  30. data/opal/browser/dom/element/size.rb +5 -0
  31. data/opal/browser/dom/element/template.rb +9 -0
  32. data/opal/browser/dom/element/textarea.rb +24 -0
  33. data/opal/browser/dom/mutation_observer.rb +2 -2
  34. data/opal/browser/dom/node.rb +93 -51
  35. data/opal/browser/dom/node_set.rb +66 -48
  36. data/opal/browser/effects.rb +11 -0
  37. data/opal/browser/{dom/event.rb → event.rb} +32 -32
  38. data/opal/browser/{dom/event → event}/animation.rb +2 -2
  39. data/opal/browser/{dom/event → event}/audio_processing.rb +2 -2
  40. data/opal/browser/{dom/event → event}/base.rb +65 -7
  41. data/opal/browser/{dom/event → event}/before_unload.rb +2 -2
  42. data/opal/browser/{dom/event → event}/clipboard.rb +2 -2
  43. data/opal/browser/{dom/event → event}/close.rb +2 -2
  44. data/opal/browser/{dom/event → event}/composition.rb +2 -2
  45. data/opal/browser/{dom/event → event}/custom.rb +2 -2
  46. data/opal/browser/{dom/event → event}/device_light.rb +2 -2
  47. data/opal/browser/{dom/event → event}/device_motion.rb +2 -2
  48. data/opal/browser/{dom/event → event}/device_orientation.rb +2 -2
  49. data/opal/browser/{dom/event → event}/device_proximity.rb +2 -2
  50. data/opal/browser/{dom/event → event}/drag.rb +2 -2
  51. data/opal/browser/{dom/event → event}/focus.rb +2 -2
  52. data/opal/browser/{dom/event → event}/gamepad.rb +2 -2
  53. data/opal/browser/{dom/event → event}/hash_change.rb +2 -2
  54. data/opal/browser/{dom/event → event}/keyboard.rb +2 -2
  55. data/opal/browser/{dom/event → event}/message.rb +2 -2
  56. data/opal/browser/{dom/event → event}/mouse.rb +2 -2
  57. data/opal/browser/{dom/event → event}/page_transition.rb +2 -2
  58. data/opal/browser/{dom/event → event}/pop_state.rb +2 -2
  59. data/opal/browser/{dom/event → event}/progress.rb +2 -2
  60. data/opal/browser/{dom/event → event}/sensor.rb +2 -2
  61. data/opal/browser/{dom/event → event}/storage.rb +2 -2
  62. data/opal/browser/{dom/event → event}/touch.rb +2 -2
  63. data/opal/browser/{dom/event → event}/ui.rb +2 -2
  64. data/opal/browser/{dom/event → event}/wheel.rb +2 -2
  65. data/opal/browser/event_source.rb +1 -1
  66. data/opal/browser/http.rb +25 -0
  67. data/opal/browser/http/binary.rb +1 -0
  68. data/opal/browser/http/headers.rb +16 -2
  69. data/opal/browser/http/request.rb +14 -38
  70. data/opal/browser/immediate.rb +9 -3
  71. data/opal/browser/interval.rb +34 -11
  72. data/opal/browser/navigator.rb +23 -4
  73. data/opal/browser/screen.rb +1 -1
  74. data/opal/browser/socket.rb +5 -1
  75. data/opal/browser/storage.rb +51 -33
  76. data/opal/browser/support.rb +59 -4
  77. data/opal/browser/version.rb +1 -1
  78. data/opal/browser/window.rb +17 -9
  79. data/opal/browser/window/size.rb +17 -3
  80. data/opal/opal-browser.rb +1 -0
  81. data/spec/database/sql_spec.rb +131 -0
  82. data/spec/delay_spec.rb +38 -0
  83. data/spec/dom/attribute_spec.rb +49 -0
  84. data/spec/dom/builder_spec.rb +25 -8
  85. data/spec/dom/document_spec.rb +20 -0
  86. data/spec/dom/element/attributes_spec.rb +52 -0
  87. data/spec/dom/element_spec.rb +139 -4
  88. data/spec/dom/node_set_spec.rb +44 -0
  89. data/spec/interval_spec.rb +50 -0
  90. data/spec/runner.rb +46 -28
  91. data/spec/socket_spec.rb +1 -0
  92. data/spec/spec_helper.rb +0 -4
  93. data/spec/storage_spec.rb +1 -1
  94. metadata +57 -39
  95. data/opal/browser/http/parameters.rb +0 -8
@@ -1,6 +1,6 @@
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
6
  def self.supported?
@@ -67,4 +67,4 @@ class Message < Event
67
67
  end
68
68
  end
69
69
 
70
- end; end; end
70
+ end; end
@@ -1,4 +1,4 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class Mouse < UI
4
4
  def self.supported?
@@ -251,4 +251,4 @@ class Mouse < UI
251
251
  end
252
252
  end
253
253
 
254
- end; end; end
254
+ end; end
@@ -1,4 +1,4 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class PageTransition < Event
4
4
  def self.supported?
@@ -20,4 +20,4 @@ class PageTransition < Event
20
20
  alias_native :persisted?, :persisted
21
21
  end
22
22
 
23
- end; end; end
23
+ end; end
@@ -1,4 +1,4 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class PopState < Event
4
4
  def self.supported?
@@ -30,4 +30,4 @@ class PopState < Event
30
30
  alias_native :state
31
31
  end
32
32
 
33
- end; end; end
33
+ end; end
@@ -1,4 +1,4 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class Progress < Event
4
4
  def self.supported?
@@ -40,4 +40,4 @@ class Progress < Event
40
40
  alias_native :total
41
41
  end
42
42
 
43
- end; end; end
43
+ end; end
@@ -1,4 +1,4 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class Sensor < Event
4
4
  def self.supported?
@@ -12,4 +12,4 @@ class Sensor < Event
12
12
  end if supported?
13
13
  end
14
14
 
15
- end; end; end
15
+ end; end
@@ -1,4 +1,4 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class Storage < Event
4
4
  def self.supported?
@@ -40,4 +40,4 @@ class Storage < Event
40
40
  alias_native :url
41
41
  end
42
42
 
43
- end; end; end
43
+ end; end
@@ -1,4 +1,4 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class Touch < Event
4
4
  def self.supported?
@@ -57,4 +57,4 @@ class Touch < Event
57
57
  end
58
58
  end
59
59
 
60
- end; end; end
60
+ 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,4 +1,4 @@
1
- module Browser; module DOM; class Event
1
+ module Browser; class Event
2
2
 
3
3
  class Wheel < UI
4
4
  def self.supported?
@@ -46,4 +46,4 @@ class Wheel < UI
46
46
  end
47
47
  end
48
48
 
49
- end; end; end
49
+ end; end
@@ -10,7 +10,7 @@ class EventSource
10
10
  end
11
11
 
12
12
  include Native
13
- include DOM::Event::Target
13
+ include Event::Target
14
14
 
15
15
  target {|value|
16
16
  EventSource.new(value) if Native.is_a?(value, `window.EventSource`)
@@ -8,6 +8,7 @@ require 'browser/http/response'
8
8
  module Browser
9
9
 
10
10
  module HTTP
11
+ # Check if HTTP requests are supported.
11
12
  def self.supported?
12
13
  Browser.supports?('XHR') || Browser.supports?('ActiveXObject')
13
14
  end
@@ -18,6 +19,8 @@ module HTTP
18
19
  # @param url [String] the URL to request
19
20
  # @param data [String, Hash] the data to send
20
21
  #
22
+ # @yieldparam request [Request] the request to configure
23
+ #
21
24
  # @return [Promise] a promise that will be resolved with the response
22
25
  def self.send(method, url, data = nil, &block)
23
26
  Promise.new.tap {|promise|
@@ -37,6 +40,8 @@ module HTTP
37
40
  #
38
41
  # @param url [String] the URL to request
39
42
  #
43
+ # @yieldparam request [Request] the request to configure
44
+ #
40
45
  # @return [Promise] a promise that will be resolved with the response
41
46
  def self.get(url, &block)
42
47
  send(:get, url, &block)
@@ -46,6 +51,8 @@ module HTTP
46
51
  #
47
52
  # @param url [String] the URL to request
48
53
  #
54
+ # @yieldparam request [Request] the request to configure
55
+ #
49
56
  # @return [Promise] a promise that will be resolved with the response
50
57
  def self.head(url, &block)
51
58
  send(:head, url, &block)
@@ -56,6 +63,8 @@ module HTTP
56
63
  # @param url [String] the URL to request
57
64
  # @param data [String, Hash] the data to send
58
65
  #
66
+ # @yieldparam request [Request] the request to configure
67
+ #
59
68
  # @return [Promise] a promise that will be resolved with the response
60
69
  def self.post(url, data = nil, &block)
61
70
  send(:post, url, data, &block)
@@ -66,6 +75,8 @@ module HTTP
66
75
  # @param url [String] the URL to request
67
76
  # @param data [String, Hash] the data to send
68
77
  #
78
+ # @yieldparam request [Request] the request to configure
79
+ #
69
80
  # @return [Promise] a promise that will be resolved with the response
70
81
  def self.put(url, data = nil, &block)
71
82
  send(:put, url, data, &block)
@@ -76,6 +87,8 @@ module HTTP
76
87
  # @param url [String] the URL to request
77
88
  # @param data [String, Hash] the data to send
78
89
  #
90
+ # @yieldparam request [Request] the request to configure
91
+ #
79
92
  # @return [Promise] a promise that will be resolved with the response
80
93
  def self.delete(url, data = nil, &block)
81
94
  send(:delete, url, data, &block)
@@ -87,6 +100,8 @@ module HTTP
87
100
  # @param url [String] the URL to request
88
101
  # @param data [String, Hash] the data to send
89
102
  #
103
+ # @yieldparam request [Request] the request to configure
104
+ #
90
105
  # @return [Response] the response
91
106
  def self.send!(method, url, data = nil, &block)
92
107
  Request.new(&block).open(method, url, false).send(data)
@@ -96,6 +111,8 @@ module HTTP
96
111
  #
97
112
  # @param url [String] the URL to request
98
113
  #
114
+ # @yieldparam request [Request] the request to configure
115
+ #
99
116
  # @return [Response] the response
100
117
  def self.get!(url, &block)
101
118
  send!(:get, url, &block)
@@ -105,6 +122,8 @@ module HTTP
105
122
  #
106
123
  # @param url [String] the URL to request
107
124
  #
125
+ # @yieldparam request [Request] the request to configure
126
+ #
108
127
  # @return [Response] the response
109
128
  def self.head!(url, &block)
110
129
  send!(:head, url, &block)
@@ -115,6 +134,8 @@ module HTTP
115
134
  # @param url [String] the URL to request
116
135
  # @param data [String, Hash] the data to send
117
136
  #
137
+ # @yieldparam request [Request] the request to configure
138
+ #
118
139
  # @return [Response] the response
119
140
  def self.post!(url, data = nil, &block)
120
141
  send!(:post, url, data, &block)
@@ -125,6 +146,8 @@ module HTTP
125
146
  # @param url [String] the URL to request
126
147
  # @param data [String, Hash] the data to send
127
148
  #
149
+ # @yieldparam request [Request] the request to configure
150
+ #
128
151
  # @return [Response] the response
129
152
  def self.put!(url, data = nil, &block)
130
153
  send!(:put, url, data, &block)
@@ -135,6 +158,8 @@ module HTTP
135
158
  # @param url [String] the URL to request
136
159
  # @param data [String, Hash] the data to send
137
160
  #
161
+ # @yieldparam request [Request] the request to configure
162
+ #
138
163
  # @return [Response] the response
139
164
  def self.delete!(url, data = nil, &block)
140
165
  send!(:delete, url, data, &block)
@@ -24,6 +24,7 @@ class Binary
24
24
  # Iterate over each byte in the binary.
25
25
  #
26
26
  # @yield [byte] the byte
27
+ #
27
28
  # @return [self]
28
29
  def each(&block)
29
30
  return enum_for :each unless block
@@ -14,6 +14,8 @@ class Headers
14
14
  end
15
15
 
16
16
  # Create {Headers} from a hash.
17
+ #
18
+ # @param hash [Hash]
17
19
  def self.[](hash)
18
20
  result = new
19
21
 
@@ -36,9 +38,11 @@ class Headers
36
38
  @hash.clear
37
39
  end
38
40
 
39
- # Iterate over the headers.
41
+ # Enumerate over the headers.
42
+ #
43
+ # @yieldparam name [String] the name of the header
44
+ # @yieldparam value [String] the value of the header
40
45
  #
41
- # @yield [name, value] the header name and value
42
46
  # @return [self]
43
47
  def each(&block)
44
48
  return enum_for :each unless block
@@ -51,10 +55,18 @@ class Headers
51
55
  end
52
56
 
53
57
  # Get the value of a header.
58
+ #
59
+ # @param name [String] the name of the header
60
+ #
61
+ # @return [String] the value of the header
54
62
  def [](name)
55
63
  @hash[name.downcase]
56
64
  end
57
65
 
66
+ # Set a value for the header.
67
+ #
68
+ # @param name [String] the name of the header
69
+ # @param value [String] the value of the header
58
70
  def []=(name, value)
59
71
  header = Header.new(name, value)
60
72
 
@@ -64,6 +76,7 @@ class Headers
64
76
  # Push a header.
65
77
  #
66
78
  # @param header [Header] the header to push
79
+ #
67
80
  # @return [self]
68
81
  def <<(header)
69
82
  @hash[header.name.downcase] = header
@@ -76,6 +89,7 @@ class Headers
76
89
  # Merge in place other headers.
77
90
  #
78
91
  # @param other [Headers, Hash, #each] the headers to merge
92
+ #
79
93
  # @return [self]
80
94
  def merge!(other)
81
95
  other.each {|name, value|
@@ -3,18 +3,8 @@ module Browser; module HTTP
3
3
  class Request
4
4
  include Native
5
5
 
6
- # Open and send a request.
7
- #
8
- # @param method [Symbol] the HTTP method to use
9
- # @param url [String, #to_s] the URL to request
10
- # @param parameters [String, Hash] the parameters to send
11
- def self.open(method, url, parameters = nil, &block)
12
- request = new(&block)
13
- request.open(method, url)
14
- request.send(*parameters)
15
- end
16
-
17
- DEFAULT_HEADERS = {
6
+ # Default headers.
7
+ HEADERS = {
18
8
  'X-Requested-With' => 'XMLHttpRequest',
19
9
  'X-Opal-Version' => RUBY_ENGINE_VERSION,
20
10
  'Accept' => 'text/javascript, text/html, application/xml, text/xml, */*'
@@ -45,7 +35,7 @@ class Request
45
35
 
46
36
  @parameters = {}
47
37
  @query = {}
48
- @headers = Headers[DEFAULT_HEADERS]
38
+ @headers = Headers[HEADERS]
49
39
  @method = :get
50
40
  @asynchronous = true
51
41
  @binary = false
@@ -104,21 +94,13 @@ class Request
104
94
  end
105
95
 
106
96
  # Make the request asynchronous.
107
- #
108
- # @return [self]
109
97
  def asynchronous!
110
98
  @asynchronous = true
111
-
112
- self
113
99
  end
114
100
 
115
101
  # Make the request synchronous.
116
- #
117
- # @return [self]
118
102
  def synchronous!
119
103
  @asynchronous = false
120
-
121
- self
122
104
  end
123
105
 
124
106
  # Check the request is binary.
@@ -129,8 +111,6 @@ class Request
129
111
  # Make the request binary.
130
112
  def binary!
131
113
  @binary = true
132
-
133
- self
134
114
  end
135
115
 
136
116
  # Check if the request is cacheable.
@@ -139,12 +119,8 @@ class Request
139
119
  end
140
120
 
141
121
  # Disable caching for this request.
142
- #
143
- # @return [self]
144
122
  def no_cache!
145
123
  @cacheable = false
146
-
147
- self
148
124
  end
149
125
 
150
126
  # Get or set the user used for authentication.
@@ -213,13 +189,10 @@ class Request
213
189
  # Register an event on the request.
214
190
  #
215
191
  # @param what [Symbol, String] the event name
216
- # @yield [response] yields the {Response}
217
192
  #
218
- # @return [self]
193
+ # @yieldparam response [Response] the response for the event
219
194
  def on(what, &block)
220
195
  @callbacks[what] << block
221
-
222
- self
223
196
  end
224
197
 
225
198
  # Open the request.
@@ -242,12 +215,15 @@ class Request
242
215
 
243
216
  url = @url
244
217
 
218
+ # add a dummy random parameter to the query to try circumvent caching
245
219
  unless cacheable?
246
220
  @query[:_] = rand
247
221
  end
248
222
 
223
+ # add the encoded query to the @url, prepending the right character if
224
+ # there was already a query in the defined @url or not
249
225
  unless @query.empty?
250
- if url.include???
226
+ if url.include? ??
251
227
  url += ?&
252
228
  else
253
229
  url += ??
@@ -258,6 +234,8 @@ class Request
258
234
 
259
235
  `#@native.open(#{@method.to_s.upcase}, #{url.to_s}, #{@asynchronous}, #{@user.to_n}, #{@password.to_n})`
260
236
 
237
+ # if there are no registered callbacks no point in setting the event
238
+ # handler
261
239
  unless @callbacks.empty?
262
240
  `#@native.onreadystatechange = #{callback}`
263
241
  end
@@ -277,6 +255,8 @@ class Request
277
255
 
278
256
  raise 'the request has already been sent' if sent?
279
257
 
258
+ # try to circumvent caching setting an If-Modified-Since header with a very
259
+ # old date
280
260
  unless cacheable?
281
261
  `#@native.setRequestHeader("If-Modified-Since", "Tue, 11 Sep 2001 12:46:00 GMT")`
282
262
  end
@@ -327,17 +307,13 @@ class Request
327
307
  end
328
308
 
329
309
  # Abort the request.
330
- #
331
- # @return [self]
332
310
  def abort
333
311
  `#@native.abort()`
334
-
335
- self
336
312
  end
337
313
 
338
314
  private
339
315
  def callback
340
- proc {|event|
316
+ -> event {
341
317
  state = %w[uninitialized loading loaded interactive complete][`#@native.readyState`]
342
318
  res = response
343
319
 
@@ -354,7 +330,7 @@ private
354
330
  @callbacks[:failure].each { |b| b.(res) }
355
331
  end
356
332
  end
357
- }.to_n
333
+ }
358
334
  end
359
335
  end
360
336