opal-browser 0.1.0.beta1

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 (127) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.yardopts +1 -0
  4. data/Gemfile +11 -0
  5. data/README.md +106 -0
  6. data/Rakefile +5 -0
  7. data/config.ru +63 -0
  8. data/lib/opal/browser.rb +4 -0
  9. data/opal-browser.gemspec +23 -0
  10. data/opal/browser.rb +10 -0
  11. data/opal/browser/animation_frame.rb +29 -0
  12. data/opal/browser/canvas.rb +277 -0
  13. data/opal/browser/canvas/data.rb +73 -0
  14. data/opal/browser/canvas/gradient.rb +37 -0
  15. data/opal/browser/canvas/style.rb +123 -0
  16. data/opal/browser/canvas/text.rb +55 -0
  17. data/opal/browser/compatibility.rb +59 -0
  18. data/opal/browser/compatibility/animation_frame.rb +93 -0
  19. data/opal/browser/compatibility/dom/document/window.rb +15 -0
  20. data/opal/browser/compatibility/dom/element/css.rb +15 -0
  21. data/opal/browser/compatibility/dom/element/matches.rb +31 -0
  22. data/opal/browser/compatibility/dom/element/offset.rb +20 -0
  23. data/opal/browser/compatibility/dom/element/scroll.rb +25 -0
  24. data/opal/browser/compatibility/dom/element/style.rb +15 -0
  25. data/opal/browser/compatibility/dom/mutation_observer.rb +47 -0
  26. data/opal/browser/compatibility/http/request.rb +15 -0
  27. data/opal/browser/compatibility/immediate.rb +107 -0
  28. data/opal/browser/compatibility/window/scroll.rb +27 -0
  29. data/opal/browser/compatibility/window/size.rb +13 -0
  30. data/opal/browser/compatibility/window/view.rb +13 -0
  31. data/opal/browser/console.rb +137 -0
  32. data/opal/browser/cookies.rb +79 -0
  33. data/opal/browser/css.rb +24 -0
  34. data/opal/browser/css/declaration.rb +88 -0
  35. data/opal/browser/css/rule.rb +48 -0
  36. data/opal/browser/css/rule/style.rb +16 -0
  37. data/opal/browser/css/style_sheet.rb +83 -0
  38. data/opal/browser/css/unit.rb +188 -0
  39. data/opal/browser/dom.rb +95 -0
  40. data/opal/browser/dom/attribute.rb +19 -0
  41. data/opal/browser/dom/builder.rb +97 -0
  42. data/opal/browser/dom/cdata.rb +9 -0
  43. data/opal/browser/dom/character_data.rb +37 -0
  44. data/opal/browser/dom/comment.rb +9 -0
  45. data/opal/browser/dom/compatibility.rb +8 -0
  46. data/opal/browser/dom/document.rb +83 -0
  47. data/opal/browser/dom/document_fragment.rb +7 -0
  48. data/opal/browser/dom/element.rb +290 -0
  49. data/opal/browser/dom/element/input.rb +17 -0
  50. data/opal/browser/dom/element/offset.rb +67 -0
  51. data/opal/browser/dom/element/position.rb +37 -0
  52. data/opal/browser/dom/element/scroll.rb +49 -0
  53. data/opal/browser/dom/event.rb +240 -0
  54. data/opal/browser/dom/event/animation.rb +26 -0
  55. data/opal/browser/dom/event/audio_processing.rb +31 -0
  56. data/opal/browser/dom/event/base.rb +207 -0
  57. data/opal/browser/dom/event/before_unload.rb +13 -0
  58. data/opal/browser/dom/event/clipboard.rb +26 -0
  59. data/opal/browser/dom/event/close.rb +35 -0
  60. data/opal/browser/dom/event/composition.rb +38 -0
  61. data/opal/browser/dom/event/custom.rb +30 -0
  62. data/opal/browser/dom/event/device_light.rb +21 -0
  63. data/opal/browser/dom/event/device_motion.rb +38 -0
  64. data/opal/browser/dom/event/device_orientation.rb +36 -0
  65. data/opal/browser/dom/event/device_proximity.rb +31 -0
  66. data/opal/browser/dom/event/drag.rb +113 -0
  67. data/opal/browser/dom/event/focus.rb +23 -0
  68. data/opal/browser/dom/event/gamepad.rb +47 -0
  69. data/opal/browser/dom/event/hash_change.rb +26 -0
  70. data/opal/browser/dom/event/keyboard.rb +93 -0
  71. data/opal/browser/dom/event/message.rb +50 -0
  72. data/opal/browser/dom/event/mouse.rb +253 -0
  73. data/opal/browser/dom/event/page_transition.rb +21 -0
  74. data/opal/browser/dom/event/pop_state.rb +21 -0
  75. data/opal/browser/dom/event/progress.rb +31 -0
  76. data/opal/browser/dom/event/sensor.rb +13 -0
  77. data/opal/browser/dom/event/storage.rb +41 -0
  78. data/opal/browser/dom/event/touch.rb +69 -0
  79. data/opal/browser/dom/event/ui.rb +22 -0
  80. data/opal/browser/dom/event/wheel.rb +49 -0
  81. data/opal/browser/dom/mutation_observer.rb +118 -0
  82. data/opal/browser/dom/node.rb +317 -0
  83. data/opal/browser/dom/node_set.rb +88 -0
  84. data/opal/browser/dom/text.rb +21 -0
  85. data/opal/browser/effects.rb +39 -0
  86. data/opal/browser/event_source.rb +67 -0
  87. data/opal/browser/history.rb +54 -0
  88. data/opal/browser/http.rb +129 -0
  89. data/opal/browser/http/binary.rb +57 -0
  90. data/opal/browser/http/compatibility.rb +1 -0
  91. data/opal/browser/http/headers.rb +90 -0
  92. data/opal/browser/http/parameters.rb +8 -0
  93. data/opal/browser/http/request.rb +331 -0
  94. data/opal/browser/http/response.rb +115 -0
  95. data/opal/browser/immediate.rb +43 -0
  96. data/opal/browser/interval.rb +93 -0
  97. data/opal/browser/location.rb +77 -0
  98. data/opal/browser/navigator.rb +151 -0
  99. data/opal/browser/screen.rb +40 -0
  100. data/opal/browser/socket.rb +115 -0
  101. data/opal/browser/storage.rb +149 -0
  102. data/opal/browser/timeout.rb +60 -0
  103. data/opal/browser/utils.rb +56 -0
  104. data/opal/browser/version.rb +3 -0
  105. data/opal/browser/window.rb +113 -0
  106. data/opal/browser/window/compatibility.rb +3 -0
  107. data/opal/browser/window/scroll.rb +49 -0
  108. data/opal/browser/window/size.rb +35 -0
  109. data/opal/browser/window/view.rb +18 -0
  110. data/spec/dom/builder_spec.rb +69 -0
  111. data/spec/dom/document_spec.rb +40 -0
  112. data/spec/dom/element_spec.rb +46 -0
  113. data/spec/dom/event_spec.rb +127 -0
  114. data/spec/dom/mutation_observer_spec.rb +37 -0
  115. data/spec/dom/node_spec.rb +154 -0
  116. data/spec/dom_spec.rb +13 -0
  117. data/spec/event_source_spec.rb +42 -0
  118. data/spec/history_spec.rb +48 -0
  119. data/spec/http_spec.rb +87 -0
  120. data/spec/immediate_spec.rb +12 -0
  121. data/spec/json2.js +486 -0
  122. data/spec/sizzle.js +5 -0
  123. data/spec/socket_spec.rb +43 -0
  124. data/spec/spec_helper.rb +37 -0
  125. data/spec/storage_spec.rb +26 -0
  126. data/spec/window_spec.rb +10 -0
  127. metadata +240 -0
