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.
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