opal-browser 0.1.0.beta1 → 0.2.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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +60 -0
  3. data/.yardopts +1 -1
  4. data/Gemfile +7 -2
  5. data/LICENSE +19 -0
  6. data/README.md +74 -10
  7. data/config.ru +2 -1
  8. data/index.html.erb +22 -0
  9. data/opal-browser.gemspec +9 -11
  10. data/opal/browser.rb +1 -1
  11. data/opal/browser/animation_frame.rb +66 -9
  12. data/opal/browser/canvas.rb +72 -18
  13. data/opal/browser/canvas/data.rb +1 -1
  14. data/opal/browser/console.rb +3 -37
  15. data/opal/browser/cookies.rb +80 -24
  16. data/opal/browser/css/declaration.rb +0 -5
  17. data/opal/browser/{timeout.rb → delay.rb} +13 -13
  18. data/opal/browser/dom.rb +0 -2
  19. data/opal/browser/dom/attribute.rb +6 -0
  20. data/opal/browser/dom/builder.rb +4 -8
  21. data/opal/browser/dom/character_data.rb +43 -7
  22. data/opal/browser/dom/document.rb +13 -11
  23. data/opal/browser/dom/element.rb +127 -29
  24. data/opal/browser/dom/element/image.rb +23 -0
  25. data/opal/browser/dom/element/offset.rb +27 -10
  26. data/opal/browser/dom/element/scroll.rb +32 -12
  27. data/opal/browser/dom/element/size.rb +29 -0
  28. data/opal/browser/dom/event.rb +88 -75
  29. data/opal/browser/dom/event/animation.rb +16 -4
  30. data/opal/browser/dom/event/audio_processing.rb +6 -4
  31. data/opal/browser/dom/event/base.rb +229 -64
  32. data/opal/browser/dom/event/before_unload.rb +6 -4
  33. data/opal/browser/dom/event/clipboard.rb +6 -4
  34. data/opal/browser/dom/event/close.rb +16 -4
  35. data/opal/browser/dom/event/composition.rb +16 -4
  36. data/opal/browser/dom/event/custom.rb +43 -8
  37. data/opal/browser/dom/event/device_light.rb +6 -4
  38. data/opal/browser/dom/event/device_motion.rb +17 -4
  39. data/opal/browser/dom/event/device_orientation.rb +16 -4
  40. data/opal/browser/dom/event/device_proximity.rb +6 -4
  41. data/opal/browser/dom/event/drag.rb +34 -28
  42. data/opal/browser/dom/event/focus.rb +21 -5
  43. data/opal/browser/dom/event/gamepad.rb +33 -20
  44. data/opal/browser/dom/event/hash_change.rb +6 -4
  45. data/opal/browser/dom/event/keyboard.rb +45 -23
  46. data/opal/browser/dom/event/message.rb +28 -8
  47. data/opal/browser/dom/event/mouse.rb +26 -25
  48. data/opal/browser/dom/event/page_transition.rb +6 -4
  49. data/opal/browser/dom/event/pop_state.rb +16 -4
  50. data/opal/browser/dom/event/progress.rb +16 -4
  51. data/opal/browser/dom/event/sensor.rb +6 -4
  52. data/opal/browser/dom/event/storage.rb +6 -4
  53. data/opal/browser/dom/event/touch.rb +10 -19
  54. data/opal/browser/dom/event/ui.rb +19 -3
  55. data/opal/browser/dom/event/wheel.rb +2 -2
  56. data/opal/browser/dom/mutation_observer.rb +65 -5
  57. data/opal/browser/dom/node.rb +164 -59
  58. data/opal/browser/dom/node_set.rb +4 -0
  59. data/opal/browser/dom/text.rb +16 -1
  60. data/opal/browser/event_source.rb +5 -2
  61. data/opal/browser/history.rb +51 -15
  62. data/opal/browser/http.rb +22 -7
  63. data/opal/browser/http/headers.rb +5 -0
  64. data/opal/browser/http/request.rb +40 -10
  65. data/opal/browser/immediate.rb +123 -9
  66. data/opal/browser/interval.rb +8 -13
  67. data/opal/browser/location.rb +13 -3
  68. data/opal/browser/navigator.rb +9 -6
  69. data/opal/browser/screen.rb +31 -5
  70. data/opal/browser/socket.rb +8 -4
  71. data/opal/browser/storage.rb +118 -33
  72. data/opal/browser/support.rb +232 -0
  73. data/opal/browser/utils.rb +24 -6
  74. data/opal/browser/version.rb +1 -1
  75. data/opal/browser/window.rb +1 -2
  76. data/opal/browser/window/scroll.rb +21 -11
  77. data/opal/browser/window/size.rb +16 -6
  78. data/opal/browser/window/view.rb +23 -5
  79. data/spec/dom/builder_spec.rb +19 -19
  80. data/spec/dom/document_spec.rb +6 -6
  81. data/spec/dom/element_spec.rb +5 -5
  82. data/spec/dom/event_spec.rb +20 -20
  83. data/spec/dom/mutation_observer_spec.rb +5 -5
  84. data/spec/dom/node_spec.rb +39 -27
  85. data/spec/dom_spec.rb +10 -8
  86. data/spec/event_source_spec.rb +12 -12
  87. data/spec/history_spec.rb +24 -15
  88. data/spec/http_spec.rb +18 -17
  89. data/spec/immediate_spec.rb +9 -7
  90. data/spec/runner.rb +114 -0
  91. data/spec/socket_spec.rb +8 -8
  92. data/spec/spec_helper.rb +1 -0
  93. data/spec/storage_spec.rb +6 -6
  94. data/spec/wgxpath.install.js +49 -0
  95. data/spec/window_spec.rb +2 -2
  96. metadata +21 -54
  97. data/opal/browser/compatibility.rb +0 -59
  98. data/opal/browser/compatibility/animation_frame.rb +0 -93
  99. data/opal/browser/compatibility/dom/document/window.rb +0 -15
  100. data/opal/browser/compatibility/dom/element/css.rb +0 -15
  101. data/opal/browser/compatibility/dom/element/matches.rb +0 -31
  102. data/opal/browser/compatibility/dom/element/offset.rb +0 -20
  103. data/opal/browser/compatibility/dom/element/scroll.rb +0 -25
  104. data/opal/browser/compatibility/dom/element/style.rb +0 -15
  105. data/opal/browser/compatibility/dom/mutation_observer.rb +0 -47
  106. data/opal/browser/compatibility/http/request.rb +0 -15
  107. data/opal/browser/compatibility/immediate.rb +0 -107
  108. data/opal/browser/compatibility/window/scroll.rb +0 -27
  109. data/opal/browser/compatibility/window/size.rb +0 -13
  110. data/opal/browser/compatibility/window/view.rb +0 -13
  111. data/opal/browser/dom/compatibility.rb +0 -8
  112. data/opal/browser/http/compatibility.rb +0 -1
  113. data/opal/browser/window/compatibility.rb +0 -3
