lib/capybara/poltergeist/client/compiled/browser.js in poltergeist-1.1.2 vs lib/capybara/poltergeist/client/compiled/browser.js in poltergeist-1.2.0

- old
+ new

@@ -1,8 +1,6 @@ - Poltergeist.Browser = (function() { - function Browser(owner, width, height) { this.owner = owner; this.width = width || 1024; this.height = height || 768; this.state = 'default'; @@ -13,26 +11,27 @@ this.resetPage(); } Browser.prototype.resetPage = function() { var _this = this; + if (this.page != null) { this.page.release(); phantom.clearCookies(); } this.page = new Poltergeist.WebPage; this.page.setViewportSize({ width: this.width, height: this.height }); this.page.onLoadStarted = function() { - if (_this.state === 'clicked') { + if (_this.state === 'mouse_event') { return _this.setState('loading'); } }; this.page.onNavigationRequested = function(url, navigation) { - if (_this.state === 'clicked' && navigation === 'FormSubmitted') { + if (_this.state === 'mouse_event' && navigation === 'FormSubmitted') { return _this.setState('loading'); } }; this.page.onLoadFinished = function(status) { if (_this.state === 'loading') { @@ -49,10 +48,11 @@ this.page.onInitialized = function() { return _this.page_id += 1; }; return this.page.onPageCreated = function(sub_page) { var name; + if (_this.state === 'awaiting_sub_page') { name = _this.page_name; _this.page_name = null; _this.setState('default'); return setTimeout((function() { @@ -73,10 +73,11 @@ return this.state = state; }; Browser.prototype.sendResponse = function(response) { var errors; + errors = this.page.errors(); this.page.clearErrors(); if (errors.length > 0 && this.js_errors) { return this.owner.sendError(new Poltergeist.JavascriptError(errors)); } else { @@ -97,10 +98,11 @@ } }; Browser.prototype.visit = function(url) { var prev_url; + this.setState('loading'); prev_url = this.page.currentUrl(); this.page.open(url); if (/#/.test(url) && prev_url.split('#')[0] === url.split('#')[0]) { this.setState('default'); @@ -122,25 +124,33 @@ Browser.prototype.source = function() { return this.sendResponse(this.page.source()); }; - Browser.prototype.find = function(selector) { + Browser.prototype.title = function() { + return this.sendResponse(this.page.title()); + }; + + Browser.prototype.find = function(method, selector) { return this.sendResponse({ page_id: this.page_id, - ids: this.page.find(selector) + ids: this.page.find(method, selector) }); }; - Browser.prototype.find_within = function(page_id, id, selector) { - return this.sendResponse(this.node(page_id, id).find(selector)); + Browser.prototype.find_within = function(page_id, id, method, selector) { + return this.sendResponse(this.node(page_id, id).find(method, selector)); }; - Browser.prototype.text = function(page_id, id) { - return this.sendResponse(this.node(page_id, id).text()); + Browser.prototype.all_text = function(page_id, id) { + return this.sendResponse(this.node(page_id, id).allText()); }; + Browser.prototype.visible_text = function(page_id, id) { + return this.sendResponse(this.node(page_id, id).visibleText()); + }; + Browser.prototype.attribute = function(page_id, id, name) { return this.sendResponse(this.node(page_id, id).getAttribute(name)); }; Browser.prototype.value = function(page_id, id) { @@ -152,10 +162,11 @@ return this.sendResponse(true); }; Browser.prototype.select_file = function(page_id, id, value) { var node; + node = this.node(page_id, id); this.page.beforeUpload(node.id); this.page.uploadFile('[_poltergeist_selected]', value); this.page.afterUpload(node.id); return this.sendResponse(true); @@ -171,41 +182,54 @@ Browser.prototype.visible = function(page_id, id) { return this.sendResponse(this.node(page_id, id).isVisible()); }; + Browser.prototype.disabled = function(page_id, id) { + return this.sendResponse(this.node(page_id, id).isDisabled()); + }; + Browser.prototype.evaluate = function(script) { return this.sendResponse(this.page.evaluate("function() { return " + script + " }")); }; Browser.prototype.execute = function(script) { this.page.execute("function() { " + script + " }"); return this.sendResponse(true); }; - Browser.prototype.push_frame = function(name) { + Browser.prototype.push_frame = function(name, timeout) { var _this = this; + + if (timeout == null) { + timeout = new Date().getTime() + 2000; + } if (this.page.pushFrame(name)) { if (this.page.currentUrl() === 'about:blank') { return this.setState('awaiting_frame_load'); } else { return this.sendResponse(true); } } else { - return setTimeout((function() { - return _this.push_frame(name); - }), 50); + if (new Date().getTime() < timeout) { + return setTimeout((function() { + return _this.push_frame(name, timeout); + }), 50); + } else { + return this.owner.sendError(new Poltergeist.FrameNotFound(name)); + } } }; Browser.prototype.pop_frame = function() { return this.sendResponse(this.page.popFrame()); }; Browser.prototype.push_window = function(name) { var sub_page, _this = this; + sub_page = this.page.getPage(name); if (sub_page) { if (sub_page.currentUrl() === 'about:blank') { return sub_page.onLoadFinished = function() { sub_page.onLoadFinished = null; @@ -223,38 +247,45 @@ } }; Browser.prototype.pop_window = function() { var prev_page; + prev_page = this.page_stack.pop(); if (prev_page) { this.page = prev_page; } return this.sendResponse(true); }; - Browser.prototype.click = function(page_id, id, event) { + Browser.prototype.mouse_event = function(page_id, id, name) { var node, _this = this; - if (event == null) { - event = 'click'; - } + node = this.node(page_id, id); - this.setState('clicked'); - this.last_click = node.click(event); + this.setState('mouse_event'); + this.last_mouse_event = node.mouseEvent(name); return setTimeout(function() { if (_this.state !== 'loading') { _this.setState('default'); - return _this.sendResponse(_this.last_click); + return _this.sendResponse(_this.last_mouse_event); } }, 5); }; + Browser.prototype.click = function(page_id, id) { + return this.mouse_event(page_id, id, 'click'); + }; + Browser.prototype.double_click = function(page_id, id) { - return this.click(page_id, id, 'doubleclick'); + return this.mouse_event(page_id, id, 'doubleclick'); }; + Browser.prototype.hover = function(page_id, id) { + return this.mouse_event(page_id, id, 'mousemove'); + }; + Browser.prototype.click_coordinates = function(x, y) { this.page.sendEvent('click', x, y); return this.sendResponse({ click: { x: x, @@ -282,9 +313,10 @@ return this.sendResponse(true); }; Browser.prototype.render = function(path, full) { var dimensions, document, viewport; + dimensions = this.page.validatedDimensions(); document = dimensions.document; viewport = dimensions.viewport; if (full) { this.page.setScrollPosition({