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