/**
 * The const var for SVG and xlink namespaces
 */
const SVGNS = 'http://www.w3.org/2000/svg';
const XLINKNS = 'http://www.w3.org/1999/xlink';

/**
 * Appends a svg element to the parent.
 *
 * @param test The testharness.js Test object. If provided, this will be used
 *             to register a cleanup callback to remove the div when the test
 *             finishes.
 * @param tag The element tag name.
 * @param parent The parent element of this new created svg element.
 * @param attrs  A dictionary object with attribute names and values to set on
 *               the div.
 */
function createSVGElement(test, tag, parent, attrs) {
  var elem = document.createElementNS(SVGNS, tag);
  if (attrs) {
    for (var attrName in attrs) {
      elem.setAttribute(attrName, attrs[attrName]);
    }
  }
  parent.appendChild(elem);
  test.add_cleanup(function() {
    elem.remove();
  });
  return elem;
}

/**
 * Create a Promise object which resolves when a specific event fires.
 *
 * @param object The event target.
 * @param name The event name.
 */
function waitEvent(object, name) {
  return new Promise(function(resolve) {
    object.addEventListener(name, resolve, { once: true });
  });
}
