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
@@ -0,0 +1,87 @@
|
|
1
|
+
module Browser; module DOM; class Element < Node
|
2
|
+
|
3
|
+
class Attributes
|
4
|
+
attr_reader :namespace
|
5
|
+
|
6
|
+
def initialize(element, options)
|
7
|
+
@element = element
|
8
|
+
@native = element.to_n
|
9
|
+
@namespace = options[:namespace]
|
10
|
+
end
|
11
|
+
|
12
|
+
if Browser.supports?('Element.className') || Browser.supports?('Element.htmlFor')
|
13
|
+
def [](name, options = {})
|
14
|
+
if name == :class && Browser.supports?('Element.className')
|
15
|
+
name = :className
|
16
|
+
elsif name == :for && Browser.supports?('Element.htmlFor')
|
17
|
+
name = :htmlFor
|
18
|
+
end
|
19
|
+
|
20
|
+
if namespace = options[:namespace] || @namespace
|
21
|
+
`#@native.getAttributeNS(#{namespace.to_s}, #{name.to_s}) || nil`
|
22
|
+
else
|
23
|
+
`#@native.getAttribute(#{name.to_s}) || nil`
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def []=(name, value, options = {})
|
28
|
+
if name == :class && Browser.supports?('Element.className')
|
29
|
+
name = :className
|
30
|
+
elsif name == :for && Browser.supports?('Element.htmlFor')
|
31
|
+
name = :htmlFor
|
32
|
+
end
|
33
|
+
|
34
|
+
if namespace = options[:namespace] || @namespace
|
35
|
+
`#@native.setAttributeNS(#{namespace.to_s}, #{name.to_s}, #{value})`
|
36
|
+
else
|
37
|
+
`#@native.setAttribute(#{name.to_s}, #{value.to_s})`
|
38
|
+
end
|
39
|
+
end
|
40
|
+
else
|
41
|
+
def [](name, options = {})
|
42
|
+
if namespace = options[:namespace] || @namespace
|
43
|
+
`#@native.getAttributeNS(#{namespace.to_s}, #{name.to_s}) || nil`
|
44
|
+
else
|
45
|
+
`#@native.getAttribute(#{name.to_s}) || nil`
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def []=(name, value, options = {})
|
50
|
+
if namespace = options[:namespace] || @namespace
|
51
|
+
`#@native.setAttributeNS(#{namespace.to_s}, #{name.to_s}, #{value})`
|
52
|
+
else
|
53
|
+
`#@native.setAttribute(#{name.to_s}, #{value.to_s})`
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
include Enumerable
|
59
|
+
|
60
|
+
def each(&block)
|
61
|
+
return enum_for :each unless block_given?
|
62
|
+
|
63
|
+
@element.attribute_nodes.each {|attr|
|
64
|
+
yield attr.name, attr.value
|
65
|
+
}
|
66
|
+
|
67
|
+
self
|
68
|
+
end
|
69
|
+
|
70
|
+
alias get []
|
71
|
+
|
72
|
+
def has_key?(name)
|
73
|
+
!!self[name]
|
74
|
+
end
|
75
|
+
|
76
|
+
def merge!(hash)
|
77
|
+
hash.each {|name, value|
|
78
|
+
self[name] = value
|
79
|
+
}
|
80
|
+
|
81
|
+
self
|
82
|
+
end
|
83
|
+
|
84
|
+
alias set []=
|
85
|
+
end
|
86
|
+
|
87
|
+
end; end; end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Browser; module DOM; class Element < Node
|
2
|
+
|
3
|
+
class Data
|
4
|
+
attr_reader :element
|
5
|
+
|
6
|
+
def initialize(element)
|
7
|
+
@element = element
|
8
|
+
@native = element.to_n
|
9
|
+
|
10
|
+
unless defined?(`#@native.$data`)
|
11
|
+
`#@native.$data = {}`
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
include Enumerable
|
16
|
+
|
17
|
+
def each(&block)
|
18
|
+
return enum_for :each unless block
|
19
|
+
|
20
|
+
%x{
|
21
|
+
var data = #@native.$data;
|
22
|
+
|
23
|
+
for (var key in data) {
|
24
|
+
#{block.call `key`, `data[key]`};
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
@element.attributes.each {|name, value|
|
29
|
+
if name =~ /^data-(.*)$/
|
30
|
+
block.call $1, value
|
31
|
+
end
|
32
|
+
}
|
33
|
+
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
def assign(data)
|
38
|
+
data.each {|name, value|
|
39
|
+
`#@native.$data[name] = value`
|
40
|
+
}
|
41
|
+
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
45
|
+
def [](name)
|
46
|
+
if data = @element["data-#{name}"]
|
47
|
+
return data
|
48
|
+
end
|
49
|
+
|
50
|
+
%x{
|
51
|
+
var value = #@native.$data[name];
|
52
|
+
|
53
|
+
if (value === undefined) {
|
54
|
+
return nil;
|
55
|
+
}
|
56
|
+
else {
|
57
|
+
return value;
|
58
|
+
}
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
def []=(name, value)
|
63
|
+
`#@native.$data[name] = value`
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end; end; end
|
@@ -2,13 +2,24 @@ module Browser; module DOM; class Element < Node
|
|
2
2
|
|
3
3
|
class Input < Element
|
4
4
|
def value
|
5
|
-
|
5
|
+
%x{
|
6
|
+
if (#@native.value == "") {
|
7
|
+
return nil;
|
8
|
+
}
|
9
|
+
else {
|
10
|
+
return #@native.value;
|
11
|
+
}
|
12
|
+
}
|
6
13
|
end
|
7
14
|
|
8
15
|
def value=(value)
|
9
16
|
`#@native.value = #{value}`
|
10
17
|
end
|
11
18
|
|
19
|
+
def checked?
|
20
|
+
`#@native.checked`
|
21
|
+
end
|
22
|
+
|
12
23
|
def clear
|
13
24
|
`#@native.value = ''`
|
14
25
|
end
|
@@ -3,6 +3,7 @@ module Browser; module DOM; class Element < Node
|
|
3
3
|
class Offset
|
4
4
|
attr_reader :element
|
5
5
|
|
6
|
+
# @private
|
6
7
|
def initialize(element)
|
7
8
|
@element = element
|
8
9
|
@native = element.to_n
|
@@ -12,6 +13,8 @@ class Offset
|
|
12
13
|
DOM(`#@native.offsetParent || #{@element.document.root.to_n}`)
|
13
14
|
end
|
14
15
|
|
16
|
+
# @!attribute x
|
17
|
+
# @return [Integer]
|
15
18
|
def x
|
16
19
|
get.x
|
17
20
|
end
|
@@ -20,6 +23,8 @@ class Offset
|
|
20
23
|
set value, nil
|
21
24
|
end
|
22
25
|
|
26
|
+
# @!attribute y
|
27
|
+
# @return [Integer]
|
23
28
|
def y
|
24
29
|
get.y
|
25
30
|
end
|
@@ -1,11 +1,15 @@
|
|
1
1
|
module Browser; module DOM; class Element < Node
|
2
2
|
|
3
3
|
class Position
|
4
|
+
attr_reader :element
|
5
|
+
|
6
|
+
# @private
|
4
7
|
def initialize(element)
|
5
8
|
@element = element
|
6
9
|
@native = element.to_n
|
7
10
|
end
|
8
11
|
|
12
|
+
# @private
|
9
13
|
def get
|
10
14
|
offset = @element.offset
|
11
15
|
position = offset.get
|
@@ -21,14 +25,19 @@ class Position
|
|
21
25
|
parent_offset.y += parent.style['border-left-width'].to_i
|
22
26
|
end
|
23
27
|
|
24
|
-
Browser::Position.new(
|
25
|
-
|
28
|
+
Browser::Position.new(
|
29
|
+
position.x - parent_offset.x - @element.style['margin-left'].to_i,
|
30
|
+
position.y - parent_offset.y - @element.style['margin-top'].to_i)
|
26
31
|
end
|
27
32
|
|
33
|
+
# @!attribute [r] x
|
34
|
+
# @return [Integer] the position of the element on the x axis
|
28
35
|
def x
|
29
36
|
get.x
|
30
37
|
end
|
31
38
|
|
39
|
+
# @!attribute [r] y
|
40
|
+
# @return [Integer] the position of the element on the y axis
|
32
41
|
def y
|
33
42
|
get.y
|
34
43
|
end
|
@@ -1,15 +1,22 @@
|
|
1
1
|
module Browser; module DOM; class Element < Node
|
2
2
|
|
3
3
|
class Scroll
|
4
|
+
attr_reader :element
|
5
|
+
|
6
|
+
# @private
|
4
7
|
def initialize(element)
|
5
8
|
@element = element
|
6
9
|
@native = element.to_n
|
7
10
|
end
|
8
11
|
|
9
12
|
if Browser.supports? 'Element.scroll'
|
10
|
-
def to(
|
11
|
-
|
12
|
-
|
13
|
+
def to(*args)
|
14
|
+
if Hash === args.first
|
15
|
+
x = args.first[:x] || self.x
|
16
|
+
y = args.first[:y] || self.y
|
17
|
+
else
|
18
|
+
x, y = args
|
19
|
+
end
|
13
20
|
|
14
21
|
`#@native.scrollTop = #{y}`
|
15
22
|
`#@native.scrollLeft = #{x}`
|
@@ -19,9 +26,13 @@ class Scroll
|
|
19
26
|
Browser::Position.new(`#@native.scrollLeft`, `#@native.scrollTop`)
|
20
27
|
end
|
21
28
|
elsif Browser.supports? 'Element.pageOffset'
|
22
|
-
def to(
|
23
|
-
|
24
|
-
|
29
|
+
def to(*args)
|
30
|
+
if Hash === args.first
|
31
|
+
x = args.first[:x] || self.x
|
32
|
+
y = args.first[:y] || self.y
|
33
|
+
else
|
34
|
+
x, y = args
|
35
|
+
end
|
25
36
|
|
26
37
|
`#@native.pageYOffset = #{y}`
|
27
38
|
`#@native.pageXOffset = #{x}`
|
@@ -31,7 +42,22 @@ class Scroll
|
|
31
42
|
Position.new(`#@native.pageXOffset`, `#@native.pageYOffset`)
|
32
43
|
end
|
33
44
|
else
|
34
|
-
|
45
|
+
# @overload to(x, y)
|
46
|
+
#
|
47
|
+
# Scroll to the given x and y.
|
48
|
+
#
|
49
|
+
# @param x [Integer] scroll to x on the x axis
|
50
|
+
# @param y [Integer] scroll to y on the y axis
|
51
|
+
#
|
52
|
+
# @overload to(hash)
|
53
|
+
#
|
54
|
+
# Scroll to the given x and y.
|
55
|
+
#
|
56
|
+
# @param hash [Hash] the descriptor
|
57
|
+
#
|
58
|
+
# @option hash [Integer] :x scroll to x on the x axis
|
59
|
+
# @option hash [Integer] :y scroll to y on the y axis
|
60
|
+
def to(*args)
|
35
61
|
raise NotImplementedError, 'scroll on element unsupported'
|
36
62
|
end
|
37
63
|
|
@@ -40,30 +66,71 @@ class Scroll
|
|
40
66
|
end
|
41
67
|
end
|
42
68
|
|
69
|
+
# @!attribute [r] x
|
70
|
+
# @return [Integer] the scroll position on the x axis
|
43
71
|
def x
|
44
72
|
position.x
|
45
73
|
end
|
46
74
|
|
75
|
+
# @!attribute [r] y
|
76
|
+
# @return [Integer] the scroll position on the y axis
|
47
77
|
def y
|
48
78
|
position.y
|
49
79
|
end
|
50
80
|
|
81
|
+
# @!attribute [r] height
|
82
|
+
# @return [Integer] the height of the scroll
|
51
83
|
def height
|
52
84
|
`#@native.scrollHeight`
|
53
85
|
end
|
54
86
|
|
87
|
+
# @!attribute [r] width
|
88
|
+
# @return [Integer] the width of the scroll
|
55
89
|
def width
|
56
90
|
`#@native.scrollWidth`
|
57
91
|
end
|
58
92
|
|
59
|
-
|
60
|
-
|
61
|
-
|
93
|
+
# @overload by(x, y)
|
94
|
+
#
|
95
|
+
# Scroll by the given x and y.
|
96
|
+
#
|
97
|
+
# @param x [Integer] scroll by x on the x axis
|
98
|
+
# @param y [Integer] scroll by y on the y axis
|
99
|
+
#
|
100
|
+
# @overload by(hash)
|
101
|
+
#
|
102
|
+
# Scroll by the given x and y.
|
103
|
+
#
|
104
|
+
# @param hash [Hash] the descriptor
|
105
|
+
#
|
106
|
+
# @option hash [Integer] :x scroll by x on the x axis
|
107
|
+
# @option hash [Integer] :y scroll by y on the y axis
|
108
|
+
def by(*args)
|
109
|
+
if Hash === args.first
|
110
|
+
x = args.first[:x] || 0
|
111
|
+
y = args.first[:y] || 0
|
112
|
+
else
|
113
|
+
x, y = args
|
114
|
+
end
|
62
115
|
|
63
116
|
`#@native.scrollBy(#{x}, #{y})`
|
64
117
|
|
65
118
|
self
|
66
119
|
end
|
120
|
+
|
121
|
+
if Browser.supports? 'Element.scrollIntoViewIfNeeded'
|
122
|
+
def to(align = true)
|
123
|
+
`#@native.scrollIntoViewIfNeeded(align)`
|
124
|
+
end
|
125
|
+
else
|
126
|
+
def to(align = true)
|
127
|
+
raise NotImplementedError
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def to!(align = true)
|
132
|
+
`#@native.scrollIntoView(align)`
|
133
|
+
end
|
67
134
|
end
|
68
135
|
|
69
136
|
end; end; end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Browser; module DOM; class Element < Node
|
2
|
+
|
3
|
+
class Select < Element
|
4
|
+
def value
|
5
|
+
%x{
|
6
|
+
if (#@native.value == "") {
|
7
|
+
return nil;
|
8
|
+
}
|
9
|
+
else {
|
10
|
+
return #@native.value;
|
11
|
+
}
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def labels
|
16
|
+
NodeSet[Native::Array.new(`#@native.labels`)]
|
17
|
+
end
|
18
|
+
|
19
|
+
def options
|
20
|
+
NodeSet[Native::Array.new(`#@native.options`)]
|
21
|
+
end
|
22
|
+
|
23
|
+
def option
|
24
|
+
DOM(`#@native.options[#@native.selectedIndex]`)
|
25
|
+
end
|
26
|
+
|
27
|
+
def index
|
28
|
+
`#@native.selectedIndex`
|
29
|
+
end
|
30
|
+
|
31
|
+
alias_native :multiple?, :multiple
|
32
|
+
alias_native :required?, :required
|
33
|
+
alias_native :length
|
34
|
+
end
|
35
|
+
|
36
|
+
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
|