opal-browser 0.1.0.beta1

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 (127) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.yardopts +1 -0
  4. data/Gemfile +11 -0
  5. data/README.md +106 -0
  6. data/Rakefile +5 -0
  7. data/config.ru +63 -0
  8. data/lib/opal/browser.rb +4 -0
  9. data/opal-browser.gemspec +23 -0
  10. data/opal/browser.rb +10 -0
  11. data/opal/browser/animation_frame.rb +29 -0
  12. data/opal/browser/canvas.rb +277 -0
  13. data/opal/browser/canvas/data.rb +73 -0
  14. data/opal/browser/canvas/gradient.rb +37 -0
  15. data/opal/browser/canvas/style.rb +123 -0
  16. data/opal/browser/canvas/text.rb +55 -0
  17. data/opal/browser/compatibility.rb +59 -0
  18. data/opal/browser/compatibility/animation_frame.rb +93 -0
  19. data/opal/browser/compatibility/dom/document/window.rb +15 -0
  20. data/opal/browser/compatibility/dom/element/css.rb +15 -0
  21. data/opal/browser/compatibility/dom/element/matches.rb +31 -0
  22. data/opal/browser/compatibility/dom/element/offset.rb +20 -0
  23. data/opal/browser/compatibility/dom/element/scroll.rb +25 -0
  24. data/opal/browser/compatibility/dom/element/style.rb +15 -0
  25. data/opal/browser/compatibility/dom/mutation_observer.rb +47 -0
  26. data/opal/browser/compatibility/http/request.rb +15 -0
  27. data/opal/browser/compatibility/immediate.rb +107 -0
  28. data/opal/browser/compatibility/window/scroll.rb +27 -0
  29. data/opal/browser/compatibility/window/size.rb +13 -0
  30. data/opal/browser/compatibility/window/view.rb +13 -0
  31. data/opal/browser/console.rb +137 -0
  32. data/opal/browser/cookies.rb +79 -0
  33. data/opal/browser/css.rb +24 -0
  34. data/opal/browser/css/declaration.rb +88 -0
  35. data/opal/browser/css/rule.rb +48 -0
  36. data/opal/browser/css/rule/style.rb +16 -0
  37. data/opal/browser/css/style_sheet.rb +83 -0
  38. data/opal/browser/css/unit.rb +188 -0
  39. data/opal/browser/dom.rb +95 -0
  40. data/opal/browser/dom/attribute.rb +19 -0
  41. data/opal/browser/dom/builder.rb +97 -0
  42. data/opal/browser/dom/cdata.rb +9 -0
  43. data/opal/browser/dom/character_data.rb +37 -0
  44. data/opal/browser/dom/comment.rb +9 -0
  45. data/opal/browser/dom/compatibility.rb +8 -0
  46. data/opal/browser/dom/document.rb +83 -0
  47. data/opal/browser/dom/document_fragment.rb +7 -0
  48. data/opal/browser/dom/element.rb +290 -0
  49. data/opal/browser/dom/element/input.rb +17 -0
  50. data/opal/browser/dom/element/offset.rb +67 -0
  51. data/opal/browser/dom/element/position.rb +37 -0
  52. data/opal/browser/dom/element/scroll.rb +49 -0
  53. data/opal/browser/dom/event.rb +240 -0
  54. data/opal/browser/dom/event/animation.rb +26 -0
  55. data/opal/browser/dom/event/audio_processing.rb +31 -0
  56. data/opal/browser/dom/event/base.rb +207 -0
  57. data/opal/browser/dom/event/before_unload.rb +13 -0
  58. data/opal/browser/dom/event/clipboard.rb +26 -0
  59. data/opal/browser/dom/event/close.rb +35 -0
  60. data/opal/browser/dom/event/composition.rb +38 -0
  61. data/opal/browser/dom/event/custom.rb +30 -0
  62. data/opal/browser/dom/event/device_light.rb +21 -0
  63. data/opal/browser/dom/event/device_motion.rb +38 -0
  64. data/opal/browser/dom/event/device_orientation.rb +36 -0
  65. data/opal/browser/dom/event/device_proximity.rb +31 -0
  66. data/opal/browser/dom/event/drag.rb +113 -0
  67. data/opal/browser/dom/event/focus.rb +23 -0
  68. data/opal/browser/dom/event/gamepad.rb +47 -0
  69. data/opal/browser/dom/event/hash_change.rb +26 -0
  70. data/opal/browser/dom/event/keyboard.rb +93 -0
  71. data/opal/browser/dom/event/message.rb +50 -0
  72. data/opal/browser/dom/event/mouse.rb +253 -0
  73. data/opal/browser/dom/event/page_transition.rb +21 -0
  74. data/opal/browser/dom/event/pop_state.rb +21 -0
  75. data/opal/browser/dom/event/progress.rb +31 -0
  76. data/opal/browser/dom/event/sensor.rb +13 -0
  77. data/opal/browser/dom/event/storage.rb +41 -0
  78. data/opal/browser/dom/event/touch.rb +69 -0
  79. data/opal/browser/dom/event/ui.rb +22 -0
  80. data/opal/browser/dom/event/wheel.rb +49 -0
  81. data/opal/browser/dom/mutation_observer.rb +118 -0
  82. data/opal/browser/dom/node.rb +317 -0
  83. data/opal/browser/dom/node_set.rb +88 -0
  84. data/opal/browser/dom/text.rb +21 -0
  85. data/opal/browser/effects.rb +39 -0
  86. data/opal/browser/event_source.rb +67 -0
  87. data/opal/browser/history.rb +54 -0
  88. data/opal/browser/http.rb +129 -0
  89. data/opal/browser/http/binary.rb +57 -0
  90. data/opal/browser/http/compatibility.rb +1 -0
  91. data/opal/browser/http/headers.rb +90 -0
  92. data/opal/browser/http/parameters.rb +8 -0
  93. data/opal/browser/http/request.rb +331 -0
  94. data/opal/browser/http/response.rb +115 -0
  95. data/opal/browser/immediate.rb +43 -0
  96. data/opal/browser/interval.rb +93 -0
  97. data/opal/browser/location.rb +77 -0
  98. data/opal/browser/navigator.rb +151 -0
  99. data/opal/browser/screen.rb +40 -0
  100. data/opal/browser/socket.rb +115 -0
  101. data/opal/browser/storage.rb +149 -0
  102. data/opal/browser/timeout.rb +60 -0
  103. data/opal/browser/utils.rb +56 -0
  104. data/opal/browser/version.rb +3 -0
  105. data/opal/browser/window.rb +113 -0
  106. data/opal/browser/window/compatibility.rb +3 -0
  107. data/opal/browser/window/scroll.rb +49 -0
  108. data/opal/browser/window/size.rb +35 -0
  109. data/opal/browser/window/view.rb +18 -0
  110. data/spec/dom/builder_spec.rb +69 -0
  111. data/spec/dom/document_spec.rb +40 -0
  112. data/spec/dom/element_spec.rb +46 -0
  113. data/spec/dom/event_spec.rb +127 -0
  114. data/spec/dom/mutation_observer_spec.rb +37 -0
  115. data/spec/dom/node_spec.rb +154 -0
  116. data/spec/dom_spec.rb +13 -0
  117. data/spec/event_source_spec.rb +42 -0
  118. data/spec/history_spec.rb +48 -0
  119. data/spec/http_spec.rb +87 -0
  120. data/spec/immediate_spec.rb +12 -0
  121. data/spec/json2.js +486 -0
  122. data/spec/sizzle.js +5 -0
  123. data/spec/socket_spec.rb +43 -0
  124. data/spec/spec_helper.rb +37 -0
  125. data/spec/storage_spec.rb +26 -0
  126. data/spec/window_spec.rb +10 -0
  127. metadata +240 -0
