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.
- checksums.yaml +4 -4
- data/.travis.yml +22 -8
- data/Gemfile +1 -1
- data/README.md +59 -5
- data/index.html.erb +7 -4
- data/lib/opal-browser.rb +1 -0
- data/opal-browser.gemspec +1 -1
- data/opal/browser.rb +1 -0
- data/opal/browser/animation_frame.rb +26 -1
- data/opal/browser/canvas.rb +0 -10
- data/opal/browser/canvas/data.rb +0 -10
- data/opal/browser/canvas/gradient.rb +0 -10
- data/opal/browser/canvas/style.rb +0 -10
- data/opal/browser/canvas/text.rb +0 -10
- data/opal/browser/cookies.rb +6 -8
- data/opal/browser/database/sql.rb +194 -0
- data/opal/browser/delay.rb +25 -7
- data/opal/browser/dom.rb +2 -11
- data/opal/browser/dom/attribute.rb +12 -11
- data/opal/browser/dom/builder.rb +4 -9
- data/opal/browser/dom/document.rb +105 -41
- data/opal/browser/dom/element.rb +317 -231
- data/opal/browser/dom/element/attributes.rb +87 -0
- data/opal/browser/dom/element/data.rb +67 -0
- data/opal/browser/dom/element/input.rb +12 -1
- data/opal/browser/dom/element/offset.rb +5 -0
- data/opal/browser/dom/element/position.rb +11 -2
- data/opal/browser/dom/element/scroll.rb +77 -10
- data/opal/browser/dom/element/select.rb +36 -0
- data/opal/browser/dom/element/size.rb +5 -0
- data/opal/browser/dom/element/template.rb +9 -0
- data/opal/browser/dom/element/textarea.rb +24 -0
- data/opal/browser/dom/mutation_observer.rb +2 -2
- data/opal/browser/dom/node.rb +93 -51
- data/opal/browser/dom/node_set.rb +66 -48
- data/opal/browser/effects.rb +11 -0
- data/opal/browser/{dom/event.rb → event.rb} +32 -32
- data/opal/browser/{dom/event → event}/animation.rb +2 -2
- data/opal/browser/{dom/event → event}/audio_processing.rb +2 -2
- data/opal/browser/{dom/event → event}/base.rb +65 -7
- data/opal/browser/{dom/event → event}/before_unload.rb +2 -2
- data/opal/browser/{dom/event → event}/clipboard.rb +2 -2
- data/opal/browser/{dom/event → event}/close.rb +2 -2
- data/opal/browser/{dom/event → event}/composition.rb +2 -2
- data/opal/browser/{dom/event → event}/custom.rb +2 -2
- data/opal/browser/{dom/event → event}/device_light.rb +2 -2
- data/opal/browser/{dom/event → event}/device_motion.rb +2 -2
- data/opal/browser/{dom/event → event}/device_orientation.rb +2 -2
- data/opal/browser/{dom/event → event}/device_proximity.rb +2 -2
- data/opal/browser/{dom/event → event}/drag.rb +2 -2
- data/opal/browser/{dom/event → event}/focus.rb +2 -2
- data/opal/browser/{dom/event → event}/gamepad.rb +2 -2
- data/opal/browser/{dom/event → event}/hash_change.rb +2 -2
- data/opal/browser/{dom/event → event}/keyboard.rb +2 -2
- data/opal/browser/{dom/event → event}/message.rb +2 -2
- data/opal/browser/{dom/event → event}/mouse.rb +2 -2
- data/opal/browser/{dom/event → event}/page_transition.rb +2 -2
- data/opal/browser/{dom/event → event}/pop_state.rb +2 -2
- data/opal/browser/{dom/event → event}/progress.rb +2 -2
- data/opal/browser/{dom/event → event}/sensor.rb +2 -2
- data/opal/browser/{dom/event → event}/storage.rb +2 -2
- data/opal/browser/{dom/event → event}/touch.rb +2 -2
- data/opal/browser/{dom/event → event}/ui.rb +2 -2
- data/opal/browser/{dom/event → event}/wheel.rb +2 -2
- data/opal/browser/event_source.rb +1 -1
- data/opal/browser/http.rb +25 -0
- data/opal/browser/http/binary.rb +1 -0
- data/opal/browser/http/headers.rb +16 -2
- data/opal/browser/http/request.rb +14 -38
- data/opal/browser/immediate.rb +9 -3
- data/opal/browser/interval.rb +34 -11
- data/opal/browser/navigator.rb +23 -4
- data/opal/browser/screen.rb +1 -1
- data/opal/browser/socket.rb +5 -1
- data/opal/browser/storage.rb +51 -33
- data/opal/browser/support.rb +59 -4
- data/opal/browser/version.rb +1 -1
- data/opal/browser/window.rb +17 -9
- data/opal/browser/window/size.rb +17 -3
- data/opal/opal-browser.rb +1 -0
- data/spec/database/sql_spec.rb +131 -0
- data/spec/delay_spec.rb +38 -0
- data/spec/dom/attribute_spec.rb +49 -0
- data/spec/dom/builder_spec.rb +25 -8
- data/spec/dom/document_spec.rb +20 -0
- data/spec/dom/element/attributes_spec.rb +52 -0
- data/spec/dom/element_spec.rb +139 -4
- data/spec/dom/node_set_spec.rb +44 -0
- data/spec/interval_spec.rb +50 -0
- data/spec/runner.rb +46 -28
- data/spec/socket_spec.rb +1 -0
- data/spec/spec_helper.rb +0 -4
- data/spec/storage_spec.rb +1 -1
- metadata +57 -39
- data/opal/browser/http/parameters.rb +0 -8
data/opal/browser/http.rb
CHANGED
@@ -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)
|
data/opal/browser/http/binary.rb
CHANGED
@@ -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
|
-
#
|
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
|
-
#
|
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[
|
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
|
-
# @
|
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
|
-
|
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
|
-
}
|
333
|
+
}
|
358
334
|
end
|
359
335
|
end
|
360
336
|
|