requestLongerTimeout(2);

const TEST_URL = "http://example.com/browser/browser/base/content/test/general/app_bug575561.html";

add_task(function*() {
  SimpleTest.requestCompleteLog();

  // Pinned: Link to the same domain should not open a new tab
  // Tests link to http://example.com/browser/browser/base/content/test/general/dummy_page.html
  yield testLink(0, true, false);
  // Pinned: Link to a different subdomain should open a new tab
  // Tests link to http://test1.example.com/browser/browser/base/content/test/general/dummy_page.html
  yield testLink(1, true, true);

  // Pinned: Link to a different domain should open a new tab
  // Tests link to http://example.org/browser/browser/base/content/test/general/dummy_page.html
  yield testLink(2, true, true);

  // Not Pinned: Link to a different domain should not open a new tab
  // Tests link to http://example.org/browser/browser/base/content/test/general/dummy_page.html
  yield testLink(2, false, false);

  // Pinned: Targetted link should open a new tab
  // Tests link to http://example.org/browser/browser/base/content/test/general/dummy_page.html with target="foo"
  yield testLink(3, true, true);

  // Pinned: Link in a subframe should not open a new tab
  // Tests link to http://example.org/browser/browser/base/content/test/general/dummy_page.html in subframe
  yield testLink(0, true, false, true);

  // Pinned: Link to the same domain (with www prefix) should not open a new tab
  // Tests link to http://www.example.com/browser/browser/base/content/test/general/dummy_page.html
  yield testLink(4, true, false);

  // Pinned: Link to a data: URI should not open a new tab
  // Tests link to data:text/html,<!DOCTYPE html><html><body>Another Page</body></html>
  yield testLink(5, true, false);

  // Pinned: Link to an about: URI should not open a new tab
  // Tests link to about:logo
  yield testLink(function(doc) {
    let link = doc.createElement("a");
    link.textContent = "Link to Mozilla";
    link.href = "about:logo";
    doc.body.appendChild(link);
    return link;
  }, true, false, false, "about:robots");
});

var waitForPageLoad = Task.async(function*(browser, linkLocation) {
  yield waitForDocLoadComplete();

  is(browser.contentDocument.location.href, linkLocation, "Link should not open in a new tab");
});

var waitForTabOpen = Task.async(function*() {
  let event = yield promiseWaitForEvent(gBrowser.tabContainer, "TabOpen", true);
  ok(true, "Link should open a new tab");

  yield waitForDocLoadComplete(event.target.linkedBrowser);
  yield Promise.resolve();

  gBrowser.removeCurrentTab();
});

var testLink = Task.async(function*(aLinkIndexOrFunction, pinTab, expectNewTab, testSubFrame, aURL = TEST_URL) {
  let appTab = gBrowser.addTab(aURL, {skipAnimation: true});
  if (pinTab)
    gBrowser.pinTab(appTab);
  gBrowser.selectedTab = appTab;

  yield waitForDocLoadComplete();

  let browser = appTab.linkedBrowser;
  if (testSubFrame)
    browser = browser.contentDocument.querySelector("iframe");

  let link;
  if (typeof aLinkIndexOrFunction == "function") {
    link = aLinkIndexOrFunction(browser.contentDocument);
  } else {
    link = browser.contentDocument.querySelectorAll("a")[aLinkIndexOrFunction];
  }

  let promise;
  if (expectNewTab)
    promise = waitForTabOpen();
  else
    promise = waitForPageLoad(browser, link.href);

  info("Clicking " + link.textContent);
  link.click();

  yield promise;

  gBrowser.removeTab(appTab);
});