@@ -0,0 +1,17 @@
1
+ module Browser; module DOM; class Element < Node
2
+
3
+ class Input < Element
4
+ def value
5
+ `#@native.value`
6
+ end
7
+
8
+ def value=(value)
9
+ `#@native.value = #{value}`
10
+ end
11
+
12
+ def clear
13
+ `#@native.value = ''`
14
+ end
15
+ end
16
+
17
+ end; end; end
@@ -0,0 +1,67 @@
1
+ module Browser; module DOM; class Element < Node
2
+
3
+ class Offset
4
+ def initialize(element)
5
+ @element = element
6
+ @native = element.to_n
7
+ end
8
+
9
+ def parent
10
+ DOM(`#@native.offsetParent || #{@element.document.root.to_n}`)
11
+ end
12
+
13
+ def x
14
+ get.x
15
+ end
16
+
17
+ def x=(value)
18
+ set value, nil
19
+ end
20
+
21
+ def y
22
+ get.y
23
+ end
24
+
25
+ def y=(value)
26
+ set nil, value
27
+ end
28
+
29
+ def get
30
+ doc = @element.document
31
+ root = doc.root.to_n
32
+ win = doc.window.to_n
33
+
34
+ %x{
35
+ var box = #@native.getBoundingClientRect(),
36
+ y = box.top + (#{win}.pageYOffset || #{root}.scrollTop) - (#{root}.clientTop || 0),
37
+ x = box.left + (#{win}.pageXOffset || #{root}.scrollLeft) - (#{root}.clientLeft || 0);
38
+ }
39
+
40
+ Browser::Position.new(`x`, `y`)
41
+ end
42
+
43
+ def set(*value)
44
+ position = @element.style![:position]
45
+
46
+ if position == :static
47
+ @element.style[:position] = :relative
48
+ end
49
+
50
+ offset = get
51
+ top = @element.style![:top].to_u
52
+ left = @element.style![:left].to_u
53
+
54
+ if Browser::Position === value.first
55
+ x, y = value.first.x, value.first.y
56
+ elsif Hash === value.first
57
+ x, y = value.first[:x], value.first[:y]
58
+ else
59
+ x, y = value
60
+ end
61
+
62
+ @element.style[:left] = (x.px - offset.x) + left if x
63
+ @element.style[:top] = (y.px - offset.y) + top if y
64
+ end
65
+ end
66
+
67
+ end; end; end
@@ -0,0 +1,37 @@
1
+ module Browser; module DOM; class Element < Node
2
+
3
+ class Position
4
+ def initialize(element)
5
+ @element = element
6
+ @native = element.to_n
7
+ end
8
+
9
+ def get
10
+ offset = @element.offset
11
+ position = offset.get
12
+ parent = offset.parent
13
+ parent_offset = Browser::Position.new(0, 0)
14
+
15
+ if @element.style[:position] == :fixed
16
+ unless parent =~ :html
17
+ parent_offset = parent.offset
18
+ end
19
+
20
+ parent_offset.x += parent.style['border-top-width'].to_i
21
+ parent_offset.y += parent.style['border-left-width'].to_i
22
+ end
23
+
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)
26
+ end
27
+
28
+ def x
29
+ get.x
30
+ end
31
+
32
+ def y
33
+ get.y
34
+ end
35
+ end
36
+
37
+ end; end; end
@@ -0,0 +1,49 @@
1
+ module Browser; module DOM; class Element < Node
2
+
3
+ class Scroll
4
+ def initialize(element)
5
+ @element = element
6
+ @native = element.to_n
7
+ end
8
+
9
+ def position
10
+ Browser::Position.new(`#@native.scrollLeft`, `#@native.scrollTop`)
11
+ end
12
+
13
+ def x
14
+ position.x
15
+ end
16
+
17
+ def y
18
+ position.y
19
+ end
20
+
21
+ def to(what)
22
+ x = what[:x] || self.x
23
+ y = what[:y] || self.y
24
+
25
+ `#@native.scrollTop = #{y}`
26
+ `#@native.scrollLeft = #{x}`
27
+
28
+ self
29
+ end
30
+
31
+ def height
32
+ `#@native.scrollHeight`
33
+ end
34
+
35
+ def width
36
+ `#@native.scrollWidth`
37
+ end
38
+
39
+ def by(what)
40
+ x = what[:x] || 0
41
+ y = what[:y] || 0
42
+
43
+ `#@native.scrollBy(#{x}, #{y})`
44
+
45
+ self
46
+ end
47
+ end
48
+
49
+ end; end; end
@@ -0,0 +1,240 @@
1
+ require 'browser/dom/event/base'
2
+
3
+ require 'browser/dom/event/ui'
4
+ require 'browser/dom/event/mouse'
5
+ require 'browser/dom/event/keyboard'
6
+ require 'browser/dom/event/focus'
7
+ require 'browser/dom/event/wheel'
8
+ require 'browser/dom/event/composition'
9
+ require 'browser/dom/event/animation'
10
+ require 'browser/dom/event/audio_processing'
11
+ require 'browser/dom/event/before_unload'
12
+ require 'browser/dom/event/composition'
13
+ require 'browser/dom/event/clipboard'
14
+ require 'browser/dom/event/device_light'
15
+ require 'browser/dom/event/device_motion'
16
+ require 'browser/dom/event/device_orientation'
17
+ require 'browser/dom/event/device_proximity'
18
+ require 'browser/dom/event/drag'
19
+ require 'browser/dom/event/gamepad'
20
+ require 'browser/dom/event/hash_change'
21
+ require 'browser/dom/event/progress'
22
+ require 'browser/dom/event/page_transition'
23
+ require 'browser/dom/event/pop_state'
24
+ require 'browser/dom/event/storage'
25
+ require 'browser/dom/event/touch'
26
+ require 'browser/dom/event/sensor'
27
+ require 'browser/dom/event/custom'
28
+ require 'browser/dom/event/message'
29
+ require 'browser/dom/event/close'
30
+
31
+ module Browser; module DOM
32
+
33
+ class Event
34
+ def self.names
35
+ return @names if @names
36
+
37
+ @names = Hash.new { |_, k| k }
38
+ @names.merge!({
39
+ load: 'DOMContentLoaded',
40
+ hover: 'mouse:over'
41
+ })
42
+ end
43
+
44
+ def self.name_for(name)
45
+ names[name].gsub(?:, '')
46
+ end
47
+
48
+ def self.classes
49
+ @classes ||= {
50
+ Animation => $$[:AnimationEvent],
51
+ AudioProcessing => $$[:AudioProcessingEvent],
52
+ BeforeUnload => $$[:BeforeUnloadEvent],
53
+ Composition => $$[:CompositionEvent],
54
+ Clipboard => $$[:ClipboardEvent],
55
+ DeviceLight => $$[:DeviceLightEvent],
56
+ DeviceMotion => $$[:DeviceMotionEvent],
57
+ DeviceOrientation => $$[:DeviceOrientationEvent],
58
+ DeviceProximity => $$[:DeviceProximityEvent],
59
+ Drag => $$[:DragEvent],
60
+ Gamepad => $$[:GamepadEvent],
61
+ HashChange => $$[:HashChangeEvent],
62
+ Progress => $$[:ProgressEvent],
63
+ PageTransition => $$[:PageTransitionEvent],
64
+ PopState => $$[:PopStateEvent],
65
+ Storage => $$[:StorageEvent],
66
+ Touch => $$[:TouchEvent],
67
+ Sensor => $$[:SensorEvent],
68
+ Mouse => $$[:MouseEvent],
69
+ Keyboard => $$[:KeyboardEvent],
70
+ Focus => $$[:FocusEvent],
71
+ Wheel => $$[:WheelEvent],
72
+ Custom => $$[:CustomEvent]
73
+ }
74
+ end
75
+
76
+ def self.class_for(name)
77
+ type = case name_for(name)
78
+ when 'animationend', 'animationiteration', 'animationstart'
79
+ Animation
80
+
81
+ when 'audioprocess'
82
+ AudioProcessing
83
+
84
+ when 'beforeunload'
85
+ BeforeUnload
86
+
87
+ when 'compositionend', 'compositionstart', 'compositionupdate'
88
+ Composition
89
+
90
+ when 'copy', 'cut'
91
+ Clipboard
92
+
93
+ when 'devicelight'
94
+ DeviceLight
95
+
96
+ when 'devicemotion'
97
+ DeviceMotion
98
+
99
+ when 'deviceorientation'
100
+ DeviceOrientation
101
+
102
+ when 'deviceproximity'
103
+ DeviceProximity
104
+
105
+ when 'drag', 'dragend', 'dragleave', 'dragover', 'dragstart', 'drop'
106
+ Drag
107
+
108
+ when 'gamepadconnected', 'gamepaddisconnected'
109
+ Gamepad
110
+
111
+ when 'hashchange'
112
+ HashChange
113
+
114
+ when 'load', 'loadend', 'loadstart'
115
+ Progress
116
+
117
+ when 'pagehide', 'pageshow'
118
+ PageTransition
119
+
120
+ when 'popstate'
121
+ PopState
122
+
123
+ when 'storage'
124
+ Storage
125
+
126
+ when 'touchcancel', 'touchend', 'touchleave', 'touchmove', 'touchstart'
127
+ Touch
128
+
129
+ when 'compassneedscalibration', 'userproximity'
130
+ Sensor
131
+
132
+ when 'message'
133
+ Message
134
+
135
+ when 'close'
136
+ Close
137
+
138
+ when 'click', 'contextmenu', 'dblclick', 'mousedown', 'mouseenter',
139
+ 'mouseleave', 'mousemove', 'mouseout', 'mouseover', 'mouseup',
140
+ 'show'
141
+ Mouse
142
+
143
+ when 'keydown', 'keypress', 'keyup'
144
+ Keyboard
145
+
146
+ when 'blur', 'focus', 'focusin', 'focusout'
147
+ Focus
148
+
149
+ when 'wheel'
150
+ Wheel
151
+
152
+ when 'abort', 'afterprint', 'beforeprint', 'cached', 'canplay', 'canplaythrough',
153
+ 'change', 'chargingchange', 'chargingtimechange', 'checking', 'close',
154
+ 'dischargingtimechange', 'DOMContentLoaded', 'downloading', 'durationchange',
155
+ 'emptied', 'ended', 'error', 'fullscreenchange', 'fullscreenerror', 'input',
156
+ 'invalid', 'levelchange', 'loadeddata', 'loadedmetadata', 'noupdate', 'obsolete',
157
+ 'offline', 'online', 'open', 'orientationchange', 'pause', 'pointerlockchange',
158
+ 'pointerlockerror', 'play', 'playing', 'ratechange', 'readystatechange', 'reset',
159
+ 'seeked', 'seeking', 'stalled', 'submit', 'success', 'suspend', 'timeupdate',
160
+ 'updateready', 'visibilitychange', 'volumechange', 'waiting'
161
+ Event
162
+
163
+ else
164
+ Custom
165
+ end
166
+
167
+ if type != Event && type.supported?
168
+ type
169
+ else
170
+ Event
171
+ end
172
+ end
173
+
174
+ def self.create(name, *args, &block)
175
+ name = name_for(name)
176
+ klass = class_for(name)
177
+
178
+ event = if klass == self
179
+ new(`new window.Event(#{name}, #{Definition.new(&block)})`)
180
+ else
181
+ klass.create(name, &block)
182
+ end
183
+
184
+ event.arguments = args
185
+
186
+ event
187
+ end
188
+
189
+ def self.new(value, *args)
190
+ klass, _ = classes.find {|_, constructor|
191
+ Native.is_a?(value, constructor)
192
+ }
193
+
194
+ if !klass || klass == self
195
+ super(value, *args)
196
+ else
197
+ klass.new(value, *args)
198
+ end
199
+ end
200
+
201
+ attr_reader :target, :callback
202
+
203
+ def initialize(native, callback = nil)
204
+ super(native)
205
+
206
+ @target = Target.convert(`#@native.target`)
207
+ @callback, = callback # TODO: change this when super is fixed
208
+ end
209
+
210
+ def off
211
+ @callback.off if @callback
212
+ end
213
+
214
+ def arguments
215
+ `#@native.arguments || []`
216
+ end
217
+
218
+ def arguments=(args)
219
+ `#@native.arguments = #{args}`
220
+ end
221
+
222
+ alias_native :bubbles?, :bubbles
223
+ alias_native :cancelable?, :cancelable
224
+ alias_native :name, :type
225
+ alias_native :data
226
+ alias_native :phase, :eventPhase
227
+ alias_native :at, :timeStamp
228
+
229
+ def stopped?
230
+ `!!#@native.stopped`
231
+ end
232
+
233
+ def stop!
234
+ `#@native.stopPropagation()` if defined?(`#@native.stopPropagation`)
235
+ `#@native.preventDefault()` if defined?(`#@native.preventDefault`)
236
+ `#@native.stopped = true`
237
+ end
238
+ end
239
+
240
+ end; end
@@ -0,0 +1,26 @@
1
+ module Browser; module DOM; class Event
2
+
3
+ class Animation < Event
4
+ def self.supported?
5
+ not $$[:AnimationEvent].nil?
6
+ end
7
+
8
+ class Definition < Definition
9
+ def animation=(value)
10
+ `#@native.animationName = #{value}`
11
+ end
12
+
13
+ def elapsed=(value)
14
+ `#@native.elapsedTime = #{value}`
15
+ end
16
+ end
17
+
18
+ def self.create(name, &block)
19
+ new(`new AnimationEvent(#{name}, #{Definition.new(&block)})`)
20
+ end
21
+
22
+ alias_native :name, :animationName
23
+ alias_native :elapsed, :elapsedTime
24
+ end
25
+
26
+ end; end; end
@@ -0,0 +1,31 @@
1
+ module Browser; module DOM; class Event
2
+
3
+ class AudioProcessing < Event
4
+ def self.supported?
5
+ not $$[:AudioProcessingEvent].nil?
6
+ end
7
+
8
+ class Definition < Definition
9
+ def time=(value)
10
+ `#@native.playbackTime = #{value}`
11
+ end
12
+
13
+ def input=(value)
14
+ `#@native.inputBuffer = #{value}`
15
+ end
16
+
17
+ def output=(value)
18
+ `#@native.outputBuffer = #{value}`
19
+ end
20
+ end
21
+
22
+ def self.create(name, &block)
23
+ new(`new AudioProcessingEvent(#{name}, #{Definition.new(&block)})`)
24
+ end
25
+
26
+ alias_native :time, :playbackTime
27
+ alias_native :input, :inputBuffer
28
+ alias_native :output, :outputBuffer
29
+ end
30
+
31
+ end; end; end