lib/capybara/poltergeist/client/agent.coffee in poltergeist-1.5.1 vs lib/capybara/poltergeist/client/agent.coffee in poltergeist-1.6.0
- old
+ new
@@ -23,11 +23,11 @@
'"(cyclic structure)"'
else
throw error
currentUrl: ->
- encodeURI(window.location.href)
+ encodeURI(decodeURI(window.location.href))
find: (method, selector, within = document) ->
try
if method == "xpath"
xpath = document.evaluate(selector, within, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
@@ -46,12 +46,12 @@
register: (element) ->
@elements.push(element)
@elements.length - 1
documentSize: ->
- height: document.documentElement.scrollHeight,
- width: document.documentElement.scrollWidth
+ height: document.documentElement.scrollHeight || document.documentElement.clientHeight,
+ width: document.documentElement.scrollWidth || document.documentElement.clientWidth
get: (id) ->
@nodes[id] or= new PoltergeistAgent.Node(this, @elements[id])
nodeCall: (id, name, args) ->
@@ -63,28 +63,40 @@
this.get(id).setAttribute('_poltergeist_selected', '')
afterUpload: (id) ->
this.get(id).removeAttribute('_poltergeist_selected')
+ clearLocalStorage: ->
+ localStorage.clear()
+
class PoltergeistAgent.ObsoleteNode
toString: -> "PoltergeistAgent.ObsoleteNode"
class PoltergeistAgent.InvalidSelector
toString: -> "PoltergeistAgent.InvalidSelector"
class PoltergeistAgent.Node
@EVENTS = {
FOCUS: ['blur', 'focus', 'focusin', 'focusout'],
MOUSE: ['click', 'dblclick', 'mousedown', 'mouseenter', 'mouseleave', 'mousemove',
- 'mouseover', 'mouseout', 'mouseup']
+ 'mouseover', 'mouseout', 'mouseup', 'contextmenu'],
+ FORM: ['submit']
}
constructor: (@agent, @element) ->
parentId: ->
@agent.register(@element.parentNode)
+ parentIds: ->
+ ids = []
+ parent = @element.parentNode
+ while parent != document
+ ids.push @agent.register(parent)
+ parent = parent.parentNode
+ ids
+
find: (method, selector) ->
@agent.find(method, selector, @element)
isObsolete: ->
obsolete = (element) =>
@@ -134,21 +146,29 @@
allText: ->
@element.textContent
visibleText: ->
- if @element.nodeName == "TEXTAREA"
- @element.textContent
- else
- @element.innerText
+ if this.isVisible()
+ if @element.nodeName == "TEXTAREA"
+ @element.textContent
+ else
+ @element.innerText
deleteText: ->
range = document.createRange()
range.selectNodeContents(@element)
+ window.getSelection().removeAllRanges()
window.getSelection().addRange(range)
window.getSelection().deleteFromDocument()
+ getAttributes: ->
+ attrs = {}
+ for attr, i in @element.attributes
+ attrs[attr.name] = attr.value.replace("\n","\\n");
+ attrs
+
getAttribute: (name) ->
if name == 'checked' || name == 'selected'
@element[name]
else
@element.getAttribute(name)
@@ -217,10 +237,20 @@
true
isDisabled: ->
@element.disabled || @element.tagName == 'OPTION' && @element.parentNode.disabled
+ containsSelection: ->
+ selectedNode = document.getSelection().focusNode
+
+ return false if !selectedNode
+
+ if selectedNode.nodeType == 3
+ selectedNode = selectedNode.parentNode
+
+ @element.contains(selectedNode)
+
frameOffset: ->
win = window
offset = { top: 0, left: 0 }
while win.frameElement
@@ -255,15 +285,21 @@
event.initMouseEvent(
name, true, true, window, 0, 0, 0, 0, 0,
false, false, false, false, 0, null
)
else if Node.EVENTS.FOCUS.indexOf(name) != -1
- event = document.createEvent('HTMLEvents')
- event.initEvent(name, true, true)
+ event = this.obtainEvent(name)
+ else if Node.EVENTS.FORM.indexOf(name) != -1
+ event = this.obtainEvent(name)
else
throw "Unknown event"
@element.dispatchEvent(event)
+
+ obtainEvent: (name) ->
+ event = document.createEvent('HTMLEvents')
+ event.initEvent(name, true, true)
+ event
mouseEventTest: (x, y) ->
frameOffset = this.frameOffset()
x -= frameOffset.left