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

This commit is contained in:
dbaron%fas.harvard.edu 2002-05-16 18:00:39 +00:00
Родитель fa4232596b
Коммит 8fa134d477
4 изменённых файлов: 68 добавлений и 69 удалений

Просмотреть файл

@ -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);

Просмотреть файл

@ -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<nsIPref> prefs(do_GetService(NS_PREF_CONTRACTID, &rv));
if (NS_FAILED(prefs->GetIntPref(image_behaviorPref, &n))) {
image_SetBehaviorPref(PERMISSION_Accept);
nsCOMPtr<nsIPref> 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<nsIPref> prefs(do_GetService(NS_PREF_CONTRACTID, &rv));
if (NS_FAILED(prefs->GetBoolPref(image_warningPref, &x))) {
x = PR_FALSE;
nsCOMPtr<nsIPref> 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<nsIPref> 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<nsIPref> prefs(do_GetService(NS_PREF_CONTRACTID, &rv));
nsCOMPtr<nsIPref> 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<nsIPref> 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;
}

Просмотреть файл

@ -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) {

Просмотреть файл

@ -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);