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.
- checksums.yaml +4 -4
- data/.travis.yml +60 -0
- data/.yardopts +1 -1
- data/Gemfile +7 -2
- data/LICENSE +19 -0
- data/README.md +74 -10
- data/config.ru +2 -1
- data/index.html.erb +22 -0
- data/opal-browser.gemspec +9 -11
- data/opal/browser.rb +1 -1
- data/opal/browser/animation_frame.rb +66 -9
- data/opal/browser/canvas.rb +72 -18
- data/opal/browser/canvas/data.rb +1 -1
- data/opal/browser/console.rb +3 -37
- data/opal/browser/cookies.rb +80 -24
- data/opal/browser/css/declaration.rb +0 -5
- data/opal/browser/{timeout.rb → delay.rb} +13 -13
- data/opal/browser/dom.rb +0 -2
- data/opal/browser/dom/attribute.rb +6 -0
- data/opal/browser/dom/builder.rb +4 -8
- data/opal/browser/dom/character_data.rb +43 -7
- data/opal/browser/dom/document.rb +13 -11
- data/opal/browser/dom/element.rb +127 -29
- data/opal/browser/dom/element/image.rb +23 -0
- data/opal/browser/dom/element/offset.rb +27 -10
- data/opal/browser/dom/element/scroll.rb +32 -12
- data/opal/browser/dom/element/size.rb +29 -0
- data/opal/browser/dom/event.rb +88 -75
- data/opal/browser/dom/event/animation.rb +16 -4
- data/opal/browser/dom/event/audio_processing.rb +6 -4
- data/opal/browser/dom/event/base.rb +229 -64
- data/opal/browser/dom/event/before_unload.rb +6 -4
- data/opal/browser/dom/event/clipboard.rb +6 -4
- data/opal/browser/dom/event/close.rb +16 -4
- data/opal/browser/dom/event/composition.rb +16 -4
- data/opal/browser/dom/event/custom.rb +43 -8
- data/opal/browser/dom/event/device_light.rb +6 -4
- data/opal/browser/dom/event/device_motion.rb +17 -4
- data/opal/browser/dom/event/device_orientation.rb +16 -4
- data/opal/browser/dom/event/device_proximity.rb +6 -4
- data/opal/browser/dom/event/drag.rb +34 -28
- data/opal/browser/dom/event/focus.rb +21 -5
- data/opal/browser/dom/event/gamepad.rb +33 -20
- data/opal/browser/dom/event/hash_change.rb +6 -4
- data/opal/browser/dom/event/keyboard.rb +45 -23
- data/opal/browser/dom/event/message.rb +28 -8
- data/opal/browser/dom/event/mouse.rb +26 -25
- data/opal/browser/dom/event/page_transition.rb +6 -4
- data/opal/browser/dom/event/pop_state.rb +16 -4
- data/opal/browser/dom/event/progress.rb +16 -4
- data/opal/browser/dom/event/sensor.rb +6 -4
- data/opal/browser/dom/event/storage.rb +6 -4
- data/opal/browser/dom/event/touch.rb +10 -19
- data/opal/browser/dom/event/ui.rb +19 -3
- data/opal/browser/dom/event/wheel.rb +2 -2
- data/opal/browser/dom/mutation_observer.rb +65 -5
- data/opal/browser/dom/node.rb +164 -59
- data/opal/browser/dom/node_set.rb +4 -0
- data/opal/browser/dom/text.rb +16 -1
- data/opal/browser/event_source.rb +5 -2
- data/opal/browser/history.rb +51 -15
- data/opal/browser/http.rb +22 -7
- data/opal/browser/http/headers.rb +5 -0
- data/opal/browser/http/request.rb +40 -10
- data/opal/browser/immediate.rb +123 -9
- data/opal/browser/interval.rb +8 -13
- data/opal/browser/location.rb +13 -3
- data/opal/browser/navigator.rb +9 -6
- data/opal/browser/screen.rb +31 -5
- data/opal/browser/socket.rb +8 -4
- data/opal/browser/storage.rb +118 -33
- data/opal/browser/support.rb +232 -0
- data/opal/browser/utils.rb +24 -6
- data/opal/browser/version.rb +1 -1
- data/opal/browser/window.rb +1 -2
- data/opal/browser/window/scroll.rb +21 -11
- data/opal/browser/window/size.rb +16 -6
- data/opal/browser/window/view.rb +23 -5
- data/spec/dom/builder_spec.rb +19 -19
- data/spec/dom/document_spec.rb +6 -6
- data/spec/dom/element_spec.rb +5 -5
- data/spec/dom/event_spec.rb +20 -20
- data/spec/dom/mutation_observer_spec.rb +5 -5
- data/spec/dom/node_spec.rb +39 -27
- data/spec/dom_spec.rb +10 -8
- data/spec/event_source_spec.rb +12 -12
- data/spec/history_spec.rb +24 -15
- data/spec/http_spec.rb +18 -17
- data/spec/immediate_spec.rb +9 -7
- data/spec/runner.rb +114 -0
- data/spec/socket_spec.rb +8 -8
- data/spec/spec_helper.rb +1 -0
- data/spec/storage_spec.rb +6 -6
- data/spec/wgxpath.install.js +49 -0
- data/spec/window_spec.rb +2 -2
- metadata +21 -54
- data/opal/browser/compatibility.rb +0 -59
- data/opal/browser/compatibility/animation_frame.rb +0 -93
- data/opal/browser/compatibility/dom/document/window.rb +0 -15
- data/opal/browser/compatibility/dom/element/css.rb +0 -15
- data/opal/browser/compatibility/dom/element/matches.rb +0 -31
- data/opal/browser/compatibility/dom/element/offset.rb +0 -20
- data/opal/browser/compatibility/dom/element/scroll.rb +0 -25
- data/opal/browser/compatibility/dom/element/style.rb +0 -15
- data/opal/browser/compatibility/dom/mutation_observer.rb +0 -47
- data/opal/browser/compatibility/http/request.rb +0 -15
- data/opal/browser/compatibility/immediate.rb +0 -107
- data/opal/browser/compatibility/window/scroll.rb +0 -27
- data/opal/browser/compatibility/window/size.rb +0 -13
- data/opal/browser/compatibility/window/view.rb +0 -13
- data/opal/browser/dom/compatibility.rb +0 -8
- data/opal/browser/http/compatibility.rb +0 -1
- 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
|