fixes bug 324558 "Build data collection service to gather browser metrics" r=bryner
git-svn-id: svn://10.0.0.236/trunk@188800 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
parent
6a8e678d4f
commit
b2ccd6ec16
@ -902,6 +902,11 @@ extensions/typeaheadfind/src/Makefile
|
|||||||
extensions/typeaheadfind/Makefile
|
extensions/typeaheadfind/Makefile
|
||||||
"
|
"
|
||||||
|
|
||||||
|
MAKEFILES_metrics="
|
||||||
|
extensions/metrics/Makefile
|
||||||
|
extensions/metrics/src/Makefile
|
||||||
|
"
|
||||||
|
|
||||||
MAKEFILES_phoenix="
|
MAKEFILES_phoenix="
|
||||||
browser/Makefile
|
browser/Makefile
|
||||||
browser/app/Makefile
|
browser/app/Makefile
|
||||||
|
|||||||
49
mozilla/extensions/metrics/Makefile.in
Normal file
49
mozilla/extensions/metrics/Makefile.in
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
# vim:set ts=8 sw=8 sts=8 noet:
|
||||||
|
# ***** BEGIN LICENSE BLOCK *****
|
||||||
|
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
#
|
||||||
|
# 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 the Metrics extension.
|
||||||
|
#
|
||||||
|
# The Initial Developer of the Original Code is Google Inc.
|
||||||
|
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||||
|
# the Initial Developer. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Contributor(s):
|
||||||
|
# Darin Fisher <darin@meer.net>
|
||||||
|
#
|
||||||
|
# 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 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 MPL, the GPL or the LGPL.
|
||||||
|
#
|
||||||
|
# ***** END LICENSE BLOCK *****
|
||||||
|
|
||||||
|
DEPTH = ../..
|
||||||
|
topsrcdir = @top_srcdir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
|
||||||
|
include $(DEPTH)/config/autoconf.mk
|
||||||
|
|
||||||
|
DIRS = public src tool
|
||||||
|
|
||||||
|
PREF_JS_EXPORTS = $(srcdir)/metrics.js
|
||||||
|
|
||||||
|
include $(topsrcdir)/config/rules.mk
|
||||||
3
mozilla/extensions/metrics/metrics.js
Normal file
3
mozilla/extensions/metrics/metrics.js
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
pref("metrics.upload.interval", 86400000); // 24 hrs in msec
|
||||||
|
pref("metrics.upload.enable", false);
|
||||||
|
pref("metrics.upload.uri", "");
|
||||||
54
mozilla/extensions/metrics/public/Makefile.in
Normal file
54
mozilla/extensions/metrics/public/Makefile.in
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
# vim:set ts=8 sw=8 sts=8 noet:
|
||||||
|
# ***** BEGIN LICENSE BLOCK *****
|
||||||
|
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
#
|
||||||
|
# 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 the Metrics extension.
|
||||||
|
#
|
||||||
|
# The Initial Developer of the Original Code is Google Inc.
|
||||||
|
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||||
|
# the Initial Developer. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Contributor(s):
|
||||||
|
# Darin Fisher <darin@meer.net>
|
||||||
|
#
|
||||||
|
# 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 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 MPL, the GPL or the LGPL.
|
||||||
|
#
|
||||||
|
# ***** END LICENSE BLOCK *****
|
||||||
|
|
||||||
|
DEPTH = ../../..
|
||||||
|
topsrcdir = @top_srcdir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
|
||||||
|
include $(DEPTH)/config/autoconf.mk
|
||||||
|
|
||||||
|
MODULE = metrics
|
||||||
|
|
||||||
|
XPIDLSRCS = nsIMetricsService.idl
|
||||||
|
|
||||||
|
EXPORTS = \
|
||||||
|
nsMetricsEvent.h \
|
||||||
|
nsMetricsModule.h \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
include $(topsrcdir)/config/rules.mk
|
||||||
78
mozilla/extensions/metrics/public/nsIMetricsService.idl
Normal file
78
mozilla/extensions/metrics/public/nsIMetricsService.idl
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* 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 the Metrics extension.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Google Inc.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2006
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Darin Fisher <darin@meer.net>
|
||||||
|
*
|
||||||
|
* 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 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 MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#include "nsISupports.idl"
|
||||||
|
|
||||||
|
[ref] native nsMetricsEvent(const class nsMetricsEvent);
|
||||||
|
|
||||||
|
[scriptable, uuid(614a8246-5c83-422c-8147-28b8a2946b58)]
|
||||||
|
interface nsIMetricsService : nsISupports
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Log a custom event. The event is recorded with a timestamp generated at
|
||||||
|
* the time at which this method is called.
|
||||||
|
*
|
||||||
|
* @param aEventData
|
||||||
|
* The data to be logged with this event.
|
||||||
|
*/
|
||||||
|
void logCustomEvent(in ACString aEventData);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log a raw metrics event.
|
||||||
|
*/
|
||||||
|
[noscript] void logEvent(in nsMetricsEvent aEvent);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initiate the upload of the current event log. This causes the current
|
||||||
|
* event log to be truncated once the upload completes.
|
||||||
|
*/
|
||||||
|
void upload();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Suspend log collection. LogEvent calls will be silently ignored while log
|
||||||
|
* collection is suspended. For each call to suspend, resume must be called
|
||||||
|
* to re-enable log collection.
|
||||||
|
*/
|
||||||
|
void suspend();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resume log collection. Call this method once per call to suspend to
|
||||||
|
* re-enable log collection.
|
||||||
|
*/
|
||||||
|
void resume();
|
||||||
|
};
|
||||||
99
mozilla/extensions/metrics/public/nsMetricsEvent.h
Normal file
99
mozilla/extensions/metrics/public/nsMetricsEvent.h
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* 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 the Metrics extension.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Google Inc.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2006
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Darin Fisher <darin@meer.net>
|
||||||
|
*
|
||||||
|
* 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 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 MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#ifndef nsMetricsEvent_h__
|
||||||
|
#define nsMetricsEvent_h__
|
||||||
|
|
||||||
|
#include "nsTArray.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Every metrics event has a unique type. This value is constrained to 16-bits.
|
||||||
|
*/
|
||||||
|
enum nsMetricsEventType {
|
||||||
|
NS_METRICS_PROFILE_EVENT,
|
||||||
|
NS_METRICS_CUSTOM_EVENT,
|
||||||
|
NS_METRICS_LOAD_EVENT,
|
||||||
|
NS_METRICS_UI_EVENT,
|
||||||
|
// Insert additional event types here
|
||||||
|
NS_METRICS_EVENT_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for metric events. This class provides basic structure for each
|
||||||
|
* event and methods to pack integers and byte arrays into the event.
|
||||||
|
*/
|
||||||
|
class nsMetricsEvent {
|
||||||
|
public:
|
||||||
|
nsMetricsEvent(nsMetricsEventType type) : mType(type) {
|
||||||
|
mBuf.SetCapacity(16);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PutInt8(PRUint8 val) {
|
||||||
|
mBuf.AppendElement(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PutInt16(PRUint16 val) {
|
||||||
|
mBuf.AppendElements((PRUint8 *) &val, sizeof(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
void PutInt32(PRUint32 val) {
|
||||||
|
mBuf.AppendElements((PRUint8 *) &val, sizeof(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
void PutBytes(const void *ptr, PRUint32 num) {
|
||||||
|
mBuf.AppendElements((PRUint8 *) ptr, num);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsMetricsEventType Type() const {
|
||||||
|
return mType;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PRUint8 *Buffer() const {
|
||||||
|
return mBuf.Elements();
|
||||||
|
}
|
||||||
|
|
||||||
|
PRUint32 BufferLength() const {
|
||||||
|
return mBuf.Length();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
nsMetricsEventType mType;
|
||||||
|
nsTArray<PRUint8> mBuf;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // nsMetricsEvent_h__
|
||||||
52
mozilla/extensions/metrics/public/nsMetricsModule.h
Normal file
52
mozilla/extensions/metrics/public/nsMetricsModule.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* 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 the Metrics extension.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Google Inc.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2006
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Darin Fisher <darin@meer.net>
|
||||||
|
*
|
||||||
|
* 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 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 MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#ifndef nsMetricsModule_h__
|
||||||
|
#define nsMetricsModule_h__
|
||||||
|
|
||||||
|
#define NS_METRICSSERVICE_CLASSNAME "nsMetricsService"
|
||||||
|
#define NS_METRICSSERVICE_CID \
|
||||||
|
{ /* 6f72134c-8855-4c07-b181-90d22bf7a0aa */ \
|
||||||
|
0x6f72134c, \
|
||||||
|
0x8855, \
|
||||||
|
0x4c07, \
|
||||||
|
{0xb1, 0x81, 0x90, 0xd2, 0x2b, 0xf7, 0xa0, 0xaa} \
|
||||||
|
}
|
||||||
|
#define NS_METRICSSERVICE_CONTRACTID "@mozilla.org/metrics/service;1"
|
||||||
|
|
||||||
|
#endif // nsMetricsModule_h__
|
||||||
66
mozilla/extensions/metrics/src/Makefile.in
Normal file
66
mozilla/extensions/metrics/src/Makefile.in
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
# vim:set ts=8 sw=8 sts=8 noet:
|
||||||
|
# ***** BEGIN LICENSE BLOCK *****
|
||||||
|
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
#
|
||||||
|
# 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 the Metrics extension.
|
||||||
|
#
|
||||||
|
# The Initial Developer of the Original Code is Google Inc.
|
||||||
|
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||||
|
# the Initial Developer. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Contributor(s):
|
||||||
|
# Darin Fisher <darin@meer.net>
|
||||||
|
#
|
||||||
|
# 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 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 MPL, the GPL or the LGPL.
|
||||||
|
#
|
||||||
|
# ***** END LICENSE BLOCK *****
|
||||||
|
|
||||||
|
DEPTH = ../../..
|
||||||
|
topsrcdir = @top_srcdir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
|
||||||
|
include $(DEPTH)/config/autoconf.mk
|
||||||
|
|
||||||
|
MODULE = metrics
|
||||||
|
LIBRARY_NAME = metrics
|
||||||
|
SHORT_LIBNAME = metrics
|
||||||
|
IS_COMPONENT = 1
|
||||||
|
MOZILLA_INTERNAL_API = 1
|
||||||
|
|
||||||
|
REQUIRES = xpcom \
|
||||||
|
string \
|
||||||
|
necko \
|
||||||
|
pref \
|
||||||
|
update \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
CPPSRCS = \
|
||||||
|
nsMetricsService.cpp \
|
||||||
|
nsMetricsModule.cpp \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
EXTRA_DSO_LDOPTS = $(MOZ_COMPONENT_LIBS) \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
include $(topsrcdir)/config/rules.mk
|
||||||
85
mozilla/extensions/metrics/src/nsMetricsModule.cpp
Normal file
85
mozilla/extensions/metrics/src/nsMetricsModule.cpp
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* 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 the Metrics extension.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Google Inc.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2006
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Darin Fisher <darin@meer.net>
|
||||||
|
*
|
||||||
|
* 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 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 MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#include "nsMetricsModule.h"
|
||||||
|
#include "nsMetricsService.h"
|
||||||
|
#include "nsMetricsEvent.h"
|
||||||
|
#include "nsIGenericFactory.h"
|
||||||
|
#include "nsICategoryManager.h"
|
||||||
|
#include "nsServiceManagerUtils.h"
|
||||||
|
#include "nsCOMPtr.h"
|
||||||
|
#include "nsXPCOMCID.h"
|
||||||
|
|
||||||
|
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsMetricsService, Init)
|
||||||
|
NS_DECL_CLASSINFO(nsMetricsService)
|
||||||
|
|
||||||
|
static NS_METHOD
|
||||||
|
nsMetricsServiceRegisterSelf(nsIComponentManager *compMgr,
|
||||||
|
nsIFile *path,
|
||||||
|
const char *loaderStr,
|
||||||
|
const char *type,
|
||||||
|
const nsModuleComponentInfo *info)
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsICategoryManager> cat =
|
||||||
|
do_GetService(NS_CATEGORYMANAGER_CONTRACTID);
|
||||||
|
NS_ENSURE_STATE(cat);
|
||||||
|
|
||||||
|
cat->AddCategoryEntry("app-startup",
|
||||||
|
NS_METRICSSERVICE_CLASSNAME,
|
||||||
|
NS_METRICSSERVICE_CONTRACTID,
|
||||||
|
PR_TRUE, PR_TRUE, nsnull);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const nsModuleComponentInfo components[] = {
|
||||||
|
{
|
||||||
|
NS_METRICSSERVICE_CLASSNAME,
|
||||||
|
NS_METRICSSERVICE_CID,
|
||||||
|
NS_METRICSSERVICE_CONTRACTID,
|
||||||
|
nsMetricsServiceConstructor,
|
||||||
|
nsMetricsServiceRegisterSelf,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NS_CI_INTERFACE_GETTER_NAME(nsMetricsService),
|
||||||
|
NULL,
|
||||||
|
&NS_CLASSINFO_NAME(nsMetricsService),
|
||||||
|
nsIClassInfo::MAIN_THREAD_ONLY | nsIClassInfo::SINGLETON
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
NS_IMPL_NSGETMODULE(metrics, components)
|
||||||
313
mozilla/extensions/metrics/src/nsMetricsService.cpp
Normal file
313
mozilla/extensions/metrics/src/nsMetricsService.cpp
Normal file
@ -0,0 +1,313 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* 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 the Metrics extension.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Google Inc.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2006
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Darin Fisher <darin@meer.net>
|
||||||
|
*
|
||||||
|
* 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 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 MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#include "nsMetricsService.h"
|
||||||
|
#include "nsMetricsEvent.h"
|
||||||
|
#include "nsXPCOM.h"
|
||||||
|
#include "nsServiceManagerUtils.h"
|
||||||
|
#include "nsDirectoryServiceUtils.h"
|
||||||
|
#include "nsAppDirectoryServiceDefs.h"
|
||||||
|
#include "nsNetUtil.h"
|
||||||
|
#include "nsIObserverService.h"
|
||||||
|
#include "nsIUpdateService.h"
|
||||||
|
#include "nsIUploadChannel.h"
|
||||||
|
#include "nsIPrefService.h"
|
||||||
|
#include "nsIPrefBranch.h"
|
||||||
|
#include "nsIObserver.h"
|
||||||
|
#include "nsILocalFile.h"
|
||||||
|
|
||||||
|
// Flush the event log whenever its size exceeds this amount of bytes.
|
||||||
|
#define NS_EVENTLOG_FLUSH_POINT 4096
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
NS_IMPL_ISUPPORTS5_CI(nsMetricsService, nsIMetricsService,
|
||||||
|
nsIStreamListener, nsIRequestObserver,
|
||||||
|
nsIObserver, nsITimerCallback)
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsMetricsService::LogCustomEvent(const nsACString &data)
|
||||||
|
{
|
||||||
|
nsMetricsEvent event(NS_METRICS_CUSTOM_EVENT);
|
||||||
|
PRUint32 len = data.Length();
|
||||||
|
NS_ENSURE_ARG(len < PR_UINT16_MAX);
|
||||||
|
event.PutInt16(len);
|
||||||
|
event.PutBytes(data.BeginReading(), len);
|
||||||
|
return LogEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsMetricsService::LogEvent(const nsMetricsEvent &event)
|
||||||
|
{
|
||||||
|
if (mSuspendCount != 0) // Ignore events while suspended
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
|
NS_ENSURE_ARG(PRUint32(event.Type()) < PR_UINT8_MAX);
|
||||||
|
|
||||||
|
// The event header consists of the following fields:
|
||||||
|
PRUint8 type; // 8-bit event type
|
||||||
|
PRUint32 timestamp; // 32-bit timestamp (seconds since the epoch)
|
||||||
|
|
||||||
|
type = (PRUint8) event.Type();
|
||||||
|
timestamp = PRUint32(PR_Now() / PR_USEC_PER_SEC);
|
||||||
|
|
||||||
|
mEventLog.AppendElement(type);
|
||||||
|
mEventLog.AppendElements((PRUint8 *) ×tamp, sizeof(timestamp));
|
||||||
|
mEventLog.AppendElements(event.Buffer(), event.BufferLength());
|
||||||
|
|
||||||
|
if (mEventLog.Length() > NS_EVENTLOG_FLUSH_POINT)
|
||||||
|
FlushData();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsMetricsService::Upload()
|
||||||
|
{
|
||||||
|
if (mUploading) // Ignore new uploads issued while uploading.
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
|
// We suspend logging until the upload completes.
|
||||||
|
|
||||||
|
nsresult rv = FlushData();
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
rv = UploadData();
|
||||||
|
if (NS_SUCCEEDED(rv)) {
|
||||||
|
mUploading = PR_TRUE;
|
||||||
|
Suspend();
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsMetricsService::Suspend()
|
||||||
|
{
|
||||||
|
mSuspendCount++;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsMetricsService::Resume()
|
||||||
|
{
|
||||||
|
if (mSuspendCount > 0)
|
||||||
|
mSuspendCount--;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsMetricsService::OnStartRequest(nsIRequest *request, nsISupports *context)
|
||||||
|
{
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsMetricsService::OnStopRequest(nsIRequest *request, nsISupports *context,
|
||||||
|
nsresult status)
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsILocalFile> dataFile;
|
||||||
|
GetDataFile(&dataFile);
|
||||||
|
if (dataFile)
|
||||||
|
dataFile->Remove(PR_FALSE);
|
||||||
|
|
||||||
|
Resume();
|
||||||
|
mUploading = PR_FALSE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsMetricsService::OnDataAvailable(nsIRequest *request, nsISupports *context,
|
||||||
|
nsIInputStream *stream, PRUint32 offset,
|
||||||
|
PRUint32 count)
|
||||||
|
{
|
||||||
|
// We don't expect to receive any data from an upload.
|
||||||
|
return NS_ERROR_ABORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsMetricsService::Observe(nsISupports *subject, const char *topic,
|
||||||
|
const PRUnichar *data)
|
||||||
|
{
|
||||||
|
if (strcmp(topic, NS_XPCOM_SHUTDOWN_OBSERVER_ID) == 0) {
|
||||||
|
FlushData();
|
||||||
|
} else if (strcmp(topic, "app-startup") == 0) {
|
||||||
|
PRInt32 interval = 86400000; // 24 hours
|
||||||
|
nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
|
||||||
|
if (prefs)
|
||||||
|
prefs->GetIntPref("metrics.upload.interval", &interval);
|
||||||
|
|
||||||
|
nsCOMPtr<nsIUpdateTimerManager> mgr =
|
||||||
|
do_GetService("@mozilla.org/updates/timer-manager;1");
|
||||||
|
if (mgr)
|
||||||
|
mgr->RegisterTimer(NS_LITERAL_STRING("metrics-upload"), this, interval);
|
||||||
|
}
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsMetricsService::Notify(nsITimer *timer)
|
||||||
|
{
|
||||||
|
// OK, we are ready to upload!
|
||||||
|
Upload();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsMetricsService::Init()
|
||||||
|
{
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
// Hook ourselves up to receive the xpcom shutdown event so we can properly
|
||||||
|
// flush our data to disk.
|
||||||
|
nsCOMPtr<nsIObserverService> obsSvc =
|
||||||
|
do_GetService("@mozilla.org/observer-service;1", &rv);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
rv = obsSvc->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, PR_FALSE);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsMetricsService::GetDataFile(nsCOMPtr<nsILocalFile> *result)
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsIFile> file;
|
||||||
|
nsresult rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR,
|
||||||
|
getter_AddRefs(file));
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
rv = file->AppendNative(NS_LITERAL_CSTRING("metrics.dat"));
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
*result = do_QueryInterface(file, &rv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsMetricsService::OpenDataFile(PRUint32 flags, PRFileDesc **fd)
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsILocalFile> dataFile;
|
||||||
|
nsresult rv = GetDataFile(&dataFile);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
return dataFile->OpenNSPRFileDesc(flags, 0600, fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsMetricsService::FlushData()
|
||||||
|
{
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
PRFileDesc *fd;
|
||||||
|
rv = OpenDataFile(PR_WRONLY | PR_APPEND | PR_CREATE_FILE, &fd);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
PRInt32 num = mEventLog.Length();
|
||||||
|
PRBool succeeded = ( PR_Write(fd, mEventLog.Elements(), num) == num );
|
||||||
|
|
||||||
|
PR_Close(fd);
|
||||||
|
NS_ENSURE_STATE(succeeded);
|
||||||
|
|
||||||
|
mEventLog.SetLength(0);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsMetricsService::UploadData()
|
||||||
|
{
|
||||||
|
// TODO: 1) Submit a request to the server to figure out how much data to
|
||||||
|
// upload. For now, we just submit all of the data.
|
||||||
|
// 2) Prepare a data stream for upload that is prefixed with a PROFILE
|
||||||
|
// event.
|
||||||
|
|
||||||
|
PRBool enable = PR_FALSE;
|
||||||
|
nsXPIDLCString 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())
|
||||||
|
return NS_ERROR_ABORT;
|
||||||
|
|
||||||
|
nsCOMPtr<nsILocalFile> file;
|
||||||
|
nsresult rv = GetDataFile(&file);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
// NOTE: nsIUploadChannel requires a buffered stream to upload...
|
||||||
|
|
||||||
|
nsCOMPtr<nsIInputStream> fileStream;
|
||||||
|
NS_NewLocalFileInputStream(getter_AddRefs(fileStream), file);
|
||||||
|
NS_ENSURE_STATE(fileStream);
|
||||||
|
|
||||||
|
PRUint32 streamLen;
|
||||||
|
rv = fileStream->Available(&streamLen);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
if (streamLen == 0)
|
||||||
|
return NS_ERROR_ABORT;
|
||||||
|
|
||||||
|
nsCOMPtr<nsIInputStream> uploadStream;
|
||||||
|
NS_NewBufferedInputStream(getter_AddRefs(uploadStream), fileStream, 4096);
|
||||||
|
NS_ENSURE_STATE(uploadStream);
|
||||||
|
|
||||||
|
nsCOMPtr<nsIIOService> ios = do_GetIOService();
|
||||||
|
NS_ENSURE_STATE(ios);
|
||||||
|
|
||||||
|
nsCOMPtr<nsIChannel> channel;
|
||||||
|
ios->NewChannel(spec, nsnull, nsnull, getter_AddRefs(channel));
|
||||||
|
NS_ENSURE_STATE(channel);
|
||||||
|
|
||||||
|
nsCOMPtr<nsIUploadChannel> uploadChannel = do_QueryInterface(channel);
|
||||||
|
NS_ENSURE_STATE(uploadChannel);
|
||||||
|
|
||||||
|
NS_NAMED_LITERAL_CSTRING(binaryType, "application/vnd.mozilla.metrics");
|
||||||
|
rv = uploadChannel->SetUploadStream(uploadStream, binaryType, -1);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(channel);
|
||||||
|
NS_ENSURE_STATE(httpChannel);
|
||||||
|
rv = httpChannel->SetRequestMethod(NS_LITERAL_CSTRING("POST"));
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
rv = channel->AsyncOpen(this, nsnull);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
88
mozilla/extensions/metrics/src/nsMetricsService.h
Normal file
88
mozilla/extensions/metrics/src/nsMetricsService.h
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* 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 the Metrics extension.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Google Inc.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2006
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Darin Fisher <darin@meer.net>
|
||||||
|
*
|
||||||
|
* 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 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 MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#ifndef nsMetricsService_h__
|
||||||
|
#define nsMetricsService_h__
|
||||||
|
|
||||||
|
#include "nsIMetricsService.h"
|
||||||
|
#include "nsIStreamListener.h"
|
||||||
|
#include "nsILocalFile.h"
|
||||||
|
#include "nsIObserver.h"
|
||||||
|
#include "nsITimer.h"
|
||||||
|
#include "nsTArray.h"
|
||||||
|
#include "nsCOMPtr.h"
|
||||||
|
#include "prio.h"
|
||||||
|
|
||||||
|
// This class manages the metrics datastore. It is responsible for persisting
|
||||||
|
// the data when the browser closes and for uploading it to the metrics server
|
||||||
|
// periodically.
|
||||||
|
|
||||||
|
class nsMetricsService : public nsIMetricsService
|
||||||
|
, public nsIStreamListener
|
||||||
|
, public nsIObserver
|
||||||
|
, public nsITimerCallback
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NS_DECL_ISUPPORTS
|
||||||
|
NS_DECL_NSIMETRICSSERVICE
|
||||||
|
NS_DECL_NSIREQUESTOBSERVER
|
||||||
|
NS_DECL_NSISTREAMLISTENER
|
||||||
|
NS_DECL_NSIOBSERVER
|
||||||
|
NS_DECL_NSITIMERCALLBACK
|
||||||
|
|
||||||
|
nsMetricsService()
|
||||||
|
: mSuspendCount(0)
|
||||||
|
, mUploading(PR_FALSE)
|
||||||
|
{}
|
||||||
|
|
||||||
|
nsresult Init();
|
||||||
|
|
||||||
|
private:
|
||||||
|
nsresult FlushData();
|
||||||
|
nsresult UploadData();
|
||||||
|
nsresult GetDataFile(nsCOMPtr<nsILocalFile> *result);
|
||||||
|
nsresult OpenDataFile(PRUint32 flags, PRFileDesc **result);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Memory buffer containing events to be flushed.
|
||||||
|
nsTArray<PRUint8> mEventLog;
|
||||||
|
PRInt32 mSuspendCount;
|
||||||
|
PRBool mUploading;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // nsMetricsService_h__
|
||||||
190
mozilla/extensions/metrics/tool/DumpMetrics.cpp
Normal file
190
mozilla/extensions/metrics/tool/DumpMetrics.cpp
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* 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.org code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Google Inc.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2006
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Darin Fisher <darin@meer.net>
|
||||||
|
*
|
||||||
|
* 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 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 MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#define HEXDUMP_MAX_ROWS 16
|
||||||
|
|
||||||
|
static void hex_dump(unsigned int *state, const unsigned char *buf, int n)
|
||||||
|
{
|
||||||
|
const unsigned char *p;
|
||||||
|
while (n) {
|
||||||
|
printf(" %08x: ", *state);
|
||||||
|
*state += HEXDUMP_MAX_ROWS;
|
||||||
|
|
||||||
|
p = buf;
|
||||||
|
|
||||||
|
int i, row_max = n;
|
||||||
|
if (row_max > HEXDUMP_MAX_ROWS)
|
||||||
|
row_max = HEXDUMP_MAX_ROWS;
|
||||||
|
|
||||||
|
// print hex codes:
|
||||||
|
for (i = 0; i < row_max; ++i) {
|
||||||
|
printf("%02x ", *p++);
|
||||||
|
}
|
||||||
|
for (i = row_max; i < HEXDUMP_MAX_ROWS; ++i) {
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
// print ASCII glyphs if possible:
|
||||||
|
p = buf;
|
||||||
|
for (i = 0; i < row_max; ++i, ++p) {
|
||||||
|
if (*p < 0x7F && *p > 0x1F) {
|
||||||
|
printf("%c", *p);
|
||||||
|
} else {
|
||||||
|
printf("%c", '.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
buf += row_max;
|
||||||
|
n -= row_max;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
typedef int (* TypeHandler)(const unsigned char *buf, int bufLen);
|
||||||
|
|
||||||
|
struct TypeMap {
|
||||||
|
unsigned char type;
|
||||||
|
const char *name;
|
||||||
|
TypeHandler handler;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int dump_profile_event(const unsigned char *buf, int bufLen);
|
||||||
|
static int dump_custom_event(const unsigned char *buf, int bufLen);
|
||||||
|
static int dump_load_event(const unsigned char *buf, int bufLen);
|
||||||
|
static int dump_ui_event(const unsigned char *buf, int bufLen);
|
||||||
|
|
||||||
|
static TypeMap g_typemap[] = {
|
||||||
|
{ '\x00', "PROFILE", dump_profile_event },
|
||||||
|
{ '\x01', "CUSTOM", dump_custom_event },
|
||||||
|
{ '\x02', "LOAD", dump_load_event },
|
||||||
|
{ '\x03', "UI", dump_ui_event }
|
||||||
|
};
|
||||||
|
|
||||||
|
int dump_profile_event(const unsigned char *buf, int bufLen)
|
||||||
|
{
|
||||||
|
return -1; // XXX Implement me!
|
||||||
|
}
|
||||||
|
|
||||||
|
int dump_load_event(const unsigned char *buf, int bufLen)
|
||||||
|
{
|
||||||
|
return -1; // XXX Implement me!
|
||||||
|
}
|
||||||
|
|
||||||
|
int dump_ui_event(const unsigned char *buf, int bufLen)
|
||||||
|
{
|
||||||
|
return -1; // XXX Implement me!
|
||||||
|
}
|
||||||
|
|
||||||
|
int dump_custom_event(const unsigned char *buf, int bufLen)
|
||||||
|
{
|
||||||
|
unsigned short num;
|
||||||
|
memcpy(&num, buf, sizeof(num));
|
||||||
|
unsigned int state = 0;
|
||||||
|
hex_dump(&state, buf + 2, num);
|
||||||
|
return 2 + num;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dump_data(const unsigned char *buf, int bufLen)
|
||||||
|
{
|
||||||
|
const unsigned char *end = buf + bufLen;
|
||||||
|
while (buf < end) {
|
||||||
|
int n = -1;
|
||||||
|
for (size_t i = 0; i < sizeof(g_typemap)/sizeof(g_typemap[0]); ++i) {
|
||||||
|
if (g_typemap[i].type == *buf) {
|
||||||
|
static unsigned long g_first_timestamp = 0;
|
||||||
|
// dump the header, which consists of a single byte identifier
|
||||||
|
// for the type, and a 32-bit timestamp (seconds since epoch)
|
||||||
|
unsigned long ts;
|
||||||
|
memcpy(&ts, buf + 1, 4);
|
||||||
|
if (g_first_timestamp == 0) {
|
||||||
|
g_first_timestamp = ts;
|
||||||
|
ts = 0;
|
||||||
|
} else {
|
||||||
|
ts -= g_first_timestamp;
|
||||||
|
}
|
||||||
|
printf("%s(%lu):\n", g_typemap[i].name, ts);
|
||||||
|
|
||||||
|
buf += 5;
|
||||||
|
|
||||||
|
n = g_typemap[i].handler(buf, bufLen);
|
||||||
|
if (n > 0)
|
||||||
|
buf += n;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (n == -1) {
|
||||||
|
fprintf(stderr, "error: unhandled event type!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
if (argc < 2) {
|
||||||
|
fprintf(stderr, "usage: DumpMetrics metrics.dat\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *fp = fopen(argv[1], "rb");
|
||||||
|
if (!fp)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
long len = ftell(fp);
|
||||||
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
|
||||||
|
unsigned char *buf = new unsigned char[len];
|
||||||
|
if (fread(buf, len, 1, fp) != 1)
|
||||||
|
len = 0;
|
||||||
|
if (len)
|
||||||
|
dump_data(buf, len);
|
||||||
|
delete[] buf;
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
50
mozilla/extensions/metrics/tool/Makefile.in
Normal file
50
mozilla/extensions/metrics/tool/Makefile.in
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# vim:set ts=8 sw=8 sts=8 noet:
|
||||||
|
# ***** BEGIN LICENSE BLOCK *****
|
||||||
|
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
#
|
||||||
|
# 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 the Metrics extension.
|
||||||
|
#
|
||||||
|
# The Initial Developer of the Original Code is Google Inc.
|
||||||
|
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||||
|
# the Initial Developer. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Contributor(s):
|
||||||
|
# Darin Fisher <darin@meer.net>
|
||||||
|
#
|
||||||
|
# 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 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 MPL, the GPL or the LGPL.
|
||||||
|
#
|
||||||
|
# ***** END LICENSE BLOCK *****
|
||||||
|
|
||||||
|
DEPTH = ../../..
|
||||||
|
topsrcdir = @top_srcdir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
|
||||||
|
include $(DEPTH)/config/autoconf.mk
|
||||||
|
|
||||||
|
MODULE = metrics
|
||||||
|
SIMPLE_PROGRAMS = $(CPPSRCS:.cpp=$(BIN_SUFFIX))
|
||||||
|
|
||||||
|
CPPSRCS = DumpMetrics.cpp
|
||||||
|
|
||||||
|
include $(topsrcdir)/config/rules.mk
|
||||||
Loading…
x
Reference in New Issue
Block a user