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