bowser 0.4.3 → 0.5.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.
- checksums.yaml +4 -4
- data/.travis.yml +4 -9
- data/CHANGELOG.md +7 -0
- data/lib/bowser/version.rb +1 -1
- data/opal/bowser.rb +0 -3
- data/opal/bowser/delegate_native.rb +9 -1
- data/opal/bowser/document.rb +8 -0
- data/opal/bowser/element.rb +57 -4
- data/opal/bowser/event.rb +30 -0
- data/opal/bowser/event_target.rb +10 -0
- data/opal/bowser/file_list.rb +25 -0
- data/opal/bowser/http.rb +30 -0
- data/opal/bowser/http/form_data.rb +4 -0
- data/opal/bowser/http/request.rb +19 -0
- data/opal/bowser/http/response.rb +8 -0
- data/opal/bowser/indexed_db.rb +244 -0
- data/opal/bowser/service_worker.rb +43 -0
- data/opal/bowser/service_worker/cache_storage.rb +49 -0
- data/opal/bowser/service_worker/clients.rb +19 -0
- data/opal/bowser/service_worker/context.rb +71 -0
- data/opal/bowser/service_worker/extendable_event.rb +19 -0
- data/opal/bowser/service_worker/fetch_event.rb +28 -0
- data/opal/bowser/service_worker/promise.rb +101 -0
- data/opal/bowser/service_worker/request.rb +33 -0
- data/opal/bowser/service_worker/response.rb +41 -0
- data/opal/bowser/websocket.rb +18 -0
- data/opal/bowser/window.rb +28 -0
- metadata +13 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8764d8fafbc1b0bceb01df46a44ef1c97957c38
|
4
|
+
data.tar.gz: 0f92be9feadace2fad0b02138476a823e49b440f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d5e3db8ed89a6bd2fcab026ebc4fca1b705d95118c51571e3d5951d831bdbff9cdcc41a2132b2e1e86e71cd26ad4416412a78dede2dbcfc7dea1e68e78c2fc4
|
7
|
+
data.tar.gz: a1da66808e31e6ddca3b7a6de2f39146f14263f782521389eb9be80db57849585634052985e0a2ee0df1645125d674fe4d3c5d4ac0d5471c3f935dca2001e61a
|
data/.travis.yml
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
-
- 2.2
|
4
|
-
- 2.3
|
5
|
-
- 2.4
|
6
|
-
- jruby-9.
|
7
|
-
- jruby-9.1.1.0
|
3
|
+
- 2.2
|
4
|
+
- 2.3
|
5
|
+
- 2.4
|
6
|
+
- jruby-9.1.14.0
|
8
7
|
before_install:
|
9
|
-
- wget https://s3.amazonaws.com/travis-phantomjs/phantomjs-2.0.0-ubuntu-12.04.tar.bz2
|
10
|
-
- tar -xjf phantomjs-2.0.0-ubuntu-12.04.tar.bz2
|
11
|
-
- sudo rm -rf /usr/local/phantomjs/bin/phantomjs
|
12
|
-
- sudo mv phantomjs /usr/local/phantomjs/bin/phantomjs
|
13
8
|
- gem install bundler
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
## Version 0.5.0
|
2
|
+
|
3
|
+
- IndexedDB support (#22)
|
4
|
+
- ServiceWorker support (#5)
|
5
|
+
- Subscript operators (`[]` and `[]=`) to get/set HTML attributes on `Element`
|
6
|
+
- Added `HTTP::Response#ok?` to align with [`Response.ok`](https://developer.mozilla.org/en-US/docs/Web/API/Response/ok)
|
7
|
+
|
1
8
|
## Version 0.3.0
|
2
9
|
|
3
10
|
- Fix bug with falsy JS values as element properties
|
data/lib/bowser/version.rb
CHANGED
data/opal/bowser.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
module Bowser
|
2
2
|
module DelegateNative
|
3
|
-
# Fall back to native properties.
|
3
|
+
# Fall back to native properties. If the message sent to this element is not
|
4
|
+
# recognized, it checks to see if it is a property of the native element. It
|
5
|
+
# also checks for variations of the message name, such as:
|
6
|
+
#
|
7
|
+
# :supported? => [:supported, :isSupported]
|
8
|
+
#
|
9
|
+
# If a property with the specified message name is found and it is a
|
10
|
+
# function, that function is invoked with `args`. Otherwise, the property
|
11
|
+
# is returned as is.
|
4
12
|
def method_missing message, *args, &block
|
5
13
|
property_name = property_for_message(message)
|
6
14
|
property = `#@native[#{property_name}]`
|
data/opal/bowser/document.rb
CHANGED
@@ -11,10 +11,13 @@ module Bowser
|
|
11
11
|
|
12
12
|
module_function
|
13
13
|
|
14
|
+
# @return [Bowser::Element] the body element of the current document
|
14
15
|
def body
|
15
16
|
@body ||= Element.new(`#@native.body`)
|
16
17
|
end
|
17
18
|
|
19
|
+
# @return [Bowser::Element?] the first element that matches the given CSS
|
20
|
+
# selector or `nil` if no elements match
|
18
21
|
def [] css
|
19
22
|
native = `#@native.querySelector(css)`
|
20
23
|
if `#{native} === null`
|
@@ -24,6 +27,10 @@ module Bowser
|
|
24
27
|
end
|
25
28
|
end
|
26
29
|
|
30
|
+
# Create an element of the specified type
|
31
|
+
#
|
32
|
+
# @param type [String] the type of element to create
|
33
|
+
# @example Bowser.document.create_element('div')
|
27
34
|
def create_element type
|
28
35
|
Element.new(`document.createElement(type)`)
|
29
36
|
end
|
@@ -31,6 +38,7 @@ module Bowser
|
|
31
38
|
|
32
39
|
module_function
|
33
40
|
|
41
|
+
# @return [Document] the browser's document object
|
34
42
|
def document
|
35
43
|
Document
|
36
44
|
end
|
data/opal/bowser/element.rb
CHANGED
@@ -3,6 +3,7 @@ require 'bowser/file_list'
|
|
3
3
|
require 'bowser/delegate_native'
|
4
4
|
|
5
5
|
module Bowser
|
6
|
+
# Wrap a native DOM element
|
6
7
|
class Element
|
7
8
|
include EventTarget
|
8
9
|
include DelegateNative
|
@@ -23,23 +24,37 @@ module Bowser
|
|
23
24
|
element
|
24
25
|
end
|
25
26
|
|
27
|
+
# @param native [JS] The native DOM element to wrap
|
26
28
|
def initialize native
|
27
29
|
@native = native
|
28
30
|
end
|
29
31
|
|
30
|
-
|
32
|
+
# Replace all child elements with the given element
|
33
|
+
#
|
34
|
+
# @param element [Bowser::Element] The Bowser element with which to replace
|
35
|
+
# this element's contents
|
36
|
+
def inner_dom= element
|
31
37
|
clear
|
32
|
-
append
|
38
|
+
append element
|
33
39
|
end
|
34
40
|
|
41
|
+
# The contents of this element as an HTML string
|
42
|
+
#
|
43
|
+
# @return [String] the HTML representation of this element's contents
|
35
44
|
def inner_html
|
36
45
|
`#@native.innerHTML`
|
37
46
|
end
|
38
47
|
|
48
|
+
# Use the supplied HTML string to replace this element's contents
|
49
|
+
#
|
50
|
+
# @param html [String] the HTML with which to replace this elements contents
|
39
51
|
def inner_html= html
|
40
52
|
`#@native.innerHTML = html`
|
41
53
|
end
|
42
54
|
|
55
|
+
# This element's direct child elements
|
56
|
+
#
|
57
|
+
# @return [Array<Bowser::Element>] list of this element's children
|
43
58
|
def children
|
44
59
|
elements = []
|
45
60
|
|
@@ -53,10 +68,17 @@ module Bowser
|
|
53
68
|
elements
|
54
69
|
end
|
55
70
|
|
71
|
+
# Determine whether this element has any contents
|
72
|
+
#
|
73
|
+
# @return [Boolean] true if the element has no children, false otherwise
|
56
74
|
def empty?
|
57
75
|
`#@native.children.length === 0`
|
58
76
|
end
|
59
77
|
|
78
|
+
# Remove all contents from this element. After this call, `empty?` will
|
79
|
+
# return `true`.
|
80
|
+
#
|
81
|
+
# @return [Bowser::Element] self
|
60
82
|
def clear
|
61
83
|
if %w(input textarea).include? type
|
62
84
|
`#@native.value = null`
|
@@ -69,29 +91,49 @@ module Bowser
|
|
69
91
|
self
|
70
92
|
end
|
71
93
|
|
94
|
+
# Remove the specified child element
|
95
|
+
#
|
96
|
+
# @param child [Bowser::Element] the child element to remove
|
72
97
|
def remove_child child
|
73
98
|
`#@native.removeChild(child['native'] ? child['native'] : child)`
|
74
99
|
end
|
75
100
|
|
101
|
+
# This element's type. For example: "div", "span", "p"
|
102
|
+
#
|
103
|
+
# @return [String] the HTML tag name for this element
|
76
104
|
def type
|
77
105
|
`#@native.nodeName`.downcase
|
78
106
|
end
|
79
107
|
|
108
|
+
# Append the specified element as a child element
|
109
|
+
#
|
110
|
+
# @param element [Bowser::Element, JS] the element to insert
|
80
111
|
def append node
|
81
112
|
`#@native.appendChild(node['native'] ? node['native'] : node)`
|
82
113
|
self
|
83
114
|
end
|
84
115
|
|
85
|
-
#
|
116
|
+
# Methods for <input /> elements
|
117
|
+
|
118
|
+
# A checkbox's checked status
|
119
|
+
#
|
120
|
+
# @return [Boolean] true if the checkbox is checked, false otherwise
|
86
121
|
def checked?
|
87
122
|
`!!#@native.checked`
|
88
123
|
end
|
89
124
|
|
90
|
-
#
|
125
|
+
# Get the currently selected file for this input. This is only useful for
|
126
|
+
# file inputs without the `multiple` property set.
|
127
|
+
#
|
128
|
+
# @return [Bowser::File] the file selected by the user
|
91
129
|
def file
|
92
130
|
files.first
|
93
131
|
end
|
94
132
|
|
133
|
+
# Get the currently selected files for this input. This is only useful for
|
134
|
+
# file inputs with the `multiple` property set.
|
135
|
+
#
|
136
|
+
# @return [Bowser::FileList] the currently selected files for this input
|
95
137
|
def files
|
96
138
|
FileList.new(`#@native.files`)
|
97
139
|
end
|
@@ -100,6 +142,17 @@ module Bowser
|
|
100
142
|
`#@native === #{other.to_n}`
|
101
143
|
end
|
102
144
|
|
145
|
+
def []= attribute, value
|
146
|
+
`#@native.setAttribute(#{attribute}, #{value})`
|
147
|
+
end
|
148
|
+
|
149
|
+
def [] attribute
|
150
|
+
`#@native.getAttribute(#{attribute})`
|
151
|
+
end
|
152
|
+
|
153
|
+
# The native representation of this element.
|
154
|
+
#
|
155
|
+
# @return [JS] the native element wrapped by this object.
|
103
156
|
def to_n
|
104
157
|
@native
|
105
158
|
end
|
data/opal/bowser/event.rb
CHANGED
@@ -1,47 +1,76 @@
|
|
1
1
|
module Bowser
|
2
|
+
# Wrapper for JS events
|
2
3
|
class Event
|
4
|
+
# @param [JS] the native event to wrap
|
3
5
|
def initialize native
|
4
6
|
@native = native
|
5
7
|
end
|
6
8
|
|
9
|
+
# Prevent the runtime from executing this event's default behavior. For
|
10
|
+
# example, prevent navigation after clicking a link.
|
11
|
+
#
|
12
|
+
# @return [Bowser::Event] self
|
7
13
|
def prevent
|
8
14
|
`#@native.preventDefault()`
|
9
15
|
self
|
10
16
|
end
|
11
17
|
|
18
|
+
# Prevent the runtime from bubbling this event up the hierarchy. This is
|
19
|
+
# typically used to keep an event local to the element on which it was
|
20
|
+
# triggered, such as keeping a click event on a button from unintentionally
|
21
|
+
# triggering a handler on a parent element.
|
22
|
+
#
|
23
|
+
# @return self
|
12
24
|
def stop_propagation
|
13
25
|
`#@native.stopPropagation()`
|
14
26
|
self
|
15
27
|
end
|
16
28
|
|
29
|
+
# @return [Boolean] true if `prevent` has been called on this event, false
|
30
|
+
# otherwise
|
17
31
|
def prevented?
|
18
32
|
`#@native.defaultPrevented`
|
19
33
|
end
|
20
34
|
|
35
|
+
# @return [Boolean] true if the Meta/Command/Windows key was pressed when
|
36
|
+
# this event fired, false otherwise
|
21
37
|
def meta?
|
22
38
|
`#@native.metaKey`
|
23
39
|
end
|
24
40
|
|
41
|
+
# @return [Boolean] true if the Shift key was pressed when this event fired,
|
42
|
+
# false otherwise
|
25
43
|
def shift?
|
26
44
|
`#@native.shiftKey`
|
27
45
|
end
|
28
46
|
|
47
|
+
# @return [Boolean] true if the Ctrl key was pressed when this event fired,
|
48
|
+
# false otherwise
|
29
49
|
def ctrl?
|
30
50
|
`#@native.ctrlKey`
|
31
51
|
end
|
32
52
|
|
53
|
+
# @return [Boolean] true if the Alt key was pressed when this event fired,
|
54
|
+
# false otherwise
|
33
55
|
def alt?
|
34
56
|
`#@native.altKey`
|
35
57
|
end
|
36
58
|
|
59
|
+
# The target for this event
|
60
|
+
#
|
61
|
+
# @return [Bowser::Element] the element on which this event was triggered
|
62
|
+
# @todo Handle non-DOM events here
|
37
63
|
def target
|
38
64
|
Element.new(`#@native.target`)
|
39
65
|
end
|
40
66
|
|
67
|
+
# @return [Numeric] the key code associated with this event. Only useful for
|
68
|
+
# keyboard-based events.
|
41
69
|
def code
|
42
70
|
`#@native.keyCode`
|
43
71
|
end
|
44
72
|
|
73
|
+
# Return properties on the event not covered by Ruby methods.
|
45
74
|
def method_missing name, *args
|
46
75
|
property = name.gsub(/_[a-z]/) { |match| match[-1, 1].upcase }
|
47
76
|
value = `#@native[property]`
|
@@ -55,6 +84,7 @@ module Bowser
|
|
55
84
|
end
|
56
85
|
end
|
57
86
|
|
87
|
+
# @return [JS] the native event wrapped by this object.
|
58
88
|
def to_n
|
59
89
|
@native
|
60
90
|
end
|
data/opal/bowser/event_target.rb
CHANGED
@@ -2,6 +2,12 @@ require 'bowser/event'
|
|
2
2
|
|
3
3
|
module Bowser
|
4
4
|
module EventTarget
|
5
|
+
# Add the block as a handler for the specified event name. Will use either
|
6
|
+
# `addEventListener` or `addListener` if they exist.
|
7
|
+
#
|
8
|
+
# @param event_name [String] the name of the event
|
9
|
+
# @return [Proc] the block to pass to `off` to remove this handler
|
10
|
+
# @yieldparam event [Bowser::Event] the event object
|
5
11
|
def on event_name, &block
|
6
12
|
wrapper = proc { |event| block.call Event.new(event) }
|
7
13
|
|
@@ -16,6 +22,10 @@ module Bowser
|
|
16
22
|
wrapper
|
17
23
|
end
|
18
24
|
|
25
|
+
# Remove an event handler
|
26
|
+
#
|
27
|
+
# @param event_name [String] the name of the event
|
28
|
+
# @block the handler to remove, as returned from `on`
|
19
29
|
def off event_name, &block
|
20
30
|
if `#@native.removeEventListener !== undefined`
|
21
31
|
`#@native.removeEventListener(event_name, block)`
|
data/opal/bowser/file_list.rb
CHANGED
@@ -5,6 +5,7 @@ module Bowser
|
|
5
5
|
class FileList
|
6
6
|
include Enumerable
|
7
7
|
|
8
|
+
# @param native [JS] the native FileList object to wrap
|
8
9
|
def initialize native
|
9
10
|
@native = `#{native} || []`
|
10
11
|
@files = length.times.each_with_object([]) { |index, array|
|
@@ -12,54 +13,72 @@ module Bowser
|
|
12
13
|
}
|
13
14
|
end
|
14
15
|
|
16
|
+
# @param index [Integer] the index of the file in the list
|
17
|
+
# @return [Bowser::FileList::File] the file at the specified index
|
15
18
|
def [] index
|
16
19
|
@files[index]
|
17
20
|
end
|
18
21
|
|
22
|
+
# @return [Integer] the number of files in this list
|
19
23
|
def length
|
20
24
|
`#@native.length`
|
21
25
|
end
|
22
26
|
alias size length
|
23
27
|
|
28
|
+
# Call the given block for each file in the list
|
29
|
+
#
|
30
|
+
# @yieldparam file [Bowser::FileList::File]
|
24
31
|
def each &block
|
25
32
|
@files.each do |file|
|
26
33
|
block.call file
|
27
34
|
end
|
28
35
|
end
|
29
36
|
|
37
|
+
# Convert this FileList into an array
|
30
38
|
def to_a
|
31
39
|
@files.dup # Don't return a value that can mutate our internal state
|
32
40
|
end
|
33
41
|
alias to_ary to_a
|
34
42
|
|
43
|
+
# @return [String] a string representation of this FileList
|
35
44
|
def to_s
|
36
45
|
@files.to_s
|
37
46
|
end
|
38
47
|
|
48
|
+
# An individual item in a FileList
|
39
49
|
class File
|
40
50
|
attr_reader :data
|
41
51
|
|
52
|
+
# @param native [JS] the native File object to wrap
|
42
53
|
def initialize native
|
43
54
|
@native = native
|
44
55
|
@data = nil
|
45
56
|
end
|
46
57
|
|
58
|
+
# @return [String] the filename
|
47
59
|
def name
|
48
60
|
`#@native.name`
|
49
61
|
end
|
50
62
|
|
63
|
+
# @return [Integer] the size of this file on disk
|
51
64
|
def size
|
52
65
|
`#@native.size`
|
53
66
|
end
|
54
67
|
|
68
|
+
# @return [String] the MIME type of the file, detected by the browser
|
55
69
|
def type
|
56
70
|
`#@native.type`
|
57
71
|
end
|
58
72
|
|
73
|
+
# @return [Time] the timestamp of the file
|
59
74
|
def last_modified
|
60
75
|
`#@native.lastModifiedDate`
|
61
76
|
end
|
62
77
|
|
78
|
+
# Read the file from disk into memory
|
79
|
+
#
|
80
|
+
# @return [Promise] a promise that resolves when finished loading and
|
81
|
+
# rejects if an error occurs while loading.
|
63
82
|
def read
|
64
83
|
promise = Promise.new
|
65
84
|
reader = FileReader.new
|
@@ -79,10 +98,16 @@ module Bowser
|
|
79
98
|
promise
|
80
99
|
end
|
81
100
|
|
101
|
+
# Convert to the native object
|
102
|
+
#
|
103
|
+
# @return [JS.HTMLElement] the underlying native element
|
82
104
|
def to_n
|
83
105
|
@native
|
84
106
|
end
|
85
107
|
|
108
|
+
# The object that reads the file from disk.
|
109
|
+
#
|
110
|
+
# @api private
|
86
111
|
class FileReader
|
87
112
|
include EventTarget
|
88
113
|
|