opal-browser 0.2.0.beta1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +22 -8
- data/Gemfile +1 -1
- data/README.md +59 -5
- data/index.html.erb +7 -4
- data/lib/opal-browser.rb +1 -0
- data/opal-browser.gemspec +1 -1
- data/opal/browser.rb +1 -0
- data/opal/browser/animation_frame.rb +26 -1
- data/opal/browser/canvas.rb +0 -10
- data/opal/browser/canvas/data.rb +0 -10
- data/opal/browser/canvas/gradient.rb +0 -10
- data/opal/browser/canvas/style.rb +0 -10
- data/opal/browser/canvas/text.rb +0 -10
- data/opal/browser/cookies.rb +6 -8
- data/opal/browser/database/sql.rb +194 -0
- data/opal/browser/delay.rb +25 -7
- data/opal/browser/dom.rb +2 -11
- data/opal/browser/dom/attribute.rb +12 -11
- data/opal/browser/dom/builder.rb +4 -9
- data/opal/browser/dom/document.rb +105 -41
- data/opal/browser/dom/element.rb +317 -231
- data/opal/browser/dom/element/attributes.rb +87 -0
- data/opal/browser/dom/element/data.rb +67 -0
- data/opal/browser/dom/element/input.rb +12 -1
- data/opal/browser/dom/element/offset.rb +5 -0
- data/opal/browser/dom/element/position.rb +11 -2
- data/opal/browser/dom/element/scroll.rb +77 -10
- data/opal/browser/dom/element/select.rb +36 -0
- data/opal/browser/dom/element/size.rb +5 -0
- data/opal/browser/dom/element/template.rb +9 -0
- data/opal/browser/dom/element/textarea.rb +24 -0
- data/opal/browser/dom/mutation_observer.rb +2 -2
- data/opal/browser/dom/node.rb +93 -51
- data/opal/browser/dom/node_set.rb +66 -48
- data/opal/browser/effects.rb +11 -0
- data/opal/browser/{dom/event.rb → event.rb} +32 -32
- data/opal/browser/{dom/event → event}/animation.rb +2 -2
- data/opal/browser/{dom/event → event}/audio_processing.rb +2 -2
- data/opal/browser/{dom/event → event}/base.rb +65 -7
- data/opal/browser/{dom/event → event}/before_unload.rb +2 -2
- data/opal/browser/{dom/event → event}/clipboard.rb +2 -2
- data/opal/browser/{dom/event → event}/close.rb +2 -2
- data/opal/browser/{dom/event → event}/composition.rb +2 -2
- data/opal/browser/{dom/event → event}/custom.rb +2 -2
- data/opal/browser/{dom/event → event}/device_light.rb +2 -2
- data/opal/browser/{dom/event → event}/device_motion.rb +2 -2
- data/opal/browser/{dom/event → event}/device_orientation.rb +2 -2
- data/opal/browser/{dom/event → event}/device_proximity.rb +2 -2
- data/opal/browser/{dom/event → event}/drag.rb +2 -2
- data/opal/browser/{dom/event → event}/focus.rb +2 -2
- data/opal/browser/{dom/event → event}/gamepad.rb +2 -2
- data/opal/browser/{dom/event → event}/hash_change.rb +2 -2
- data/opal/browser/{dom/event → event}/keyboard.rb +2 -2
- data/opal/browser/{dom/event → event}/message.rb +2 -2
- data/opal/browser/{dom/event → event}/mouse.rb +2 -2
- data/opal/browser/{dom/event → event}/page_transition.rb +2 -2
- data/opal/browser/{dom/event → event}/pop_state.rb +2 -2
- data/opal/browser/{dom/event → event}/progress.rb +2 -2
- data/opal/browser/{dom/event → event}/sensor.rb +2 -2
- data/opal/browser/{dom/event → event}/storage.rb +2 -2
- data/opal/browser/{dom/event → event}/touch.rb +2 -2
- data/opal/browser/{dom/event → event}/ui.rb +2 -2
- data/opal/browser/{dom/event → event}/wheel.rb +2 -2
- data/opal/browser/event_source.rb +1 -1
- data/opal/browser/http.rb +25 -0
- data/opal/browser/http/binary.rb +1 -0
- data/opal/browser/http/headers.rb +16 -2
- data/opal/browser/http/request.rb +14 -38
- data/opal/browser/immediate.rb +9 -3
- data/opal/browser/interval.rb +34 -11
- data/opal/browser/navigator.rb +23 -4
- data/opal/browser/screen.rb +1 -1
- data/opal/browser/socket.rb +5 -1
- data/opal/browser/storage.rb +51 -33
- data/opal/browser/support.rb +59 -4
- data/opal/browser/version.rb +1 -1
- data/opal/browser/window.rb +17 -9
- data/opal/browser/window/size.rb +17 -3
- data/opal/opal-browser.rb +1 -0
- data/spec/database/sql_spec.rb +131 -0
- data/spec/delay_spec.rb +38 -0
- data/spec/dom/attribute_spec.rb +49 -0
- data/spec/dom/builder_spec.rb +25 -8
- data/spec/dom/document_spec.rb +20 -0
- data/spec/dom/element/attributes_spec.rb +52 -0
- data/spec/dom/element_spec.rb +139 -4
- data/spec/dom/node_set_spec.rb +44 -0
- data/spec/interval_spec.rb +50 -0
- data/spec/runner.rb +46 -28
- data/spec/socket_spec.rb +1 -0
- data/spec/spec_helper.rb +0 -4
- data/spec/storage_spec.rb +1 -1
- metadata +57 -39
- data/opal/browser/http/parameters.rb +0 -8
data/opal/browser/version.rb
CHANGED
data/opal/browser/window.rb
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'browser/interval'
|
2
|
-
require 'browser/delay'
|
3
|
-
|
4
1
|
require 'browser/window/view'
|
5
2
|
require 'browser/window/size'
|
6
3
|
require 'browser/window/scroll'
|
@@ -34,6 +31,11 @@ class Window
|
|
34
31
|
end
|
35
32
|
|
36
33
|
include Native
|
34
|
+
include Event::Target
|
35
|
+
|
36
|
+
target {|value|
|
37
|
+
$window if `#{value} == window`
|
38
|
+
}
|
37
39
|
|
38
40
|
# Alert the passed string.
|
39
41
|
def alert(value)
|
@@ -73,12 +75,18 @@ class Window
|
|
73
75
|
Scroll.new(self)
|
74
76
|
end
|
75
77
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
78
|
+
if Browser.supports? 'Window.send'
|
79
|
+
def send(message, options = {})
|
80
|
+
`#@native.postMessage(#{message}, #{options[:to] || '*'})`
|
81
|
+
end
|
82
|
+
else
|
83
|
+
# Send a message to the window.
|
84
|
+
#
|
85
|
+
# @param message [String] the message
|
86
|
+
# @param options [Hash] optional `to: target`
|
87
|
+
def send(message, options = {})
|
88
|
+
raise NotImplementedError, 'message sending unsupported'
|
89
|
+
end
|
82
90
|
end
|
83
91
|
|
84
92
|
def close
|
data/opal/browser/window/size.rb
CHANGED
@@ -1,20 +1,34 @@
|
|
1
1
|
module Browser; class Window
|
2
2
|
|
3
|
+
# Allows access and manipulation of the {Window} size.
|
3
4
|
class Size
|
5
|
+
# @private
|
4
6
|
def initialize(window)
|
5
7
|
@window = window
|
6
8
|
@native = window.to_n
|
7
9
|
end
|
8
10
|
|
9
|
-
def set(
|
10
|
-
|
11
|
-
|
11
|
+
def set(*args)
|
12
|
+
if Hash === args.first
|
13
|
+
width, height = args.first.values_at(:width, :height)
|
14
|
+
else
|
15
|
+
width, height = args
|
16
|
+
end
|
17
|
+
|
18
|
+
width ||= self.width
|
19
|
+
height ||= self.height
|
12
20
|
|
13
21
|
`#@native.resizeTo(#{width}, #{height})`
|
14
22
|
|
15
23
|
self
|
16
24
|
end
|
17
25
|
|
26
|
+
# @!attribute width
|
27
|
+
# @return [Integer] the width of the window
|
28
|
+
|
29
|
+
# @!attribute height
|
30
|
+
# @return [Integer] the height of the window
|
31
|
+
|
18
32
|
if Browser.supports? 'Window.outerSize'
|
19
33
|
def width
|
20
34
|
`#@native.outerWidth`
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'browser'
|
@@ -0,0 +1,131 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'browser/database/sql'
|
3
|
+
|
4
|
+
describe Browser::Database::SQL do
|
5
|
+
SQL = Browser::Database::SQL
|
6
|
+
SIZE = 1024 * 1024
|
7
|
+
|
8
|
+
describe '#new' do
|
9
|
+
it 'sets the attributes properly' do
|
10
|
+
sql = SQL.new('test', description: 'trains', size: SIZE)
|
11
|
+
|
12
|
+
expect(sql.name).to eq('test')
|
13
|
+
expect(sql.description).to eq('trains')
|
14
|
+
expect(sql.size).to eq(SIZE)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'sets the version properly' do
|
18
|
+
sql = SQL.new('test2', version: '1.0', size: SIZE)
|
19
|
+
expect(sql.version).to eq('1.0')
|
20
|
+
|
21
|
+
sql = SQL.new('test', size: SIZE)
|
22
|
+
expect(sql.version).to eq('')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#transaction' do
|
27
|
+
async 'calls the block with the transaction' do
|
28
|
+
sql = SQL.new('test', size: SIZE)
|
29
|
+
|
30
|
+
sql.transaction {|t|
|
31
|
+
async {
|
32
|
+
expect(t).to be_a(SQL::Transaction)
|
33
|
+
}
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
async 'the transaction database is the right one' do
|
38
|
+
sql = SQL.new('test', size: SIZE)
|
39
|
+
|
40
|
+
sql.transaction {|t|
|
41
|
+
async {
|
42
|
+
expect(t.database).to eq(sql)
|
43
|
+
}
|
44
|
+
}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe SQL::Transaction do
|
49
|
+
describe '#query' do
|
50
|
+
async 'returns a promise' do
|
51
|
+
sql = SQL.new('test', size: SIZE)
|
52
|
+
|
53
|
+
sql.transaction {|t|
|
54
|
+
async {
|
55
|
+
expect(t.query('hue')).to be_a(Promise)
|
56
|
+
}
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
async 'resolves on success' do
|
61
|
+
sql = SQL.new('test', size: SIZE)
|
62
|
+
|
63
|
+
sql.transaction {|t|
|
64
|
+
t.query('CREATE TABLE IF NOT EXISTS test(ID INTEGER PRIMARY KEY ASC, a TEXT)').then {|r|
|
65
|
+
async {
|
66
|
+
expect(r).to be_a(SQL::Result)
|
67
|
+
}
|
68
|
+
}
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
async 'rejects on failure' do
|
73
|
+
sql = SQL.new('test', size: SIZE)
|
74
|
+
|
75
|
+
sql.transaction {|t|
|
76
|
+
t.query('huehue').rescue {|e|
|
77
|
+
async {
|
78
|
+
expect(e).to be_a(SQL::Error::Syntax)
|
79
|
+
}
|
80
|
+
}
|
81
|
+
}
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe SQL::Result do
|
87
|
+
describe '#length' do
|
88
|
+
async 'has the proper length' do
|
89
|
+
sql = SQL.new('test', size: SIZE)
|
90
|
+
|
91
|
+
sql.transaction {|t|
|
92
|
+
t.query('SELECT 1').then {|r|
|
93
|
+
async {
|
94
|
+
expect(r.length).to eq(1)
|
95
|
+
}
|
96
|
+
}
|
97
|
+
}
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe '#[]' do
|
102
|
+
async 'returns a row' do
|
103
|
+
sql = SQL.new('test', size: SIZE)
|
104
|
+
|
105
|
+
sql.transaction {|t|
|
106
|
+
t.query('SELECT 1, 2, 3').then {|r|
|
107
|
+
async {
|
108
|
+
expect(r[0]).to be_a(SQL::Row)
|
109
|
+
expect(r[-1]).to be_a(SQL::Row)
|
110
|
+
|
111
|
+
expect(r[0]).to eq(r[-1])
|
112
|
+
}
|
113
|
+
}
|
114
|
+
}
|
115
|
+
end
|
116
|
+
|
117
|
+
async 'returns nil on missing row' do
|
118
|
+
sql = SQL.new('test', size: SIZE)
|
119
|
+
|
120
|
+
sql.transaction {|t|
|
121
|
+
t.query('SELECT 1, 2, 3').then {|r|
|
122
|
+
async {
|
123
|
+
expect(r[5]).to be_nil
|
124
|
+
expect(r[-5]).to be_nil
|
125
|
+
}
|
126
|
+
}
|
127
|
+
}
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end if Browser::Database::SQL.supported?
|
data/spec/delay_spec.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'browser/delay'
|
3
|
+
|
4
|
+
describe Browser::Window do
|
5
|
+
describe '#after' do
|
6
|
+
async 'calls the block after the given time' do
|
7
|
+
$window.after 0.3 do
|
8
|
+
async {
|
9
|
+
expect(true).to be_truthy
|
10
|
+
}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe Kernel do
|
17
|
+
describe '#after' do
|
18
|
+
async 'calls the block after the given time' do
|
19
|
+
after 0.3 do
|
20
|
+
async {
|
21
|
+
expect(true).to be_truthy
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe Proc do
|
29
|
+
describe '#after' do
|
30
|
+
async 'calls the block after the given time' do
|
31
|
+
-> {
|
32
|
+
async {
|
33
|
+
expect(true).to be_truthy
|
34
|
+
}
|
35
|
+
}.after 0.3
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Browser::DOM::Attribute do
|
4
|
+
html <<-HTML
|
5
|
+
<div id="lol" class="hue" something="wat"></div>
|
6
|
+
HTML
|
7
|
+
|
8
|
+
describe '#name' do
|
9
|
+
it 'gets the right name' do
|
10
|
+
attr = $document['lol'].attribute_nodes.find { |a| a.name == :id }
|
11
|
+
|
12
|
+
expect(attr.name).to eq(:id)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#value' do
|
17
|
+
it 'gets the right value' do
|
18
|
+
attr = $document['lol'].attribute_nodes.find { |a| a.name == :id }
|
19
|
+
|
20
|
+
expect(attr.name).to eq(:id)
|
21
|
+
expect(attr.value).to eq(:lol)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#value=' do
|
26
|
+
it 'sets the value' do
|
27
|
+
attr = $document['lol'].attribute_nodes.find { |a| a.name == :id }
|
28
|
+
|
29
|
+
expect(attr.name).to eq(:id)
|
30
|
+
expect(attr.value).to eq(:lol)
|
31
|
+
attr.value = :omg
|
32
|
+
expect(attr.value).to eq(:omg)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '#id?' do
|
37
|
+
it 'is true for an id attribute' do
|
38
|
+
attr = $document['lol'].attribute_nodes.find { |a| a.name == :id }
|
39
|
+
|
40
|
+
expect(attr.id?).to be_truthy
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'is false for any other attribute' do
|
44
|
+
attr = $document['lol'].attribute_nodes.find { |a| a.name == :class }
|
45
|
+
|
46
|
+
expect(attr.id?).to be_falsy
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/spec/dom/builder_spec.rb
CHANGED
@@ -2,27 +2,35 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Browser::DOM::Builder do
|
4
4
|
it 'builds an element' do
|
5
|
-
|
5
|
+
res = DOM {
|
6
6
|
div
|
7
|
-
}
|
7
|
+
}
|
8
|
+
|
9
|
+
expect(res.name).to eq('DIV')
|
8
10
|
end
|
9
11
|
|
10
12
|
it 'builds an element with text content' do
|
11
|
-
|
13
|
+
res = DOM {
|
12
14
|
div "foo bar"
|
13
|
-
}
|
15
|
+
}
|
14
16
|
|
15
|
-
expect(
|
17
|
+
expect(res.text).to eq('foo bar')
|
18
|
+
|
19
|
+
res = DOM {
|
16
20
|
div {
|
17
21
|
"foo bar"
|
18
22
|
}
|
19
|
-
}
|
23
|
+
}
|
24
|
+
|
25
|
+
expect(res.text).to eq('foo bar')
|
20
26
|
end
|
21
27
|
|
22
28
|
it 'builds an element with attributes' do
|
23
|
-
|
29
|
+
res = DOM {
|
24
30
|
div class: :wut
|
25
|
-
}
|
31
|
+
}
|
32
|
+
|
33
|
+
expect(res.class_name).to eq(:wut)
|
26
34
|
end
|
27
35
|
|
28
36
|
it 'builds deeper trees' do
|
@@ -66,4 +74,13 @@ describe Browser::DOM::Builder do
|
|
66
74
|
expect(res.name).to eq('I')
|
67
75
|
expect(res.class_names).to eq(%w[icon-legal])
|
68
76
|
end
|
77
|
+
|
78
|
+
it 'sets the id' do
|
79
|
+
res = DOM {
|
80
|
+
div.omg!
|
81
|
+
}
|
82
|
+
|
83
|
+
expect(res.name).to eq('DIV')
|
84
|
+
expect(res.id).to eq('omg')
|
85
|
+
end
|
69
86
|
end
|
data/spec/dom/document_spec.rb
CHANGED
@@ -37,4 +37,24 @@ describe Browser::DOM::Document do
|
|
37
37
|
expect($document["doo-dah"]).to be_nil
|
38
38
|
end
|
39
39
|
end
|
40
|
+
|
41
|
+
describe "#ready" do
|
42
|
+
async "calls the block when the document is ready" do
|
43
|
+
$document.ready do
|
44
|
+
async {
|
45
|
+
expect(true).to be_truthy
|
46
|
+
}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "#ready?" do
|
52
|
+
async "is true inside a #ready block" do
|
53
|
+
$document.ready do
|
54
|
+
async {
|
55
|
+
expect($document.ready?).to be_truthy
|
56
|
+
}
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
40
60
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Browser::DOM::Element::Attributes do
|
4
|
+
html <<-HTML
|
5
|
+
<label id="lol" class="name" for="hue"></label>
|
6
|
+
HTML
|
7
|
+
|
8
|
+
describe '#[]' do
|
9
|
+
it 'gets an attribute' do
|
10
|
+
expect($document[:lol].attributes[:id]).to eq(:lol)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'gets the class attribute' do
|
14
|
+
expect($document[:lol].attributes[:class]).to eq(:name)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'gets the for attribute' do
|
18
|
+
expect($document[:lol].attributes[:for]).to eq(:hue)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#[]=' do
|
23
|
+
it 'sets an attribute' do
|
24
|
+
$document[:lol].attributes[:a] = :foo
|
25
|
+
|
26
|
+
expect($document[:lol].attributes[:a]).to eq(:foo)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'sets the class attribute' do
|
30
|
+
$document[:lol].attributes[:class] = :bar
|
31
|
+
|
32
|
+
expect($document[:lol].attributes[:class]).to eq(:bar)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'sets the for attribute' do
|
36
|
+
$document[:lol].attributes[:for] = :baz
|
37
|
+
|
38
|
+
expect($document[:lol].attributes[:for]).to eq(:baz)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#each' do
|
43
|
+
it 'enumerates over the attributes' do
|
44
|
+
attributes = $document[:lol].attributes.select {|name, _|
|
45
|
+
%w[class for id].include?(name)
|
46
|
+
}
|
47
|
+
|
48
|
+
expect(attributes.sort).to eq \
|
49
|
+
[[:class, :name], [:for, :hue], [:id, :lol]]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|