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