opal-browser 0.2.0.beta1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +22 -8
  3. data/Gemfile +1 -1
  4. data/README.md +59 -5
  5. data/index.html.erb +7 -4
  6. data/lib/opal-browser.rb +1 -0
  7. data/opal-browser.gemspec +1 -1
  8. data/opal/browser.rb +1 -0
  9. data/opal/browser/animation_frame.rb +26 -1
  10. data/opal/browser/canvas.rb +0 -10
  11. data/opal/browser/canvas/data.rb +0 -10
  12. data/opal/browser/canvas/gradient.rb +0 -10
  13. data/opal/browser/canvas/style.rb +0 -10
  14. data/opal/browser/canvas/text.rb +0 -10
  15. data/opal/browser/cookies.rb +6 -8
  16. data/opal/browser/database/sql.rb +194 -0
  17. data/opal/browser/delay.rb +25 -7
  18. data/opal/browser/dom.rb +2 -11
  19. data/opal/browser/dom/attribute.rb +12 -11
  20. data/opal/browser/dom/builder.rb +4 -9
  21. data/opal/browser/dom/document.rb +105 -41
  22. data/opal/browser/dom/element.rb +317 -231
  23. data/opal/browser/dom/element/attributes.rb +87 -0
  24. data/opal/browser/dom/element/data.rb +67 -0
  25. data/opal/browser/dom/element/input.rb +12 -1
  26. data/opal/browser/dom/element/offset.rb +5 -0
  27. data/opal/browser/dom/element/position.rb +11 -2
  28. data/opal/browser/dom/element/scroll.rb +77 -10
  29. data/opal/browser/dom/element/select.rb +36 -0
  30. data/opal/browser/dom/element/size.rb +5 -0
  31. data/opal/browser/dom/element/template.rb +9 -0
  32. data/opal/browser/dom/element/textarea.rb +24 -0
  33. data/opal/browser/dom/mutation_observer.rb +2 -2
  34. data/opal/browser/dom/node.rb +93 -51
  35. data/opal/browser/dom/node_set.rb +66 -48
  36. data/opal/browser/effects.rb +11 -0
  37. data/opal/browser/{dom/event.rb → event.rb} +32 -32
  38. data/opal/browser/{dom/event → event}/animation.rb +2 -2
  39. data/opal/browser/{dom/event → event}/audio_processing.rb +2 -2
  40. data/opal/browser/{dom/event → event}/base.rb +65 -7
  41. data/opal/browser/{dom/event → event}/before_unload.rb +2 -2
  42. data/opal/browser/{dom/event → event}/clipboard.rb +2 -2
  43. data/opal/browser/{dom/event → event}/close.rb +2 -2
  44. data/opal/browser/{dom/event → event}/composition.rb +2 -2
  45. data/opal/browser/{dom/event → event}/custom.rb +2 -2
  46. data/opal/browser/{dom/event → event}/device_light.rb +2 -2
  47. data/opal/browser/{dom/event → event}/device_motion.rb +2 -2
  48. data/opal/browser/{dom/event → event}/device_orientation.rb +2 -2
  49. data/opal/browser/{dom/event → event}/device_proximity.rb +2 -2
  50. data/opal/browser/{dom/event → event}/drag.rb +2 -2
  51. data/opal/browser/{dom/event → event}/focus.rb +2 -2
  52. data/opal/browser/{dom/event → event}/gamepad.rb +2 -2
  53. data/opal/browser/{dom/event → event}/hash_change.rb +2 -2
  54. data/opal/browser/{dom/event → event}/keyboard.rb +2 -2
  55. data/opal/browser/{dom/event → event}/message.rb +2 -2
  56. data/opal/browser/{dom/event → event}/mouse.rb +2 -2
  57. data/opal/browser/{dom/event → event}/page_transition.rb +2 -2
  58. data/opal/browser/{dom/event → event}/pop_state.rb +2 -2
  59. data/opal/browser/{dom/event → event}/progress.rb +2 -2
  60. data/opal/browser/{dom/event → event}/sensor.rb +2 -2
  61. data/opal/browser/{dom/event → event}/storage.rb +2 -2
  62. data/opal/browser/{dom/event → event}/touch.rb +2 -2
  63. data/opal/browser/{dom/event → event}/ui.rb +2 -2
  64. data/opal/browser/{dom/event → event}/wheel.rb +2 -2
  65. data/opal/browser/event_source.rb +1 -1
  66. data/opal/browser/http.rb +25 -0
  67. data/opal/browser/http/binary.rb +1 -0
  68. data/opal/browser/http/headers.rb +16 -2
  69. data/opal/browser/http/request.rb +14 -38
  70. data/opal/browser/immediate.rb +9 -3
  71. data/opal/browser/interval.rb +34 -11
  72. data/opal/browser/navigator.rb +23 -4
  73. data/opal/browser/screen.rb +1 -1
  74. data/opal/browser/socket.rb +5 -1
  75. data/opal/browser/storage.rb +51 -33
  76. data/opal/browser/support.rb +59 -4
  77. data/opal/browser/version.rb +1 -1
  78. data/opal/browser/window.rb +17 -9
  79. data/opal/browser/window/size.rb +17 -3
  80. data/opal/opal-browser.rb +1 -0
  81. data/spec/database/sql_spec.rb +131 -0
  82. data/spec/delay_spec.rb +38 -0
  83. data/spec/dom/attribute_spec.rb +49 -0
  84. data/spec/dom/builder_spec.rb +25 -8
  85. data/spec/dom/document_spec.rb +20 -0
  86. data/spec/dom/element/attributes_spec.rb +52 -0
  87. data/spec/dom/element_spec.rb +139 -4
  88. data/spec/dom/node_set_spec.rb +44 -0
  89. data/spec/interval_spec.rb +50 -0
  90. data/spec/runner.rb +46 -28
  91. data/spec/socket_spec.rb +1 -0
  92. data/spec/spec_helper.rb +0 -4
  93. data/spec/storage_spec.rb +1 -1
  94. metadata +57 -39
  95. data/opal/browser/http/parameters.rb +0 -8
@@ -1,3 +1,3 @@
1
1
  module Browser
2
- VERSION = '0.2.0.beta1'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -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
- # Send a message to the window.
77
- #
78
- # @param message [String] the message
79
- # @param options [Hash] optional `to: target`
80
- def send!(message, options = {})
81
- `#@native.postMessage(#{message}, #{options[:to] || '*'})`
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
@@ -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(what)
10
- width = what[:width] || self.width
11
- height = what[:height] || self.height
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?
@@ -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
@@ -2,27 +2,35 @@ require 'spec_helper'
2
2
 
3
3
  describe Browser::DOM::Builder do
4
4
  it 'builds an element' do
5
- expect(DOM {
5
+ res = DOM {
6
6
  div
7
- }.name).to eq('DIV')
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
- expect(DOM {
13
+ res = DOM {
12
14
  div "foo bar"
13
- }.text).to eq('foo bar')
15
+ }
14
16
 
15
- expect(DOM {
17
+ expect(res.text).to eq('foo bar')
18
+
19
+ res = DOM {
16
20
  div {
17
21
  "foo bar"
18
22
  }
19
- }.text).to eq('foo bar')
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
- expect(DOM {
29
+ res = DOM {
24
30
  div class: :wut
25
- }.class_name).to eq(:wut)
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
@@ -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