@@ -0,0 +1,18 @@
1
+ module Browser; class Window
2
+
3
+ class View
4
+ def initialize(window)
5
+ @window = window
6
+ @native = window.to_n
7
+ end
8
+
9
+ def width
10
+ `#@native.innerWidth`
11
+ end
12
+
13
+ def height
14
+ `#@native.innerHeight`
15
+ end
16
+ end
17
+
18
+ end; end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ describe Browser::DOM::Builder do
4
+ it 'builds an element' do
5
+ DOM {
6
+ div
7
+ }.name.should == 'DIV'
8
+ end
9
+
10
+ it 'builds an element with text content' do
11
+ DOM {
12
+ div "foo bar"
13
+ }.text.should == "foo bar"
14
+
15
+ DOM {
16
+ div {
17
+ "foo bar"
18
+ }
19
+ }.text.should == "foo bar"
20
+ end
21
+
22
+ it 'builds an element with attributes' do
23
+ DOM {
24
+ div class: :wut
25
+ }.class_name.should == :wut
26
+ end
27
+
28
+ it 'builds deeper trees' do
29
+ res = DOM {
30
+ div {
31
+ span {
32
+ "wut"
33
+ }
34
+ }
35
+ }
36
+
37
+ res.name.should == 'DIV'
38
+ res.child.name.should == 'SPAN'
39
+ res.child.text.should == 'wut'
40
+ end
41
+
42
+ it 'sets classes with methods' do
43
+ DOM {
44
+ div.nice.element
45
+ }.class_names.should == %w[nice element]
46
+ end
47
+
48
+ it 'nests when setting classes' do
49
+ res = DOM {
50
+ div.nice.element {
51
+ span.nicer 'lol'
52
+ }
53
+ }
54
+
55
+ res.name.should == 'DIV'
56
+ res.class_names.should == %w[nice element]
57
+ res.child.name.should == 'SPAN'
58
+ res.child.class_names.should == %w[nicer]
59
+ end
60
+
61
+ it 'joins class name properly' do
62
+ res = DOM {
63
+ i.icon[:legal]
64
+ }
65
+
66
+ res.name.should == 'I'
67
+ res.class_names.should == %w[icon-legal]
68
+ end
69
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Browser::DOM::Document do
4
+ describe '#title' do
5
+ it 'should get the document title' do
6
+ $document.title.should be_kind_of(String)
7
+ end
8
+ end
9
+
10
+ describe '#title=' do
11
+ it 'should set the document title' do
12
+ old = $document.title
13
+ $document.title = 'lol'
14
+ $document.title.should == 'lol'
15
+ $document.title = old
16
+ end
17
+ end
18
+
19
+ describe "#[]" do
20
+ html <<-HTML
21
+ <div id="lol"></div>
22
+ HTML
23
+
24
+ it "should get element by id" do
25
+ $document["lol"].should == `#{$document.to_n}.getElementById('lol')`
26
+ end
27
+
28
+ it "should get element by css" do
29
+ $document["lol"].should == `#{$document.to_n}.getElementById('lol')`
30
+ end
31
+
32
+ it "should get element by xpath" do
33
+ $document["//*[@id='lol']"].should == `#{$document.to_n}.getElementById('lol')`
34
+ end
35
+
36
+ it "should return nil if it can't find anything" do
37
+ $document["doo-dah"].should be_nil
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Browser::DOM::Element do
4
+ describe '#id' do
5
+ html <<-HTML
6
+ <div id="lol"></div>
7
+ HTML
8
+
9
+ it 'gets the proper id' do
10
+ $document["lol"].id.should == 'lol'
11
+ end
12
+ end
13
+
14
+ describe '#class_names' do
15
+ html <<-HTML
16
+ <div id="class-names">
17
+ <div id="class-names-1" class="a b c"></div>
18
+ <div id="class-names-2" class=""></div>
19
+ </div>
20
+ HTML
21
+
22
+ it 'gives an empty array when no class is set' do
23
+ $document["class-names-2"].class_names.should == []
24
+ end
25
+
26
+ it 'gives an array of class names' do
27
+ $document["class-names-1"].class_names.should == %w[a b c]
28
+ end
29
+ end
30
+
31
+ describe '#matches?' do
32
+ html <<-HTML
33
+ <div id="matches" class="not me">
34
+ <span class="yes me"></span>
35
+ </div>
36
+ HTML
37
+
38
+ it 'matches on class and id' do
39
+ $document[:matches].matches?('#matches.not.me').should be_truthy
40
+ end
41
+
42
+ it 'matches on class and name' do
43
+ $document[:matches].first_element_child.matches?('span.yes').should be_truthy
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,127 @@
1
+ require 'spec_helper'
2
+
3
+ describe Browser::DOM::Event do
4
+ html <<-HTML
5
+ <div id="event-spec">
6
+ u wot m8
7
+ </div>
8
+ HTML
9
+
10
+ describe "#on" do
11
+ it "properly registers an event" do
12
+ count = 0
13
+ elem = $document["event-spec"]
14
+
15
+ elem.on :click do |event|
16
+ count += 1
17
+ end
18
+
19
+ count.should == 0
20
+ elem.trigger :click
21
+ count.should == 1
22
+ elem.trigger :click
23
+ count.should == 2
24
+ elem.trigger 'mouse:down'
25
+ count.should == 2
26
+ end
27
+
28
+ it "listens for custom events" do
29
+ count = 0
30
+ elem = $document["event-spec"]
31
+
32
+ elem.on :huehue do
33
+ count += 1
34
+ end
35
+
36
+ count.should == 0
37
+ elem.trigger :huehue
38
+ count.should == 1
39
+ elem.trigger :huehue
40
+ count.should == 2
41
+ end
42
+
43
+ async "passes an event to the handler" do
44
+ elem = $document["event-spec"]
45
+
46
+ elem.on :click do |event|
47
+ run_async {
48
+ event.should be_kind_of Browser::DOM::Event
49
+ }
50
+ end
51
+
52
+ elem.trigger :click
53
+ end
54
+
55
+ async "passes additional arguments to the handler" do
56
+ elem = $document["event-spec"]
57
+
58
+ elem.on :bazinga do |event, foo, bar, baz|
59
+ run_async {
60
+ foo.should == 1
61
+ bar.should == 2
62
+ baz.should == 3
63
+ }
64
+ end
65
+
66
+ elem.trigger :bazinga, 1, 2, 3
67
+ end
68
+
69
+ async "works with deferred elements" do
70
+ elem = $document["event-spec"]
71
+
72
+ elem.on :bazinga, 'span.nami' do
73
+ run_async {
74
+ true.should be_truthy
75
+ }
76
+ end
77
+
78
+ elem.add_child DOM { span.nami }
79
+
80
+ after 0.01 do
81
+ elem.first_element_child.trigger :bazinga
82
+ end
83
+ end
84
+ end
85
+
86
+ describe "#off" do
87
+ it "removes all the handlers that were added" do
88
+ count = 0
89
+ elem = $document["event-spec"]
90
+
91
+ elem.on :click do
92
+ count += 1
93
+ end
94
+
95
+ elem.on :click do
96
+ count += 1
97
+ end
98
+
99
+ elem.trigger :click
100
+ count.should == 2
101
+
102
+ elem.off :click
103
+ elem.trigger :click
104
+ count.should == 2
105
+ end
106
+
107
+ it "removes only the passed handler" do
108
+ count = 0
109
+ elem = $document["event-spec"]
110
+
111
+ cb = elem.on :click do
112
+ count += 1
113
+ end
114
+
115
+ elem.on :click do
116
+ count += 1
117
+ end
118
+
119
+ elem.trigger :click
120
+ count.should == 2
121
+
122
+ cb.off
123
+ elem.trigger :click
124
+ count.should == 3
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Browser::DOM::MutationObserver do
4
+ html <<-HTML
5
+ <div id="mutate">
6
+ <span></span>
7
+ </div>
8
+ HTML
9
+
10
+ async 'notifies additions' do
11
+ obs = Browser::DOM::MutationObserver.new {|mutations|
12
+ run_async {
13
+ mutations.first.added.first.name.should == 'DIV'
14
+ }
15
+
16
+ obs.disconnect
17
+ }
18
+
19
+ obs.observe $document[:mutate]
20
+
21
+ $document[:mutate].add_child $document.create_element('div')
22
+ end
23
+
24
+ async 'notifies removals' do
25
+ obs = Browser::DOM::MutationObserver.new {|mutations|
26
+ run_async {
27
+ mutations.first.removed.first.name.should == 'SPAN'
28
+ }
29
+
30
+ obs.disconnect
31
+ }
32
+
33
+ obs.observe $document[:mutate]
34
+
35
+ $document[:mutate].first_element_child.remove
36
+ end
37
+ end
@@ -0,0 +1,154 @@
1
+ require 'spec_helper'
2
+
3
+ describe Browser::DOM::Node do
4
+ describe "#==" do
5
+ html '<div id="lol"></div>'
6
+
7
+ it 'should work when the other argument is the native counterpart' do
8
+ $document["lol"].should == `document.getElementById("lol")`
9
+ end
10
+
11
+ it 'should work when the other argument is the same DOM::Node' do
12
+ el = $document["lol"]
13
+ el.should == el
14
+ end
15
+
16
+ it 'should work when the other argument is another DOM::Node' do
17
+ $document["lol"].should == $document["lol"]
18
+ end
19
+ end
20
+
21
+ describe "#document?" do
22
+ it "should be true for document" do
23
+ $document.document?.should be_truthy
24
+ end
25
+ end
26
+
27
+ describe "#element?" do
28
+ html '<div id="lol"></div>'
29
+
30
+ it "should be true for <div id='lol'>" do
31
+ $document["#lol"].element?.should be_truthy
32
+ end
33
+ end
34
+
35
+ describe "#text?" do
36
+ html '<div id="omg">lol</div>'
37
+
38
+ it "should be true for the first child of <div id='lol'>" do
39
+ $document["#omg"].child.text?.should be_truthy
40
+ end
41
+ end
42
+
43
+ describe "#ancestors" do
44
+ html <<-HTML
45
+ <div><span><strong><em id="incest"></em></strong></span></div>
46
+ HTML
47
+
48
+ it 'should get all ancestors' do
49
+ ancestors = $document["incest"].ancestors
50
+
51
+ ancestors[0].name.should == 'STRONG'
52
+ ancestors[1].name.should == 'SPAN'
53
+ ancestors[2].name.should == 'DIV'
54
+ end
55
+
56
+ it 'should get only the selected ancestors' do
57
+ $document["incest"].ancestors('strong').length.should == 1
58
+ end
59
+ end
60
+
61
+ describe '#child' do
62
+ html <<-HTML
63
+ <div id="test-1"><div id="test-2"></div></div>
64
+ HTML
65
+
66
+ it 'gets the first child properly' do
67
+ $document["test-1"].child.id.should == "test-2"
68
+ end
69
+
70
+ it 'returns nil if there is no child' do
71
+ $document["test-2"].child.should be_nil
72
+ end
73
+ end
74
+
75
+ describe '#next' do
76
+ html <<-HTML
77
+ <div id="spec-1"></div>
78
+ <div id="spec-2"></div>
79
+ <div id="spec-3"></div>
80
+ HTML
81
+
82
+ it 'should return the next sibling' do
83
+ $document["spec-1"].next.text?.should be_truthy
84
+ $document["spec-1"].next.next.id.should == 'spec-2'
85
+ end
86
+
87
+ it 'should return nil when there is no next sibling' do
88
+ $document["spec-3"].next.text?.should be_truthy
89
+ $document["spec-3"].next.next.should be_nil
90
+ end
91
+ end
92
+
93
+ describe '#next_element' do
94
+ html <<-HTML
95
+ <div id="spec-1"></div>
96
+ <div id="spec-2"></div>
97
+ <div id="spec-3"></div>
98
+ HTML
99
+
100
+ it 'should return the next element sibling' do
101
+ $document["spec-1"].next_element.id.should == 'spec-2'
102
+ $document["spec-2"].next_element.id.should == 'spec-3'
103
+ end
104
+
105
+ it 'should return nil when there is no next element sibling' do
106
+ $document["spec-3"].next_element.should be_nil
107
+ end
108
+ end
109
+
110
+ describe '#previous' do
111
+ html <<-HTML
112
+ <div id="spec-1"></div>
113
+ <div id="spec-2"></div>
114
+ <div id="spec-3"></div>
115
+ HTML
116
+
117
+ it 'should return the previous sibling' do
118
+ $document["spec-2"].previous.text?.should be_truthy
119
+ $document["spec-2"].previous.previous.id.should == 'spec-1'
120
+ end
121
+
122
+ it 'should return nil when there is no previous sibling' do
123
+ $document["spec-1"].previous.text?.should be_truthy
124
+ $document["spec-1"].previous.previous.should be_nil
125
+ end
126
+ end
127
+
128
+ describe '#previous_element' do
129
+ html <<-HTML
130
+ <div id="spec-1"></div>
131
+ <div id="spec-2"></div>
132
+ <div id="spec-3"></div>
133
+ HTML
134
+
135
+ it 'should return the previous element sibling' do
136
+ $document["spec-2"].previous_element.id.should == 'spec-1'
137
+ $document["spec-3"].previous_element.id.should == 'spec-2'
138
+ end
139
+
140
+ it 'should return nil when there is no previous element sibling' do
141
+ $document["spec-1"].previous_element.should be_nil
142
+ end
143
+ end
144
+
145
+ describe '#inner_text' do
146
+ html <<-HTML
147
+ <div id="inner"><span>I like trains.</span> <span>And turtles.</span></div>
148
+ HTML
149
+
150
+ it 'should get the whole text for elements' do
151
+ $document["inner"].inner_text.should == "I like trains. And turtles."
152
+ end
153
+ end
154
+ end