From 8fa134d477195d95105c151534e07d9cb43a3972 Mon Sep 17 00:00:00 2001 From: "dbaron%fas.harvard.edu" Date: Thu, 16 May 2002 18:00:39 +0000 Subject: [PATCH] Speed up IMAGE_CheckForPermission by (1) caching the 'imageblocker.enabled' pref and using a pref-changed callback and (2) not getting the warning message from the string bundle and formatting it with nsTextFormatter::smprintf until we know we're going to display the warning dialog. Also do (2) in nsCookies since they share the same permission checking code (Permission_Check). b=143918 r=morse sr=alecf --- extensions/cookie/nsCookies.cpp | 19 ++--- extensions/cookie/nsImages.cpp | 106 ++++++++++++++-------------- extensions/cookie/nsPermissions.cpp | 10 ++- extensions/cookie/nsPermissions.h | 2 +- 4 files changed, 68 insertions(+), 69 deletions(-) diff --git a/extensions/cookie/nsCookies.cpp b/extensions/cookie/nsCookies.cpp index 72b45cf40b35..1ebc86581dde 100644 --- a/extensions/cookie/nsCookies.cpp +++ b/extensions/cookie/nsCookies.cpp @@ -48,7 +48,6 @@ #include "nsXPIDLString.h" #include "nsReadableUtils.h" #include "nsIPref.h" -#include "nsTextFormatter.h" #include "nsAppDirectoryServiceDefs.h" #include "nsIObserverService.h" #include "nsICookieConsent.h" @@ -1313,21 +1312,16 @@ cookie_SetCookieString(char * curURL, nsIPrompt *aPrompter, const char * setCook int count = cookie_Count(host_from_header); prev_cookie = cookie_CheckForPrevCookie (path_from_header, host_from_header, name_from_header); - PRUnichar * message; + const char *message_string; if (prev_cookie) { - message = CKutil_Localize(NS_LITERAL_STRING("PermissionToModifyCookie").get()); - new_string = nsTextFormatter::smprintf(message, host_from_header ? host_from_header : ""); + message_string = "PermissionToModifyCookie"; } else if (count>1) { - message = CKutil_Localize(NS_LITERAL_STRING("PermissionToSetAnotherCookie").get()); - new_string = nsTextFormatter::smprintf(message, host_from_header ? host_from_header : "", count); + message_string = "PermissionToSetAnotherCookie"; } else if (count==1){ - message = CKutil_Localize(NS_LITERAL_STRING("PermissionToSetSecondCookie").get()); - new_string = nsTextFormatter::smprintf(message, host_from_header ? host_from_header : ""); + message_string = "PermissionToSetSecondCookie"; } else { - message = CKutil_Localize(NS_LITERAL_STRING("PermissionToSetACookie").get()); - new_string = nsTextFormatter::smprintf(message, host_from_header ? host_from_header : ""); + message_string = "PermissionToSetACookie"; } - Recycle(message); //TRACEMSG(("mkaccess.c: Setting cookie: %s for host: %s for path: %s", // cookie_from_header, host_from_header, path_from_header)); @@ -1341,9 +1335,8 @@ cookie_SetCookieString(char * curURL, nsIPrompt *aPrompter, const char * setCook // until generalized per-site preferences are available. //cookie_GetLifetimeAsk(timeToExpire) || cookie_GetWarningPref(), - new_string); + message_string, count); } - PR_FREEIF(new_string); if (!permission) { PR_FREEIF(path_from_header); PR_FREEIF(host_from_header); diff --git a/extensions/cookie/nsImages.cpp b/extensions/cookie/nsImages.cpp index d3a6d7e2736f..555b7a4be080 100644 --- a/extensions/cookie/nsImages.cpp +++ b/extensions/cookie/nsImages.cpp @@ -43,12 +43,12 @@ #include "nsVoidArray.h" #include "prmem.h" #include "nsIPref.h" -#include "nsTextFormatter.h" #include "nsIServiceManager.h" #include "nsIIOService.h" #define image_behaviorPref "network.image.imageBehavior" #define image_warningPref "network.image.warnAboutImages" +#define image_blockerPref "imageblocker.enabled" typedef struct _permission_HostStruct { char * host; @@ -60,51 +60,45 @@ typedef struct _permission_TypeStruct { PRBool permission; } permission_TypeStruct; -PRIVATE PERMISSION_BehaviorEnum image_behavior = PERMISSION_Accept; -PRIVATE PRBool image_warning = PR_FALSE; +#define kBehaviorPrefDefault PERMISSION_Accept +#define kWarningPrefDefault PR_FALSE +#define kBlockerPrefDefault PR_FALSE -PRIVATE void -image_SetBehaviorPref(PERMISSION_BehaviorEnum x) { - image_behavior = x; -} +static PERMISSION_BehaviorEnum gBehaviorPref = kBehaviorPrefDefault; +static PRBool gWarningPref = kWarningPrefDefault; +static PRBool gBlockerPref = kBlockerPrefDefault; -PRIVATE void -image_SetWarningPref(PRBool x) { - image_warning = x; -} - -PRIVATE PERMISSION_BehaviorEnum -image_GetBehaviorPref() { - return image_behavior; -} - -PRIVATE PRBool -image_GetWarningPref() { - return image_warning; -} - -MODULE_PRIVATE int PR_CALLBACK +PR_STATIC_CALLBACK(int) image_BehaviorPrefChanged(const char * newpref, void * data) { PRInt32 n; - nsresult rv; - nsCOMPtr prefs(do_GetService(NS_PREF_CONTRACTID, &rv)); - if (NS_FAILED(prefs->GetIntPref(image_behaviorPref, &n))) { - image_SetBehaviorPref(PERMISSION_Accept); + nsCOMPtr prefs(do_GetService(NS_PREF_CONTRACTID)); + if (!prefs || NS_FAILED(prefs->GetIntPref(image_behaviorPref, &n))) { + gBehaviorPref = kBehaviorPrefDefault; } else { - image_SetBehaviorPref((PERMISSION_BehaviorEnum)n); + gBehaviorPref = (PERMISSION_BehaviorEnum)n; } return 0; } -MODULE_PRIVATE int PR_CALLBACK +PR_STATIC_CALLBACK(int) image_WarningPrefChanged(const char * newpref, void * data) { PRBool x; - nsresult rv; - nsCOMPtr prefs(do_GetService(NS_PREF_CONTRACTID, &rv)); - if (NS_FAILED(prefs->GetBoolPref(image_warningPref, &x))) { - x = PR_FALSE; + nsCOMPtr prefs(do_GetService(NS_PREF_CONTRACTID)); + if (!prefs || NS_FAILED(prefs->GetBoolPref(image_warningPref, &x))) { + x = kWarningPrefDefault; } - image_SetWarningPref(x); + gWarningPref = x; + return 0; +} + +PR_STATIC_CALLBACK(int) +image_BlockerPrefChanged(const char * newpref, void * data) { + PRBool x; + nsCOMPtr prefs(do_GetService(NS_PREF_CONTRACTID)); + if (!prefs || NS_FAILED(prefs->GetBoolPref(image_blockerPref, &x))) { + x = kBlockerPrefDefault; + } + gBlockerPref = x; return 0; } @@ -112,22 +106,34 @@ PUBLIC void IMAGE_RegisterPrefCallbacks(void) { PRInt32 n; PRBool x; - nsresult rv; - nsCOMPtr prefs(do_GetService(NS_PREF_CONTRACTID, &rv)); + nsCOMPtr prefs(do_GetService(NS_PREF_CONTRACTID)); + if (!prefs) { + NS_NOTREACHED("couldn't get prefs"); + // All the prefs should still have their default values from the + // static initializers. + return; + } // Initialize for image_behaviorPref if (NS_FAILED(prefs->GetIntPref(image_behaviorPref, &n))) { - n = PERMISSION_Accept; + n = kBehaviorPrefDefault; } - image_SetBehaviorPref((PERMISSION_BehaviorEnum)n); + gBehaviorPref = (PERMISSION_BehaviorEnum)n; prefs->RegisterCallback(image_behaviorPref, image_BehaviorPrefChanged, NULL); // Initialize for image_warningPref if (NS_FAILED(prefs->GetBoolPref(image_warningPref, &x))) { - x = PR_FALSE; + x = kWarningPrefDefault; } - image_SetWarningPref(x); + gWarningPref = x; prefs->RegisterCallback(image_warningPref, image_WarningPrefChanged, NULL); + + // Initialize for image_blockerPref + if (NS_FAILED(prefs->GetBoolPref(image_blockerPref, &x))) { + x = kBlockerPrefDefault; + } + gBlockerPref = x; + prefs->RegisterCallback(image_blockerPref, image_BlockerPrefChanged, NULL); } PUBLIC nsresult @@ -135,22 +141,17 @@ IMAGE_CheckForPermission (const char * hostname, const char * firstHostname, PRBool *permission) { /* exit if imageblocker is not enabled */ - nsresult rv; - PRBool prefvalue = PR_FALSE; - nsCOMPtr prefs(do_GetService(NS_PREF_CONTRACTID, &rv)); - if (NS_FAILED(rv) || - NS_FAILED(prefs->GetBoolPref("imageblocker.enabled", &prefvalue)) || - !prefvalue) { - *permission = (image_GetBehaviorPref() != PERMISSION_DontUse); + if (!gBlockerPref) { + *permission = (gBehaviorPref != PERMISSION_DontUse); return NS_OK; } /* try to make a decision based on pref settings */ - if ((image_GetBehaviorPref() == PERMISSION_DontUse)) { + if ((gBehaviorPref == PERMISSION_DontUse)) { *permission = PR_FALSE; return NS_OK; } - if (image_GetBehaviorPref() == PERMISSION_DontAcceptForeign) { + if (gBehaviorPref == PERMISSION_DontAcceptForeign) { /* compare tails of names checking to see if they have a common domain */ /* we do this by comparing the tails of both names where each tail includes at least one dot */ PRInt32 dotcount = 0; @@ -184,16 +185,13 @@ IMAGE_CheckForPermission } /* use common routine to make decision */ - PRUnichar * message = CKutil_Localize(NS_LITERAL_STRING("PermissionToAcceptImage").get()); - PRUnichar * new_string = nsTextFormatter::smprintf(message, hostname ? hostname : ""); if (NS_SUCCEEDED(PERMISSION_Read())) { *permission = Permission_Check(0, hostname, IMAGEPERMISSION, - PR_FALSE /*image_GetWarningPref()*/, new_string); + PR_FALSE /* gWarningPref */, + "PermissionToAcceptImage", 0); } else { *permission = PR_TRUE; } - PR_FREEIF(new_string); - Recycle(message); return NS_OK; } diff --git a/extensions/cookie/nsPermissions.cpp b/extensions/cookie/nsPermissions.cpp index cb5a8ba327e3..42272c7c011d 100644 --- a/extensions/cookie/nsPermissions.cpp +++ b/extensions/cookie/nsPermissions.cpp @@ -52,6 +52,7 @@ #include "nsAppDirectoryServiceDefs.h" #include "nsIIOService.h" #include "nsNetCID.h" +#include "nsTextFormatter.h" static const char *kCookiesPermFileName = "cookperm.txt"; @@ -183,7 +184,8 @@ Permission_Check( const char * hostname, PRInt32 type, PRBool warningPref, - PRUnichar * message) + const char * message_string, + int count_for_message) { PRBool permission; @@ -198,9 +200,15 @@ Permission_Check( } /* we need to prompt */ + PRUnichar * message_fmt = + CKutil_Localize(NS_ConvertASCIItoUCS2(message_string).get()); + PRUnichar * message = nsTextFormatter::smprintf(message_fmt, + hostname ? hostname : "", count_for_message); PRBool rememberChecked = permission_GetRememberChecked(type); PRUnichar * remember_string = CKutil_Localize(NS_LITERAL_STRING("RememberThisDecision").get()); permission = permission_CheckConfirmYN(aPrompter, message, remember_string, &rememberChecked); + nsTextFormatter::smprintf_free(message); + nsMemory::Free(message_fmt); /* see if we need to remember this decision */ if (rememberChecked) { diff --git a/extensions/cookie/nsPermissions.h b/extensions/cookie/nsPermissions.h index 99f339a15801..68b17a46331e 100644 --- a/extensions/cookie/nsPermissions.h +++ b/extensions/cookie/nsPermissions.h @@ -69,7 +69,7 @@ extern void PERMISSION_Remove(const char* host, PRInt32 type); extern PRBool Permission_Check (nsIPrompt *aPrompter, const char * hostname, PRInt32 type, - PRBool warningPref, PRUnichar * message); + PRBool warningPref, const char * message_string, int count_for_message); extern nsresult Permission_AddHost (char * host, PRBool permission, PRInt32 type, PRBool save); //extern void Permission_Free(PRInt32 hostNumber, PRInt32 type, PRBool save);