@@ -2,7 +2,7 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class HashChange < Event
4
4
  def self.supported?
5
- not $$[:HashChangeEvent].nil?
5
+ Browser.supports? 'Event.HashChange'
6
6
  end
7
7
 
8
8
  class Definition < Definition
@@ -15,9 +15,11 @@ class HashChange < Event
15
15
  end
16
16
  end
17
17
 
18
- def self.create(name, &block)
19
- new(`new HashChangeEvent(#{name}, #{Definition.new(&block)})`)
20
- end
18
+ if Browser.supports? 'Event.constructor'
19
+ def self.construct(name, desc)
20
+ `new HashChangeEvent(#{name}, #{desc})`
21
+ end
22
+ end if supported?
21
23
 
22
24
  alias_native :old, :oldURL
23
25
  alias_native :new, :newURL
@@ -2,7 +2,7 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class Keyboard < UI
4
4
  def self.supported?
5
- not $$[:KeyboardEvent].nil?
5
+ Browser.supports? 'Event.Keyboard'
6
6
  end
7
7
 
8
8
  class Definition < UI::Definition
@@ -37,31 +37,53 @@ class Keyboard < UI
37
37
  def repeat!
38
38
  `#@native.repeat = true`
39
39
  end
40
- end
41
-
42
- def self.create(name, &block)
43
- new(`new KeyboardEvent(#{name}, #{Definition.new(&block)})`)
44
- end
45
-
46
- def alt?
47
- `#@native.altKey`
48
- end
49
-
50
- def ctrl?
51
- `#@native.ctrlKey`
52
- end
53
40
 
54
- def meta?
55
- `#@native.metaKey`
56
- end
57
-
58
- def shift?
59
- `#@native.shiftKey`
41
+ def locale=(value)
42
+ `#@native.locale = value`
43
+ end
60
44
  end
