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
@@ -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
- `#@native.value`
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(position.x - parent_offset.x - @element.style['margin-left'].to_i,
25
- position.y - parent_offset.y - @element.style['margin-top'].to_i)
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(what)
11
- x = what[:x] || self.x
12
- y = what[:y] || self.y
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(what)
23
- x = what[:x] || self.x
24
- y = what[:y] || self.y
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
- def to(what)
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
- def by(what)
60
- x = what[:x] || 0
61
- y = what[:y] || 0
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