mirror of
https://github.com/servo/servo
synced 2026-04-28 18:37:39 +02:00
97 lines
2.8 KiB
JavaScript
97 lines
2.8 KiB
JavaScript
//
|
|
// Simple Helper Functions For Testing CSS
|
|
//
|
|
|
|
(function(root) {
|
|
'use strict';
|
|
|
|
// serialize styles object and dump to dom
|
|
// appends <style id="dynamic-style"> to <head>
|
|
// setStyle("#some-selector", {"some-style" : "value"})
|
|
// setStyle({"#some-selector": {"some-style" : "value"}})
|
|
root.setStyle = function(selector, styles) {
|
|
var target = document.getElementById('dynamic-style');
|
|
if (!target) {
|
|
target = document.createElement('style');
|
|
target.id = 'dynamic-style';
|
|
target.type = "text/css";
|
|
document.getElementsByTagName('head')[0].appendChild(target);
|
|
}
|
|
|
|
var data = [];
|
|
// single selector/styles
|
|
if (typeof selector === 'string' && styles !== undefined) {
|
|
data = [selector, '{', serializeStyles(styles), '}'];
|
|
target.textContent = data.join("\n");
|
|
return;
|
|
}
|
|
// map of selector/styles
|
|
for (var key in selector) {
|
|
if (Object.prototype.hasOwnProperty.call(selector, key)) {
|
|
var _data = [key, '{', serializeStyles(selector[key]), '}'];
|
|
data.push(_data.join('\n'));
|
|
}
|
|
}
|
|
|
|
target.textContent = data.join("\n");
|
|
};
|
|
|
|
function serializeStyles(styles) {
|
|
var data = [];
|
|
for (var property in styles) {
|
|
if (Object.prototype.hasOwnProperty.call(styles, property)) {
|
|
var prefixedProperty = addVendorPrefix(property);
|
|
data.push(prefixedProperty + ":" + styles[property] + ";");
|
|
}
|
|
}
|
|
|
|
return data.join('\n');
|
|
}
|
|
|
|
|
|
// shorthand for computed style
|
|
root.computedStyle = function(element, property, pseudo) {
|
|
var prefixedProperty = addVendorPrefix(property);
|
|
return window
|
|
.getComputedStyle(element, pseudo || null)
|
|
.getPropertyValue(prefixedProperty);
|
|
};
|
|
|
|
// flush rendering buffer
|
|
root.reflow = function() {
|
|
document.body.offsetWidth;
|
|
};
|
|
|
|
// merge objects
|
|
root.extend = function(target /*, ..rest */) {
|
|
Array.prototype.slice.call(arguments, 1).forEach(function(obj) {
|
|
Object.keys(obj).forEach(function(key) {
|
|
target[key] = obj[key];
|
|
});
|
|
});
|
|
|
|
return target;
|
|
};
|
|
|
|
// dom fixture helper ("resetting dom test elements")
|
|
var _domFixture;
|
|
var _domFixtureSelector;
|
|
root.domFixture = function(selector) {
|
|
var fixture = document.querySelector(selector || _domFixtureSelector);
|
|
if (!fixture) {
|
|
throw new Error('fixture ' + (selector || _domFixtureSelector) + ' not found!');
|
|
}
|
|
if (!_domFixture && selector) {
|
|
// save a copy
|
|
_domFixture = fixture.cloneNode(true);
|
|
_domFixtureSelector = selector;
|
|
} else if (_domFixture) {
|
|
// restore the copy
|
|
var tmp = _domFixture.cloneNode(true);
|
|
fixture.parentNode.replaceChild(tmp, fixture);
|
|
} else {
|
|
throw new Error('domFixture must be initialized first!');
|
|
}
|
|
};
|
|
})(window);
|