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({