opal-browser 0.1.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
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