// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

(async function() {
  TestRunner.addResult(
      `Tests that URLs are linked to and completed correctly. Bugs 51663, 53171, 62643, 72373, 79905\n`);
  await TestRunner.loadModule('elements_test_runner');
  await TestRunner.showPanel('elements');
  await TestRunner.loadHTML(`
      <div id="local"></div>
      <iframe src="../styles/resources/styles-url-linkify-iframe.html"></iframe>
    `);
  await TestRunner.addStylesheetTag('../styles/resources/styles-url-linkify.css');

  function completeURL(baseURL, href) {
    TestRunner.addResult(Common.ParsedURL.completeURL(baseURL, href));
  }

  TestRunner.addResult('URLs completed:');
  completeURL('http://example.com', '/');
  completeURL('http://example.com', 'moo');
  completeURL('http://example.com/', 'https://secure.com/moo');
  completeURL('https://example.com/foo', '//secure.com/moo');
  completeURL('http://example.com/foo/zoo', '/moo');
  completeURL('http://example.com/foo/zoo/', 'moo');
  completeURL('http://example.com/foo/zoo', 'boo/moo');
  completeURL('http://example.com/foo', 'moo');
  completeURL('http://example.com/foo', '?a=b');
  completeURL('http://example.com/foo', '?a=/b');
  completeURL('http://example.com/?c=/d#anchor', '?a=/b');
  completeURL('http://example.com/foo?c=d', '?a=b');
  completeURL('http://example.com/foo?c=d#anchor', '?a=/b');
  completeURL('http://example.com/foo?c=/d/e', '?a=b');
  completeURL('http://example.com/foo?c=/d/e', 'cat.jpeg');
  completeURL('http://example.com/foo#anchor', 'cat.jpeg');
  completeURL('http://example.com/', '/foo?bar=http://otherexample.com');

  const dataURL =
      'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAABCAgMAAACeOuh7AAAABGdBTUEAAK/INwWK6QAAAAlQTFRF////AAAA////fu+PTwAAAAF0Uk5TAEDm2GYAAACHSURBVDjLxdLbDYAgDAVQGELn0R3oEHYf2KGdUqtE46OFRCP3oyTng1xCnWsaD5JRRtCkQ2YmkBkHRXqWJBn0j0TICbrsWVoWhRShCdcGyZCtHxMaUnVPRZ9KSbmBJdsX2vJVnwqRD0Rb4rpzgIbE/AI5NTnWAMvy5l0dXrfuLh5OCe5BmmYGXhTUxlQ5xJ8AAAAASUVORK5CYII=';
  const blobURL = 'blob:http://example.com/f91b7b00-00-0000-0000-3b7c87055d7a';
  completeURL('https://example.com/foo', dataURL);
  completeURL('http://example.com/foo', 'javascript:alert(\'foo\');');
  completeURL('http://example.com/foo', blobURL);
  completeURL('', blobURL);

  function dumpHref(dumpLinkClass) {
    var hrefNode;
    var valueChildNodes =
        ElementsTestRunner.firstMatchedStyleSection().propertiesTreeOutline.firstChild().valueElement.childNodes;
    for (var i = 0; i < valueChildNodes.length; ++i) {
      if (valueChildNodes[i].href) {
        hrefNode = valueChildNodes[i];
        break;
      }
    }
    if (!hrefNode) {
      TestRunner.addResult('href property not found');
      return;
    }

    var styleClass = '';
    if (dumpLinkClass) {
      if (hrefNode.classList.contains('devtools-link'))
        styleClass += 'devtools-link ';
    }

    var href = hrefNode.href;
    var segments = href.split('/');
    var output = [];
    for (var i = segments.length - 1, minSegment = i - 3; i >= 0 && i >= minSegment; --i)
      output.unshift(segments[i]);

    TestRunner.addResult(styleClass + output.join('/'));
  }

  ElementsTestRunner.selectNodeAndWaitForStyles('local', step1);

  function step1() {
    TestRunner.addResult('Link for a URI from CSS document:');
    dumpHref(true);
    ElementsTestRunner.selectNodeAndWaitForStyles('iframed', step2);
  }

  function step2() {
    TestRunner.addResult('Link for a URI from iframe inline stylesheet:');
    dumpHref();
    TestRunner.completeTest();
  }
})();
