{"version":3,"file":"Html.js","sourceRoot":"","sources":["../../../../src/lib/reporters/Html.ts"],"names":[],"mappings":"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","sourcesContent":["import { Executor } from '../executors/Executor';\nimport Reporter, { eventHandler, ReporterProperties } from './Reporter';\nimport Test from '../Test';\nimport Suite from '../Suite';\nimport {\n  suitesIcon,\n  passIcon,\n  failIcon,\n  testsIcon,\n  skipIcon,\n  timeIcon\n} from './html/icons';\n\n// Needs a URLSearchParams polyfill\n\n/**\n * The Html reporter displays an HTML report in the browser.\n */\nexport default class Html extends Reporter implements HtmlProperties {\n  document: Document;\n\n  location: Location;\n\n  protected _reportContainer: Element | undefined;\n\n  // Div element to hold buttons above the summary table\n  protected _reportControls: Element | undefined;\n\n  // tbody element to append report rows to\n  protected _reportNode: Element | undefined;\n\n  // tr element containing summary info\n  protected _summaryNode: Element | undefined;\n\n  // Array of td elements in 'summaryNode'\n  protected _summaryNodes: Element[] = [];\n\n  // Accumulator for total number of suites\n  protected _suiteCount = 0;\n\n  // Accumulator for total number of tests\n  protected _testCount = 0;\n\n  // Tests in the current suite\n  protected _testsInSuite = 0;\n\n  // Current test index\n  protected _testIndex = 0;\n\n  // ID's of tests that have been processed\n  protected _processedTests: any = {};\n\n  protected _passedFilter: any = null;\n  protected _skippedFilter: any = null;\n\n  protected _fragment: DocumentFragment;\n\n  protected _indentLevel = 0;\n\n  protected _runningSuites: any = {};\n\n  constructor(executor: Executor, options: HtmlOptions = {}) {\n    super(executor, options);\n    this.document = options.document || window.document;\n    this.location = options.location || window.location;\n    this._fragment = this.document.createDocumentFragment();\n  }\n\n  /**\n   * Generate the summary header at the top of the report.\n   *\n   * @param suite The root suite of the test session\n   */\n  protected _generateSummary(suite: Suite): void {\n    const document = this.document;\n\n    if (this._summaryNodes.length === 0) {\n      return;\n    }\n\n    const duration = suite.timeElapsed!;\n    const numSkippedTests =\n      suite.numTests - (suite.numFailedTests + suite.numPassedTests);\n    const percentPassed = Math.round(\n      (1 - suite.numFailedTests / suite.numTests) * 100\n    );\n    let rowInfo = [\n      this._suiteCount,\n      this._testCount,\n      formatDuration(duration),\n      numSkippedTests,\n      suite.numFailedTests,\n      percentPassed + '%'\n    ];\n\n    for (let i = 0; i < rowInfo.length; ++i) {\n      this._summaryNodes[i].appendChild(\n        document.createTextNode(<string>rowInfo[i])\n      );\n    }\n\n    // Create a toggle to only show failed tests\n    if (suite.numFailedTests > 0) {\n      this._passedFilter = this._createToggleFilter(\n        'hidePassed',\n        'Hide passed tests'\n      );\n    }\n\n    // Create a toggle to hide skipped tests\n    if (suite.numSkippedTests > 0) {\n      this._skippedFilter = this._createToggleFilter(\n        'hideSkipped',\n        'Hide skipped tests'\n      );\n    }\n  }\n\n  private _createToggleFilter(className: string, label: string) {\n    const document = this.document;\n\n    const toggleFilter = document.createElement('div');\n    toggleFilter.className = `toggleFilter`;\n\n    const toggle = document.createElement('input');\n    toggle.type = 'checkbox';\n\n    const toggleLabel = document.createElement('label');\n    toggleLabel.appendChild(toggle);\n    toggleLabel.appendChild(document.createTextNode(label));\n\n    toggleFilter.appendChild(toggleLabel);\n\n    toggle.onclick = () => {\n      if (toggle.checked) {\n        addClass(document.body, className);\n      } else {\n        removeClass(document.body, className);\n      }\n    };\n\n    return toggleFilter;\n  }\n\n  protected _injectCSS() {\n    const document = this.document;\n    // Prevent FOUC\n    const style = document.createElement('style');\n    style.innerHTML = 'body { visibility: hidden; }';\n\n    const link = document.createElement('link');\n    link.rel = 'stylesheet';\n    link.href = `${this.executor.config.internPath}lib/reporters/html/html.css`;\n\n    document.head!.appendChild(style);\n    document.head!.appendChild(link);\n  }\n\n  protected _getIndentLevel(node: Element) {\n    // second child always has a class of indentN\n    const child: Element = node.children[1];\n\n    // get the indentN class\n    const indent = child.className.split(' ').filter(function(name: string) {\n      return name.indexOf('indent') >= 0;\n    })[0];\n\n    return indent ? parseInt(indent.slice('indent'.length), 10) : 0;\n  }\n\n  /**\n   * Set the collapsed state of a node and return the new state.\n   *\n   * @param {DOMNode} node A suite node\n   * @param {boolean} collapsed Set the collapsed state, or toggle if\n   * undefined\n   */\n  protected _setCollapsed(node: Element, shouldCollapse?: boolean) {\n    let indentDelta: number;\n    let initialIndent = this._getIndentLevel(node);\n\n    const collapsed = containsClass(node, 'collapsed');\n    if (shouldCollapse === collapsed) {\n      // Don't do anything if the current collapse state is the the same\n      // as the requested\n      return;\n    }\n\n    // Use the given collapsed state or toggle the existing state\n    shouldCollapse = shouldCollapse == null ? !collapsed : shouldCollapse;\n    if (shouldCollapse) {\n      addClass(node, 'collapsed');\n    } else {\n      removeClass(node, 'collapsed');\n    }\n\n    // node won't exist after the last test in a suite\n    while ((node = <Element>node.nextSibling)) {\n      indentDelta = this._getIndentLevel(node) - initialIndent;\n\n      // Stop looping when we encounter a row that's not indented more\n      // than the suite being updated\n      if (indentDelta <= 0) {\n        break;\n      }\n\n      // Child suites of the suite being updated should always be\n      // collapsed\n      if (containsClass(node, 'suite')) {\n        addClass(node, 'collapsed');\n      }\n\n      // Only show children one level under the suite being updated when\n      // expanding\n      (<HTMLElement>node).style.display =\n        !shouldCollapse && indentDelta === 1 ? '' : 'none';\n    }\n  }\n\n  @eventHandler()\n  error(error: Error) {\n    const document = this.document;\n    let htmlError = this.formatError(error)\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;');\n    let errorNode = document.createElement('pre');\n    errorNode.style.cssText = 'color: red; font-family: sans-serif;';\n    errorNode.innerHTML =\n      '<h1>Fatal error</h1>' +\n      '<pre style=\"padding: 1em; background-color: #f0f0f0;\">' +\n      htmlError +\n      '</pre>';\n    document.body.appendChild(errorNode);\n  }\n\n  @eventHandler()\n  runStart() {\n    const document = this.document;\n    this._reportContainer = document.createElement('div');\n    const headerNode = document.createElement('h1');\n    const summaryHeaders = [\n      'Suites',\n      'Tests',\n      'Duration',\n      'Skipped',\n      'Failed',\n      'Success Rate'\n    ];\n    const summaryIcons: { [key: string]: string } = {\n      suites: suitesIcon,\n      tests: testsIcon,\n      duration: timeIcon,\n      skipped: skipIcon,\n      failed: failIcon\n    };\n\n    const fragment = this._fragment;\n\n    // Page header\n    const headerTitle = document.createElement('span');\n    headerTitle.className = 'headerTitle';\n    headerTitle.innerHTML = 'Intern Test Report';\n\n    headerNode.className = 'reportHeader';\n    const headerLogo = document.createElement('img');\n    headerLogo.className = 'headerLogo';\n    headerLogo.src =\n      'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAACACAMAAADwF' +\n      'UHEAAADAFBMVEUAAAAAAAAAAABVVVVAQEBmZmZVVVVtbW1gYGBVVVVmZmZdXV1q' +\n      'ampiYmJtbW1mZmZwcHBpaWljY2Nra2tmZmZtbW1oaGhvb29qampwcHBsbGxoaGh' +\n      'tbW1qampvb29ra2twcHBsbGxxcXFtbW1qampubm5ra2tvb29sbGxwcHBtbW1xcX' +\n      'Fubm5sbGxvb29tbW1wcHBtbW1wcHBubm5xcXFvb29tbW1vb29tbW1wcHBubm5wc' +\n      'HBvb29xcXFvb29tbW1wcHBubm5wcHBubm5xcXFvb29xcXFvb29ubm5wcHBubm5w' +\n      'cHBvb29xcXFvb29xcXFwcHBubm5wcHBwcHBvb29xcXFvb29ubm5xcXFwcHBvb29' +\n      'wcHBwcHBvb29xcXFwcHBubm5wcHBvb29wcHBvb29xcXFvb29xcXFwcHBvb29wcH' +\n      'Bvb29wcHBvb29xcXFwcHBxcXFwcHBvb29wcHBvb29wcHBvb29xcXFwcHBxcXFwc' +\n      'HBvb29wcHBubm5wcHBwcHBwcHBxcXFwcHBvb29wcHBvb29xcXFwcHBwcHBvb29x' +\n      'cXFwcHBvb29wcHBwcHBxcXFwcHBxcXFwcHBxcXFwcHBvb29wcHBwcHBxcXFwcHB' +\n      'xcXFwcHBxcXFwcHBwcHBwcHBxcXFwcHBxcXFwcHBxcXFwcHBwcHBxcXFwcHBxcX' +\n      'FwcHBxcXFwcHBwcHBwcHBwcHBxcXFwcHBwcHBxcXFwcHBwcHBwcHBwcHBxcXFwc' +\n      'HBxcXFwcHBxcXFwcHBwcHBwcHBwcHBxcXFwcHBxcXFwcHBxcXFwcHBwcHBxcXFw' +\n      'cHBxcXFxcXFwcHBwcHBxcXFwcHBwcHBxcXFwcHBxcXFwcHBxcXFwcHBxcXFwcHB' +\n      'wcHBxcXFwcHBxcXFwcHBxcXFwcHBxcXFwcHBwcHBxcXFwcHBxcXFwcHBxcXFwcH' +\n      'BxcXFxcXFwcHBxcXFwcHBxcXFwcHBxcXFxcXFwcHBxcXFxcXFwcHBwcHBxcXFwc' +\n      'HBxcXFxcXFwcHBxcXFxcXFwcHBxcXF+cGExAAAA/3RSTlMAAQIDBAUGBwgJCgsM' +\n      'DQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs' +\n      '8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlRVVldYWFlaW11eX2BhYmNkZWZnaGlqa2' +\n      'xtbm9wcXJzdHV2d3h5ent8fX9/gIKDhIWGh4iJi4yMjY6PkJGSk5SVlpeYmZqbn' +\n      'J2en6Gio6SlpqeoqaqrrK2ur7CxsrO0tre4ubq7vL2+v8DBwsPExcbHyMnKy8zN' +\n      'ztDR0tLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vPz9PX29/j5+fr' +\n      '6+/z8/f6oCt5hAAAJJUlEQVQYGcXBC0DU9QEH8O9xgDwEM0BTYVn4thpmvpN02W' +\n      'qVpaXNYlPM0koW+cy0BepYG5Ca1lDLMrXyEenS6GFiTiSxttTIFJsvFFB5TIEdg' +\n      '919+/3+/zu5x/9/AnF3nw+aI/C2qcs27T1RXlVdW1r45ZY/TxwYAi8yDF68v47O' +\n      '6velPxAKrxi06iz11HyYeC08LPSJA3Sv9t27/OA5IXPPswmKpgbCMwKfOcMmOpU' +\n      'UBA8YcYTNUDwzFK2s3UoLm6c0yQ+tKfoEm2//bWhNt+xm85mXt0MrMjxZweYrfh' +\n      'StKfYrtsDWCLSiwEy2wKk70JomN7D5GlKMaEW/Y0vsikarCI0b8+zLb11kS5SNw' +\n      'M/Uc2LGJ6f4c9Q9jhbzHzhjSwlbQbofWiJk3OZLbC1b26K52ozZcImt6etOaJae' +\n      'WRVsbUe7oukGZFvoAad6oYmi11roGSW3oikMz12mx5QPxdV12E5PqhiAq+lzmp5' +\n      '1IQ7uxZXS00r7wp3uF+l5xbHQF1hAbzgaBV2Z9I78UOiIrqOXfOQPbRn0mhVwEN' +\n      'StXw8jhEmPjb7nnoenv1lFz3saNuGPvvGdheSlVZG44k56Xv2dkALHf2SizXehU' +\n      'Pmn1dALyn4BXJ9eSnuzoVpH78gfsqGejrZDMY6+cwGKAvrOeUix9KHjkCbQh/ZB' +\n      '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' +\n      'wAAAABJRU5ErkJggg==';\n\n    headerNode.appendChild(headerLogo);\n    headerNode.appendChild(headerTitle);\n    fragment.appendChild(headerNode);\n\n    // Report container\n    this._reportContainer.className = 'internReportContainer';\n    this._fragment.appendChild(this._reportContainer);\n\n    // Summary table\n    const summaryTableNode = document.createElement('div');\n    summaryTableNode.className = 'summary';\n    this._summaryNode = document.createElement('div');\n\n    for (let i = 0; i < summaryHeaders.length; i++) {\n      const cellNode = document.createElement('div');\n      const cellName = summaryHeaders[i]\n        .toLowerCase()\n        .replace(/\\s(.)/g, (_, char) => char.toUpperCase());\n      cellNode.className = 'summaryContent';\n      addClass(cellNode, cellName);\n\n      if (summaryIcons[cellName]) {\n        const cellIcon = createSvgNode(summaryIcons[cellName], cellName);\n        cellNode.appendChild(cellIcon);\n      }\n\n      const cellTitle = document.createElement('span');\n      cellTitle.className = 'summaryTitle';\n      cellTitle.appendChild(document.createTextNode(summaryHeaders[i]));\n\n      const cellData = document.createElement('div');\n      cellData.className = 'summaryData';\n\n      this._summaryNodes[i] = document.createElement('span');\n      this._summaryNode.appendChild(this._summaryNodes[i]);\n\n      cellData.appendChild(this._summaryNodes[i]);\n      cellNode.appendChild(cellTitle);\n      cellNode.appendChild(cellData);\n      summaryTableNode.appendChild(cellNode);\n    }\n\n    this._reportContainer.appendChild(summaryTableNode);\n\n    // Controls\n    this._reportControls = document.createElement('div');\n    this._reportControls.className = 'reportControls';\n    this._reportControls.appendChild(document.createElement('div'));\n    this._reportControls.appendChild(document.createElement('div'));\n    this._reportContainer.appendChild(this._reportControls);\n\n    // Report table\n    const reportTableNode = document.createElement('table');\n    reportTableNode.className = 'report';\n    this._reportNode = document.createElement('tbody');\n    reportTableNode.appendChild(this._reportNode);\n    this._reportContainer.appendChild(reportTableNode);\n\n    // Handle clicks on table rows, which will expand or collapse rows\n    this._reportNode.addEventListener('click', event => {\n      let target: Element | null = <Element>event.target;\n      if (!target || target.tagName === 'A') {\n        return;\n      }\n\n      while (target && target!.tagName !== 'TR') {\n        target = target!.parentElement;\n      }\n      if (target) {\n        this._setCollapsed(target);\n      }\n    });\n  }\n\n  @eventHandler()\n  suiteStart(suite: Suite) {\n    // There's a top-level Suite that contains all user-created suites\n    // We want to skip it\n    if (!suite.hasParent) {\n      return;\n    }\n\n    this._testsInSuite = suite.tests.length;\n    this._testIndex = 0;\n    this._processedTests = {};\n    this._suiteCount++;\n\n    const document = this.document;\n    const rowNode = document.createElement('tr');\n    rowNode.className = 'suite';\n\n    const statusCell = document.createElement('td');\n    addClass(statusCell, 'column-status');\n    const statusContent = document.createElement('div');\n    addClass(statusContent, 'statusContent');\n    statusCell.appendChild(statusContent);\n    rowNode.appendChild(statusCell);\n\n    const idCell = document.createElement('td');\n    idCell.className = 'column-id';\n    addClass(idCell, 'title');\n\n    const idText = document.createElement('div');\n    idText.className = 'truncateText';\n    idText.appendChild(this.createLinkNode(suite));\n    idCell.appendChild(idText);\n    rowNode.appendChild(idCell);\n\n    this._reportNode!.appendChild(rowNode);\n\n    if (this._indentLevel) {\n      addClass(idCell, `indent${Math.min(this._indentLevel, 5)}`);\n      addClass(rowNode, 'indent');\n    }\n\n    this._runningSuites[suite.id] = { node: rowNode };\n    ++this._indentLevel;\n  }\n\n  @eventHandler()\n  suiteEnd(suite: Suite) {\n    const document = this.document;\n\n    const numTests = suite.numTests;\n    const numFailedTests = suite.numFailedTests;\n    const numPassedTests = suite.numPassedTests;\n    const numSkippedTests = numTests - (numFailedTests + numPassedTests);\n    const hasSuiteFailures = suite.numSkippedTests !== numSkippedTests;\n    const allTestsSkipped = numTests === numSkippedTests;\n\n    if (!suite.hasParent) {\n      this._generateSummary(suite);\n\n      for (let i = 0; i < document.styleSheets.length; i++) {\n        document.styleSheets[i].disabled = true;\n      }\n\n      // Load styles via webpack\n      require('./html/html.styl');\n\n      document.body.innerHTML = '';\n      document.body.className = '';\n      document.body.appendChild(this._fragment);\n\n      const expandToggle = document.createElement('div');\n      expandToggle.className = 'linkButton';\n      expandToggle.textContent = 'Expand/collapse all';\n\n      const reportControls = this._reportControls!;\n      reportControls.firstElementChild!.appendChild(expandToggle);\n\n      expandToggle.addEventListener('click', () => {\n        const reportNode = this._reportNode!;\n        const shouldExpand = reportNode.querySelector('.collapsed') != null;\n        const suites = reportNode.querySelectorAll('.suite');\n        for (let i = 0; i < suites.length; i++) {\n          this._setCollapsed(suites[i], !shouldExpand);\n        }\n      });\n\n      if (this._passedFilter) {\n        reportControls.lastElementChild!.appendChild(this._passedFilter);\n      } else {\n        const failedNode = document.querySelector('.failed')!;\n        addClass(failedNode, 'success');\n      }\n\n      if (this._skippedFilter) {\n        reportControls.lastElementChild!.appendChild(this._skippedFilter);\n      }\n\n      const successRateNode = document.querySelector('.successRate')!;\n\n      if (suite.numFailedTests > 0) {\n        const icon = createSvgNode(failIcon);\n        successRateNode.insertBefore(icon, successRateNode.firstChild);\n        addClass(successRateNode, 'failed');\n      } else {\n        const icon = createSvgNode(passIcon);\n        successRateNode.insertBefore(icon, successRateNode.firstChild);\n      }\n\n      if (hasSuiteFailures) {\n        const skippedNode = document.querySelector('.summaryContent.skipped')!;\n        addClass(skippedNode, 'failed');\n      }\n\n      return;\n    }\n\n    const rowNode = this._runningSuites[suite.id].node;\n    const rowStatus = allTestsSkipped\n      ? 'skipped'\n      : numFailedTests > 0 || hasSuiteFailures\n      ? 'failed'\n      : 'passed';\n\n    // Mark a suite as failed if any of its child tests failed, and\n    addClass(rowNode, rowStatus);\n\n    const icon = createSvgNode(rowStatus === 'skipped' ? skipIcon : suitesIcon);\n    const statusCell = rowNode.querySelector('.column-status');\n    const statusContent = statusCell.firstElementChild;\n    statusContent.appendChild(icon);\n\n    // Only suites with failed tests will be initially expanded\n    this._setCollapsed(rowNode, numFailedTests === 0 && !hasSuiteFailures);\n\n    let cellNode = document.createElement('td');\n\n    if (numPassedTests > 0) {\n      cellNode.appendChild(document.createTextNode('Passed: '));\n      const testsPassed = document.createElement('span');\n      testsPassed.className = 'success';\n      testsPassed.innerHTML = `${numPassedTests}`;\n      cellNode.appendChild(testsPassed);\n    }\n\n    if (numFailedTests > 0) {\n      cellNode.appendChild(document.createTextNode('Failed: '));\n      const testsFailed = document.createElement('span');\n      testsFailed.className = 'failed';\n      testsFailed.innerHTML = `${numFailedTests}`;\n      cellNode.appendChild(testsFailed);\n    }\n\n    if (numSkippedTests > 0) {\n      cellNode.appendChild(document.createTextNode('Skipped: '));\n      const testsSkipped = document.createElement('span');\n      testsSkipped.innerHTML = `${numSkippedTests}`;\n      cellNode.appendChild(testsSkipped);\n    }\n\n    if (suite.error) {\n      const suiteError = document.createElement('span');\n      suiteError.className = 'failed';\n      suiteError.innerHTML = 'Suite error!';\n      cellNode.appendChild(suiteError);\n    }\n\n    cellNode.className = 'column-info';\n    rowNode.appendChild(cellNode);\n\n    // Duration cell\n    cellNode = document.createElement('td');\n    cellNode.className = 'column-time numeric duration';\n    cellNode.appendChild(\n      document.createTextNode(formatDuration(suite.timeElapsed!))\n    );\n    rowNode.appendChild(cellNode);\n\n    --this._indentLevel;\n\n    // Only update the global tracking variables for top-level suites\n    if (!this._indentLevel) {\n      this._testCount += numTests;\n    }\n\n    this._runningSuites[suite.id] = null;\n  }\n\n  @eventHandler()\n  testEnd(test: Test) {\n    if (test.id in this._processedTests) {\n      return;\n    }\n\n    this._processedTests[test.id] = true;\n\n    this._testIndex++;\n\n    const document = this.document;\n    const rowNode = document.createElement('tr');\n    rowNode.className = 'testResult';\n\n    const statusCell = document.createElement('td');\n    statusCell.className = 'column-status';\n    const statusContent = document.createElement('div');\n    statusContent.className = 'statusContent';\n    statusCell.appendChild(statusContent);\n    rowNode.appendChild(statusCell);\n\n    const idCell = document.createElement('td');\n    idCell.className = 'column-id';\n    if (this._indentLevel) {\n      addClass(idCell, `indent${this._indentLevel}`);\n    }\n\n    const idText = document.createElement('div');\n    idText.className = 'truncateText';\n    idText.appendChild(this.createLinkNode(test));\n    idCell.appendChild(idText);\n    rowNode.appendChild(idCell);\n\n    const infoCell = document.createElement('td');\n    infoCell.className = 'column-info';\n\n    let statusIcon: Element;\n\n    if (test.error) {\n      addClass(rowNode, 'failed');\n\n      const errorNode = document.createElement('div');\n      errorNode.className = 'testError';\n      const errorText = document.createElement('pre');\n      addClass(errorText, 'scrollText');\n      errorText.textContent = this.formatError(test.error);\n      errorNode.appendChild(errorText);\n      infoCell.appendChild(errorNode);\n\n      statusIcon = createSvgNode(failIcon);\n    } else if (test.skipped != null) {\n      addClass(rowNode, 'skipped');\n      infoCell.appendChild(document.createTextNode(test.skipped || ''));\n      statusIcon = createSvgNode(skipIcon);\n    } else {\n      addClass(rowNode, 'passed');\n      statusIcon = createSvgNode(passIcon);\n    }\n\n    statusContent.appendChild(statusIcon);\n\n    if (this._testIndex === this._testsInSuite) {\n      addClass(rowNode, 'lastTest');\n    }\n\n    rowNode.appendChild(infoCell);\n\n    const timeNode = document.createElement('td');\n    timeNode.className = 'numeric';\n    addClass(timeNode, 'duration');\n    timeNode.appendChild(\n      document.createTextNode(\n        test.skipped ? 'Skipped' : formatDuration(test.timeElapsed!)\n      )\n    );\n    rowNode.appendChild(timeNode);\n\n    this._reportNode!.appendChild(rowNode);\n  }\n\n  private createLinkNode(obj: Suite | Test) {\n    const document = this.document;\n    const location = this.location;\n\n    const params = new URLSearchParams(location.search.slice(1) || undefined);\n    params.delete('grep');\n    params.append('grep', obj.id);\n\n    const a = document.createElement('a');\n    a.href = location.origin + location.pathname + `?${params.toString()}`;\n    a.title = obj.name!;\n    a.appendChild(document.createTextNode(obj.name!));\n\n    return a;\n  }\n}\n\nexport interface HtmlProperties extends ReporterProperties {\n  document: Document;\n  location: Location;\n}\n\nexport type HtmlOptions = Partial<HtmlProperties>;\n\nfunction containsClass(node: Element, cls: string) {\n  const classes = node.className.split(/\\s+/);\n  return classes.indexOf(cls) !== -1;\n}\n\nfunction addClass(node: Element, cls: string) {\n  if (node.classList) {\n    node.classList.add(cls);\n  } else {\n    const classes = getClassName(node).split(/\\s+/);\n    if (classes.indexOf(cls) !== -1) {\n      return;\n    }\n\n    classes.push(cls);\n    setClassName(node, classes.join(' '));\n  }\n}\n\nfunction removeClass(node: Element, cls: string) {\n  if (node.classList) {\n    node.classList.remove(cls);\n  } else {\n    const classes = getClassName(node).split(/\\s+/);\n    const index = classes.indexOf(cls);\n    if (index === -1) {\n      return;\n    }\n\n    classes.splice(index, 1);\n    setClassName(node, classes.join(' '));\n  }\n}\n\nfunction getClassName(node: Element) {\n  return node.getAttribute('class') || '';\n}\n\nfunction setClassName(node: Element, cls: string) {\n  node.setAttribute('class', cls);\n}\n\nfunction pad(value: string | number, size: number): string {\n  let padded = String(value);\n\n  while (padded.length < size) {\n    padded = '0' + padded;\n  }\n\n  return padded;\n}\n\n// Format a millisecond value to m:ss.SSS\n// If duration is greater than 60 minutes, value will be HHHH:mm:ss.SSS\n// (the hours value will not be converted to days)\nfunction formatDuration(duration: number): string {\n  let hours = Math.floor(duration / 3600000);\n  let minutes: string | number = Math.floor(duration / 60000) - hours * 60;\n  let seconds = Math.floor(duration / 1000) - hours * 3600 - minutes * 60;\n  let milliseconds =\n    duration - hours * 3600000 - minutes * 60000 - seconds * 1000;\n  let formattedValue = '';\n\n  if (hours) {\n    formattedValue = hours + ':';\n    minutes = pad(minutes, 2);\n  }\n\n  formattedValue +=\n    minutes + ':' + pad(seconds, 2) + '.' + pad(milliseconds, 3);\n\n  return formattedValue;\n}\n\nfunction createSvgNode(svg: string, extraClass?: string) {\n  const div = document.createElement('div');\n  div.className = 'icon';\n  div.innerHTML = svg;\n  const icon = div.firstElementChild!;\n  addClass(icon, 'icon');\n  if (extraClass) {\n    addClass(icon, extraClass);\n  }\n  return icon;\n}\n"]}