Bug 1473631: Part 10 - Replace pref observers with callbacks in ScriptSecurityManager. r?njn draft
authorKris Maglione <maglione.k@gmail.com>
Thu, 05 Jul 2018 14:53:14 -0700
changeset 818482 4b186852a9ec326bc86a1f658ee7c2abca8c10ba
parent 818481 44aa2241ae5f3f45a34dc41308720d1c0a5a5ff3
child 818483 5d1d3a69c397bda43b55a428e84b8226bffcb1fc
push id116269
push usermaglione.k@gmail.com
push dateSat, 14 Jul 2018 02:18:47 +0000
reviewersnjn
bugs1473631
milestone63.0a1
Bug 1473631: Part 10 - Replace pref observers with callbacks in ScriptSecurityManager. r?njn MozReview-Commit-ID: COEgATfeEj
caps/nsScriptSecurityManager.cpp
caps/nsScriptSecurityManager.h
--- a/caps/nsScriptSecurityManager.cpp
+++ b/caps/nsScriptSecurityManager.cpp
@@ -41,17 +41,16 @@
 #include "nsIFileURL.h"
 #include "nsIZipReader.h"
 #include "nsIScriptGlobalObject.h"
 #include "nsPIDOMWindow.h"
 #include "nsIDocShell.h"
 #include "nsIPrompt.h"
 #include "nsIWindowWatcher.h"
 #include "nsIConsoleService.h"
-#include "nsIObserverService.h"
 #include "nsIOService.h"
 #include "nsIContent.h"
 #include "nsDOMJSUtils.h"
 #include "nsAboutProtocolUtils.h"
 #include "nsIClassInfo.h"
 #include "nsIURIFixup.h"
 #include "nsCDefaultURIFixup.h"
 #include "nsIChromeRegistry.h"
@@ -456,18 +455,17 @@ nsScriptSecurityManager::IsSystemPrincip
 /////////////////////////////
 // nsScriptSecurityManager //
 /////////////////////////////
 
 ////////////////////////////////////
 // Methods implementing ISupports //
 ////////////////////////////////////
 NS_IMPL_ISUPPORTS(nsScriptSecurityManager,
-                  nsIScriptSecurityManager,
-                  nsIObserver)
+                  nsIScriptSecurityManager)
 
 ///////////////////////////////////////////////////
 // Methods implementing nsIScriptSecurityManager //
 ///////////////////////////////////////////////////
 
 ///////////////// Security Checks /////////////////
 
 bool
@@ -1346,39 +1344,28 @@ nsScriptSecurityManager::CanGetService(J
     nsAutoCString errorMsg("Permission denied to get service. CID=");
     char cidStr[NSID_LENGTH];
     aCID.ToProvidedString(cidStr);
     errorMsg.Append(cidStr);
     SetPendingExceptionASCII(cx, errorMsg.get());
     return NS_ERROR_DOM_XPCONNECT_ACCESS_DENIED;
 }
 
-/////////////////////////////////////
-// Method implementing nsIObserver //
-/////////////////////////////////////
 const char sJSEnabledPrefName[] = "javascript.enabled";
 const char sFileOriginPolicyPrefName[] =
     "security.fileuri.strict_origin_policy";
 
 static const char* kObservedPrefs[] = {
   sJSEnabledPrefName,
   sFileOriginPolicyPrefName,
   "capability.policy.",
   nullptr
 };
 
 
