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
@@ -0,0 +1,94 @@
|
|
1
|
+
module Browser
|
2
|
+
|
3
|
+
class Blob
|
4
|
+
include NativeCachedWrapper
|
5
|
+
|
6
|
+
# Create a new blob from anything that Blob API supports
|
7
|
+
def self.create(from, options={})
|
8
|
+
new(`new Blob(#{Native.convert(from)}, #{options.to_n})`)
|
9
|
+
end
|
10
|
+
|
11
|
+
# @!attribute [r] size
|
12
|
+
# @return [Integer] blob size in bytes
|
13
|
+
def size
|
14
|
+
`#@native.size`
|
15
|
+
end
|
16
|
+
|
17
|
+
# @!attribute [r] type
|
18
|
+
# @return [String] blob mime type
|
19
|
+
def type
|
20
|
+
`#@native.type`
|
21
|
+
end
|
22
|
+
|
23
|
+
# Convert a blob to a UTF-8 encoded string.
|
24
|
+
#
|
25
|
+
# If block is given it will be called with a parameter once we receive
|
26
|
+
# the text. Otherwise return a {Promise} which will resolve once we
|
27
|
+
# receive it.
|
28
|
+
def text(&block)
|
29
|
+
promise = nil
|
30
|
+
unless block_given?
|
31
|
+
promise = Promise.new
|
32
|
+
block = proc { |i| promise.resolve(i) }
|
33
|
+
end
|
34
|
+
`#@native.text().then(#{block.to_n})`
|
35
|
+
promise
|
36
|
+
end
|
37
|
+
|
38
|
+
# {Buffer} view into the blob
|
39
|
+
#
|
40
|
+
# If block is given it will be called with a parameter once we receive
|
41
|
+
# the buffer. Otherwise return a {Promise} which will resolve once we
|
42
|
+
# receive it.
|
43
|
+
def buffer
|
44
|
+
promise = nil
|
45
|
+
unless block_given?
|
46
|
+
promise = Promise.new
|
47
|
+
block = proc { |i| promise.resolve(i) }
|
48
|
+
end
|
49
|
+
resblock = proc { |i| block.call(Buffer.new(i)) }
|
50
|
+
`#@native.arrayBuffer().then(#{resblock.to_n})`
|
51
|
+
promise
|
52
|
+
end
|
53
|
+
|
54
|
+
# Create a new blob by slicing this blob
|
55
|
+
def slice(start, finish=nil)
|
56
|
+
Blob.new(`#@native.slice(#{start}, #{finish})`)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Convert a blob to an URL that can be used to reference this blob in DOM
|
60
|
+
# eg. display some multimedia
|
61
|
+
def to_url(window=$window)
|
62
|
+
`#{window.to_n}.URL.createObjectURL(#@native)`
|
63
|
+
end
|
64
|
+
|
65
|
+
# Rename a blob and return a {File} with a new name.
|
66
|
+
#
|
67
|
+
# @return [File] a renamed blob
|
68
|
+
def rename(new_filename)
|
69
|
+
File.create([self], new_filename, type: type,
|
70
|
+
lastModified: respond_to?(:last_modified) ?
|
71
|
+
last_modified : Time.now)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
class File < Blob
|
76
|
+
# Create a new file from anything that File API supports
|
77
|
+
def self.create(from, name, options={})
|
78
|
+
new(`new File(#{Native.convert(from)}, #{name}, #{options.to_n})`)
|
79
|
+
end
|
80
|
+
|
81
|
+
# @!attribute [r] last_modified
|
82
|
+
# @return [Time] last modified date of this file
|
83
|
+
def last_modified
|
84
|
+
Time.at(`#@native.lastModified`/1000.0)
|
85
|
+
end
|
86
|
+
|
87
|
+
# @!attribute [r] name
|
88
|
+
# @return [String] filename
|
89
|
+
def name
|
90
|
+
`#@native.name`
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
data/opal/browser/canvas/data.rb
CHANGED
@@ -1,13 +1,3 @@
|
|
1
|
-
#--
|
2
|
-
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
-
# Version 2, December 2004
|
4
|
-
#
|
5
|
-
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
6
|
-
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
7
|
-
#
|
8
|
-
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
9
|
-
#++
|
10
|
-
|
11
1
|
module Browser; class Canvas
|
12
2
|
|
13
3
|
class Data
|
@@ -27,7 +17,7 @@ class Data
|
|
27
17
|
data
|
28
18
|
end
|
29
19
|
|
30
|
-
include Native
|
20
|
+
include Native::Wrapper
|
31
21
|
|
32
22
|
attr_reader :x, :y, :width, :height
|
33
23
|
|
@@ -42,7 +32,7 @@ class Data
|
|
42
32
|
end
|
43
33
|
|
44
34
|
def length
|
45
|
-
`#@native.length`
|
35
|
+
`#@native.data.length`
|
46
36
|
end
|
47
37
|
|
48
38
|
def [](index)
|
@@ -1,17 +1,7 @@
|
|
1
|
-
#--
|
2
|
-
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
-
# Version 2, December 2004
|
4
|
-
#
|
5
|
-
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
6
|
-
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
7
|
-
#
|
8
|
-
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
9
|
-
#++
|
10
|
-
|
11
1
|
module Browser; class Canvas
|
12
2
|
|
13
3
|
class Gradient
|
14
|
-
include Native
|
4
|
+
include Native::Wrapper
|
15
5
|
|
16
6
|
attr_reader :context
|
17
7
|
|
@@ -1,17 +1,7 @@
|
|
1
|
-
#--
|
2
|
-
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
-
# Version 2, December 2004
|
4
|
-
#
|
5
|
-
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
6
|
-
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
7
|
-
#
|
8
|
-
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
9
|
-
#++
|
10
|
-
|
11
1
|
module Browser; class Canvas
|
12
2
|
|
13
3
|
class StyleObject
|
14
|
-
include Native
|
4
|
+
include Native::Wrapper
|
15
5
|
|
16
6
|
attr_reader :context
|
17
7
|
|
@@ -66,10 +56,12 @@ class Style < StyleObject
|
|
66
56
|
|
67
57
|
def smooth!
|
68
58
|
`#@native.mozImageSmoothingEnabled = #{@smooth = true}`
|
59
|
+
`#@native.imageSmoothingEnabled = #{@smooth = true}`
|
69
60
|
end
|
70
61
|
|
71
62
|
def no_smooth!
|
72
63
|
`#@native.mozImageSmoothingEnabled = #{@smooth = false}`
|
64
|
+
`#@native.imageSmoothingEnabled = #{@smooth = false}`
|
73
65
|
end
|
74
66
|
end
|
75
67
|
|
data/opal/browser/canvas/text.rb
CHANGED
@@ -1,17 +1,7 @@
|
|
1
|
-
#--
|
2
|
-
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
-
# Version 2, December 2004
|
4
|
-
#
|
5
|
-
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
6
|
-
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
7
|
-
#
|
8
|
-
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
9
|
-
#++
|
10
|
-
|
11
1
|
module Browser; class Canvas
|
12
2
|
|
13
3
|
class Text
|
14
|
-
include Native
|
4
|
+
include Native::Wrapper
|
15
5
|
|
16
6
|
attr_reader :context
|
17
7
|
|
data/opal/browser/canvas.rb
CHANGED
@@ -1,13 +1,3 @@
|
|
1
|
-
#--
|
2
|
-
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
-
# Version 2, December 2004
|
4
|
-
#
|
5
|
-
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
6
|
-
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
7
|
-
#
|
8
|
-
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
9
|
-
#++
|
10
|
-
|
11
1
|
require 'browser/canvas/style'
|
12
2
|
require 'browser/canvas/text'
|
13
3
|
require 'browser/canvas/data'
|
@@ -16,17 +6,33 @@ require 'browser/canvas/gradient'
|
|
16
6
|
module Browser
|
17
7
|
|
18
8
|
class Canvas
|
19
|
-
include Native
|
9
|
+
include Native::Wrapper
|
20
10
|
|
21
11
|
attr_reader :element, :style, :text
|
22
12
|
|
23
13
|
def initialize(*args)
|
24
|
-
if DOM::
|
25
|
-
|
26
|
-
|
14
|
+
if DOM::Element === args.first
|
15
|
+
element = args.shift
|
16
|
+
|
17
|
+
if DOM::Element::Image === element
|
18
|
+
@image = element
|
19
|
+
else
|
20
|
+
@element = element
|
21
|
+
end
|
22
|
+
elsif Canvas === args.first
|
23
|
+
@image = args.first
|
24
|
+
end
|
25
|
+
|
26
|
+
unless @element
|
27
27
|
@element = $document.create_element('canvas')
|
28
|
-
|
29
|
-
@
|
28
|
+
|
29
|
+
if @image
|
30
|
+
@element[:width] = @image.width
|
31
|
+
@element[:height] = @image.height
|
32
|
+
else
|
33
|
+
@element[:width] = args.shift
|
34
|
+
@element[:height] = args.shift
|
35
|
+
end
|
30
36
|
end
|
31
37
|
|
32
38
|
if @element.node_name != 'CANVAS'
|
@@ -37,6 +43,43 @@ class Canvas
|
|
37
43
|
|
38
44
|
@style = Style.new(self)
|
39
45
|
@text = Text.new(self)
|
46
|
+
|
47
|
+
if @image
|
48
|
+
draw_image(@image)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def width
|
53
|
+
@element[:width].to_i
|
54
|
+
end
|
55
|
+
|
56
|
+
def height
|
57
|
+
@element[:height].to_i
|
58
|
+
end
|
59
|
+
|
60
|
+
def width=(new_width)
|
61
|
+
@element[:width] = new_width.to_i
|
62
|
+
end
|
63
|
+
|
64
|
+
def height=(new_height)
|
65
|
+
@element[:height] = new_height.to_i
|
66
|
+
end
|
67
|
+
|
68
|
+
def append_to(parent)
|
69
|
+
@element.append_to(parent)
|
70
|
+
end
|
71
|
+
|
72
|
+
def load(path)
|
73
|
+
promise = Promise.new
|
74
|
+
image = $document.create_element('img')
|
75
|
+
|
76
|
+
image.on :load do
|
77
|
+
promise.resolve(image)
|
78
|
+
end
|
79
|
+
|
80
|
+
image[:src] = path
|
81
|
+
|
82
|
+
promise
|
40
83
|
end
|
41
84
|
|
42
85
|
def data(x = nil, y = nil, width = nil, height = nil)
|
@@ -49,7 +92,7 @@ class Canvas
|
|
49
92
|
end
|
50
93
|
|
51
94
|
def pattern(image, type = :repeat)
|
52
|
-
`#@native.createPattern(#{
|
95
|
+
`#@native.createPattern(#{DOM(image).to_n}, type)`
|
53
96
|
end
|
54
97
|
|
55
98
|
def gradient(*args, &block)
|
@@ -143,17 +186,28 @@ class Canvas
|
|
143
186
|
self
|
144
187
|
end
|
145
188
|
|
146
|
-
def draw_image(*args)
|
147
|
-
|
189
|
+
def draw_image(image, *args)
|
190
|
+
if Canvas === image
|
191
|
+
image = image.element
|
192
|
+
else
|
193
|
+
image = DOM(image)
|
194
|
+
end
|
148
195
|
|
149
196
|
if args.first.is_a?(Hash)
|
150
197
|
source, destination = args
|
151
198
|
|
152
199
|
`#@native.drawImage(#{image.to_n}, #{source[:x]}, #{source[:y]}, #{source[:width]}, #{source[:height]}, #{destination[:x]}, #{destination[:y]}, #{destination[:width]}, #{destination[:height]})`
|
153
200
|
else
|
154
|
-
|
201
|
+
case args.length
|
202
|
+
when 0
|
203
|
+
`#@native.drawImage(#{image.to_n}, 0, 0)`
|
204
|
+
|
205
|
+
when 2
|
206
|
+
`#@native.drawImage(#{image.to_n}, #{args[0]}, #{args[1]})`
|
155
207
|
|
156
|
-
|
208
|
+
when 4
|
209
|
+
`#@native.drawImage(#{image.to_n}, #{args[0]}, #{args[1]}, #{args[2]}, #{args[3]})`
|
210
|
+
end
|
157
211
|
end
|
158
212
|
|
159
213
|
self
|
@@ -261,17 +315,21 @@ class Canvas
|
|
261
315
|
`#@native.isPointInPath(x, y)`
|
262
316
|
end
|
263
317
|
|
264
|
-
def
|
265
|
-
@element
|
318
|
+
def to_data(type = undefined)
|
319
|
+
`#{@element.to_n}.toDataUrl(type)`
|
266
320
|
end
|
267
321
|
|
268
|
-
def
|
269
|
-
@element
|
322
|
+
def to_dom(*)
|
323
|
+
@element
|
270
324
|
end
|
271
325
|
|
272
|
-
def
|
273
|
-
|
274
|
-
end
|
326
|
+
def on(*args, &block); @element.on(*args, &block); end
|
327
|
+
def one(*args, &block); @element.one(*args, &block); end
|
328
|
+
def off(*args, &block); @element.off(*args, &block); end
|
329
|
+
end
|
330
|
+
|
331
|
+
Browser::DOM::Builder.for Canvas do |b, item|
|
332
|
+
item.element
|
275
333
|
end
|
276
334
|
|
277
335
|
end
|
data/opal/browser/console.rb
CHANGED
@@ -1,67 +1,45 @@
|
|
1
|
+
warn "`console' has been moved to Opal's stdlib, please `require 'console'` instead." if RUBY_ENGINE_VERSION.to_f >= 0.9
|
2
|
+
|
1
3
|
module Browser
|
2
4
|
|
3
|
-
#
|
5
|
+
# Manipulate the browser console.
|
6
|
+
#
|
7
|
+
# @see https://developer.mozilla.org/en-US/docs/Web/API/console
|
4
8
|
class Console
|
5
|
-
include
|
9
|
+
include Browser::NativeCachedWrapper
|
6
10
|
|
7
11
|
# Clear the console.
|
8
|
-
#
|
9
|
-
# @return [self]
|
10
12
|
def clear
|
11
13
|
`#@native.clear()`
|
12
|
-
|
13
|
-
self
|
14
14
|
end
|
15
15
|
|
16
16
|
# Print a stacktrace from the call site.
|
17
|
-
#
|
18
|
-
# @return [self]
|
19
17
|
def trace
|
20
18
|
`#@native.trace()`
|
21
|
-
|
22
|
-
self
|
23
19
|
end
|
24
20
|
|
25
21
|
# Log the passed objects based on an optional initial format.
|
26
|
-
#
|
27
|
-
# @return [self]
|
28
22
|
def log(*args)
|
29
23
|
`#@native.log.apply(#@native, args)`
|
30
|
-
|
31
|
-
self
|
32
24
|
end
|
33
25
|
|
34
26
|
# Log the passed objects based on an optional initial format as informational
|
35
27
|
# log.
|
36
|
-
#
|
37
|
-
# @return [self]
|
38
28
|
def info(*args)
|
39
29
|
`#@native.info.apply(#@native, args)`
|
40
|
-
|
41
|
-
self
|
42
30
|
end
|
43
31
|
|
44
32
|
# Log the passed objects based on an optional initial format as warning.
|
45
|
-
#
|
46
|
-
# @return [self]
|
47
33
|
def warn(*args)
|
48
34
|
`#@native.warn.apply(#@native, args)`
|
49
|
-
|
50
|
-
self
|
51
35
|
end
|
52
36
|
|
53
37
|
# Log the passed objects based on an optional initial format as error.
|
54
|
-
#
|
55
|
-
# @return [self]
|
56
38
|
def error(*args)
|
57
39
|
`#@native.error.apply(#@native, args)`
|
58
|
-
|
59
|
-
self
|
60
40
|
end
|
61
41
|
|
62
42
|
# Time the given block with the given label.
|
63
|
-
#
|
64
|
-
# @return [self]
|
65
43
|
def time(label, &block)
|
66
44
|
raise ArgumentError, "no block given" unless block
|
67
45
|
|
@@ -76,13 +54,9 @@ class Console
|
|
76
54
|
ensure
|
77
55
|
`#@native.timeEnd()`
|
78
56
|
end
|
79
|
-
|
80
|
-
self
|
81
57
|
end
|
82
58
|
|
83
59
|
# Group the given block.
|
84
|
-
#
|
85
|
-
# @return [self]
|
86
60
|
def group(*args, &block)
|
87
61
|
raise ArgumentError, "no block given" unless block
|
88
62
|
|
@@ -97,13 +71,9 @@ class Console
|
|
97
71
|
ensure
|
98
72
|
`#@native.groupEnd()`
|
99
73
|
end
|
100
|
-
|
101
|
-
self
|
102
74
|
end
|
103
75
|
|
104
76
|
# Group the given block but collapse it.
|
105
|
-
#
|
106
|
-
# @return [self]
|
107
77
|
def group!(*args, &block)
|
108
78
|
return unless block_given?
|
109
79
|
|
@@ -118,8 +88,6 @@ class Console
|
|
118
88
|
ensure
|
119
89
|
`#@native.groupEnd()`
|
120
90
|
end
|
121
|
-
|
122
|
-
self
|
123
91
|
end
|
124
92
|
end
|
125
93
|
|
data/opal/browser/cookies.rb
CHANGED
@@ -1,78 +1,141 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
|
1
3
|
module Browser
|
2
4
|
|
5
|
+
# Allows manipulation of browser cookies.
|
6
|
+
#
|
7
|
+
# @see https://developer.mozilla.org/en-US/docs/Web/API/document.cookie
|
8
|
+
#
|
9
|
+
# Usage:
|
10
|
+
#
|
11
|
+
# cookies = Browser::Cookies.new(`document`)
|
12
|
+
# cookies["my-cookie"] = "monster"
|
13
|
+
# cookies.delete("my-cookie")
|
14
|
+
#
|
3
15
|
class Cookies
|
16
|
+
# Default cookie options.
|
17
|
+
DEFAULT = {
|
18
|
+
expires: Time.now + 60 * 60 * 24,
|
19
|
+
secure: false
|
20
|
+
}
|
21
|
+
|
4
22
|
include Enumerable
|
5
23
|
|
24
|
+
attr_reader :options
|
25
|
+
|
26
|
+
# Create a new {Cookies} wrapper.
|
27
|
+
#
|
28
|
+
# @param document [native] the native document object
|
6
29
|
def initialize(document)
|
7
30
|
@document = document
|
8
|
-
|
9
|
-
@options = {
|
10
|
-
expires: Time.now + 1.day,
|
11
|
-
path: '',
|
12
|
-
domain: '',
|
13
|
-
secure: ''
|
14
|
-
}
|
15
|
-
end
|
16
|
-
|
17
|
-
def options (value = nil)
|
18
|
-
value ? @options.merge!(value) : @options
|
31
|
+
@options = DEFAULT.dup
|
19
32
|
end
|
20
33
|
|
21
|
-
|
22
|
-
|
34
|
+
# Access the cookie with the given name.
|
35
|
+
#
|
36
|
+
# @param name [String] the name of the cookie
|
37
|
+
#
|
38
|
+
# @return [Object]
|
39
|
+
def [](name)
|
40
|
+
matches = `#@document.cookie`.scan(/#{Regexp.escape(FormData.encode(name))}=([^;]*)/)
|
23
41
|
|
24
42
|
return if matches.empty?
|
25
43
|
|
26
|
-
result = matches.map {|
|
27
|
-
JSON.parse(
|
44
|
+
result = matches.flatten.map {|value|
|
45
|
+
JSON.parse(FormData.decode(value))
|
28
46
|
}
|
29
47
|
|
30
48
|
result.length == 1 ? result.first : result
|
31
49
|
end
|
32
50
|
|
33
|
-
|
34
|
-
|
51
|
+
# Set a cookie.
|
52
|
+
#
|
53
|
+
# @param name [String] the name of the cookie
|
54
|
+
# @param value [Object] the data to set
|
55
|
+
# @param options [Hash] the options for the cookie
|
56
|
+
#
|
57
|
+
# @option options [Integer] :max_age the max age of the cookie in seconds
|
58
|
+
# @option options [Time] :expires the expire date
|
59
|
+
# @option options [String] :path the path the cookie is valid on
|
60
|
+
# @option options [String] :domain the domain the cookie is valid on
|
61
|
+
# @option options [Boolean] :secure whether the cookie is secure or not
|
62
|
+
def []=(name, value, options = {})
|
63
|
+
string = value.is_a?(String) ? value : JSON.dump(value)
|
64
|
+
encoded_value = encode(name, string, @options.merge(options))
|
65
|
+
`#@document.cookie = #{encoded_value}`
|
35
66
|
end
|
36
67
|
|
37
|
-
|
68
|
+
# Delete a cookie.
|
69
|
+
#
|
70
|
+
# @param name [String] the name of the cookie
|
71
|
+
def delete(name)
|
38
72
|
`#@document.cookie = #{encode name, '', expires: Time.now}`
|
39
73
|
end
|
40
74
|
|
75
|
+
# @!attribute [r] keys
|
76
|
+
# @return [Array<String>] all the cookie names
|
41
77
|
def keys
|
42
78
|
Array(`#@document.cookie.split(/; /)`).map {|cookie|
|
43
79
|
cookie.split(/\s*=\s*/).first
|
44
80
|
}
|
45
81
|
end
|
46
82
|
|
83
|
+
# @!attribute [r] values
|
84
|
+
# @return [Array] all the cookie values
|
47
85
|
def values
|
48
86
|
keys.map {|key|
|
49
87
|
self[key]
|
50
88
|
}
|
51
89
|
end
|
52
90
|
|
53
|
-
|
91
|
+
# Enumerate the cookies.
|
92
|
+
#
|
93
|
+
# @yieldparam key [String] the name of the cookie
|
94
|
+
# @yieldparam value [String] the value of the cookie
|
95
|
+
#
|
96
|
+
# @return [self]
|
97
|
+
def each(&block)
|
98
|
+
return enum_for :each unless block
|
99
|
+
|
54
100
|
keys.each {|key|
|
55
101
|
yield key, self[key]
|
56
102
|
}
|
103
|
+
|
104
|
+
self
|
57
105
|
end
|
58
106
|
|
107
|
+
# Delete all the cookies
|
108
|
+
#
|
109
|
+
# @return [self]
|
59
110
|
def clear
|
60
111
|
keys.each {|key|
|
61
112
|
delete key
|
62
113
|
}
|
114
|
+
|
115
|
+
self
|
63
116
|
end
|
64
117
|
|
65
118
|
protected
|
66
|
-
def encode
|
67
|
-
|
119
|
+
def encode(key, value, options = {})
|
120
|
+
io = StringIO.new
|
121
|
+
|
122
|
+
io << FormData.encode(key) << ?= << FormData.encode(value) << '; '
|
68
123
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
124
|
+
io << 'max-age=' << options[:max_age] << '; ' if options[:max_age]
|
125
|
+
io << 'expires=' << options[:expires].utc << '; ' if options[:expires]
|
126
|
+
io << 'path=' << options[:path] << '; ' if options[:path]
|
127
|
+
io << 'domain=' << options[:domain] << '; ' if options[:domain]
|
128
|
+
io << 'secure' if options[:secure]
|
129
|
+
|
130
|
+
io.string
|
131
|
+
end
|
132
|
+
end
|
74
133
|
|
75
|
-
|
134
|
+
class DOM::Document < DOM::Element
|
135
|
+
# @!attribute [r] cookies
|
136
|
+
# @return [Cookies] the cookies for the document
|
137
|
+
def cookies
|
138
|
+
Cookies.new(@native) if defined?(`#@native.cookie`)
|
76
139
|
end
|
77
140
|
end
|
78
141
|
|