function requestViaNavigable(navigableElementName, additionalAttributes,
                             parentNode, trigger) {
  const name = guid();

  const iframe =
    createElement("iframe", {"name": name, "id": name}, parentNode, false);

  const navigable = createElement(
      navigableElementName,
      Object.assign({"target": name}, additionalAttributes),
      parentNode, false);

  const promise =
    bindEvents2(window, "message", iframe, "error", window, "error")
      .then(event => {
          if (event.source !== iframe.contentWindow)
            return Promise.reject(new Error('Unexpected event.source'));
          return event.data;
        });
  trigger(navigable);
  return promise;
}
Creates a navigable element with the name `navigableElementName`
(<a>, <area>, or <form>) under `parentNode`, and
performs a navigation by `trigger()` (e.g. clicking <a>).
To avoid navigating away from the current execution context,
a target attribute is set to point to a new helper iframe.
@param {string} navigableElementName
@param {object} additionalAttributes The attributes of the navigable element.
@param {DOMElement} parentNode
@param {function(DOMElement} trigger A callback called after the navigable
element is inserted and should trigger navigation using the element.
@return {Promise} The promise for success/error events.