quixote
Version:
CSS unit and integration testing
69 lines (53 loc) • 1.96 kB
JavaScript
// Copyright (c) 2014-2017 Titanium I.T. LLC. All rights reserved. For license, see "README" or "LICENSE" file.
;
var ensure = require("../util/ensure.js");
var Position = require("../values/position.js");
var PositionDescriptor = require("./position_descriptor.js");
var TOP = "top";
var RIGHT = "right";
var BOTTOM = "bottom";
var LEFT = "left";
var Me = module.exports = function ElementEdge(element, position) {
var QElement = require("../q_element.js"); // break circular dependency
ensure.signature(arguments, [QElement, String]);
this.should = this.createShould();
if (position === LEFT || position === RIGHT) PositionDescriptor.x(this);
else if (position === TOP || position === BOTTOM) PositionDescriptor.y(this);
else ensure.unreachable("Unknown position: " + position);
this._element = element;
this._position = position;
};
PositionDescriptor.extend(Me);
Me.top = factoryFn(TOP);
Me.right = factoryFn(RIGHT);
Me.bottom = factoryFn(BOTTOM);
Me.left = factoryFn(LEFT);
Me.prototype.value = function value() {
ensure.signature(arguments, []);
var rawPosition = this._element.getRawPosition();
var edge = rawPosition[this._position];
var scroll = this._element.context().getRawScrollPosition();
var rendered = elementRendered(this._element);
if (this._position === RIGHT || this._position === LEFT) {
if (!rendered) return Position.noX();
return Position.x(edge + scroll.x);
}
else {
if (!rendered) return Position.noY();
return Position.y(edge + scroll.y);
}
};
Me.prototype.toString = function toString() {
ensure.signature(arguments, []);
return this._position + " edge of " + this._element;
};
function factoryFn(position) {
return function factory(element) {
return new Me(element, position);
};
}
function elementRendered(element) {
var inDom = element.context().body().contains(element);
var displayNone = element.getRawStyle("display") === "none";
return inDom && !displayNone;
}