-NS_IMETHODIMP
-nsScriptSecurityManager::Observe(nsISupports* aObject, const char* aTopic,
-                                 const char16_t* aMessage)
-{
-    ScriptSecurityPrefChanged();
-    return NS_OK;
-}
-
 /////////////////////////////////////////////
 // Constructor, Destructor, Initialization //
 /////////////////////////////////////////////
 nsScriptSecurityManager::nsScriptSecurityManager(void)
     : mPrefInitialized(false)
     , mIsJavaScriptEnabled(false)
 {
     static_assert(sizeof(intptr_t) == sizeof(void*),
@@ -1415,17 +1402,20 @@ nsresult nsScriptSecurityManager::Init()
 
     return NS_OK;
 }
 
 static StaticRefPtr<nsScriptSecurityManager> gScriptSecMan;
 
 nsScriptSecurityManager::~nsScriptSecurityManager(void)
 {
-    Preferences::RemoveObservers(this, kObservedPrefs);
+    Preferences::UnregisterPrefixCallbacks(
+       PREF_CHANGE_METHOD(nsScriptSecurityManager::ScriptSecurityPrefChanged),
+       kObservedPrefs,
+       this);
     if (mDomainPolicy) {
         mDomainPolicy->Deactivate();
     }
     // ContentChild might hold a reference to the domain policy,
     // and it might release it only after the security manager is
     // gone. But we can still assert this for the main process.
     MOZ_ASSERT_IF(XRE_IsParentProcess(),
                   !mDomainPolicy);
@@ -1495,17 +1485,17 @@ uint32_t SkipUntil(const nsCString& str,
 {
     while (base < str.Length() && !Predicate::Test(str[base])) {
         ++base;
     }
     return base;
 }
 
 inline void
-nsScriptSecurityManager::ScriptSecurityPrefChanged()
+nsScriptSecurityManager::ScriptSecurityPrefChanged(const char* aPref)
 {
     MOZ_ASSERT(mPrefInitialized);
     mIsJavaScriptEnabled =
         Preferences::GetBool(sJSEnabledPrefName, mIsJavaScriptEnabled);
     sStrictFileOriginPolicy =
         Preferences::GetBool(sFileOriginPolicyPrefName, false);
     mFileURIWhitelist.reset();
 }
@@ -1552,17 +1542,20 @@ nsScriptSecurityManager::InitPrefs()
     NS_ENSURE_TRUE(branch, NS_ERROR_FAILURE);
 
     mPrefInitialized = true;
 
     // Set the initial value of the "javascript.enabled" prefs
     ScriptSecurityPrefChanged();
 
     // set observer callbacks in case the value of the prefs change
-    Preferences::AddStrongObservers(this, kObservedPrefs);
+    Preferences::RegisterPrefixCallbacks(
+       PREF_CHANGE_METHOD(nsScriptSecurityManager::ScriptSecurityPrefChanged),
+       kObservedPrefs,
+       this);
 
     OriginAttributes::InitPrefs();
 
     return NS_OK;
 }
 
 NS_IMETHODIMP
 nsScriptSecurityManager::GetDomainPolicyActive(bool *aRv)
--- a/caps/nsScriptSecurityManager.h
+++ b/caps/nsScriptSecurityManager.h
@@ -7,17 +7,16 @@
 #ifndef nsScriptSecurityManager_h__
 #define nsScriptSecurityManager_h__
 
 #include "nsIScriptSecurityManager.h"
 
 #include "mozilla/Maybe.h"
 #include "nsIPrincipal.h"
 #include "nsCOMPtr.h"
-#include "nsIObserver.h"
 #include "nsServiceManagerUtils.h"
 #include "nsStringFwd.h"
 #include "plstr.h"
 #include "js/TypeDecls.h"
 
 #include <stdint.h>
 
 class nsIIOService;
@@ -30,27 +29,25 @@ class OriginAttributes;
 
 /////////////////////////////
 // nsScriptSecurityManager //
 /////////////////////////////
 #define NS_SCRIPTSECURITYMANAGER_CID \
 { 0x7ee2a4c0, 0x4b93, 0x17d3, \
 { 0xba, 0x18, 0x00, 0x60, 0xb0, 0xf1, 0x99, 0xa2 }}
 
-class nsScriptSecurityManager final : public nsIScriptSecurityManager,
-                                      public nsIObserver
+class nsScriptSecurityManager final : public nsIScriptSecurityManager
 {
 public:
     static void Shutdown();
 
     NS_DEFINE_STATIC_CID_ACCESSOR(NS_SCRIPTSECURITYMANAGER_CID)
 
     NS_DECL_ISUPPORTS
     NS_DECL_NSISCRIPTSECURITYMANAGER
-    NS_DECL_NSIOBSERVER
 
     static nsScriptSecurityManager*
     GetScriptSecurityManager();
 
     // Invoked exactly once, by XPConnect.
     static void InitStatics();
 
     static already_AddRefed<SystemPrincipal>
@@ -94,18 +91,18 @@ private:
     JSPrincipalsSubsume(JSPrincipals *first, JSPrincipals *second);
 
     nsresult
     Init();
 
     nsresult
     InitPrefs();
 
-    inline void
-    ScriptSecurityPrefChanged();
+    void
+    ScriptSecurityPrefChanged(const char* aPref = nullptr);
 
     inline void
     AddSitesToFileURIWhitelist(const nsCString& aSiteList);
 
     nsresult GetChannelResultPrincipal(nsIChannel* aChannel,
                                        nsIPrincipal** aPrincipal,
                                        bool aIgnoreSandboxing);