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,12 +2,14 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class BeforeUnload < Event
4
4
  def self.supported?
5
- not $$[:BeforeUnloadEvent].nil?
5
+ Browser.supports? 'Event.BeforeUnload'
6
6
  end
7
7
 
8
- def self.create(name, &block)
9
- new(`new BeforeUnloadEvent(#{name}, #{Definition.new(&block)})`)
10
- end
8
+ if Browser.supports? 'Event.constructor'
9
+ def self.construct(name, desc)
10
+ `new BeforeUnloadEvent(#{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 Clipboard < Event
4
4
  def self.supported?
5
- not $$[:ClipboardEvent].nil?
5
+ Browser.supports? 'Event.Clipboard'
6
6
  end
7
7
 
8
8
  class Definition < Definition
@@ -15,9 +15,11 @@ class Clipboard < Event
15
15
  end
16
16
  end
17
17
 
18
- def self.create(name, &block)
19
- new(`new ClipboardEvent(#{name}, #{Definition.new(&block)})`)
20
- end
18
+ if Browser.supports? 'Event.constructor'
19
+ def self.construct(name, desc)
20
+ `new ClipboardEvent(#{name}, #{desc})`
21
+ end
22
+ end if supported?
21
23
 
22
24
  alias_native :data
23
25
  alias_native :type, :dataType
@@ -2,7 +2,7 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class Close < Event
4
4
  def self.supported?
5
- not $$[:CloseEvent].nil?
5
+ Browser.supports? 'Event.Close'
6
6
  end
7
7
 
8
8
  class Definition < Definition
@@ -23,9 +23,21 @@ class Close < Event
23
23
  end
24
24
  end
25
25
 
26
- def self.create(name, &block)
27
- new(`new CloseEvent(#{name}, #{Definition.new(&block)})`)
28
- end
26
+ if Browser.supports? 'Event.constructor'
27
+ def self.construct(name, desc)
28
+ `new CloseEvent(#{name}, #{desc})`
29
+ end
30
+ elsif Browser.supports? 'Event.create'
31
+ def self.construct(name, desc)
32
+ %x{
33
+ var event = document.createEvent("CloseEvent");
34
+ event.initCloseEvent(name, desc.bubbles, desc.cancelable,
35
+ desc.wasClean, desc.code, desc.reason);
36
+
37
+ return event;
38
+ }
39
+ end
40
+ end if supported?
29
41
 
30
42
  alias_native :code
31
43
  alias_native :reason
@@ -2,7 +2,7 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class Composition < UI
4
4
  def self.supported?
5
- not $$[:CompositionEvent].nil?
5
+ Browser.supports? 'Event.Composition'
6
6
  end
7
7
 
8
8
  class Definition < UI::Definition
@@ -15,9 +15,21 @@ class Composition < UI
15
15
  end
16
16
  end
17
17
 
18
- def self.create(name, &block)
19
- new(`new CompositionEvent(#{name}, #{Definition.new(&block)})`)
20
- end
18
+ if Browser.supports? 'Event.constructor'
19
+ def self.construct(name, desc)
20
+ `new CompositionEvent(#{name}, #{desc})`
21
+ end
22
+ elsif Browser.supports? 'Event.create'
23
+ def self.construct(name, desc)
24
+ %x{
25
+ var event = document.createEvent("CompositionEvent");
26
+ event.initCompositionEvent(name, desc.bubbles, desc.cancelable,
27
+ desc.view || window, desc.data, desc.locale);
28
+
29
+ return event;
30
+ }
31
+ end
32
+ end if supported?
21
33
 
22
34
  alias_native :data
23
35
  alias_native :locale
@@ -4,20 +4,55 @@ module Browser; module DOM; class Event
4
4
 
5
5
  class Custom < Event
6
6
  def self.supported?
7
- not $$[:CustomEvent].nil?
7
+ Browser.supports? 'Event.Custom'
8
8
  end
9
9
 
10
- def self.create(name, &block)
11
- data = OpenStruct.new
12
- block.call(data) if block
10
+ class Definition < Definition
11
+ def method_missing(name, value)
12
+ if name.end_with? ?=
13
+ `#@native[#{name[0 .. -2]}] = value`
14
+ end
15
+ end
16
+ end
17
+
18
+ if Browser.supports? 'Event.constructor'
19
+ def self.construct(name, desc)
20
+ `new CustomEvent(name, {
21
+ bubbles: desc.bubbles,
22
+ cancelable: desc.cancelable,
23
+ detail: desc })`
24
+ end
25
+ elsif Browser.supports? 'Event.create'
26
+ def self.construct(name, desc)
27
+ %x{
28
+ var event = document.createEvent("CustomEvent");
29
+ event.initCustomEvent(name, desc.bubbles, desc.cancelable, desc);
13
30
 
14
- new(`new CustomEvent(#{name}, { detail: #{data.to_n} })`)
31
+ return event;
32
+ }
33
+ end
34
+ elsif Browser.supports? 'Event.createObject'
35
+ def self.construct(name, desc)
36
+ Native(`document.createEventObject()`).merge!(`{
37
+ type: name,
38
+ bubbles: desc.bubbles,
39
+ cancelable: desc.cancelable,
40
+ detail: desc }`).to_n
41
+ end
42
+ else
43
+ def self.construct(name, desc)
44
+ Native(desc).merge!(`{
45
+ type: name,
46
+ bubbles: desc.bubbles,
47
+ cancelable: desc.cancelable,
48
+ detail: desc }`).to_n
49
+ end
15
50
  end
16
51
 
17
- def initialize(native)
18
- super(native); @native = native # TODO: remove this when super is fixed
52
+ def initialize(event, callback = nil)
53
+ super(event, callback)
19
54
 
20
- @detail = Hash.new(`#{native}.detail`)
55
+ @detail = Hash.new(`#{event}.detail`)
21
56
  end
22
57
 
23
58
  def method_missing(id, *)
@@ -2,7 +2,7 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class DeviceLight < Event
4
4
  def self.supported?
5
- not $$[:DeviceLightEvent].nil?
5
+ Browser.supports? 'Event.DeviceLight'
6
6
  end
7
7
 
8
8
  class Definition < Definition
@@ -11,9 +11,11 @@ class DeviceLight < Event
11
11
  end
12
12
  end
13
13
 
14
- def self.create(name, &block)
15
- new(`new DeviceLightEvent(#{name}, #{Definition.new(&block)})`)
16
- end
14
+ if Browser.supports? 'Event.constructor'
15
+ def self.construct(name, desc)
16
+ `new DeviceLightEvent(#{name}, #{desc})`
17
+ end
18
+ end if supported?
17
19
 
18
20
  alias_native :value
19
21
  end
@@ -2,7 +2,7 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class DeviceMotion < Event
4
4
  def self.supported?
5
- not $$[:DeviceMotionEvent].nil?
5
+ Browser.supports? 'Event.DeviceMotion'
6
6
  end
7
7
 
8
8
  Acceleration = Struct.new(:x, :y, :z)
@@ -25,9 +25,22 @@ class DeviceMotion < Event
25
25
  end
26
26
  end
27
27
 
28
- def self.create(name, &block)
29
- new(`new DeviceMotionEvent(#{name}, #{Definition.new(&block)})`)
30
- end
28
+ if Browser.supports? 'Event.constructor'
29
+ def self.construct(name, desc)
30
+ `new DeviceMotionEvent(#{name}, #{desc})`
31
+ end
32
+ elsif Browser.supports? 'Event.create'
33
+ def self.construct(name, desc)
34
+ %x{
35
+ var event = document.createEvent("DeviceMotionEvent");
36
+ event.initDeviceMotionEvent(name, desc.bubbles, desc.cancelable,
37
+ desc.acceleration, desc.accelerationIncludingGravity,
38
+ desc.rotationRate, desc.interval);
39
+
40
+ return event;
41
+ }
42
+ end
43
+ end if supported?
31
44
 
32
45
  alias_native :acceleration
33
46
  alias_native :acceleration_with_gravity, :accelerationIncludingGravity
@@ -2,7 +2,7 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class DeviceOrientation < Event
4
4
  def self.supported?
5
- not $$[:DeviceOrientationEvent].nil?
5
+ Browser.supports? 'Event.DeviceOrientation'
6
6
  end
7
7
 
8
8
  class Definition < Definition
@@ -23,9 +23,21 @@ class DeviceOrientation < Event
23
23
  end
24
24
  end
25
25
 
26
- def self.create(name, &block)
27
- new(`new DeviceOrientationEvent(#{name}, #{Definition.new(&block)})`)
28
- end
26
+ if Browser.supports? 'Event.constructor'
27
+ def self.construct(name, desc)
28
+ `new DeviceOrientationEvent(#{name}, #{desc})`
29
+ end
30
+ elsif Browser.supports? 'Event.create'
31
+ def self.construct(name, desc)
32
+ %x{
33
+ var event = document.createEvent("DeviceOrientationEvent");
34
+ event.initDeviceOrientationEvent(name, desc.bubbles, desc.cancelable,
35
+ desc.alpha, desc.beta, desc.gamma, desc.absolute);
36
+
37
+ return event;
38
+ }
39
+ end
40
+ end if supported?
29
41
 
30
42
  alias_native :absolute
31
43
  alias_native :alpha
@@ -2,7 +2,7 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class DeviceProximity < Event
4
4
  def self.supported?
5
- not $$[:DeviceProximityEvent].nil?
5
+ Browser.supports? 'Event.DeviceProximity'
6
6
  end
7
7
 
8
8
  class Definition < Definition
@@ -19,9 +19,11 @@ class DeviceProximity < Event
19
19
  end
20
20
  end
21
21
 
22
- def self.create(name, &block)
23
- new(`new DeviceProximityEvent(#{name}, #{Definition.new(&block)})`)
24
- end
22
+ if Browser.supports? 'Event.constructor'
23
+ def self.construct(name, desc)
24
+ `new DeviceProximityEvent(#{name}, #{desc})`
25
+ end
26
+ end if supported?
25
27
 
26
28
  alias_native :value
27
29
  alias_native :min
@@ -3,7 +3,7 @@ module Browser; module DOM; class Event
3
3
  # TODO: handle transfers
4
4
  class Drag < Event
5
5
  def self.supported?
6
- not $$[:DragEvent].nil?
6
+ Browser.supports? 'Event.Drag'
7
7
  end
8
8
 
9
9
  class Definition < Definition
@@ -56,38 +56,39 @@ class Drag < Event
56
56
  end
57
57
 
58
58
  def related=(elem)
59
- `#@native.relatedTarget = #{Native.try_convert(elem)}`
59
+ `#@native.relatedTarget = #{Native.convert(elem)}`
60
60
  end
61
61
 
62
-
63
-
64
- end
65
-
66
- def self.create(name, &block)
67
- new(`new DragEvent(#{name}, #{Definition.new(&block)})`)
68
- end
69
-
70
- Position = Struct.new(:x, :y)
71
-
72
- def alt?
73
- `#@native.altKey`
74
- end
75
-
76
- def ctrl?
77
- `#@native.ctrlKey`
78
- end
79
-
80
- def meta?
81
- `#@native.metaKey`
62
+ def transfer=(value)
63
+ `#@native.dataTransfer = #{Native.convert(elem)}`
64
+ end
82
65
  end
83
66
 
84
- def shift?
85
- `#@native.shiftKey`
86
- end
67
+ if Browser.supports? 'Event.constructor'
68
+ def self.construct(name, desc)
69
+ `new DragEvent(#{name}, #{desc})`
70
+ end
71
+ elsif Browser.supports? 'Event.create'
72
+ def self.construct(name, desc)
73
+ %x{
74
+ var event = document.createEvent("DragEvent");
75
+ event.initDragEvent(name, desc.bubbles, desc.cancelable,
76
+ desc.view || window, 0,
77
+ desc.screenX || 0, desc.screenY || 0,
78
+ desc.clientX || 0, desc.clientY || 0,
79
+ desc.ctrlKey, desc.altKey, desc.shiftKey, desc.metaKey,
80
+ desc.button || 0, desc.relatedTarget, desc.dataTransfer);
81
+
82
+ return event;
83
+ }
84
+ end
85
+ end if supported?
87
86
 
88
- def button
89
- `#@native.button`
90
- end
87
+ alias_native :alt?, :altKey
88
+ alias_native :ctrl?, :ctrlKey
89
+ alias_native :meta?, :metaKey
90
+ alias_native :shift?, :shiftKey
91
+ alias_native :button
91
92
 
92
93
  def client
93
94
  Position.new(`#@native.clientX`, `#@native.clientY`)
@@ -108,6 +109,11 @@ class Drag < Event
108
109
  def related
109
110
  DOM(`#@native.relatedTarget`)
110
111
  end
112
+
113
+ # @see https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer
114
+ def transfer
115
+ raise NotImplementedError
116
+ end
111
117
  end
112
118
 
113
119
  end; end; end
@@ -2,18 +2,34 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class Focus < UI
4
4
  def self.supported?
5
- not $$[:FocusEvent].nil?
5
+ Browser.supports? 'Event.Focus'
6
6
  end
7
7
 
8
8
  class Definition < UI::Definition
9
+ def view=(value)
10
+ `#@native.view = #{Native.convert(value)}`
11
+ end
12
+
9
13
  def related=(elem)
10
- `#@native.relatedTarget = #{Native.try_convert(elem)}`
14
+ `#@native.relatedTarget = #{Native.convert(elem)}`
11
15
  end
12
16
  end
13
17
 
14
- def self.create(name, &block)
15
- new(`new FocusEvent(#{name}, #{Definition.new(&block)})`)
16
- end
18
+ if Browser.supports? 'Event.constructor'
19
+ def self.construct(name, desc)
20
+ `new FocusEvent(#{name}, #{desc})`
21
+ end
22
+ elsif Browser.supports? 'Event.create'
23
+ def self.construct(name, desc)
24
+ %x{
25
+ var event = document.createEvent("FocusEvent");
26
+ event.initFocusEvent(name, desc.bubbles, desc.cancelable,
27
+ desc.view || window, 0, desc.relatedTarget);
28
+
29
+ return event;
30
+ }
31
+ end
32
+ end if supported?
17
33
 
18
34
  def related
19
35
  DOM(`#@native.relatedTarget`)
@@ -2,46 +2,59 @@ module Browser; module DOM; class Event
2
2
 
3
3
  class Gamepad < Event
4
4
  def self.supported?
5
- not $$[:GamepadEvent].nil?
5
+ Browser.supports? 'Event.Gamepad'
6
6
  end
7
7
 
8
8
  class Definition < Definition
9
- def initialize(*)
10
- super
11
-
12
- `#@native.gamepad = {}`
13
- end
14
-
15
9
  def id=(value)
16
- `#@native.gamepad.id = #{value}`
10
+ `#@native.id = #{value}`
17
11
  end
18
12
 
19
13
  def index=(value)
20
- `#@native.gamepad.index = #{value}`
14
+ `#@native.index = #{value}`
21
15
  end
22
16
 
23
- def timestamp=(value)
24
- `#@native.gamepad.timestamp = #{value}`
17
+ def at=(value)
18
+ `#@native.timestamp = #{value}`
25
19
  end
26
20
 
27
21
  def axes=(value)
28
- `#@native.gamepad.axes = #{value}`
22
+ `#@native.axes = #{value}`
29
23
  end
30
24
 
31
25
  def buttons=(value)
32
- `#@native.gamepad.buttons = #{value}`
26
+ `#@native.buttons = #{value}`
33
27
  end
34
28
  end
35
29
 
36
- def self.create(name, &block)
37
- new(`new GamepadEvent(#{name}, #{Definition.new(&block)})`)
30
+ if Browser.supports? 'Event.constructor'
31
+ def self.construct(name, desc)
32
+ `new GamepadEvent(#{name}, {
33
+ bubbles: desc.bubbles,
34
+ cancelable: desc.cancelable,
35
+ gamepad: desc })`
36
+ end
37
+ end if supported?
38
+
39
+ def id
40
+ `#@native.gamepad.id`
38
41
  end
39
42
 
40
- %w(id index timestamp axes buttons).each {|name|
41
- define_method name do
42
- `#@native.gamepad[#{name}]`
43
- end
44
- }
43
+ def index
44
+ `#@native.gamepad.index`
45
+ end
46
+
47
+ def at
48
+ `#@native.gamepad.timestamp`
49
+ end
50
+
51
+ def axes
52
+ `#@native.gamepad.axes`
53
+ end
54
+
55
+ def buttons
56
+ `#@native.gamepad.buttons`
57
+ end
45
58
  end
46
59
 
47
60
  end; end; end