opal-browser 0.1.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +5 -0
- data/.yardopts +1 -0
- data/Gemfile +11 -0
- data/README.md +106 -0
- data/Rakefile +5 -0
- data/config.ru +63 -0
- data/lib/opal/browser.rb +4 -0
- data/opal-browser.gemspec +23 -0
- data/opal/browser.rb +10 -0
- data/opal/browser/animation_frame.rb +29 -0
- data/opal/browser/canvas.rb +277 -0
- data/opal/browser/canvas/data.rb +73 -0
- data/opal/browser/canvas/gradient.rb +37 -0
- data/opal/browser/canvas/style.rb +123 -0
- data/opal/browser/canvas/text.rb +55 -0
- data/opal/browser/compatibility.rb +59 -0
- data/opal/browser/compatibility/animation_frame.rb +93 -0
- data/opal/browser/compatibility/dom/document/window.rb +15 -0
- data/opal/browser/compatibility/dom/element/css.rb +15 -0
- data/opal/browser/compatibility/dom/element/matches.rb +31 -0
- data/opal/browser/compatibility/dom/element/offset.rb +20 -0
- data/opal/browser/compatibility/dom/element/scroll.rb +25 -0
- data/opal/browser/compatibility/dom/element/style.rb +15 -0
- data/opal/browser/compatibility/dom/mutation_observer.rb +47 -0
- data/opal/browser/compatibility/http/request.rb +15 -0
- data/opal/browser/compatibility/immediate.rb +107 -0
- data/opal/browser/compatibility/window/scroll.rb +27 -0
- data/opal/browser/compatibility/window/size.rb +13 -0
- data/opal/browser/compatibility/window/view.rb +13 -0
- data/opal/browser/console.rb +137 -0
- data/opal/browser/cookies.rb +79 -0
- data/opal/browser/css.rb +24 -0
- data/opal/browser/css/declaration.rb +88 -0
- data/opal/browser/css/rule.rb +48 -0
- data/opal/browser/css/rule/style.rb +16 -0
- data/opal/browser/css/style_sheet.rb +83 -0
- data/opal/browser/css/unit.rb +188 -0
- data/opal/browser/dom.rb +95 -0
- data/opal/browser/dom/attribute.rb +19 -0
- data/opal/browser/dom/builder.rb +97 -0
- data/opal/browser/dom/cdata.rb +9 -0
- data/opal/browser/dom/character_data.rb +37 -0
- data/opal/browser/dom/comment.rb +9 -0
- data/opal/browser/dom/compatibility.rb +8 -0
- data/opal/browser/dom/document.rb +83 -0
- data/opal/browser/dom/document_fragment.rb +7 -0
- data/opal/browser/dom/element.rb +290 -0
- data/opal/browser/dom/element/input.rb +17 -0
- data/opal/browser/dom/element/offset.rb +67 -0
- data/opal/browser/dom/element/position.rb +37 -0
- data/opal/browser/dom/element/scroll.rb +49 -0
- data/opal/browser/dom/event.rb +240 -0
- data/opal/browser/dom/event/animation.rb +26 -0
- data/opal/browser/dom/event/audio_processing.rb +31 -0
- data/opal/browser/dom/event/base.rb +207 -0
- data/opal/browser/dom/event/before_unload.rb +13 -0
- data/opal/browser/dom/event/clipboard.rb +26 -0
- data/opal/browser/dom/event/close.rb +35 -0
- data/opal/browser/dom/event/composition.rb +38 -0
- data/opal/browser/dom/event/custom.rb +30 -0
- data/opal/browser/dom/event/device_light.rb +21 -0
- data/opal/browser/dom/event/device_motion.rb +38 -0
- data/opal/browser/dom/event/device_orientation.rb +36 -0
- data/opal/browser/dom/event/device_proximity.rb +31 -0
- data/opal/browser/dom/event/drag.rb +113 -0
- data/opal/browser/dom/event/focus.rb +23 -0
- data/opal/browser/dom/event/gamepad.rb +47 -0
- data/opal/browser/dom/event/hash_change.rb +26 -0
- data/opal/browser/dom/event/keyboard.rb +93 -0
- data/opal/browser/dom/event/message.rb +50 -0
- data/opal/browser/dom/event/mouse.rb +253 -0
- data/opal/browser/dom/event/page_transition.rb +21 -0
- data/opal/browser/dom/event/pop_state.rb +21 -0
- data/opal/browser/dom/event/progress.rb +31 -0
- data/opal/browser/dom/event/sensor.rb +13 -0
- data/opal/browser/dom/event/storage.rb +41 -0
- data/opal/browser/dom/event/touch.rb +69 -0
- data/opal/browser/dom/event/ui.rb +22 -0
- data/opal/browser/dom/event/wheel.rb +49 -0
- data/opal/browser/dom/mutation_observer.rb +118 -0
- data/opal/browser/dom/node.rb +317 -0
- data/opal/browser/dom/node_set.rb +88 -0
- data/opal/browser/dom/text.rb +21 -0
- data/opal/browser/effects.rb +39 -0
- data/opal/browser/event_source.rb +67 -0
- data/opal/browser/history.rb +54 -0
- data/opal/browser/http.rb +129 -0
- data/opal/browser/http/binary.rb +57 -0
- data/opal/browser/http/compatibility.rb +1 -0
- data/opal/browser/http/headers.rb +90 -0
- data/opal/browser/http/parameters.rb +8 -0
- data/opal/browser/http/request.rb +331 -0
- data/opal/browser/http/response.rb +115 -0
- data/opal/browser/immediate.rb +43 -0
- data/opal/browser/interval.rb +93 -0
- data/opal/browser/location.rb +77 -0
- data/opal/browser/navigator.rb +151 -0
- data/opal/browser/screen.rb +40 -0
- data/opal/browser/socket.rb +115 -0
- data/opal/browser/storage.rb +149 -0
- data/opal/browser/timeout.rb +60 -0
- data/opal/browser/utils.rb +56 -0
- data/opal/browser/version.rb +3 -0
- data/opal/browser/window.rb +113 -0
- data/opal/browser/window/compatibility.rb +3 -0
- data/opal/browser/window/scroll.rb +49 -0
- data/opal/browser/window/size.rb +35 -0
- data/opal/browser/window/view.rb +18 -0
- data/spec/dom/builder_spec.rb +69 -0
- data/spec/dom/document_spec.rb +40 -0
- data/spec/dom/element_spec.rb +46 -0
- data/spec/dom/event_spec.rb +127 -0
- data/spec/dom/mutation_observer_spec.rb +37 -0
- data/spec/dom/node_spec.rb +154 -0
- data/spec/dom_spec.rb +13 -0
- data/spec/event_source_spec.rb +42 -0
- data/spec/history_spec.rb +48 -0
- data/spec/http_spec.rb +87 -0
- data/spec/immediate_spec.rb +12 -0
- data/spec/json2.js +486 -0
- data/spec/sizzle.js +5 -0
- data/spec/socket_spec.rb +43 -0
- data/spec/spec_helper.rb +37 -0
- data/spec/storage_spec.rb +26 -0
- data/spec/window_spec.rb +10 -0
- metadata +240 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
module Browser; module DOM; class Event
|
2
|
+
|
3
|
+
class PageTransition < Event
|
4
|
+
def self.supported?
|
5
|
+
not $$[:PageTransitionEvent].nil?
|
6
|
+
end
|
7
|
+
|
8
|
+
class Definition < Definition
|
9
|
+
def persisted=(value)
|
10
|
+
`#@native.persisted = #{value}`
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.create(name, &block)
|
15
|
+
new(`new PageTransitionEvent(#{name}, #{Definition.new(&block)})`)
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_native :persisted?, :persisted
|
19
|
+
end
|
20
|
+
|
21
|
+
end; end; end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Browser; module DOM; class Event
|
2
|
+
|
3
|
+
class PopState < Event
|
4
|
+
def self.supported?
|
5
|
+
not $$[:PopStateEvent].nil?
|
6
|
+
end
|
7
|
+
|
8
|
+
class Definition < Definition
|
9
|
+
def state=(value)
|
10
|
+
`#@native.state = #{value}`
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.create(name, &block)
|
15
|
+
new(`new PopStateEvent(#{name}, #{Definition.new(&block)})`)
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_native :state
|
19
|
+
end
|
20
|
+
|
21
|
+
end; end; end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Browser; module DOM; class Event
|
2
|
+
|
3
|
+
class Progress < Event
|
4
|
+
def self.supported?
|
5
|
+
not $$[:ProgressEvent].nil?
|
6
|
+
end
|
7
|
+
|
8
|
+
class Definition < Definition
|
9
|
+
def computable=(value)
|
10
|
+
`#@native.computableLength = #{value}`
|
11
|
+
end
|
12
|
+
|
13
|
+
def loaded=(value)
|
14
|
+
`#@native.loaded = #{value}`
|
15
|
+
end
|
16
|
+
|
17
|
+
def total=(value)
|
18
|
+
`#@native.total = #{value}`
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.create(name, &block)
|
23
|
+
new(`new ProgressEvent(#{name}, #{Definition.new(&block)})`)
|
24
|
+
end
|
25
|
+
|
26
|
+
alias_native :computable?, :computableLength
|
27
|
+
alias_native :loaded
|
28
|
+
alias_native :total
|
29
|
+
end
|
30
|
+
|
31
|
+
end; end; end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Browser; module DOM; class Event
|
2
|
+
|
3
|
+
class Storage < Event
|
4
|
+
def self.supported?
|
5
|
+
not $$[:StorageEvent].nil?
|
6
|
+
end
|
7
|
+
|
8
|
+
class Definition < Definition
|
9
|
+
def key=(value)
|
10
|
+
`#@native.key = #{value}`
|
11
|
+
end
|
12
|
+
|
13
|
+
def new=(value)
|
14
|
+
`#@native.newValue = #{value}`
|
15
|
+
end
|
16
|
+
|
17
|
+
def old=(value)
|
18
|
+
`#@native.oldValue = #{value}`
|
19
|
+
end
|
20
|
+
|
21
|
+
def area=(value)
|
22
|
+
`#@native.storageArea = #{value}`
|
23
|
+
end
|
24
|
+
|
25
|
+
def url=(value)
|
26
|
+
`#@native.url = #{value}`
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.create(name, &block)
|
31
|
+
new(`new StorageEvent(#{name}, #{Definition.new(&block)})`)
|
32
|
+
end
|
33
|
+
|
34
|
+
alias_native :key
|
35
|
+
alias_native :new, :newValue
|
36
|
+
alias_native :old, :oldValue
|
37
|
+
alias_native :area, :storageArea
|
38
|
+
alias_native :url
|
39
|
+
end
|
40
|
+
|
41
|
+
end; end; end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Browser; module DOM; class Event
|
2
|
+
|
3
|
+
class Touch < Event
|
4
|
+
def self.supported?
|
5
|
+
not $$[:TouchEvent].nil?
|
6
|
+
end
|
7
|
+
|
8
|
+
class Definition < Definition
|
9
|
+
def alt!
|
10
|
+
`#@native.altKey = true`
|
11
|
+
end
|
12
|
+
|
13
|
+
def ctrl!
|
14
|
+
`#@native.ctrlKey = true`
|
15
|
+
end
|
16
|
+
|
17
|
+
def meta!
|
18
|
+
`#@native.metaKey = true`
|
19
|
+
end
|
20
|
+
|
21
|
+
def shift!
|
22
|
+
`#@native.shiftKey = true`
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.create(name, &block)
|
27
|
+
new(`new TouchEvent(#{name}, #{Definition.new(&block)})`)
|
28
|
+
end
|
29
|
+
|
30
|
+
def alt?
|
31
|
+
`#@native.altKey`
|
32
|
+
end
|
33
|
+
|
34
|
+
def ctrl?
|
35
|
+
`#@native.ctrlKey`
|
36
|
+
end
|
37
|
+
|
38
|
+
def meta?
|
39
|
+
`#@native.metaKey`
|
40
|
+
end
|
41
|
+
|
42
|
+
def shift?
|
43
|
+
`#@native.shiftKey`
|
44
|
+
end
|
45
|
+
|
46
|
+
# TODO: implement touches and targetTouches
|
47
|
+
|
48
|
+
def cancel?
|
49
|
+
name.downcase == 'touchcancel'
|
50
|
+
end
|
51
|
+
|
52
|
+
def end?
|
53
|
+
name.downcase == 'touchend'
|
54
|
+
end
|
55
|
+
|
56
|
+
def leave?
|
57
|
+
name.downcase == 'touchleave'
|
58
|
+
end
|
59
|
+
|
60
|
+
def move?
|
61
|
+
name.downcase == 'touchmove'
|
62
|
+
end
|
63
|
+
|
64
|
+
def start?
|
65
|
+
name.downcase == 'touchstart'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end; end; end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Browser; module DOM; class Event
|
2
|
+
|
3
|
+
class UI < Event
|
4
|
+
class Definition < Definition
|
5
|
+
def detail=(value)
|
6
|
+
`#@native.detail = #{value}`
|
7
|
+
end
|
8
|
+
|
9
|
+
def view=(value)
|
10
|
+
`#@native.view = #{value}`
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.create(name, &block)
|
15
|
+
new(`new UIEvent(#{name}, #{Definition.new(&block)})`)
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_native :detail
|
19
|
+
alias_native :view
|
20
|
+
end
|
21
|
+
|
22
|
+
end; end; end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Browser; module DOM; class Event
|
2
|
+
|
3
|
+
class Wheel < UI
|
4
|
+
def self.supported?
|
5
|
+
not $$[:WheelEvent].nil?
|
6
|
+
end
|
7
|
+
|
8
|
+
class Definition < Definition
|
9
|
+
def x=(value)
|
10
|
+
`#@native.deltaX = #{value}`
|
11
|
+
end
|
12
|
+
|
13
|
+
def y=(value)
|
14
|
+
`#@native.deltaY = #{value}`
|
15
|
+
end
|
16
|
+
|
17
|
+
def z=(value)
|
18
|
+
`#@native.deltaZ = #{value}`
|
19
|
+
end
|
20
|
+
|
21
|
+
def mode=(value)
|
22
|
+
value = case value
|
23
|
+
when :pixel then `WheelEvent.DOM_DELTA_PIXEL`
|
24
|
+
when :line then `WheelEvent.DOM_DELTA_LINE`
|
25
|
+
when :page then `WheelEvent.DOM_DELTA_PAGE`
|
26
|
+
end
|
27
|
+
|
28
|
+
`#@native.deltaMode = #{value}`
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.create(name, &block)
|
33
|
+
new(`new WheelEvent(#{name}, #{Definition.new(&block)})`)
|
34
|
+
end
|
35
|
+
|
36
|
+
alias_native :x, :deltaX
|
37
|
+
alias_native :y, :deltaY
|
38
|
+
alias_native :z, :deltaZ
|
39
|
+
|
40
|
+
def mode
|
41
|
+
case `#@native.deltaMode`
|
42
|
+
when `WheelEvent.DOM_DELTA_PIXEL` then :pixel
|
43
|
+
when `WheelEvent.DOM_DELTA_LINE` then :line
|
44
|
+
when `WheelEvent.DOM_DELTA_PAGE` then :page
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end; end; end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
module Browser; module DOM
|
2
|
+
|
3
|
+
class MutationObserver
|
4
|
+
include Native
|
5
|
+
|
6
|
+
class Record
|
7
|
+
include Native
|
8
|
+
|
9
|
+
def type
|
10
|
+
case `#@native.type`
|
11
|
+
when :attributes then :attributes
|
12
|
+
when :childList then :tree
|
13
|
+
when :characterData then :cdata
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def attributes?; type == :attributes; end
|
18
|
+
def tree?; type == :tree; end
|
19
|
+
def cdata?; type == :cdata; end
|
20
|
+
|
21
|
+
def added
|
22
|
+
array = if `#@native.addedNodes != null`
|
23
|
+
Native::Array.new(`#@native.addedNodes`)
|
24
|
+
else
|
25
|
+
[]
|
26
|
+
end
|
27
|
+
|
28
|
+
NodeSet.new($document, array)
|
29
|
+
end
|
30
|
+
|
31
|
+
def removed
|
32
|
+
array = if `#@native.removedNodes != null`
|
33
|
+
Native::Array.new(`#@native.removedNodes`)
|
34
|
+
else
|
35
|
+
[]
|
36
|
+
end
|
37
|
+
|
38
|
+
NodeSet.new($document, array)
|
39
|
+
end
|
40
|
+
|
41
|
+
def target
|
42
|
+
DOM(`#@native.target`)
|
43
|
+
end
|
44
|
+
|
45
|
+
alias_native :old, :oldValue
|
46
|
+
alias_native :attribute, :attributeName
|
47
|
+
end
|
48
|
+
|
49
|
+
def initialize(&block)
|
50
|
+
%x{
|
51
|
+
var func = function(records) {
|
52
|
+
return #{block.call(`records`.map { |r| Browser::DOM::MutationObserver::Record.new(r) })};
|
53
|
+
}
|
54
|
+
}
|
55
|
+
|
56
|
+
super(`new window.MutationObserver(func)`)
|
57
|
+
end
|
58
|
+
|
59
|
+
def observe(target, options = nil)
|
60
|
+
unless options
|
61
|
+
options = {
|
62
|
+
children: true,
|
63
|
+
tree: true,
|
64
|
+
attributes: :old,
|
65
|
+
cdata: :old
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
`#@native.observe(#{Native.convert(target)}, #{convert(options)})`
|
70
|
+
|
71
|
+
self
|
72
|
+
end
|
73
|
+
|
74
|
+
def take
|
75
|
+
`#@native.takeRecords()`.map { |r| Record.new(r) }
|
76
|
+
end
|
77
|
+
|
78
|
+
def disconnect
|
79
|
+
`#@native.disconnect()`
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
def convert(hash)
|
84
|
+
options = Native(`{}`)
|
85
|
+
|
86
|
+
if hash[:children]
|
87
|
+
options[:childList] = true
|
88
|
+
end
|
89
|
+
|
90
|
+
if hash[:tree]
|
91
|
+
options[:subtree] = true
|
92
|
+
end
|
93
|
+
|
94
|
+
if attrs = hash[:attributes]
|
95
|
+
options[:attributes] = true
|
96
|
+
|
97
|
+
if attrs == :old
|
98
|
+
options[:attributeOldValue] = true
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
if filter = hash[:filter]
|
103
|
+
options[:attributeFilter] = filter
|
104
|
+
end
|
105
|
+
|
106
|
+
if cdata = hash[:cdata]
|
107
|
+
options[:characterData] = true
|
108
|
+
|
109
|
+
if cdata == :old
|
110
|
+
options[:characterDataOldValue] = true
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
options.to_n
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end; end
|
@@ -0,0 +1,317 @@
|
|
1
|
+
module Browser; module DOM
|
2
|
+
|
3
|
+
class Node
|
4
|
+
include Native
|
5
|
+
|
6
|
+
ELEMENT_NODE = 1
|
7
|
+
ATTRIBUTE_NODE = 2
|
8
|
+
TEXT_NODE = 3
|
9
|
+
CDATA_SECTION_NODE = 4
|
10
|
+
ENTITY_REFERENCE_NOCE = 5
|
11
|
+
ENTITY_NODE = 6
|
12
|
+
PROCESSING_INSTRUCTION_NODE = 7
|
13
|
+
COMMENT_NODE = 8
|
14
|
+
DOCUMENT_NODE = 9
|
15
|
+
DOCUMENT_TYPE_NODE = 10
|
16
|
+
DOCUMENT_FRAGMENT_NODE = 11
|
17
|
+
NOTATION_NODE = 12
|
18
|
+
|
19
|
+
def self.new(value)
|
20
|
+
if self == Node
|
21
|
+
@classes ||= [nil, Element, Attribute, Text, CDATA, nil, nil, nil, Comment, Document, nil, DocumentFragment]
|
22
|
+
|
23
|
+
if klass = @classes[`value.nodeType`]
|
24
|
+
klass.new(value)
|
25
|
+
else
|
26
|
+
raise ArgumentError, 'cannot instantiate a non derived Node object'
|
27
|
+
end
|
28
|
+
else
|
29
|
+
super
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def ==(other)
|
34
|
+
`#@native === #{Native.try_convert(other)}`
|
35
|
+
end
|
36
|
+
|
37
|
+
def =~(name)
|
38
|
+
self.name.downcase == name.downcase
|
39
|
+
end
|
40
|
+
|
41
|
+
def <<(node)
|
42
|
+
add_child(node)
|
43
|
+
end
|
44
|
+
|
45
|
+
def <=>(other)
|
46
|
+
raise NotImplementedError
|
47
|
+
end
|
48
|
+
|
49
|
+
def add_child(node)
|
50
|
+
if native?(node)
|
51
|
+
`#@native.appendChild(node)`
|
52
|
+
elsif node.respond_to? :each
|
53
|
+
node.each { |n| add_child(n) }
|
54
|
+
elsif String === node
|
55
|
+
`#@native.appendChild(#@native.ownerDocument.createTextNode(node))`
|
56
|
+
else
|
57
|
+
`#@native.appendChild(#{Native.convert(node)})`
|
58
|
+
end
|
59
|
+
|
60
|
+
self
|
61
|
+
end
|
62
|
+
|
63
|
+
def add_next_sibling(node)
|
64
|
+
`#@native.parentNode.insertBefore(node, #@native.nextSibling)`
|
65
|
+
|
66
|
+
self
|
67
|
+
end
|
68
|
+
|
69
|
+
def add_previous_sibling(node)
|
70
|
+
`#@native.parentNode.insertBefore(node, #@native)`
|
71
|
+
|
72
|
+
self
|
73
|
+
end
|
74
|
+
|
75
|
+
alias after add_next_sibling
|
76
|
+
|
77
|
+
def append_to(element)
|
78
|
+
element.add_child(self)
|
79
|
+
|
80
|
+
self
|
81
|
+
end
|
82
|
+
|
83
|
+
def ancestors(expression = nil)
|
84
|
+
return NodeSet.new(document) unless parent
|
85
|
+
|
86
|
+
parents = [parent]
|
87
|
+
|
88
|
+
while parent = parents.last.parent
|
89
|
+
parents << parent
|
90
|
+
end
|
91
|
+
|
92
|
+
if Document === parents.last
|
93
|
+
parents.pop
|
94
|
+
end
|
95
|
+
|
96
|
+
return NodeSet.new(document, parents) unless expression
|
97
|
+
|
98
|
+
NodeSet.new document, parents.select {|p|
|
99
|
+
p.matches?(expression)
|
100
|
+
}
|
101
|
+
end
|
102
|
+
|
103
|
+
alias before add_previous_sibling
|
104
|
+
|
105
|
+
def remove
|
106
|
+
detach
|
107
|
+
clear
|
108
|
+
|
109
|
+
self
|
110
|
+
end
|
111
|
+
|
112
|
+
def detach
|
113
|
+
parent.remove_child(self) if parent
|
114
|
+
|
115
|
+
self
|
116
|
+
end
|
117
|
+
|
118
|
+
def clear; end
|
119
|
+
|
120
|
+
def remove_child(element)
|
121
|
+
`#@native.removeChild(#{Native.try_convert(element)})`
|
122
|
+
|
123
|
+
self
|
124
|
+
end
|
125
|
+
|
126
|
+
def clear
|
127
|
+
children.each(&:remove)
|
128
|
+
end
|
129
|
+
|
130
|
+
def blank?
|
131
|
+
raise NotImplementedError
|
132
|
+
end
|
133
|
+
|
134
|
+
def cdata?
|
135
|
+
node_type == CDATA_SECTION_NODE
|
136
|
+
end
|
137
|
+
|
138
|
+
def child
|
139
|
+
children.first
|
140
|
+
end
|
141
|
+
|
142
|
+
def children
|
143
|
+
NodeSet.new(document, Native::Array.new(`#@native.childNodes`))
|
144
|
+
end
|
145
|
+
|
146
|
+
def children=(node)
|
147
|
+
raise NotImplementedError
|
148
|
+
end
|
149
|
+
|
150
|
+
def comment?
|
151
|
+
node_type == COMMENT_NODE
|
152
|
+
end
|
153
|
+
|
154
|
+
def document
|
155
|
+
DOM(`#@native.ownerDocument`)
|
156
|
+
end
|
157
|
+
|
158
|
+
def document?
|
159
|
+
node_type == DOCUMENT_NODE
|
160
|
+
end
|
161
|
+
|
162
|
+
def elem?
|
163
|
+
node_type == ELEMENT_NODE
|
164
|
+
end
|
165
|
+
|
166
|
+
alias element? elem?
|
167
|
+
|
168
|
+
def element_children
|
169
|
+
children.select(&:element?)
|
170
|
+
end
|
171
|
+
|
172
|
+
alias elements element_children
|
173
|
+
|
174
|
+
def first_element_child
|
175
|
+
element_children.first
|
176
|
+
end
|
177
|
+
|
178
|
+
def fragment?
|
179
|
+
node_type == DOCUMENT_FRAGMENT_NODE
|
180
|
+
end
|
181
|
+
|
182
|
+
def hash
|
183
|
+
# TODO: implement this properly
|
184
|
+
end
|
185
|
+
|
186
|
+
def inner_html(*)
|
187
|
+
`#@native.innerHTML`
|
188
|
+
end
|
189
|
+
|
190
|
+
def inner_html=(value)
|
191
|
+
`#@native.innerHTML = #{value}`
|
192
|
+
end
|
193
|
+
|
194
|
+
def inner_text(*)
|
195
|
+
`#@native.textContent`
|
196
|
+
end
|
197
|
+
|
198
|
+
alias content inner_text
|
199
|
+
|
200
|
+
def inner_text=(value)
|
201
|
+
`#@native.textContent = #{value}`
|
202
|
+
end
|
203
|
+
|
204
|
+
alias content= inner_text=
|
205
|
+
|
206
|
+
def last_element_child
|
207
|
+
element_children.last
|
208
|
+
end
|
209
|
+
|
210
|
+
def matches?(expression)
|
211
|
+
false
|
212
|
+
end
|
213
|
+
|
214
|
+
def name
|
215
|
+
`#@native.nodeName || nil`
|
216
|
+
end
|
217
|
+
|
218
|
+
def name=(value)
|
219
|
+
`#@native.nodeName = #{value.to_s}`
|
220
|
+
end
|
221
|
+
|
222
|
+
def namespace
|
223
|
+
`#@native.namespaceURI || nil`
|
224
|
+
end
|
225
|
+
|
226
|
+
def next
|
227
|
+
DOM(`#@native.nextSibling`) if `#@native.nextSibling != null`
|
228
|
+
end
|
229
|
+
|
230
|
+
def next_element
|
231
|
+
current = self.next
|
232
|
+
|
233
|
+
while current && !current.element?
|
234
|
+
current = current.next
|
235
|
+
end
|
236
|
+
|
237
|
+
current
|
238
|
+
end
|
239
|
+
|
240
|
+
alias next_sibling next
|
241
|
+
|
242
|
+
alias node_name name
|
243
|
+
|
244
|
+
alias node_name= name=
|
245
|
+
|
246
|
+
def node_type
|
247
|
+
`#@native.nodeType`
|
248
|
+
end
|
249
|
+
|
250
|
+
def parent
|
251
|
+
DOM(`#@native.parentNode`) if `#@native.parentNode != null`
|
252
|
+
end
|
253
|
+
|
254
|
+
def parent= (node)
|
255
|
+
`#@native.parentNode = #{Native.try_convert(node)}`
|
256
|
+
end
|
257
|
+
|
258
|
+
def parse (text, options = {})
|
259
|
+
raise NotImplementedError
|
260
|
+
end
|
261
|
+
|
262
|
+
def path
|
263
|
+
raise NotImplementedError
|
264
|
+
end
|
265
|
+
|
266
|
+
def previous
|
267
|
+
DOM(`#@native.previousSibling`) if `#@native.previousSibling != null`
|
268
|
+
end
|
269
|
+
|
270
|
+
alias previous= add_previous_sibling
|
271
|
+
|
272
|
+
def previous_element
|
273
|
+
current = self.previous
|
274
|
+
|
275
|
+
while current && !current.element?
|
276
|
+
current = current.previous
|
277
|
+
end
|
278
|
+
|
279
|
+
current
|
280
|
+
end
|
281
|
+
|
282
|
+
alias previous_sibling previous
|
283
|
+
|
284
|
+
# TODO: implement for NodeSet
|
285
|
+
def replace(node)
|
286
|
+
`#@native.parentNode.replaceChild(#@native, #{Native.try_convert(node)})`
|
287
|
+
|
288
|
+
node
|
289
|
+
end
|
290
|
+
|
291
|
+
alias text inner_text
|
292
|
+
alias text= inner_text=
|
293
|
+
|
294
|
+
def text?
|
295
|
+
node_type == TEXT_NODE
|
296
|
+
end
|
297
|
+
|
298
|
+
def traverse(&block)
|
299
|
+
raise NotImplementedError
|
300
|
+
end
|
301
|
+
|
302
|
+
alias type node_type
|
303
|
+
|
304
|
+
def value
|
305
|
+
`#@native.nodeValue || nil`
|
306
|
+
end
|
307
|
+
|
308
|
+
def value=(value)
|
309
|
+
`#@native.nodeValue = value`
|
310
|
+
end
|
311
|
+
|
312
|
+
def inspect
|
313
|
+
"#<DOM::Node: #{name}>"
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
end; end
|