opal-browser 0.1.0.beta1 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/build.yml +95 -0
- data/.gitignore +3 -0
- data/.yardopts +1 -1
- data/Gemfile +22 -3
- data/LICENSE +20 -0
- data/README.md +200 -20
- data/Rakefile +29 -1
- data/config.ru +20 -2
- data/docs/polyfills.md +24 -0
- data/examples/2048/Gemfile +6 -0
- data/examples/2048/README.md +13 -0
- data/examples/2048/app/application.rb +169 -0
- data/examples/2048/config.ru +9 -0
- data/examples/canvas/Gemfile +6 -0
- data/examples/canvas/README.md +9 -0
- data/examples/canvas/app/application.rb +55 -0
- data/examples/canvas/config.ru +9 -0
- data/examples/component/Gemfile +6 -0
- data/examples/component/README.md +10 -0
- data/examples/component/app/application.rb +66 -0
- data/examples/component/config.ru +9 -0
- data/examples/integrations/README.md +24 -0
- data/examples/integrations/dynamic-rack-opal-sprockets-server/Gemfile +6 -0
- data/examples/integrations/dynamic-rack-opal-sprockets-server/README.md +16 -0
- data/examples/integrations/dynamic-rack-opal-sprockets-server/app/application.rb +6 -0
- data/examples/integrations/dynamic-rack-opal-sprockets-server/config.ru +9 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/.gitignore +1 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/Gemfile +7 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/README.md +22 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/Rakefile +4 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/app/application.rb +6 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/app.rb +32 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/config.ru +3 -0
- data/examples/integrations/dynamic-roda-tilt/.gitignore +1 -0
- data/examples/integrations/dynamic-roda-tilt/Gemfile +8 -0
- data/examples/integrations/dynamic-roda-tilt/README.md +17 -0
- data/examples/integrations/dynamic-roda-tilt/Rakefile +6 -0
- data/examples/integrations/dynamic-roda-tilt/app/application.rb +6 -0
- data/examples/integrations/dynamic-roda-tilt/app.rb +50 -0
- data/examples/integrations/dynamic-roda-tilt/config.ru +3 -0
- data/examples/integrations/dynamic-sinatra-opal-sprockets-server/Gemfile +7 -0
- data/examples/integrations/dynamic-sinatra-opal-sprockets-server/README.md +16 -0
- data/examples/integrations/dynamic-sinatra-opal-sprockets-server/app/application.rb +6 -0
- data/examples/integrations/dynamic-sinatra-opal-sprockets-server/config.ru +29 -0
- data/examples/integrations/static-bash/.gitignore +2 -0
- data/examples/integrations/static-bash/Gemfile +3 -0
- data/examples/integrations/static-bash/README.md +8 -0
- data/examples/integrations/static-bash/app/application.rb +6 -0
- data/examples/integrations/static-bash/build.sh +4 -0
- data/examples/integrations/static-bash/index.html +10 -0
- data/examples/integrations/static-bash-opal-parser/.gitignore +3 -0
- data/examples/integrations/static-bash-opal-parser/Gemfile +3 -0
- data/examples/integrations/static-bash-opal-parser/README.md +10 -0
- data/examples/integrations/static-bash-opal-parser/build.sh +4 -0
- data/examples/integrations/static-bash-opal-parser/index.html +19 -0
- data/examples/integrations/static-rake/.gitignore +1 -0
- data/examples/integrations/static-rake/Gemfile +4 -0
- data/examples/integrations/static-rake/README.md +7 -0
- data/examples/integrations/static-rake/Rakefile +10 -0
- data/examples/integrations/static-rake/app/application.rb +6 -0
- data/examples/integrations/static-rake/index.html +9 -0
- data/examples/integrations/static-rake-guard/.gitignore +1 -0
- data/examples/integrations/static-rake-guard/Gemfile +6 -0
- data/examples/integrations/static-rake-guard/Guardfile +3 -0
- data/examples/integrations/static-rake-guard/README.md +10 -0
- data/examples/integrations/static-rake-guard/Rakefile +10 -0
- data/examples/integrations/static-rake-guard/app/application.rb +6 -0
- data/examples/integrations/static-rake-guard/index.html +9 -0
- data/examples/svg/.gitignore +1 -0
- data/examples/svg/Gemfile +4 -0
- data/examples/svg/README.md +7 -0
- data/examples/svg/Rakefile +10 -0
- data/examples/svg/app/application.rb +11 -0
- data/examples/svg/index.html +17 -0
- data/examples/svg/index.svg +6 -0
- data/index.html.erb +24 -0
- data/lib/opal-browser.rb +1 -0
- data/opal/browser/animation_frame.rb +92 -10
- data/opal/browser/audio/node.rb +121 -0
- data/opal/browser/audio/param_schedule.rb +43 -0
- data/opal/browser/audio.rb +66 -0
- data/opal/browser/blob.rb +94 -0
- data/opal/browser/canvas/data.rb +2 -12
- data/opal/browser/canvas/gradient.rb +1 -11
- data/opal/browser/canvas/style.rb +3 -11
- data/opal/browser/canvas/text.rb +1 -11
- data/opal/browser/canvas.rb +86 -28
- data/opal/browser/console.rb +6 -38
- data/opal/browser/cookies.rb +90 -27
- data/opal/browser/crypto.rb +79 -0
- data/opal/browser/css/declaration.rb +1 -6
- data/opal/browser/css/rule.rb +1 -1
- data/opal/browser/css/style_sheet.rb +2 -2
- data/opal/browser/css.rb +23 -7
- data/opal/browser/database/sql.rb +193 -0
- data/opal/browser/delay.rb +94 -0
- data/opal/browser/dom/attribute.rb +16 -9
- data/opal/browser/dom/builder.rb +35 -25
- data/opal/browser/dom/character_data.rb +43 -7
- data/opal/browser/dom/document.rb +171 -37
- data/opal/browser/dom/document_fragment.rb +18 -0
- data/opal/browser/dom/document_or_shadow_root.rb +19 -0
- data/opal/browser/dom/element/attributes.rb +111 -0
- data/opal/browser/dom/element/button.rb +31 -0
- data/opal/browser/dom/element/custom.rb +177 -0
- data/opal/browser/dom/element/data.rb +82 -0
- data/opal/browser/dom/element/editable.rb +47 -0
- data/opal/browser/dom/element/form.rb +38 -0
- data/opal/browser/dom/element/iframe.rb +37 -0
- data/opal/browser/dom/element/image.rb +25 -0
- data/opal/browser/dom/element/input.rb +48 -1
- data/opal/browser/dom/element/media.rb +17 -0
- data/opal/browser/dom/element/offset.rb +32 -10
- data/opal/browser/dom/element/position.rb +11 -2
- data/opal/browser/dom/element/scroll.rb +139 -20
- data/opal/browser/dom/element/select.rb +42 -0
- data/opal/browser/dom/element/size.rb +46 -0
- data/opal/browser/dom/element/template.rb +11 -0
- data/opal/browser/dom/element/textarea.rb +26 -0
- data/opal/browser/dom/element.rb +496 -168
- data/opal/browser/dom/mutation_observer.rb +69 -9
- data/opal/browser/dom/node.rb +270 -83
- data/opal/browser/dom/node_set.rb +74 -41
- data/opal/browser/dom/shadow_root.rb +12 -0
- data/opal/browser/dom/text.rb +18 -3
- data/opal/browser/dom.rb +40 -18
- data/opal/browser/effects.rb +180 -3
- data/opal/browser/event/all.rb +26 -0
- data/opal/browser/event/animation.rb +40 -0
- data/opal/browser/{dom/event → event}/audio_processing.rb +10 -6
- data/opal/browser/event/base.rb +461 -0
- data/opal/browser/event/before_unload.rb +17 -0
- data/opal/browser/event/clipboard.rb +37 -0
- data/opal/browser/event/close.rb +49 -0
- data/opal/browser/event/composition.rb +52 -0
- data/opal/browser/event/custom.rb +65 -0
- data/opal/browser/event/data_transfer.rb +95 -0
- data/opal/browser/event/device_light.rb +25 -0
- data/opal/browser/{dom/event → event}/device_motion.rb +21 -6
- data/opal/browser/event/device_orientation.rb +50 -0
- data/opal/browser/{dom/event → event}/device_proximity.rb +10 -6
- data/opal/browser/event/drag.rb +123 -0
- data/opal/browser/event/focus.rb +41 -0
- data/opal/browser/event/gamepad.rb +62 -0
- data/opal/browser/{dom/event → event}/hash_change.rb +10 -6
- data/opal/browser/event/keyboard.rb +128 -0
- data/opal/browser/event/message.rb +72 -0
- data/opal/browser/{dom/event → event}/mouse.rb +37 -32
- data/opal/browser/event/page_transition.rb +25 -0
- data/opal/browser/event/pop_state.rb +35 -0
- data/opal/browser/event/progress.rb +45 -0
- data/opal/browser/event/sensor.rb +17 -0
- data/opal/browser/{dom/event → event}/storage.rb +10 -6
- data/opal/browser/{dom/event → event}/touch.rb +14 -21
- data/opal/browser/event/ui.rb +38 -0
- data/opal/browser/{dom/event → event}/wheel.rb +6 -4
- data/opal/browser/event.rb +163 -0
- data/opal/browser/event_source.rb +7 -4
- data/opal/browser/form_data.rb +225 -0
- data/opal/browser/history.rb +53 -21
- data/opal/browser/http/binary.rb +1 -0
- data/opal/browser/http/headers.rb +21 -2
- data/opal/browser/http/request.rb +83 -55
- data/opal/browser/http/response.rb +5 -1
- data/opal/browser/http.rb +47 -9
- data/opal/browser/immediate.rb +128 -10
- data/opal/browser/interval.rb +41 -23
- data/opal/browser/location.rb +20 -4
- data/opal/browser/navigator.rb +136 -13
- data/opal/browser/polyfill/visual_viewport.rb +216 -0
- data/opal/browser/screen.rb +34 -8
- data/opal/browser/setup/base.rb +6 -0
- data/opal/browser/setup/full.rb +13 -0
- data/opal/browser/setup/large.rb +17 -0
- data/opal/browser/setup/mini.rb +8 -0
- data/opal/browser/setup/traditional.rb +10 -0
- data/opal/browser/socket.rb +16 -8
- data/opal/browser/storage.rb +155 -52
- data/opal/browser/support.rb +299 -0
- data/opal/browser/utils.rb +116 -18
- data/opal/browser/version.rb +1 -1
- data/opal/browser/visual_viewport.rb +39 -0
- data/opal/browser/window/size.rb +47 -9
- data/opal/browser/window/view.rb +37 -4
- data/opal/browser/window.rb +46 -26
- data/opal/browser.rb +1 -10
- data/opal/opal-browser.rb +1 -0
- data/opal-browser.gemspec +10 -12
- data/spec/database/sql_spec.rb +139 -0
- data/spec/delay_spec.rb +41 -0
- data/spec/dom/attribute_spec.rb +49 -0
- data/spec/dom/builder_spec.rb +36 -19
- data/spec/dom/document_spec.rb +28 -6
- data/spec/dom/element/attributes_spec.rb +52 -0
- data/spec/dom/element/custom_spec.rb +106 -0
- data/spec/dom/element/subclass_spec.rb +144 -0
- data/spec/dom/element_spec.rb +184 -7
- data/spec/dom/mutation_observer_spec.rb +13 -9
- data/spec/dom/node_set_spec.rb +44 -0
- data/spec/dom/node_spec.rb +87 -27
- data/spec/dom_spec.rb +19 -9
- data/spec/event_source_spec.rb +18 -15
- data/spec/{dom/event_spec.rb → event_spec.rb} +55 -26
- data/spec/history_spec.rb +32 -19
- data/spec/http_spec.rb +25 -36
- data/spec/immediate_spec.rb +10 -7
- data/spec/interval_spec.rb +59 -0
- data/spec/native_cached_wrapper_spec.rb +46 -0
- data/spec/runner.rb +107 -0
- data/spec/socket_spec.rb +18 -14
- data/spec/spec_helper.rb +2 -4
- data/spec/spec_helper_promise.rb.erb +25 -0
- data/spec/storage_spec.rb +7 -7
- data/spec/wgxpath.install.js +49 -0
- data/spec/window_spec.rb +2 -2
- metadata +181 -93
- 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/compatibility.rb +0 -59
- data/opal/browser/dom/compatibility.rb +0 -8
- data/opal/browser/dom/event/animation.rb +0 -26
- data/opal/browser/dom/event/base.rb +0 -207
- data/opal/browser/dom/event/before_unload.rb +0 -13
- data/opal/browser/dom/event/clipboard.rb +0 -26
- data/opal/browser/dom/event/close.rb +0 -35
- data/opal/browser/dom/event/composition.rb +0 -38
- data/opal/browser/dom/event/custom.rb +0 -30
- data/opal/browser/dom/event/device_light.rb +0 -21
- data/opal/browser/dom/event/device_orientation.rb +0 -36
- data/opal/browser/dom/event/drag.rb +0 -113
- data/opal/browser/dom/event/focus.rb +0 -23
- data/opal/browser/dom/event/gamepad.rb +0 -47
- data/opal/browser/dom/event/keyboard.rb +0 -93
- data/opal/browser/dom/event/message.rb +0 -50
- data/opal/browser/dom/event/page_transition.rb +0 -21
- data/opal/browser/dom/event/pop_state.rb +0 -21
- data/opal/browser/dom/event/progress.rb +0 -31
- data/opal/browser/dom/event/sensor.rb +0 -13
- data/opal/browser/dom/event/ui.rb +0 -22
- data/opal/browser/dom/event.rb +0 -240
- data/opal/browser/http/compatibility.rb +0 -1
- data/opal/browser/http/parameters.rb +0 -8
- data/opal/browser/timeout.rb +0 -60
- data/opal/browser/window/compatibility.rb +0 -3
- data/opal/browser/window/scroll.rb +0 -49
@@ -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
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module Browser; class Window; class Scroll
|
2
|
-
|
3
|
-
unless C.has? `document.documentElement`, :scrollLeft
|
4
|
-
if C.has? :pageXOffset
|
5
|
-
def position
|
6
|
-
Position.new(x, y)
|
7
|
-
end
|
8
|
-
|
9
|
-
def x
|
10
|
-
`#@native.pageXOffset`
|
11
|
-
end
|
12
|
-
|
13
|
-
def y
|
14
|
-
`#@native.pageYOffset`
|
15
|
-
end
|
16
|
-
else
|
17
|
-
def x
|
18
|
-
raise NotImplementedError, 'window scroll unsupported'
|
19
|
-
end
|
20
|
-
|
21
|
-
def y
|
22
|
-
raise NotImplementedError, 'window scroll unsupported'
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
end; end; end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module Browser; class Window; class Size
|
2
|
-
|
3
|
-
unless C.has? :outerHeight
|
4
|
-
def width
|
5
|
-
raise NotImplementedError, 'window outer size not supported'
|
6
|
-
end
|
7
|
-
|
8
|
-
def height
|
9
|
-
raise NotImplementedError, 'window outer size not supported'
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
end; end; end
|
@@ -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,8 +0,0 @@
|
|
1
|
-
require 'browser/compatibility/dom/document/window'
|
2
|
-
|
3
|
-
require 'browser/compatibility/dom/mutation_observer'
|
4
|
-
|
5
|
-
require 'browser/compatibility/dom/element/matches'
|
6
|
-
require 'browser/compatibility/dom/element/css'
|
7
|
-
require 'browser/compatibility/dom/element/offset'
|
8
|
-
require 'browser/compatibility/dom/element/style'
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module Browser; module DOM; class Event
|
2
|
-
|
3
|
-
class Animation < Event
|
4
|
-
def self.supported?
|
5
|
-
not $$[:AnimationEvent].nil?
|
6
|
-
end
|
7
|
-
|
8
|
-
class Definition < Definition
|
9
|
-
def animation=(value)
|
10
|
-
`#@native.animationName = #{value}`
|
11
|
-
end
|
12
|
-
|
13
|
-
def elapsed=(value)
|
14
|
-
`#@native.elapsedTime = #{value}`
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.create(name, &block)
|
19
|
-
new(`new AnimationEvent(#{name}, #{Definition.new(&block)})`)
|
20
|
-
end
|
21
|
-
|
22
|
-
alias_native :name, :animationName
|
23
|
-
alias_native :elapsed, :elapsedTime
|
24
|
-
end
|
25
|
-
|
26
|
-
end; end; end
|
@@ -1,207 +0,0 @@
|
|
1
|
-
module Browser; module DOM
|
2
|
-
|
3
|
-
class Event
|
4
|
-
include Native
|
5
|
-
|
6
|
-
class Definition
|
7
|
-
include Native
|
8
|
-
|
9
|
-
def self.new(&block)
|
10
|
-
data = super(`{}`)
|
11
|
-
block.call(data) if block
|
12
|
-
|
13
|
-
data.to_n
|
14
|
-
end
|
15
|
-
|
16
|
-
def bubbles!
|
17
|
-
`#@native.bubbles = true`
|
18
|
-
end
|
19
|
-
|
20
|
-
def cancelable!
|
21
|
-
`#@native.cancelable = true`
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
module Target
|
26
|
-
def self.converters
|
27
|
-
@converters ||= []
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.register(&block)
|
31
|
-
converters << block
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.convert(value)
|
35
|
-
return value unless native?(value)
|
36
|
-
|
37
|
-
converters.each {|block|
|
38
|
-
if result = block.call(value)
|
39
|
-
return result
|
40
|
-
end
|
41
|
-
}
|
42
|
-
|
43
|
-
nil
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.included(klass)
|
47
|
-
klass.instance_eval {
|
48
|
-
def self.target(&block)
|
49
|
-
DOM::Event::Target.register(&block)
|
50
|
-
end
|
51
|
-
}
|
52
|
-
end
|
53
|
-
|
54
|
-
class Callback
|
55
|
-
attr_reader :target, :name, :selector
|
56
|
-
|
57
|
-
def initialize(target, name, selector = nil, &block)
|
58
|
-
%x{
|
59
|
-
callback = #{self};
|
60
|
-
func = function(event) {
|
61
|
-
event = #{::Browser::DOM::Event.new(`event`, `callback`)};
|
62
|
-
|
63
|
-
if (!#{`event`.stopped?}) {
|
64
|
-
#{block.call(`event`, *`event`.arguments)};
|
65
|
-
}
|
66
|
-
|
67
|
-
return !#{`event`.stopped?};
|
68
|
-
}
|
69
|
-
}
|
70
|
-
|
71
|
-
@function = `func`
|
72
|
-
@target = target
|
73
|
-
@name = name
|
74
|
-
@selector = selector
|
75
|
-
end
|
76
|
-
|
77
|
-
def off
|
78
|
-
target.off(self)
|
79
|
-
end
|
80
|
-
|
81
|
-
def to_n
|
82
|
-
@function
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def on(name, selector = nil, &block)
|
87
|
-
raise ArgumentError, 'no block has been passed' unless block
|
88
|
-
|
89
|
-
name = Event.name_for(name)
|
90
|
-
callback = Callback.new(self, name, selector, &block)
|
91
|
-
|
92
|
-
callbacks.push(callback)
|
93
|
-
|
94
|
-
if selector
|
95
|
-
observe
|
96
|
-
deferred << [name, selector, block]
|
97
|
-
|
98
|
-
css(selector).on(name, &block)
|
99
|
-
else
|
100
|
-
`#@native.addEventListener(#{name}, #{callback.to_n})`
|
101
|
-
end
|
102
|
-
|
103
|
-
callback
|
104
|
-
end
|
105
|
-
|
106
|
-
def off(what = nil)
|
107
|
-
case what
|
108
|
-
when Callback
|
109
|
-
callbacks.delete(what)
|
110
|
-
|
111
|
-
`#@native.removeEventListener(#{what.name}, #{what.to_n}, false)`
|
112
|
-
|
113
|
-
when String
|
114
|
-
if what.include?(?*) or what.include?(??)
|
115
|
-
off(Regexp.new(what.gsub(/\*/, '.*?').gsub(/\?/, ?.)))
|
116
|
-
else
|
117
|
-
what = Event.name_for(what)
|
118
|
-
|
119
|
-
callbacks.delete_if {|callback|
|
120
|
-
if callback.name == what
|
121
|
-
`#@native.removeEventListener(#{callback.name}, #{callback.to_n}, false)`
|
122
|
-
|
123
|
-
true
|
124
|
-
end
|
125
|
-
}
|
126
|
-
end
|
127
|
-
|
128
|
-
when Regexp
|
129
|
-
callbacks.delete_if {|callback|
|
130
|
-
if callback.name =~ what
|
131
|
-
`#@native.removeEventListener(#{callback.name}, #{callback.to_n}, false)`
|
132
|
-
|
133
|
-
true
|
134
|
-
end
|
135
|
-
}
|
136
|
-
|
137
|
-
else
|
138
|
-
callbacks.each {|callback|
|
139
|
-
`#@native.removeEventListener(#{callback.name}, #{callback.to_n}, false)`
|
140
|
-
}
|
141
|
-
|
142
|
-
callbacks.clear
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
def trigger(event, *args, &block)
|
147
|
-
if event.is_a? String
|
148
|
-
event = Event.create(event, *args, &block)
|
149
|
-
end
|
150
|
-
|
151
|
-
`#@native.dispatchEvent(#{event.to_n})`
|
152
|
-
end
|
153
|
-
|
154
|
-
private
|
155
|
-
def callbacks
|
156
|
-
%x{
|
157
|
-
if (!#@native.$callbacks) {
|
158
|
-
#@native.$callbacks = [];
|
159
|
-
}
|
160
|
-
|
161
|
-
return #@native.$callbacks;
|
162
|
-
}
|
163
|
-
end
|
164
|
-
|
165
|
-
def observe
|
166
|
-
%x{
|
167
|
-
if (!#@native.$observer) {
|
168
|
-
#@native.$observer = #{MutationObserver.new {|mutations|
|
169
|
-
mutations.each {|mutation|
|
170
|
-
mutation.added.each {|node|
|
171
|
-
next unless Element === node
|
172
|
-
|
173
|
-
defer(node)
|
174
|
-
}
|
175
|
-
}
|
176
|
-
}};
|
177
|
-
|
178
|
-
#{`#@native.$observer`.observe(@native, children: true, tree: true)}
|
179
|
-
}
|
180
|
-
}
|
181
|
-
end
|
182
|
-
|
183
|
-
def deferred
|
184
|
-
%x{
|
185
|
-
if (!#@native.$deferred) {
|
186
|
-
#@native.$deferred = [];
|
187
|
-
}
|
188
|
-
|
189
|
-
return #@native.$deferred;
|
190
|
-
}
|
191
|
-
end
|
192
|
-
|
193
|
-
def defer(node)
|
194
|
-
deferred.each {|name, selector, block|
|
195
|
-
if node.matches?(selector)
|
196
|
-
node.on(name, &block)
|
197
|
-
end
|
198
|
-
|
199
|
-
node.elements.each {|el|
|
200
|
-
defer(el)
|
201
|
-
}
|
202
|
-
}
|
203
|
-
end
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
end; end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module Browser; module DOM; class Event
|
2
|
-
|
3
|
-
class BeforeUnload < Event
|
4
|
-
def self.supported?
|
5
|
-
not $$[:BeforeUnloadEvent].nil?
|
6
|
-
end
|
7
|
-
|
8
|
-
def self.create(name, &block)
|
9
|
-
new(`new BeforeUnloadEvent(#{name}, #{Definition.new(&block)})`)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
end; end; end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module Browser; module DOM; class Event
|
2
|
-
|
3
|
-
class Clipboard < Event
|
4
|
-
def self.supported?
|
5
|
-
not $$[:ClipboardEvent].nil?
|
6
|
-
end
|
7
|
-
|
8
|
-
class Definition < Definition
|
9
|
-
def data=(value)
|
10
|
-
`#@native.data = #{value}`
|
11
|
-
end
|
12
|
-
|
13
|
-
def type=(value)
|
14
|
-
`#@native.dataType = #{value}`
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.create(name, &block)
|
19
|
-
new(`new ClipboardEvent(#{name}, #{Definition.new(&block)})`)
|
20
|
-
end
|
21
|
-
|
22
|
-
alias_native :data
|
23
|
-
alias_native :type, :dataType
|
24
|
-
end
|
25
|
-
|
26
|
-
end; end; end
|