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 +}