summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/general/browser_star_hsts.js
blob: d89edefe85729df92356cd231dc6347c2374b0d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/
 */
/* eslint-disable mozilla/no-arbitrary-setTimeout */

var secureURL =
  "https://example.com/browser/browser/base/content/test/general/browser_star_hsts.sjs";
var unsecureURL =
  "http://example.com/browser/browser/base/content/test/general/browser_star_hsts.sjs";

add_task(async function test_star_redirect() {
  registerCleanupFunction(async () => {
    // Ensure to remove example.com from the HSTS list.
    let sss = Cc["@mozilla.org/ssservice;1"].getService(
      Ci.nsISiteSecurityService
    );
    sss.resetState(
      NetUtil.newURI("http://example.com/"),
      Services.prefs.getBoolPref("privacy.partition.network_state")
        ? { partitionKey: "(http,example.com)" }
        : {}
    );
    await PlacesUtils.bookmarks.eraseEverything();
    gBrowser.removeCurrentTab();
  });

  let tab = (gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser));
  // This will add the page to the HSTS cache.
  await promiseTabLoadEvent(tab, secureURL, secureURL);
  // This should transparently be redirected to the secure page.
  await promiseTabLoadEvent(tab, unsecureURL, secureURL);

  await promiseStarState(BookmarkingUI.STATUS_UNSTARRED);

  StarUI._createPanelIfNeeded();
  let bookmarkPanel = document.getElementById("editBookmarkPanel");
  let shownPromise = promisePopupShown(bookmarkPanel);
  BookmarkingUI.star.click();
  await shownPromise;

  is(BookmarkingUI.status, BookmarkingUI.STATUS_STARRED, "The star is starred");
});

/**
 * Waits for the star to reflect the expected state.
 */
function promiseStarState(aValue) {
  return new Promise(resolve => {
    let expectedStatus = aValue
      ? BookmarkingUI.STATUS_STARRED
      : BookmarkingUI.STATUS_UNSTARRED;
    (function checkState() {
      if (
        BookmarkingUI.status == BookmarkingUI.STATUS_UPDATING ||
        BookmarkingUI.status != expectedStatus
      ) {
        info("Waiting for star button change.");
        setTimeout(checkState, 1000);
      } else {
        resolve();
      }
    })();
  });
}

/**
 * Starts a load in an existing tab and waits for it to finish (via some event).
 *
 * @param aTab
 *        The tab to load into.
 * @param aUrl
 *        The url to load.
 * @param [optional] aFinalURL
 *        The url to wait for, same as aURL if not defined.
 * @return {Promise} resolved when the event is handled.
 */
function promiseTabLoadEvent(aTab, aURL, aFinalURL) {
  if (!aFinalURL) {
    aFinalURL = aURL;
  }

  info("Wait for load tab event");
  BrowserTestUtils.loadURI(aTab.linkedBrowser, aURL);
  return BrowserTestUtils.browserLoaded(aTab.linkedBrowser, false, aFinalURL);
}