61
45
 
62
- def repeat?
63
- `#@native.repeat`
64
- end
46
+ if Browser.supports? 'Event.constructor'
47
+ def self.construct(name, desc)
48
+ `new KeyboardEvent(#{name}, #{desc})`
49
+ end
50
+ elsif Browser.supports? 'Event.create'
51
+ def self.construct(name, desc)
52
+ %x{
53
+ var modifiers = "";
54
+
55
+ if (desc.altKey) {
56
+ modifiers += "Alt ";
57
+ }
58
+
59
+ if (desc.ctrlKey) {
60
+ modifiers += "Ctrl ";
61
+ }
62
+
63
+ if (desc.shiftKey) {
64
+ modifiers += "Shift" ;
65
+ }
66
+
67
+ if (desc.metaKey) {
68
+ modifiers += "Meta ";
69
+ }
70
+
71
+ var event = document.createEvent("KeyboardEvent");
72
+ event.initKeyboardEvent(name, desc.bubbles, desc.cancelable,
73
+ desc.view || window, desc.which, 0,
74
+ modifiers, desc.repeat, desc.locale);
75
+
76
+ return event;
77
+ }
78
+ end
79
+ end if supported?
80
+
81
+ alias_native :alt?, :altKey
82
+ alias_native :ctrl?, :ctrlKey
83
+ alias_native :meta?, :metaKey
84
+ alias_native :shift?, :shiftKey
85
+ alias_native :locale
86
+ alias_native :repeat?, :repeat
65
87
 
66
88
  def key
67
89
  `#@native.key || #@native.keyIdentifier || nil`
@@ -4,25 +4,45 @@ module Browser; module DOM; class Event
4
4
 
5
5
  class Message < Event
6
6
  def self.supported?
7
- not $$[:MessageEvent].nil?
7
+ Browser.supports? 'Event.Message'
8
8
  end
9
9
 
10
10
  class Definition < Definition
11
11
  def data=(value)
12
- `#@native.data = #{value.to_n}`
12
+ `#@native.data = value`
13
+ end
14
+
15
+ def origin=(value)
16
+ `#@native.origin = value`
13
17
  end
14
- end
15
18
 
16
- def self.create(name, &block)
17
- new(`new MessageEvent(#{name}, #{Definition.new(&block)})`)
19
+ def source=(value)
20
+ `#@native.source = #{Native.convert(value)}`
21
+ end
18
22
  end
19
23
 
24
+ if Browser.supports? 'Event.constructor'
25
+ def self.construct(name, desc)
26
+ `new MessageEvent(#{name}, #{desc})`
27
+ end
28
+ elsif Browser.supports? 'Event.create'
29
+ def self.construct(name, desc)
30
+ %x{
31
+ var event = document.createEvent("MessageEvent");
32
+ event.initMessageEvent(name, desc.bubbles, desc.cancelable,
33
+ desc.data, desc.origin, "", desc.source || window);
34
+
35
+ return event;
36
+ }
37
+ end
38
+ end if supported?
39
+
20
40
  def data
