opal-browser 0.2.0.beta1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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