Stop collection and clean up when the metrics.upload.enable pref is set to false (bug 344366) r=marria

This commit is contained in:
bryner%brianryner.com 2006-07-12 16:54:18 +00:00
Родитель 3ef520bea7
Коммит b5bb524f37
3 изменённых файлов: 84 добавлений и 8 удалений

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

@ -55,7 +55,7 @@
#include "nsIObserverService.h"
#include "nsIUploadChannel.h"
#include "nsIPrefService.h"
#include "nsIPrefBranch.h"
#include "nsIPrefBranch2.h"
#include "nsIObserver.h"
#include "nsILocalFile.h"
#include "nsIPropertyBag.h"
@ -117,6 +117,8 @@ PRLogModuleInfo *gMetricsLog;
static const char kQuitApplicationTopic[] = "quit-application";
static const char kUploadTimePref[] = "metrics.upload.next-time";
static const char kPingTimePref[] = "metrics.upload.next-ping";
static const char kEventCountPref[] = "metrics.event-count";
static const char kEnablePref[] = "metrics.upload.enable";
const PRUint32 nsMetricsService::kMaxRetries = 3;
@ -1029,6 +1031,15 @@ nsMetricsService::Observe(nsISupports *subject, const char *topic,
}
}
}
} else if (strcmp(topic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID) == 0) {
// The only pref we care about changing is the .enable pref
if (NS_ConvertUTF8toUTF16(kEnablePref).Equals(nsDependentString(data))) {
if (CollectionEnabled()) {
StartCollection();
} else {
StopCollection();
}
}
}
return NS_OK;
@ -1036,9 +1047,18 @@ nsMetricsService::Observe(nsISupports *subject, const char *topic,
nsresult
nsMetricsService::ProfileStartup()
{
nsCOMPtr<nsIPrefBranch2> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
NS_ENSURE_STATE(prefs);
prefs->AddObserver(kEnablePref, this, PR_FALSE);
return CollectionEnabled() ? StartCollection() : StopCollection();
}
nsresult
nsMetricsService::StartCollection()
{
// Initialize configuration by reading our old config file if one exists.
NS_ENSURE_STATE(mConfig.Init());
nsCOMPtr<nsIFile> file;
GetConfigFile(getter_AddRefs(file));
@ -1072,6 +1092,35 @@ nsMetricsService::ProfileStartup()
return NS_OK;
}
nsresult
nsMetricsService::StopCollection()
{
// Clear out prefs and files associated with metrics collection
MS_LOG(("Clearing metrics state"));
FlushClearPref(kUploadTimePref);
FlushClearPref(kPingTimePref);
FlushClearPref(kEventCountPref);
nsCOMPtr<nsIFile> configFile;
GetConfigFile(getter_AddRefs(configFile));
if (configFile) {
configFile->Remove(PR_FALSE);
}
nsCOMPtr<nsILocalFile> dataFile;
GetDataFile(&dataFile);
if (dataFile) {
dataFile->Remove(PR_FALSE);
}
// Clear our current config and make sure all collectors are disabled
mConfig.Reset();
EnableCollectors();
CreateRoot(); // clear any unflushed events
return NS_OK;
}
NS_IMETHODIMP
nsMetricsService::Notify(nsITimer *timer)
{
@ -1139,6 +1188,8 @@ nsMetricsService::Init()
mMD5Context = MD5_NewContext();
NS_ENSURE_TRUE(mMD5Context, NS_ERROR_FAILURE);
NS_ENSURE_STATE(mConfig.Init());
// Create an XML document to serve as the owner document for elements.
mDocument = do_CreateInstance("@mozilla.org/xml/xml-document;1");
NS_ENSURE_TRUE(mDocument, NS_ERROR_FAILURE);
@ -1223,15 +1274,19 @@ nsMetricsService::UploadData()
// TODO: Prepare a data stream for upload that is prefixed with a PROFILE
// event.
if (!CollectionEnabled()) {
MS_LOG(("Upload disabled"));
return NS_ERROR_ABORT;
}
PRBool enable = PR_FALSE;
nsCString spec;
nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
if (prefs) {
prefs->GetBoolPref("metrics.upload.enable", &enable);
prefs->GetCharPref("metrics.upload.uri", getter_Copies(spec));
}
if (!enable || spec.IsEmpty()) {
MS_LOG(("Upload disabled or URI not set"));
if (spec.IsEmpty()) {
MS_LOG(("Upload URI not set"));
return NS_ERROR_ABORT;
}
@ -1530,7 +1585,7 @@ nsMetricsService::HashBytes(const PRUint8 *bytes, PRUint32 length,
PRBool
nsMetricsService::PersistEventCount()
{
return NS_SUCCEEDED(FlushIntPref("metrics.event-count", mEventCount));
return NS_SUCCEEDED(FlushIntPref(kEventCountPref, mEventCount));
}
/* static */ PRUint32
@ -1633,6 +1688,16 @@ nsMetricsService::FlushClearPref(const char *prefName)
return NS_OK;
}
/* static */ PRBool
nsMetricsService::CollectionEnabled()
{
nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
NS_ENSURE_TRUE(prefs, PR_FALSE);
PRBool enabled = PR_FALSE;
prefs->GetBoolPref(kEnablePref, &enabled);
return enabled;
}
/* static */ nsresult
nsMetricsUtils::NewPropertyBag(nsIWritablePropertyBag2 **result)

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

@ -152,6 +152,12 @@ private:
// Post-profile-initialization startup code
nsresult ProfileStartup();
// Reads the config, starts a new session, and turns on collectors
nsresult StartCollection();
// Stops collectors and removes all metrics-related prefs and files
nsresult StopCollection();
// Starts and stops collectors based on the current configuration
void EnableCollectors();
@ -236,6 +242,9 @@ private:
static nsresult FlushCharPref(const char *prefName, const char *prefValue);
static nsresult FlushClearPref(const char *prefName);
// Returns true if the pref to enable collection is set to true
static PRBool CollectionEnabled();
private:
class BadCertListener;

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

@ -81,7 +81,8 @@ const nsIDOMWindow* key, PRUint32 windowID, void* userArg)
nsresult rv = windowTarget->AddEventListener(NS_LITERAL_STRING("command"),
listener, PR_TRUE);
if (NS_FAILED(rv)) {
MS_LOG(("Warning: Adding event listener failed"));
MS_LOG(("Warning: Adding event listener failed, window %p (id %d)",
key, windowID));
}
return PL_DHASH_NEXT;
}
@ -107,7 +108,8 @@ const nsIDOMWindow* key, PRUint32 windowID, void* userArg)
nsresult rv = windowTarget->RemoveEventListener(NS_LITERAL_STRING("command"),
listener, PR_TRUE);
if (NS_FAILED(rv)) {
MS_LOG(("Warning: Removing event listener failed"));
MS_LOG(("Warning: Removing event listener failed, window %p (id %d)",
key, windowID));
}
return PL_DHASH_NEXT;
}