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,207 @@
1
+ module Browser; module DOM
2
+
3
+ class Event
4
+ include Native
5
+
6
+ class Definition
7
+ include Native
8
+
9
+ def self.new(&block)
10
+ data = super(`{}`)
11
+ block.call(data) if block
12
+
13
+ data.to_n
14
+ end
15
+
16
+ def bubbles!
17
+ `#@native.bubbles = true`
18
+ end
19
+
20
+ def cancelable!
21
+ `#@native.cancelable = true`
22
+ end
23
+ end
24
+
25
+ module Target
26
+ def self.converters
27
+ @converters ||= []
28
+ end
29
+
30
+ def self.register(&block)
31
+ converters << block
32
+ end
33
+
34
+ def self.convert(value)
35
+ return value unless native?(value)
36
+
37
+ converters.each {|block|
38
+ if result = block.call(value)
39
+ return result
40
+ end
41
+ }
42
+
43
+ nil
44
+ end
45
+
46
+ def self.included(klass)
47
+ klass.instance_eval {
48
+ def self.target(&block)
49
+ DOM::Event::Target.register(&block)
50
+ end
51
+ }
52
+ end
53
+
54
+ class Callback
55
+ attr_reader :target, :name, :selector
56
+
57
+ def initialize(target, name, selector = nil, &block)
58
+ %x{
59
+ callback = #{self};
60
+ func = function(event) {
61
+ event = #{::Browser::DOM::Event.new(`event`, `callback`)};
62
+
63
+ if (!#{`event`.stopped?}) {
64
+ #{block.call(`event`, *`event`.arguments)};
65
+ }
66
+
67
+ return !#{`event`.stopped?};
68
+ }
69
+ }
70
+
71
+ @function = `func`
72
+ @target = target
73
+ @name = name
74
+ @selector = selector
75
+ end
76
+
77
+ def off
78
+ target.off(self)
79
+ end
80
+
81
+ def to_n
82
+ @function
83
+ end
84
+ end
85
+
86
+ def on(name, selector = nil, &block)
87
+ raise ArgumentError, 'no block has been passed' unless block
88
+
89
+ name = Event.name_for(name)
90
+ callback = Callback.new(self, name, selector, &block)
91
+
92
+ callbacks.push(callback)
93
+
94
+ if selector
95
+ observe
96
+ deferred << [name, selector, block]
97
+
98
+ css(selector).on(name, &block)
99
+ else
100
+ `#@native.addEventListener(#{name}, #{callback.to_n})`
101
+ end
102
+
103
+ callback
104
+ end
105
+
106
+ def off(what = nil)
107
+ case what
108
+ when Callback
109
+ callbacks.delete(what)
110
+
111
+ `#@native.removeEventListener(#{what.name}, #{what.to_n}, false)`
112
+
113
+ when String
114
+ if what.include?(?*) or what.include?(??)
115
+ off(Regexp.new(what.gsub(/\*/, '.*?').gsub(/\?/, ?.)))
116
+ else
117
+ what = Event.name_for(what)
118
+
119
+ callbacks.delete_if {|callback|
120
+ if callback.name == what
121
+ `#@native.removeEventListener(#{callback.name}, #{callback.to_n}, false)`
122
+
123
+ true
124
+ end
125
+ }
126
+ end
127
+
128
+ when Regexp
129
+ callbacks.delete_if {|callback|
130
+ if callback.name =~ what
131
+ `#@native.removeEventListener(#{callback.name}, #{callback.to_n}, false)`
132
+
133
+ true
134
+ end
135
+ }
136
+
137
+ else
138
+ callbacks.each {|callback|
139
+ `#@native.removeEventListener(#{callback.name}, #{callback.to_n}, false)`
140
+ }
141
+
142
+ callbacks.clear
143
+ end
144
+ end
145
+
146
+ def trigger(event, *args, &block)
147
+ if event.is_a? String
148
+ event = Event.create(event, *args, &block)
149
+ end
150
+
151
+ `#@native.dispatchEvent(#{event.to_n})`
152
+ end
153
+
154
+ private
155
+ def callbacks
156
+ %x{
157
+ if (!#@native.$callbacks) {
158
+ #@native.$callbacks = [];
159
+ }
160
+
161
+ return #@native.$callbacks;
162
+ }
163
+ end
164
+
165
+ def observe
166
+ %x{
167
+ if (!#@native.$observer) {
168
+ #@native.$observer = #{MutationObserver.new {|mutations|
169
+ mutations.each {|mutation|
170
+ mutation.added.each {|node|
171
+ next unless Element === node
172
+
173
+ defer(node)
174
+ }
175
+ }
176
+ }};
177
+
178
+ #{`#@native.$observer`.observe(@native, children: true, tree: true)}
179
+ }
180
+ }
181
+ end
182
+
183
+ def deferred
184
+ %x{
185
+ if (!#@native.$deferred) {
186
+ #@native.$deferred = [];
187
+ }
188
+
189
+ return #@native.$deferred;
190
+ }
191
+ end
192
+
193
+ def defer(node)
194
+ deferred.each {|name, selector, block|
195
+ if node.matches?(selector)
196
+ node.on(name, &block)
197
+ end
198
+
199
+ node.elements.each {|el|
200
+ defer(el)
201
+ }
202
+ }
203
+ end
204
+ end
205
+ end
206
+
207
+ end; end
@@ -0,0 +1,13 @@
1
+ module Browser; module DOM; class Event
2
+
3
+ class BeforeUnload < Event
4
+ def self.supported?
5
+ not $$[:BeforeUnloadEvent].nil?
6
+ end
7
+
8
+ def self.create(name, &block)
9
+ new(`new BeforeUnloadEvent(#{name}, #{Definition.new(&block)})`)
10
+ end
11
+ end
12
+
13
+ end; end; end
@@ -0,0 +1,26 @@
1
+ module Browser; module DOM; class Event
2
+
3
+ class Clipboard < Event
4
+ def self.supported?
5
+ not $$[:ClipboardEvent].nil?
6
+ end
7
+
8
+ class Definition < Definition
9
+ def data=(value)
10
+ `#@native.data = #{value}`
11
+ end
12
+
13
+ def type=(value)
14
+ `#@native.dataType = #{value}`
15
+ end
16
+ end
17
+
18
+ def self.create(name, &block)
19
+ new(`new ClipboardEvent(#{name}, #{Definition.new(&block)})`)
20
+ end
21
+
22
+ alias_native :data
23
+ alias_native :type, :dataType
24
+ end
25
+
26
+ end; end; end
@@ -0,0 +1,35 @@
1
+ module Browser; module DOM; class Event
2
+
3
+ class Close < Event
4
+ def self.supported?
5
+ not $$[:CloseEvent].nil?
6
+ end
7
+
8
+ class Definition < Definition
9
+ def code=(value)
10
+ `#@native.code = #{value}`
11
+ end
12
+
13
+ def reason=(value)
14
+ `#@native.reason = #{value}`
15
+ end
16
+
17
+ def clean!(value)
18
+ `#@native.wasClean = true`
19
+ end
20
+
21
+ def not_clean!(value)
22
+ `#@native.wasClean = false`
23
+ end
24
+ end
25
+
26
+ def self.create(name, &block)
27
+ new(`new CloseEvent(#{name}, #{Definition.new(&block)})`)
28
+ end
29
+
30
+ alias_native :code
31
+ alias_native :reason
32
+ alias_native :clean?, :wasClean
33
+ end
34
+
35
+ end; end; end
@@ -0,0 +1,38 @@
1
+ module Browser; module DOM; class Event
2
+
3
+ class Composition < UI
4
+ def self.supported?
5
+ not $$[:CompositionEvent].nil?
6
+ end
7
+
8
+ class Definition < UI::Definition
9
+ def data=(value)
10
+ `#@native.data = #{value}`
11
+ end
12
+
13
+ def locale=(value)
14
+ `#@native.locale = #{value}`
15
+ end
16
+ end
17
+
18
+ def self.create(name, &block)
19
+ new(`new CompositionEvent(#{name}, #{Definition.new(&block)})`)
20
+ end
21
+
22
+ alias_native :data
23
+ alias_native :locale
24
+
25
+ def start?
26
+ name.downcase == 'compositionstart'
27
+ end
28
+
29
+ def update?
30
+ name.downcase == 'compositionupdate'
31
+ end
32
+
33
+ def end?
34
+ name.downcase == 'compositionend'
35
+ end
36
+ end
37
+
38
+ end; end; end
@@ -0,0 +1,30 @@
1
+ require 'ostruct'
2
+
3
+ module Browser; module DOM; class Event
4
+
5
+ class Custom < Event
6
+ def self.supported?
7
+ not $$[:CustomEvent].nil?
8
+ end
9
+
10
+ def self.create(name, &block)
11
+ data = OpenStruct.new
12
+ block.call(data) if block
13
+
14
+ new(`new CustomEvent(#{name}, { detail: #{data.to_n} })`)
15
+ end
16
+
17
+ def initialize(native)
18
+ super(native); @native = native # TODO: remove this when super is fixed
19
+
20
+ @detail = Hash.new(`#{native}.detail`)
21
+ end
22
+
23
+ def method_missing(id, *)
24
+ return @detail[id] if @detail.has_key?(id)
25
+
26
+ super
27
+ end
28
+ end
29
+
30
+ end; end; end
@@ -0,0 +1,21 @@
1
+ module Browser; module DOM; class Event
2
+
3
+ class DeviceLight < Event
4
+ def self.supported?
5
+ not $$[:DeviceLightEvent].nil?
6
+ end
7
+
8
+ class Definition < Definition
9
+ def value=(value)
10
+ `#@native.value = #{value}`
11
+ end
12
+ end
13
+
14
+ def self.create(name, &block)
15
+ new(`new DeviceLightEvent(#{name}, #{Definition.new(&block)})`)
16
+ end
17
+
18
+ alias_native :value
19
+ end
20
+
21
+ end; end; end
@@ -0,0 +1,38 @@
1
+ module Browser; module DOM; class Event
2
+
3
+ class DeviceMotion < Event
4
+ def self.supported?
5
+ not $$[:DeviceMotionEvent].nil?
6
+ end
7
+
8
+ Acceleration = Struct.new(:x, :y, :z)
9
+
10
+ class Definition < Definition
11
+ def acceleration=(value)
12
+ `#@native.acceleration = #{value.to_n}`
13
+ end
14
+
15
+ def acceleration_with_gravity=(value)
16
+ `#@native.accelerationIncludingGravity = #{value.to_n}`
17
+ end
18
+
19
+ def rotation=(value)
20
+ `#@native.rotationRate = #{value}`
21
+ end
22
+
23
+ def interval=(value)
24
+ `#@native.interval = #{value}`
25
+ end
26
+ end
27
+
28
+ def self.create(name, &block)
29
+ new(`new DeviceMotionEvent(#{name}, #{Definition.new(&block)})`)
30
+ end
31
+
32
+ alias_native :acceleration
33
+ alias_native :acceleration_with_gravity, :accelerationIncludingGravity
34
+ alias_native :rotation, :rotationRate
35
+ alias_native :interval
36
+ end
37
+
38
+ end; end; end
@@ -0,0 +1,36 @@
1
+ module Browser; module DOM; class Event
2
+
3
+ class DeviceOrientation < Event
4
+ def self.supported?
5
+ not $$[:DeviceOrientationEvent].nil?
6
+ end
7
+
8
+ class Definition < Definition
9
+ def absolute=(value)
10
+ `#@native.absolute = #{value}`
11
+ end
12
+
13
+ def alpha=(value)
14
+ `#@native.alpha = #{value}`
15
+ end
16
+
17
+ def beta=(value)
18
+ `#@native.beta = #{value}`
19
+ end
20
+
21
+ def gamma=(value)
22
+ `#@native.gamma = #{value}`
23
+ end
24
+ end
25
+
26
+ def self.create(name, &block)
27
+ new(`new DeviceOrientationEvent(#{name}, #{Definition.new(&block)})`)
28
+ end
29
+
30
+ alias_native :absolute
31
+ alias_native :alpha
32
+ alias_native :beta
33
+ alias_native :gamma
34
+ end
35
+
36
+ end; end; end