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