blob: 856a33edbadd5e69d73cd6d1496bb747a7c1d246 [file] [log] [blame]
"use strict";
(function(){
let pending_resolve = null;
let pending_reject = null;
window.addEventListener("message", function(event) {
const data = event.data;
if (typeof data !== "object" && data !== null) {
return;
}
if (data.type !== "testdriver-complete") {
return;
}
if (data.status === "success") {
pending_resolve();
} else {
pending_reject();
}
});
const get_selector = function(element) {
let selector;
if (element.id && document.getElementById(element.id) === element) {
const id = element.id;
selector = "#";
// escape everything, because it's easy to implement
for (let i = 0, len = id.length; i < len; i++) {
selector += '\\' + id.charCodeAt(i).toString(16) + ' ';
}
} else {
// push and then reverse to avoid O(n) unshift in the loop
let segments = [];
for (let node = element;
node.parentElement;
node = node.parentElement) {
let segment = "*|" + node.localName;
let nth = Array.prototype.indexOf.call(node.parentElement.children, node) + 1;
segments.push(segment + ":nth-child(" + nth + ")");
}
segments.push(":root");
segments.reverse();
selector = segments.join(" > ");
}
return selector;
};
window.test_driver_internal.click = function(element) {
const selector = get_selector(element);
const pending_promise = new Promise(function(resolve, reject) {
pending_resolve = resolve;
pending_reject = reject;
});
window.opener.postMessage({"type": "action", "action": "click", "selector": selector}, "*");
return pending_promise;
};
})();