opal-browser 0.1.0.beta1 → 0.2.0.beta1

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