diff --git a/modules/libpref/public/Makefile.in b/modules/libpref/public/Makefile.in index 1b0e976764c..eb021508f65 100644 --- a/modules/libpref/public/Makefile.in +++ b/modules/libpref/public/Makefile.in @@ -32,6 +32,7 @@ GRE_MODULE = 1 SDK_XPIDLSRCS = \ nsIPrefService.idl \ nsIPrefBranch.idl \ + nsIPrefBranch2.idl \ nsIPrefLocalizedString.idl \ $(NULL) diff --git a/modules/libpref/public/nsIPrefBranch2.idl b/modules/libpref/public/nsIPrefBranch2.idl new file mode 100755 index 00000000000..55470b88528 --- /dev/null +++ b/modules/libpref/public/nsIPrefBranch2.idl @@ -0,0 +1,114 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: NPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Netscape Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Alec Flett + * Brian Nesse + * Benjamin Smedberg + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the NPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the NPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsIPrefBranch.idl" + +interface nsIObserver; + +/** + * nsIPrefBranch2 allows clients to observe changes to pref values. + * + * @status FROZEN + * @see nsIPrefBranch + */ +[scriptable, uuid(74567534-eb94-4b1c-8f45-389643bfc555)] +interface nsIPrefBranch2 : nsIPrefBranch +{ + /** + * Add a preference change observer. On preference changes, the following + * arguments will be passed to the nsIObserver.observe() method: + * aSubject - The nsIPrefBranch object (this) + * aTopic - The string defined by NS_PREFBRANCH_PREFCHANGE_TOPIC_ID + * aData - The preference which has changed + * + * @param aDomain The preference on which to listen for changes. This can + * be the name of an entire branch to observe. + * e.g. Holding the "root" prefbranch and calling + * addObserver("foo.bar.", ...) will observe changes to + * foo.bar.baz and foo.bar.bzip + * @param aObserver The object to be notified if the preference changes. + * @param aHoldWeak true Hold a weak reference to |aObserver|. The object + * must implement the nsISupportsWeakReference + * interface or this will fail. + * false Hold a strong reference to |aObserver|. + * + * @note + * Registering as a preference observer can open an object to potential + * cyclical references which will cause memory leaks. These cycles generally + * occur because an object both registers itself as an observer (causing the + * branch to hold a reference to the observer) and holds a reference to the + * branch object for the purpose of getting/setting preference values. There + * are 3 approaches which have been implemented in an attempt to avoid these + * situations. + * 1) The nsPrefBranch object supports nsISupportsWeakReference. Any consumer + * may hold a weak reference to it instead of a strong one. + * 2) The nsPrefBranch object listens for xpcom-shutdown and frees all of the + * objects currently in its observer list. This insures that long lived + * objects (services for example) will be freed correctly. + * 3) The observer can request to be held as a weak reference when it is + * registered. This insures that shorter lived objects (say one tied to an + * open window) will not fall into the cyclical reference trap. + * + * @see nsIObserver + * @see removeObserver + */ + void addObserver(in string aDomain, in nsIObserver aObserver, + in boolean aHoldWeak); + + /** + * Remove a preference change observer. + * + * @param aDomain The preference which is being observed for changes. + * @param aObserver An observer previously registered with addObserver(). + * + * @see nsIObserver + * @see addObserver + */ + void removeObserver(in string aDomain, in nsIObserver aObserver); +}; + +%{C++ + +/** + * Notification sent when a preference changes. + */ +#define NS_PREFBRANCH_PREFCHANGE_TOPIC_ID "nsPref:changed" + +%} diff --git a/modules/libpref/public/nsIPrefBranchInternal.idl b/modules/libpref/public/nsIPrefBranchInternal.idl index a92c9b3f128..4ffb4d5dff1 100644 --- a/modules/libpref/public/nsIPrefBranchInternal.idl +++ b/modules/libpref/public/nsIPrefBranchInternal.idl @@ -1,122 +1,50 @@ -/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* ***** BEGIN LICENSE BLOCK ***** - * Version: NPL 1.1/GPL 2.0/LGPL 2.1 + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * - * The contents of this file are subject to the Netscape Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/NPL/ + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * - * The Original Code is Mozilla Communicator client code. + * The Original Code is Mozilla Gecko core. * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 + * The Initial Developer of the Original Code is + * Benjamin Smedberg + * + * Portions created by the Initial Developer are Copyright (C) 2005 * the Initial Developer. All Rights Reserved. * * Contributor(s): - * Alec Flett - * Brian Nesse * * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or + * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the NPL, indicate your + * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under - * the terms of any one of the NPL, the GPL or the LGPL. + * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ -#include "nsIPrefBranch.idl" - -interface nsIObserver; +#include "nsIPrefBranch2.idl" /** - * The nsIPrefBranchInternal interface allows additional access to the - * preference branch object. This interface allows functionality to be added to - * the preference branch object which might be transitory in nature or - * otherwise deemed unnecessary to, or unwanted in, the main (nsIPrefBranch) - * interface. + * An empty interface to provide backwards compatibility for existing code that + * bsmedberg didn't want to break all at once. Don't use me! * - * @see nsIPrefBranch + * @status NON-FROZEN interface WHICH WILL PROBABLY GO AWAY. */ -[scriptable, uuid(74567534-eb94-4b1c-8f45-389643bfc555)] -interface nsIPrefBranchInternal : nsIPrefBranch +[scriptable, uuid(d1d412d9-15d6-4a6a-9533-b949dc175ff5)] +interface nsIPrefBranchInternal : nsIPrefBranch2 { - /** - * Called by a preferences consumer to add itself as a preference change - * listener. This consumer must inherit from the nsIObserver interface and - * will receive the notification via their |Observe| method. The following - * arguments will be passed to the |Observe| method: - * aSubject - The nsIPrefBranch object (this) - * aTopic - The string defined by NS_PREFBRANCH_PREFCHANGE_TOPIC_ID - * aData - The preference which has changed - * - * @param aDomain The preference on which to listen for changes. - * @param aObserver The object to be notified if the preference changes. - * @param aHoldWeak true Hold a weak reference to |aObserver|. The object - * must implement the nsISupportsWeakReference - * interface or this will fail. - * false Hold a strong reference to |aObserver|. - * - * @note - * Registering as a preference observer can open an object to potential - * cyclical references which will cause memory leaks. These cycles generally - * occur because an object both registers itself as an observer (causing the - * branch to hold a reference to the observer) and holds a reference to the - * branch object for the purpose of getting/setting preference values. There - * are 3 approaches which have been implemented in an attempt to avoid these - * situations. - * 1) The nsPrefBranch object supports nsISupportsWeakReference. Any consumer - * may hold a weak reference to it instead of a strong one. - * 2) The nsPrefBranch object listens for xpcom-shutdown and frees all of the - * objects currently in its observer list. This insures that long lived - * objects (services for example) will be freed correctly. - * 3) The observer can request to be held as a weak reference when it is - * registered. This insures that shorter lived objects (say one tied to an - * open window) will not fall into the cyclical reference trap. - * - * @return NS_OK The observer was successfully set. - * @return Other The observer could not be created. - * - * @see nsIObserver - * @see removeObserver - */ - void addObserver(in string aDomain, in nsIObserver aObserver, in boolean aHoldWeak); - - /** - * Called by a preferences consumer to remove itself from the preference - * change observer list. - * - * @param aDomain The preference which is being observed for changes. - * @param aObserver The object which is observing. - * - * @return NS_OK The observer was successfully removed. - * @return Other The observer was not successfully removed. - * - * @see nsIObserver - * @see addObserver - */ - void removeObserver(in string aDomain, in nsIObserver aObserver); - }; - -%{C++ - -/** - * Notification sent when a preference changes. - */ -#define NS_PREFBRANCH_PREFCHANGE_TOPIC_ID "nsPref:changed" - -%} diff --git a/modules/libpref/src/nsPref.cpp b/modules/libpref/src/nsPref.cpp index b7c35690228..f21e5265adb 100644 --- a/modules/libpref/src/nsPref.cpp +++ b/modules/libpref/src/nsPref.cpp @@ -73,7 +73,7 @@ public: /* Use xpidl-generated macro to declare everything required by nsIPref */ NS_DECL_ISUPPORTS NS_DECL_NSIPREFBRANCH - NS_DECL_NSIPREFBRANCHINTERNAL + NS_DECL_NSIPREFBRANCH2 NS_DECL_NSISECURITYPREF NS_DECL_NSIOBSERVER NS_FORWARD_NSIPREFSERVICE(mPrefService->) @@ -124,7 +124,15 @@ nsPref* nsPref::gInstance = NULL; static PRInt32 g_InstanceCount = 0; -NS_IMPL_THREADSAFE_ISUPPORTS7(nsPref, nsIPref, nsIPrefService, nsIObserver, nsIPrefBranch, nsIPrefBranchInternal, nsISecurityPref, nsISupportsWeakReference) +NS_IMPL_THREADSAFE_ISUPPORTS8(nsPref, + nsIPref, + nsIPrefService, + nsIObserver, + nsIPrefBranch, + nsIPrefBranch2, + nsIPrefBranchInternal, + nsISecurityPref, + nsISupportsWeakReference) //---------------------------------------------------------------------------------------- nsPref::nsPref() @@ -345,7 +353,7 @@ NS_IMETHODIMP nsPref::AddObserver(const char *aDomain, nsIObserver *aObserver, P { nsresult rv; - nsCOMPtr prefBranch = do_QueryInterface(mPrefService, &rv); + nsCOMPtr prefBranch = do_QueryInterface(mPrefService, &rv); if (NS_SUCCEEDED(rv)) rv = prefBranch->AddObserver(aDomain, aObserver, aHoldWeak); return rv; @@ -355,7 +363,7 @@ NS_IMETHODIMP nsPref::RemoveObserver(const char *aDomain, nsIObserver *aObserver { nsresult rv; - nsCOMPtr prefBranch = do_QueryInterface(mPrefService, &rv); + nsCOMPtr prefBranch = do_QueryInterface(mPrefService, &rv); if (NS_SUCCEEDED(rv)) rv = prefBranch->RemoveObserver(aDomain, aObserver); return rv; diff --git a/modules/libpref/src/nsPrefBranch.cpp b/modules/libpref/src/nsPrefBranch.cpp index caf87bdcc7f..750e52085cb 100644 --- a/modules/libpref/src/nsPrefBranch.cpp +++ b/modules/libpref/src/nsPrefBranch.cpp @@ -112,6 +112,7 @@ NS_IMPL_THREADSAFE_RELEASE(nsPrefBranch) NS_INTERFACE_MAP_BEGIN(nsPrefBranch) NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIPrefBranch) NS_INTERFACE_MAP_ENTRY(nsIPrefBranch) + NS_INTERFACE_MAP_ENTRY(nsIPrefBranch2) NS_INTERFACE_MAP_ENTRY(nsIPrefBranchInternal) NS_INTERFACE_MAP_ENTRY(nsISecurityPref) NS_INTERFACE_MAP_ENTRY(nsIObserver) @@ -602,7 +603,7 @@ NS_IMETHODIMP nsPrefBranch::GetChildList(const char *aStartingAt, PRUint32 *aCou /* - * nsIPrefBranchInternal methods + * nsIPrefBranch2 methods */ NS_IMETHODIMP nsPrefBranch::AddObserver(const char *aDomain, nsIObserver *aObserver, PRBool aHoldWeak) @@ -734,7 +735,7 @@ PR_STATIC_CALLBACK(nsresult) NotifyObserver(const char *newpref, void *data) observer = do_QueryReferent(weakRef); if (!observer) { // this weak referenced observer went away, remove them from the list - nsCOMPtr pbi = do_QueryInterface(pData->pBranch); + nsCOMPtr pbi = do_QueryInterface(pData->pBranch); if (pbi) { observer = NS_STATIC_CAST(nsIObserver *, pData->pObserver); pbi->RemoveObserver(newpref, observer); diff --git a/modules/libpref/src/nsPrefBranch.h b/modules/libpref/src/nsPrefBranch.h index 9c226c66218..2fe1a7f69a5 100644 --- a/modules/libpref/src/nsPrefBranch.h +++ b/modules/libpref/src/nsPrefBranch.h @@ -22,6 +22,7 @@ * Contributor(s): * Alec Flett * Brian Nesse + * Benjamin Smedberg * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -60,7 +61,7 @@ class nsPrefBranch : public nsIPrefBranchInternal, public: NS_DECL_ISUPPORTS NS_DECL_NSIPREFBRANCH - NS_DECL_NSIPREFBRANCHINTERNAL + NS_DECL_NSIPREFBRANCH2 NS_DECL_NSISECURITYPREF NS_DECL_NSIOBSERVER diff --git a/modules/libpref/src/nsPrefService.cpp b/modules/libpref/src/nsPrefService.cpp index d894c108fe6..2d6af8ca589 100644 --- a/modules/libpref/src/nsPrefService.cpp +++ b/modules/libpref/src/nsPrefService.cpp @@ -113,6 +113,7 @@ NS_INTERFACE_MAP_BEGIN(nsPrefService) NS_INTERFACE_MAP_ENTRY(nsIPrefService) NS_INTERFACE_MAP_ENTRY(nsIObserver) NS_INTERFACE_MAP_ENTRY(nsIPrefBranch) + NS_INTERFACE_MAP_ENTRY(nsIPrefBranch2) NS_INTERFACE_MAP_ENTRY(nsIPrefBranchInternal) NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) NS_INTERFACE_MAP_END @@ -128,7 +129,7 @@ nsresult nsPrefService::Init() if (!rootBranch) return NS_ERROR_OUT_OF_MEMORY; - mRootBranch = (nsIPrefBranchInternal *)rootBranch; + mRootBranch = (nsIPrefBranch2 *)rootBranch; nsXPIDLCString lockFileName; nsresult rv; diff --git a/modules/libpref/src/nsPrefService.h b/modules/libpref/src/nsPrefService.h index ef0b1d68a2c..aa0da14dd19 100644 --- a/modules/libpref/src/nsPrefService.h +++ b/modules/libpref/src/nsPrefService.h @@ -59,7 +59,7 @@ public: NS_DECL_ISUPPORTS NS_DECL_NSIPREFSERVICE NS_FORWARD_NSIPREFBRANCH(mRootBranch->) - NS_FORWARD_NSIPREFBRANCHINTERNAL(mRootBranch->) + NS_FORWARD_NSIPREFBRANCH2(mRootBranch->) NS_DECL_NSIOBSERVER nsPrefService(); @@ -77,7 +77,7 @@ protected: nsresult WritePrefFile(nsIFile* aFile); private: - nsCOMPtr mRootBranch; + nsCOMPtr mRootBranch; nsCOMPtr mCurrentFile; PRPackedBool mErrorOpeningUserPrefs;