opal-browser 0.1.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
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