diff --git a/parser/xml/test/unit/test_sanitizer.js b/parser/xml/test/unit/test_sanitizer.js index fdcc58aa23fc..fa3eea648417 100644 --- a/parser/xml/test/unit/test_sanitizer.js +++ b/parser/xml/test/unit/test_sanitizer.js @@ -1,8 +1,24 @@ +// We load HTML documents, which try to track link state, which requires +// the history service, which requires a profile. +do_get_profile(); + function run_test() { // vectors by the html5security project (https://code.google.com/p/html5security/ & Creative Commons 3.0 BY), see CC-BY-LICENSE for the full license load("results.js"); // gives us a `vectors' array /* import-globals-from ./results.js */ + // xpcshell tests are weird. They fake shutdown after the test finishes. This upsets this test + // because it will try to create the history service to check for visited state on the links + // we're parsing. + // Creating the history service midway through shutdown breaks. + // We can't catch this in the history component because we're not *actually* shutting down, + // and so the app startup's service's `shuttingDown` bool is false, even though normally that + // is set to true *before* profile-change-teardown notifications are fired. + // To work around this, just force the history service to be created earlier: + + let {PlacesUtils} = ChromeUtils.import("resource://gre/modules/PlacesUtils.jsm"); + Assert.ok(PlacesUtils.history.databaseStatus <= 1, "ensure places database is successfully initialized."); + var ParserUtils = Cc["@mozilla.org/parserutils;1"].getService(Ci.nsIParserUtils); var sanitizeFlags = ParserUtils.SanitizerCidEmbedsOnly | ParserUtils.SanitizerDropForms | ParserUtils.SanitizerDropNonCSSPresentation; // flags according to diff --git a/toolkit/components/places/History.cpp b/toolkit/components/places/History.cpp index 0ee9b4c2c21d..85fdacc98403 100644 --- a/toolkit/components/places/History.cpp +++ b/toolkit/components/places/History.cpp @@ -1445,6 +1445,16 @@ History::History() mObservers(VISIT_OBSERVERS_INITIAL_CACHE_LENGTH), mRecentlyVisitedURIs(RECENTLY_VISITED_URIS_SIZE) { NS_ASSERTION(!gService, "Ruh-roh! This service has already been created!"); + if (XRE_IsParentProcess()) { + nsCOMPtr dirsvc = services::GetDirectoryService(); + bool haveProfile = false; + MOZ_RELEASE_ASSERT( + dirsvc && + NS_SUCCEEDED( + dirsvc->Has(NS_APP_USER_PROFILE_50_DIR, &haveProfile)) && + haveProfile, + "Can't construct history service if there is no profile."); + } gService = this; nsCOMPtr os = services::GetObserverService();