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,88 @@
1
+ module Browser; module DOM
2
+
3
+ class NodeSet
4
+ attr_reader :document
5
+
6
+ def initialize(document, list = [])
7
+ @document = document
8
+ @literal = []
9
+
10
+ list.each {|el|
11
+ if NodeSet === el
12
+ @literal.concat(el.to_a)
13
+ else
14
+ @literal.push DOM(Native.convert(el))
15
+ end
16
+ }
17
+ end
18
+
19
+ def method_missing(name, *args, &block)
20
+ unless @literal.respond_to? name
21
+ each {|el|
22
+ el.__send__(name, *args, &block)
23
+ }
24
+
25
+ return self
26
+ end
27
+
28
+ result = @literal.__send__ name, *args, &block
29
+
30
+ if `result === #@literal`
31
+ self
32
+ elsif Array === result
33
+ NodeSet.new(@document, result)
34
+ else
35
+ result
36
+ end
37
+ end
38
+
39
+ def dup
40
+ NodeSet.new(document, to_ary.dup)
41
+ end
42
+
43
+ def filter(expression)
44
+ NodeSet.new(document, @literal.select { |node| node.matches?(expression) })
45
+ end
46
+
47
+ def after(node)
48
+ last.after node
49
+ end
50
+
51
+ def at(path)
52
+ raise NotImplementedError
53
+ end
54
+
55
+ def at_css(*rules)
56
+ raise NotImplementedError
57
+ end
58
+
59
+ def at_xpath(*paths)
60
+ raise NotImplementedError
61
+ end
62
+
63
+ def before
64
+ first.before
65
+ end
66
+
67
+ def children
68
+ result = NodeSet.new(document)
69
+
70
+ each { |n| result.concat(n.children) }
71
+
72
+ result
73
+ end
74
+
75
+ def css(*paths)
76
+ raise NotImplementedError
77
+ end
78
+
79
+ def search(*what)
80
+ map { |n| n.search(*what) }.flatten.uniq
81
+ end
82
+
83
+ def inspect
84
+ "#<DOM::NodeSet: #{@literal.inspect[1 .. -2]}"
85
+ end
86
+ end
87
+
88
+ end; end
@@ -0,0 +1,21 @@
1
+ module Browser; module DOM
2
+
3
+ class Text < CharacterData
4
+ def self.create(*args)
5
+ $document.create_text(*args)
6
+ end
7
+
8
+ def whole
9
+ `#@native.wholeText`
10
+ end
11
+
12
+ def split(offset)
13
+ `#@native.splitText(offset)`
14
+ end
15
+
16
+ def inspect
17
+ "#<DOM::Text: #{data}>"
18
+ end
19
+ end
20
+
21
+ end; end
@@ -0,0 +1,39 @@
1
+ module Browser; module DOM
2
+
3
+ class Document < Element
4
+ def active_element
5
+ DOM(`#@native.activeElement`)
6
+ end
7
+ end
8
+
9
+ class Element
10
+ def show(what = :block)
11
+ style[:display] = what
12
+ end
13
+
14
+ def hide
15
+ style[:display] = :none
16
+ end
17
+
18
+ def toggle
19
+ if style![:display] == :none
20
+ show
21
+ else
22
+ hide
23
+ end
24
+ end
25
+
26
+ def focus
27
+ `#@native.focus()`
28
+ end
29
+
30
+ def blur
31
+ `#@native.blur()`
32
+ end
33
+
34
+ def focused?
35
+ `#@native.hasFocus`
36
+ end
37
+ end
38
+
39
+ end; end
@@ -0,0 +1,67 @@
1
+ module Browser
2
+
3
+ # This class wraps `EventSource`.
4
+ class EventSource
5
+ def self.supported?
6
+ defined? `window.EventSource`
7
+ end
8
+
9
+ include Native
10
+ include DOM::Event::Target
11
+
12
+ target {|value|
13
+ EventSource.new(value) if Native.is_a?(value, `window.EventSource`)
14
+ }
15
+
16
+ # Create an {EventSource} on the given path.
17
+ #
18
+ # @param path [String] the path to use as source
19
+ # @yield if the block has no parameters it's instance_exec'd, otherwise it's
20
+ # called with self
21
+ def initialize(path, &block)
22
+ if native?(path)
23
+ super(path)
24
+ else
25
+ super(`new window.EventSource(path)`)
26
+ end
27
+
28
+ if block.arity == 0
29
+ instance_exec(&block)
30
+ else
31
+ block.call(self)
32
+ end if block
33
+ end
34
+
35
+ # @!attribute [r] url
36
+ # @return [String] the URL of the event source
37
+ alias_native :url
38
+
39
+ # @!attribute [r] state
40
+ # @return [:connecting, :open, :closed] the state of the event source
41
+ def state
42
+ %x{
43
+ switch (#@native.readyState) {
44
+ case window.EventSource.CONNECTING:
45
+ return "connecting";
46
+
47
+ case window.EventSource.OPEN:
48
+ return "open";
49
+
50
+ case window.EventSource.CLOSED:
51
+ return "closed";
52
+ }
53
+ }
54
+ end
55
+
56
+ # Check if the event source is alive.
57
+ def alive?
58
+ state == :open
59
+ end
60
+
61
+ # Close the event source.
62
+ def close
63
+ `#@native.close()`
64
+ end
65
+ end
66
+
67
+ end
@@ -0,0 +1,54 @@
1
+ require 'browser/location'
2
+
3
+ module Browser
4
+
5
+ class History
6
+ include Native
7
+
8
+ alias_native :length
9
+
10
+ def back(number = 1)
11
+ `#@native.go(-number)`
12
+
13
+ self
14
+ end
15
+
16
+ def forward(number = 1)
17
+ `#@native.go(number)`
18
+
19
+ self
20
+ end
21
+
22
+ def push(url, data = nil)
23
+ data = `null` if data.nil?
24
+
25
+ `#@native.pushState(data, null, url)`
26
+
27
+ self
28
+ end
29
+
30
+ def replace(url, data = nil)
31
+ data = `null` if data.nil?
32
+
33
+ `#@native.replaceState(data, null, url)`
34
+ end
35
+
36
+ def current
37
+ $window.location.path
38
+ end
39
+
40
+ def state
41
+ `#@native.state`
42
+ end
43
+ end
44
+
45
+ class Window
46
+ # Get the {History} object for this window.
47
+ #
48
+ # @return [History]
49
+ def history
50
+ History.new(`#@native.history`) if `#@native.history`
51
+ end
52
+ end
53
+
54
+ end
@@ -0,0 +1,129 @@
1
+ require 'promise'
2
+
3
+ require 'browser/http/binary'
4
+ require 'browser/http/headers'
5
+ require 'browser/http/request'
6
+ require 'browser/http/response'
7
+ require 'browser/http/compatibility'
8
+
9
+ module Browser
10
+
11
+ module HTTP
12
+ # Send an asynchronous request.
13
+ #
14
+ # @param method [Symbol] the HTTP method to use
15
+ # @param url [String] the URL to request
16
+ # @param data [String, Hash] the data to send
17
+ # @return [Response] the response
18
+ def self.send(method, url, data = nil, &block)
19
+ Promise.new.tap {|promise|
20
+ Request.new(&block).tap {|req|
21
+ req.on :success do |res|
22
+ promise.resolve(res)
23
+ end
24
+
25
+ req.on :failure do |res|
26
+ promise.reject(res)
27
+ end
28
+ }.open(method, url).send(data)
29
+ }
30
+ end
31
+
32
+ # Send an asynchronous GET request.
33
+ #
34
+ # @param url [String] the URL to request
35
+ # @return [Response] the response
36
+ def self.get(url, &block)
37
+ send(:get, url, &block)
38
+ end
39
+
40
+ # Send an asynchronous HEAD request.
41
+ #
42
+ # @param url [String] the URL to request
43
+ # @return [Response] the response
44
+ def self.head(url, &block)
45
+ send(:head, url, &block)
46
+ end
47
+
48
+ # Send an asynchrnous POST request.
49
+ #
50
+ # @param url [String] the URL to request
51
+ # @param data [String, Hash] the data to send
52
+ # @return [Response] the response
53
+ def self.post(url, data = nil, &block)
54
+ send(:post, url, data, &block)
55
+ end
56
+
57
+ # Send an asynchronous PUT request.
58
+ #
59
+ # @param url [String] the URL to request
60
+ # @param data [String, Hash] the data to send
61
+ # @return [Response] the response
62
+ def self.put(url, data = nil, &block)
63
+ send(:put, url, data, &block)
64
+ end
65
+
66
+ # Send an asynchronous DELETE request.
67
+ #
68
+ # @param url [String] the URL to request
69
+ # @param data [String, Hash] the data to send
70
+ # @return [Response] the response
71
+ def self.delete(url, data = nil, &block)
72
+ send(:delete, url, data, &block)
73
+ end
74
+
75
+ # Send a synchronous request.
76
+ #
77
+ # @param method [Symbol] the HTTP method to use
78
+ # @param url [String] the URL to request
79
+ # @param data [String, Hash] the data to send
80
+ # @return [Response] the response
81
+ def self.send!(method, url, data = nil, &block)
82
+ Request.new(&block).open(method, url, false).send(data)
83
+ end
84
+
85
+ # Send a synchronous GET request.
86
+ #
87
+ # @param url [String] the URL to request
88
+ # @return [Response] the response
89
+ def self.get!(url, &block)
90
+ send!(:get, url, &block)
91
+ end
92
+
93
+ # Send a synchronous HEAD request.
94
+ #
95
+ # @param url [String] the URL to request
96
+ # @return [Response] the response
97
+ def self.head!(url, &block)
98
+ send!(:head, url, &block)
99
+ end
100
+
101
+ # Send a synchronous POST request.
102
+ #
103
+ # @param url [String] the URL to request
104
+ # @param data [String, Hash] the data to send
105
+ # @return [Response] the response
106
+ def self.post!(url, data = nil, &block)
107
+ send!(:post, url, data, &block)
108
+ end
109
+
110
+ # Send a synchronous PUT request.
111
+ #
112
+ # @param url [String] the URL to request
113
+ # @param data [String, Hash] the data to send
114
+ # @return [Response] the response
115
+ def self.put!(url, data = nil, &block)
116
+ send!(:put, url, data, &block)
117
+ end
118
+
119
+ # Send a synchronous DELETE request.
120
+ #
121
+ # @param url [String] the URL to request
122
+ # @param data [String, Hash] the data to send
123
+ # @return [Response] the response
124
+ def self.delete!(url, data = nil, &block)
125
+ send!(:delete, url, data, &block)
126
+ end
127
+ end
128
+
129
+ end
@@ -0,0 +1,57 @@
1
+ module Browser; module HTTP
2
+
3
+ # Represents a binary result from a HTTP response.
4
+ class Binary
5
+ # @!attribute [r] type
6
+ # @return [:string, :buffer] the type of binary
7
+ attr_reader :type
8
+
9
+ # Create a binary from a value.
10
+ #
11
+ # @param value [String, Buffer] the binary
12
+ def initialize(value)
13
+ if String === value
14
+ @type = :string
15
+ @data = value
16
+ else
17
+ @type = :buffer
18
+ @data = value.to_a
19
+ end
20
+ end
21
+
22
+ include Enumerable
23
+
24
+ # Iterate over each byte in the binary.
25
+ #
26
+ # @yield [byte] the byte
27
+ # @return [self]
28
+ def each(&block)
29
+ return enum_for :each unless block
30
+
31
+ index = 0
32
+ length = self.length
33
+
34
+ while index < length
35
+ block.call(self[index])
36
+
37
+ index += 1
38
+ end
39
+
40
+ self
41
+ end
42
+
43
+ # Access a byte from the binary.
44
+ #
45
+ # @return [Integer] a byte
46
+ def [](index)
47
+ @type == :string ? `#@data.charCodeAt(index) & 0xff` : @data[index]
48
+ end
49
+
50
+ # @!attribute [r] length
51
+ # @return [Integer] the length of the binary
52
+ def length
53
+ @data.length
54
+ end
55
+ end
56
+
57
+ end; end