21
41
  %x{
22
- if (#@native.data instanceof ArrayBuffer) {
42
+ if (window.ArrayBuffer && #@native.data instanceof ArrayBuffer) {
23
43
  return #{Buffer.new(`#@native.data`)};
24
44
  }
25
- else if (#@native.data instanceof Blob) {
45
+ else if (window.Blob && #@native.data instanceof Blob) {
26
46
  return #{Blob.new(`#@native.data`)};
27
47
  }
28
48
  else {
@@ -37,7 +57,7 @@ class Message < Event
37
57
  %x{
38
58
  var source = #@native.source;
39
59
 
40
- if (source instanceof window.Window) {
60
+ if (window.Window && source instanceof window.Window) {
41
61
  return #{Window.new(`source`)};
42
62
  }
43
63
  else {
@@ -139,31 +139,32 @@ class Mouse < UI
139
139
  end
140
140
  end
141
141
 
142
- def self.create(name, &block)
143
- new(`new MouseEvent(#{name}, #{Definition.new(&block)})`)
144
- end
145
-
146
- Position = Struct.new(:x, :y)
147
-
148
- def alt?
149
- `#@native.altKey`
150
- end
151
-
152
- def ctrl?
153
- `#@native.ctrlKey`
154
- end
155
-
156
- def meta?
157
- `#@native.metaKey`
158
- end
159
-
160
- def shift?
161
- `#@native.shiftKey`
162
- end
163
-
164
- def button
165
- `#@native.button`
166
- end
142
+ if Browser.supports? 'Event.constructor'
143
+ def self.construct(name, desc)
144
+ `new MouseEvent(#{name}, #{desc})`
145
+ end
146
+ elsif Browser.supports? 'Event.create'
147
+ def self.construct(name, desc)
148
+ %x{
149
+ var event = document.createEvent("MouseEvent");
150
+ event.initMouseEvent(name, desc.bubbles, desc.cancelable,
151
+ desc.view || window, desc.detail || 0,
152
+ desc.screenX || 0, desc.screenY || 0,
153
+ desc.clientX || 0, desc.clientY || 0,
154
+ desc.ctrlKey || false, desc.altKey || false,
155
+ desc.shiftKey || false, desc.metaKey || false,
156
+ desc.button || 0, desc.relatedTarget || null);
157
+
158
+ return event;
159
+ }
160
+ end
161
+ end if supported?
162
+
163
+ alias_native :alt?, :altKey
164
+ alias_native :ctrl?, :ctrlKey
165
+ alias_native :meta?, :metaKey
166
+ alias_native :shift?, :shiftKey
167
+ alias_native :button
167
168
 
168
169
  def client
169
170
  Position.new(`#@native.clientX`, `#@native.clientY`)
@@ -2,7 +2,7 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class PageTransition < Event
4
4
  def self.supported?
5
- not $$[:PageTransitionEvent].nil?
5
+ Browser.supports? 'Event.PageTransition'
6
6
  end
7
7
 
8
8
  class Definition < Definition
@@ -11,9 +11,11 @@ class PageTransition < Event
11
11
  end
12
12
  end
13
13
 
14
- def self.create(name, &block)
15
- new(`new PageTransitionEvent(#{name}, #{Definition.new(&block)})`)
16
- end
14
+ if Browser.supports? 'Event.PageTransition'
15
+ def self.construct(name, desc)
16
+ `new PageTransitionEvent(name, desc)`
17
+ end
18
+ end if supported?
17
19
 
18
20
  alias_native :persisted?, :persisted
19
21
  end
@@ -2,7 +2,7 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class PopState < Event
4
4
  def self.supported?
5
- not $$[:PopStateEvent].nil?
5
+ Browser.supports? 'Event.PopState'
6
6
  end
7
7
 
8
8
  class Definition < Definition
@@ -11,9 +11,21 @@ class PopState < Event
11
11
  end
12
12
  end
13
13
 
14
- def self.create(name, &block)
15
- new(`new PopStateEvent(#{name}, #{Definition.new(&block)})`)
16
- end
14
+ if Browser.supports? 'Event.constructor'
15
+ def self.construct(name, desc)
16
+ `new PopStateEvent(#{name}, #{desc})`
17
+ end
18
+ elsif Browser.supports? 'Event.create'
19
+ def self.construct(name, desc)
20
+ %x{
21
+ var event = document.createEvent('PopStateEvent');
22
+ event.initPopStateEvent(name, desc.bubbles, desc.cancelable,
23
+ desc.state);
24
+
25
+ return event;
26
+ }
27
+ end
28
+ end if supported?
17
29
 
18
30
  alias_native :state
19
31
  end
@@ -2,7 +2,7 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class Progress < Event
4
4
  def self.supported?
5
- not $$[:ProgressEvent].nil?
5
+ Browser.supports? 'Event.Progress'
6
6
  end
7
7
 
8
8
  class Definition < Definition
@@ -19,9 +19,21 @@ class Progress < Event
19
19
  end
20
20
  end
21
21
 
22
- def self.create(name, &block)
23
- new(`new ProgressEvent(#{name}, #{Definition.new(&block)})`)
24
- end
22
+ if Browser.supports? 'Event.constructor'
23
+ def self.construct(name, desc)
24
+ `new ProgressEvent(#{name}, #{desc})`
25
+ end
26
+ elsif Browser.supports? 'Event.create'
27
+ def self.construct(name, desc)
28
+ %x{
29
+ var event = document.createEvent("ProgressEvent");
30
+ event.initProgressEvent(name, desc.bubbles, desc.cancelable,
31
+ desc.computable, desc.loaded, desc.total);
32
+
33
+ return event;
34
+ }
35
+ end
36
+ end if supported?
25
37
 
26
38
  alias_native :computable?, :computableLength
27
39
  alias_native :loaded
@@ -2,12 +2,14 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class Sensor < Event
4
4
  def self.supported?
5
- not $$[:SensorEvent].nil?
5
+ Browser.supports? 'Event.Sensor'
6
6
  end
7
7
 
8
- def self.create(name, &block)
9
- new(`new SensorEvent(#{name}, #{Definition.new(&block)})`)
10
- end
8
+ if Browser.supports? 'Event.constructor'
9
+ def self.construct(name, desc)
10
+ `new SensorEvent(#{name}, #{desc})`
11
+ end
12
+ end if supported?
11
13
  end
12
14
 
13
15
  end; end; end
@@ -2,7 +2,7 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class Storage < Event
4
4
  def self.supported?
5
- not $$[:StorageEvent].nil?
5
+ Browser.supports? 'Event.Storage'
6
6
  end
7
7
 
8
8
  class Definition < Definition
@@ -27,9 +27,11 @@ class Storage < Event
27
27
  end
28
28
  end
29
29
 
30
- def self.create(name, &block)
31
- new(`new StorageEvent(#{name}, #{Definition.new(&block)})`)
32
- end
30
+ if Browser.supports? 'Event.constructor'
31
+ def self.construct(name, desc)
32
+ `new StorageEvent(#{name}, #{desc})`
33
+ end
34
+ end if supported?
33
35
 
34
36
  alias_native :key
35
37
  alias_native :new, :newValue
@@ -2,7 +2,7 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class Touch < Event
4
4
  def self.supported?
5
- not $$[:TouchEvent].nil?
5
+ Browser.supports? 'Event.Touch'
6
6
  end
7
7
 
8
8
  class Definition < Definition
@@ -23,25 +23,16 @@ class Touch < Event
23
23
  end
24
24
  end
25
25
 
26
- def self.create(name, &block)
27
- new(`new TouchEvent(#{name}, #{Definition.new(&block)})`)
28
- end
29
-
30
- def alt?
31
- `#@native.altKey`
32
- end
33
-
34
- def ctrl?
35
- `#@native.ctrlKey`
36
- end
37
-
38
- def meta?
39
- `#@native.metaKey`
40
- end
26
+ if Browser.supports? 'Event.constructor'
27
+ def self.construct(name, desc)
28
+ `new TouchEvent(#{name}, #{desc})`
29
+ end
30
+ end if supported?
41
31
 
42
- def shift?
43
- `#@native.shiftKey`
44
- end
32
+ alias_native :alt?, :altKey
33
+ alias_native :ctrl?, :ctrlKey
34
+ alias_native :meta?, :metaKey
35
+ alias_native :shift?, :shiftKey
45
36
 
46
37
  # TODO: implement touches and targetTouches
47
38
 
@@ -1,6 +1,10 @@
1
1
  module Browser; module DOM; class Event
2
2
 
3
3
  class UI < Event
4
+ def self.supported?
5
+ Browser.supports? 'Event.UI'
6
+ end
7
+
4
8
  class Definition < Definition
5
9
  def detail=(value)
6
10
  `#@native.detail = #{value}`
@@ -11,9 +15,21 @@ class UI < Event
11
15
  end
12
16
  end
13
17
 
14
- def self.create(name, &block)
15
- new(`new UIEvent(#{name}, #{Definition.new(&block)})`)
16
- end
18
+ if Browser.supports? 'Event.constructor'
19
+ def self.construct(name, desc)
20
+ `new UIEvent(#{name}, #{desc})`
21
+ end
22
+ elsif Browser.supports? 'Event.create'
23
+ def self.construct(name, desc)
24
+ %x{
25
+ var event = document.createEvent("UIEvent");
26
+ event.initUIEvent(name, desc.bubbles, desc.cancelable,
27
+ desc.view || window, desc.detail || 0);
28
+
29
+ return event;
30
+ }
31
+ end
32
+ end if supported?
17
33
 
18
34
  alias_native :detail
19
35
  alias_native :view
@@ -29,8 +29,8 @@ class Wheel < UI
29
29
  end
30
30
  end
31
31
 
32
- def self.create(name, &block)
33
- new(`new WheelEvent(#{name}, #{Definition.new(&block)})`)
32
+ def self.construct(name, desc)
33
+ `new WheelEvent(#{name}, #{desc})`
34
34
  end
35
35
 
36
36
  alias_native :x, :deltaX