browser/base/content/test/general/browser_star_hsts.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/browser/base/content/test/general/browser_star_hsts.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,114 @@
     1.4 +/* Any copyright is dedicated to the Public Domain.
     1.5 + * http://creativecommons.org/publicdomain/zero/1.0/
     1.6 + */
     1.7 +
     1.8 +let secureURL = "https://example.com/browser/browser/base/content/test/general/browser_star_hsts.sjs";
     1.9 +let unsecureURL = "http://example.com/browser/browser/base/content/test/general/browser_star_hsts.sjs";
    1.10 +
    1.11 +add_task(function* test_star_redirect() {
    1.12 +  registerCleanupFunction(function() {
    1.13 +    // Ensure to remove example.com from the HSTS list.
    1.14 +    let sss = Cc["@mozilla.org/ssservice;1"]
    1.15 +                .getService(Ci.nsISiteSecurityService);
    1.16 +    sss.removeState(Ci.nsISiteSecurityService.HEADER_HSTS,
    1.17 +                    NetUtil.newURI("http://example.com/"), 0);
    1.18 +    PlacesUtils.bookmarks.removeFolderChildren(PlacesUtils.unfiledBookmarksFolderId);
    1.19 +    gBrowser.removeCurrentTab();
    1.20 +  });
    1.21 +
    1.22 +  let tab = gBrowser.selectedTab = gBrowser.addTab();
    1.23 +  // This will add the page to the HSTS cache.
    1.24 +  yield promiseTabLoadEvent(tab, secureURL, secureURL);
    1.25 +  // This should transparently be redirected to the secure page.
    1.26 +  yield promiseTabLoadEvent(tab, unsecureURL, secureURL);
    1.27 +
    1.28 +  yield promiseStarState(BookmarkingUI.STATUS_UNSTARRED);
    1.29 +
    1.30 +  let promiseBookmark = promiseOnItemAdded(gBrowser.currentURI);
    1.31 +  BookmarkingUI.star.click();
    1.32 +  // This resolves on the next tick, so the star should have already been
    1.33 +  // updated at that point.
    1.34 +  yield promiseBookmark;
    1.35 +
    1.36 +  is(BookmarkingUI.status, BookmarkingUI.STATUS_STARRED, "The star is starred");
    1.37 +});
    1.38 +
    1.39 +/**
    1.40 + * Waits for the star to reflect the expected state.
    1.41 + */
    1.42 +function promiseStarState(aValue) {
    1.43 +  let deferred = Promise.defer();
    1.44 +  let expectedStatus = aValue ? BookmarkingUI.STATUS_STARRED
    1.45 +                              : BookmarkingUI.STATUS_UNSTARRED;
    1.46 +  (function checkState() {
    1.47 +    if (BookmarkingUI.status == BookmarkingUI.STATUS_UPDATING ||
    1.48 +        BookmarkingUI.status != expectedStatus) {
    1.49 +      info("Waiting for star button change.");
    1.50 +      setTimeout(checkState, 1000);
    1.51 +    } else {
    1.52 +      deferred.resolve();
    1.53 +    }
    1.54 +  })();
    1.55 +  return deferred.promise;
    1.56 +}
    1.57 +
    1.58 +/**
    1.59 + * Starts a load in an existing tab and waits for it to finish (via some event).
    1.60 + *
    1.61 + * @param aTab
    1.62 + *        The tab to load into.
    1.63 + * @param aUrl
    1.64 + *        The url to load.
    1.65 + * @param [optional] aFinalURL
    1.66 + *        The url to wait for, same as aURL if not defined.
    1.67 + * @return {Promise} resolved when the event is handled.
    1.68 + */
    1.69 +function promiseTabLoadEvent(aTab, aURL, aFinalURL)
    1.70 +{
    1.71 +  if (!aFinalURL)
    1.72 +    aFinalURL = aURL;
    1.73 +  let deferred = Promise.defer();
    1.74 +  info("Wait for load tab event");
    1.75 +  aTab.linkedBrowser.addEventListener("load", function load(event) {
    1.76 +    if (event.originalTarget != aTab.linkedBrowser.contentDocument ||
    1.77 +        event.target.location.href == "about:blank" ||
    1.78 +        event.target.location.href != aFinalURL) {
    1.79 +      info("skipping spurious load event");
    1.80 +      return;
    1.81 +    }
    1.82 +    aTab.linkedBrowser.removeEventListener("load", load, true);
    1.83 +    info("Tab load event received");
    1.84 +    deferred.resolve();
    1.85 +  }, true, true);
    1.86 +  aTab.linkedBrowser.loadURI(aURL);
    1.87 +  return deferred.promise;
    1.88 +}
    1.89 +
    1.90 +/**
    1.91 + * Waits for a bookmark to be added for the given uri.
    1.92 + */
    1.93 +function promiseOnItemAdded(aExpectedURI) {
    1.94 +  let defer = Promise.defer();
    1.95 +  let bookmarksObserver = {
    1.96 +    onItemAdded: function (aItemId, aFolderId, aIndex, aItemType, aURI) {
    1.97 +      info("Added a bookmark to " + aURI.spec);
    1.98 +      PlacesUtils.bookmarks.removeObserver(bookmarksObserver);
    1.99 +      if (aURI.equals(aExpectedURI))
   1.100 +        defer.resolve();
   1.101 +      else
   1.102 +        defer.reject(new Error("Added an unexpected bookmark"));
   1.103 +    },
   1.104 +    onBeginUpdateBatch: function () {},
   1.105 +    onEndUpdateBatch: function () {},
   1.106 +    onItemRemoved: function () {},
   1.107 +    onItemChanged: function () {},
   1.108 +    onItemVisited: function () {},
   1.109 +    onItemMoved: function () {},
   1.110 +    QueryInterface: XPCOMUtils.generateQI([
   1.111 +      Ci.nsINavBookmarkObserver,
   1.112 +    ])
   1.113 +  };
   1.114 +  info("Waiting for a bookmark to be added");
   1.115 +  PlacesUtils.bookmarks.addObserver(bookmarksObserver, false);
   1.116 +  return defer.promise;
   1.117 +}

mercurial