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
@@ -1,59 +0,0 @@
1
- BROWSER_ENGINE = `/MSIE|WebKit|Presto|Gecko/.exec(navigator.userAgent)[0]`.downcase rescue :unknown
2
-
3
- module Browser
4
-
5
- module Compatibility
6
- def self.sizzle?
7
- defined?(`window.Sizzle`)
8
- end
9
-
10
- # FIXME: v
11
- # def self.respond_to?(parent = `window`, object, method)
12
- # ^
13
- def self.respond_to?(*args)
14
- if args.length == 2
15
- parent = `window`
16
- object, method = args
17
- else
18
- parent, object, method = args
19
- end
20
-
21
- %x{
22
- if (!#{parent}) {
23
- return false;
24
- }
25
-
26
- var klass = #{parent}[#{object}];
27
-
28
- if (!klass) {
29
- return false;
30
- }
31
-
32
- return typeof(klass.prototype[#{method}]) === "function";
33
- }
34
- end
35
-
36
- # FIXME: v
37
- # def self.has?(parent = `window`, name)
38
- # ^
39
- def self.has?(*args)
40
- if args.length == 1
41
- parent = `window`
42
- name, = args
43
- else
44
- parent, name = args
45
- end
46
-
47
- %x{
48
- if (!#{parent}) {
49
- return false;
50
- }
51
-
52
- return #{parent}[#{name}] != null;
53
- }
54
- end
55
- end
56
-
57
- C = Compatibility
58
-
59
- end
@@ -1,93 +0,0 @@
1
- module Browser
2
-
3
- class Compatibility
4
- def self.request_animation?(prefix = nil)
5
- if prefix
6
- has?("#{prefix}RequestAnimationFrame")
7
- else
8
- has?(:requestAnimationFrame)
9
- end
10
- end
11
-
12
- def self.cancel_animation?(prefix = nil)
13
- if prefix
14
- has?("#{prefix}CancelAnimationFrame")
15
- else
16
- has?(:cancelAnimationFrame)
17
- end
18
- end
19
-
20
- def self.cancel_request_animation?(prefix = nil)
21
- if prefix
22
- has?("#{prefix}CancelRequestAnimationFrame")
23
- else
24
- has?(:cancelAnimationFrame)
25
- end
26
- end
27
- end
28
-
29
- class AnimationFrame
30
- if C.request_animation?
31
- def request(block)
32
- `#@native.requestAnimationFrame(#{block.to_n})`
33
- end
34
- elsif C.request_animation? :webkit
35
- def request(block)
36
- `#@native.webkitRequestAnimationFrame(#{block.to_n})`
37
- end
38
- elsif C.request_animation? :moz
39
- def request(block)
40
- `#@native.mozRequestAnimationFrame(#{block.to_n})`
41
- end
42
- elsif C.request_animation? :o
43
- def request(block)
44
- `#@native.oRequestAnimationFrame(#{block.to_n})`
45
- end
46
- elsif C.request_animation? :ms
47
- def request(block)
48
- `#@native.msRequestAnimationFrame(#{block.to_n})`
49
- end
50
- end
51
-
52
- if C.cancel_animation?
53
- def cancel
54
- `#@native.cancelAnimationFrame(#@id)`
55
- end
56
- else
57
- if C.cancel_animation? :webkit
58
- def cancel
59
- `#@native.webkitCancelAnimationFrame(#@id)`
60
- end
61
- elsif C.cancel_request_animation? :webkit
62
- def cancel
63
- `#@native.webkitCancelRequestAnimationFrame(#@id)`
64
- end
65
- elsif C.cancel_animation? :moz
66
- def cancel
67
- `#@native.mozCancelAnimationFrame(#@id)`
68
- end
69
- elsif C.cancel_request_animation? :moz
70
- def cancel
71
- `#@native.mozCancelRequestAnimationFrame(#@id)`
72
- end
73
- elsif C.cancel_animation? :o
74
- def cancel
75
- `#@native.oCancelAnimationFrame(#@id)`
76
- end
77
- elsif C.cancel_request_animation? :o
78
- def cancel
79
- `#@native.oCancelRequestAnimationFrame(#@id)`
80
- end
81
- elsif C.cancel_animation? :ms
82
- def cancel
83
- `#@native.msCancelAnimationFrame(#@id)`
84
- end
85
- elsif C.cancel_request_animation? :ms
86
- def cancel
87
- `#@native.msCancelRequestAnimationFrame(#@id)`
88
- end
89
- end
90
- end
91
- end
92
-
93
- end
@@ -1,15 +0,0 @@
1
- module Browser; module DOM; class Document < Element
2
-
3
- unless C.has? `document`, :defaultView
4
- if C.has? `document`, :parentWindow
5
- def window
6
- `#@native.parentWindow`
7
- end
8
- else
9
- def window
10
- raise NotImplementedError, 'window from document is unsupported'
11
- end
12
- end
13
- end
14
-
15
- end; end; end
@@ -1,15 +0,0 @@
1
- module Browser; module DOM; class Element
2
-
3
- unless C.respond_to?(:Element, :querySelectorAll)
4
- if C.sizzle?
5
- def css(path)
6
- NodeSet.new(document, `Sizzle(#{path}, #@native)`)
7
- end
8
- else
9
- def css(*)
10
- raise NotImplementedError, 'fetching by selector unsupported'
11
- end
12
- end
13
- end
14
-
15
- end; end; end
@@ -1,31 +0,0 @@
1
- module Browser; module DOM; class Element
2
-
3
- unless C.respond_to?(:Element, :matches)
4
- if C.respond_to?(:Element, :oMatchesSelector)
5
- def matches?(selector)
6
- `#@native.oMatchesSelector(#{selector})`
7
- end
8
- elsif C.respond_to?(:Element, :msMatchesSelector)
9
- def matches?(selector)
10
- `#@native.msMatchesSelector(#{selector})`
11
- end
12
- elsif C.respond_to?(:Element, :mozMatchesSelector)
13
- def matches?(selector)
14
- `#@native.mozMatchesSelector(#{selector})`
15
- end
16
- elsif C.respond_to?(:Element, :webkitMatchesSelector)
17
- def matches?(selector)
18
- `#@native.webkitMatchesSelector(#{selector})`
19
- end
20
- elsif C.sizzle?
21
- def matches?(selector)
22
- `Sizzle.matchesSelector(#@native, #{selector})`
23
- end
24
- else
25
- def matches?(*)
26
- raise NotImplementedError, 'matches by selector unsupported'
27
- end
28
- end
29
- end
30
-
31
- end; end; end
@@ -1,20 +0,0 @@
1
- module Browser; module DOM; class Element
2
-
3
- class Offset
4
- unless C.has? `document.body`, :getBoundingClientRect
5
- def position
6
- doc = document
7
- root = doc.root.to_n
8
- win = doc.window.to_n
9
-
10
- %x{
11
- var y = (#{win}.pageYOffset || #{root}.scrollTop) - (#{root}.clientTop || 0),
12
- x = (#{win}.pageXOffset || #{root}.scrollLeft) - (#{root}.clientLeft || 0);
13
- }
14
-
15
- Browser::Position.new(`x`, `y`)
16
- end
17
- end
18
- end
19
-
20
- end; end; end
@@ -1,25 +0,0 @@
1
- module Browser; module DOM; class Element
2
-
3
- unless C.has? `document.body`, :scrollLeft
4
- if C.has? `document.body`, :pageXOffset
5
- def scroll(to = nil)
6
- if to
7
- if x = to[:x]
8
- `#@native.pageXOffset = #{x}`
9
- end
10
-
11
- if y = to[:y]
12
- `#@native.pageYOffset = #{y}`
13
- end
14
- else
15
- Position.new(`#@native.pageXOffset`, `#@native.pageYOffset`)
16
- end
17
- end
18
- else
19
- def scroll(*)
20
- raise NotImplementedError, 'scroll on element not supported'
21
- end
22
- end
23
- end
24
-
25
- end; end; end
@@ -1,15 +0,0 @@
1
- module Browser; module DOM; class Element
2
-
3
- unless C.has? :getComputedStyle
4
- if C.has?(`document.documentElement`, :currentStyle)
5
- def style!
6
- CSS::Declaration.new(`#@native.currentStyle`)
7
- end
8
- else
9
- def style!
10
- raise NotImplementedError, 'computed style unsupported'
11
- end
12
- end
13
- end
14
-
15
- end; end; end
@@ -1,47 +0,0 @@
1
- module Browser; module DOM
2
-
3
- unless defined?(`window.MutationObserver`)
4
- class MutationObserver
5
- class Record
6
- attr_reader :type, :target, :old, :attribute
7
-
8
- def initialize(*)
9
-
10
- end
11
-
12
- def attributes?; type == :attributes; end
13
- def tree?; type == :tree; end
14
- def cdata?; type == :cdata; end
15
- end
16
-
17
- def initialize(&block)
18
- @block = block
19
- @observed = []
20
- end
21
-
22
- def observe(target, options = nil)
23
- unless options
24
- options = {
25
- children: true,
26
- tree: true,
27
- attributes: :old,
28
- cdata: :old
29
- }
30
- end
31
-
32
- self
33
- end
34
-
35
- def take
36
- result, @records = @records, []
37
-
38
- result
39
- end
40
-
41
- def disconnect
42
-
43
- end
44
- end
45
- end
46
-
47
- end; end
@@ -1,15 +0,0 @@
1
- module Browser; module HTTP; class Request
2
-
3
- unless C.has? :XMLHttpRequest
4
- if C.has? :ActiveXObject
5
- def transport
6
- `new ActiveXObject("MSXML2.XMLHTTP.3.0")`
7
- end
8
- else
9
- def transport
10
- raise NotImplementedError, 'XMLHttpRequest is unsupported'
11
- end
12
- end
13
- end
14
-
15
- end; end; end
@@ -1,107 +0,0 @@
1
- module Browser
2
-
3
- module Compatibility
4
- def self.immediate?(prefix = nil)
5
- if prefix
6
- has?("#{prefix}SetImmediate")
7
- else
8
- has?(:setImmediate)
9
- end
10
- end
11
-
12
- def self.post_message?
13
- return false unless has?(:postMessage) && !has?(:importScripts)
14
-
15
- %x{
16
- var ok = true,
17
- old = window.onmessage;
18
-
19
- window.onmessage = function() { ok = false; };
20
- window.postMessage("", "*")
21
- window.onmessage = old;
22
-
23
- return ok;
24
- }
25
- end
26
-
27
- def self.ready_state_change?
28
- `"onreadystatechange" in window.document.createElement("script")`
29
- end
30
- end
31
-
32
- class Immediate
33
- if C.immediate?
34
- def dispatch
35
- @id = `window.setImmediate(function() {
36
- #{@function.call(@arguments, &@block)};
37
- })`
38
- end
39
-
40
- def prevent
41
- `window.clearImmediate(#@id)`
42
- end
43
- elsif C.immediate? :ms
44
- def dispatch
45
- @id = `window.msSetImmediate(function() {
46
- #{@function.call(@arguments, &@block)};
47
- })`
48
- end
49
-
50
- def prevent
51
- `window.msClearImmediate(#@id)`
52
- end
53
- elsif C.post_message?
54
- @@tasks = {}
55
- @@prefix = "opal.browser.immediate.#{rand(1_000_000)}."
56
-
57
- $window.on :message do |e|
58
- if String === e.data && e.data.start_with?(@@prefix)
59
- if task = @@tasks.delete(e.data[@@prefix.length .. -1])
60
- task[0].call(*task[1], &task[2])
61
- end
62
- end
63
- end
64
-
65
- def dispatch
66
- @id = rand(1_000_000).to_s
67
- @@tasks[@id] = [@function, @arguments, @block]
68
-
69
- $window.send! "#{@@prefix}#{@id}"
70
- end
71
-
72
- def prevent
73
- @@tasks.delete(@id)
74
- end
75
- elsif C.ready_state_change?
76
- def dispatch
77
- %x{
78
- var script = document.createElement("script");
79
-
80
- script.onreadystatechange = function() {
81
- if (!#{aborted?}) {
82
- #{@function.call(@arguments, &@block)};
83
- }
84
-
85
- script.onreadystatechange = null;
86
- script.parentNode.removeChild(script);
87
- };
88
-
89
- document.documentElement.appendChild(script);
90
- }
91
- end
92
-
93
- def prevent; end
94
- else
95
- def dispatch
96
- @id = `window.setTimeout(function() {
97
- #{@function.call(*@arguments, &@block)};
98
- }, 0)`
99
- end
100
-
101
- def prevent
102
- `window.clearTimeout(#@id)`
103
- end
104
- end
105
- end
106
-
107
- end