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.
- 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
|
|