diff --git a/mozilla/toolkit/airbag/Makefile.in b/mozilla/toolkit/airbag/Makefile.in index be73a616e0a..96b9c3d5d1c 100644 --- a/mozilla/toolkit/airbag/Makefile.in +++ b/mozilla/toolkit/airbag/Makefile.in @@ -65,6 +65,10 @@ DIRS += client LOCAL_INCLUDES = -I$(srcdir)/airbag/src DEFINES += -DUNICODE -D_UNICODE +XPIDLSRCS = \ + nsICrashReporter.idl \ + $(NULL) + EXPORTS = \ nsAirbagExceptionHandler.h \ $(NULL) @@ -75,4 +79,8 @@ CPPSRCS = \ FORCE_STATIC_LIB = 1 +ifdef ENABLE_TESTS +DIRS += test +endif + include $(topsrcdir)/config/rules.mk diff --git a/mozilla/toolkit/airbag/nsAirbagExceptionHandler.cpp b/mozilla/toolkit/airbag/nsAirbagExceptionHandler.cpp index 210e52444f1..2cda6fc9978 100755 --- a/mozilla/toolkit/airbag/nsAirbagExceptionHandler.cpp +++ b/mozilla/toolkit/airbag/nsAirbagExceptionHandler.cpp @@ -354,6 +354,9 @@ nsresult AnnotateCrashReport(const nsACString &key, const nsACString &data) DoFindInReadable(key, NS_LITERAL_CSTRING("\n"))) return NS_ERROR_INVALID_ARG; + if (DoFindInReadable(data, NS_LITERAL_CSTRING("\0"))) + return NS_ERROR_INVALID_ARG; + nsCString escapedData(data); // escape backslashes diff --git a/mozilla/toolkit/airbag/nsICrashReporter.idl b/mozilla/toolkit/airbag/nsICrashReporter.idl new file mode 100644 index 00000000000..4d1e602fc69 --- /dev/null +++ b/mozilla/toolkit/airbag/nsICrashReporter.idl @@ -0,0 +1,62 @@ +/* ***** 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 Breakpad Integration. + * + * The Initial Developer of the Original Code is + * Ted Mielczarek + * + * Portions created by the Initial Developer are Copyright (C) 2007 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * 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" + +/** + * Provides access to crash reporting functionality. + * @status UNSTABLE - This interface is not frozen and will probably change in + * future releases. + */ + +[scriptable, uuid(da7020ad-fad4-443e-b02b-c5cc9d482e2f)] +interface nsICrashReporter : nsISupports +{ + /** + * Add some extra data to be submitted with a crash report. + * @param key + * Name of the data to be added. + * @param data + * Data to be added. + * + * @throw NS_ERROR_NOT_INITIALIZED if crash reporting not initialized + * @throw NS_ERROR_INVALID_ARG if key or data contain invalid characters. + * Invalid characters for key are '=' and + * '\n'. Invalid character for data is '\0'. + */ + void annotateCrashReport(in ACString key, in ACString data); +}; diff --git a/mozilla/toolkit/airbag/test/Makefile.in b/mozilla/toolkit/airbag/test/Makefile.in new file mode 100644 index 00000000000..3aad6a8873c --- /dev/null +++ b/mozilla/toolkit/airbag/test/Makefile.in @@ -0,0 +1,77 @@ +# +# ***** 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 Breakpad integration. +# +# The Initial Developer of the Original Code is +# Ted Mielczarek +# Portions created by the Initial Developer are Copyright (C) 2007 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# +# Alternatively, the contents of this file may be used under the terms of +# either of 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 + +PROGRAM = TestCrashReporterAPI$(BIN_SUFFIX) + +CPPSRCS = TestCrashReporterAPI.cpp + +REQUIRES = \ + xpcom \ + string \ + airbag \ + $(NULL) + +LIBS = \ + $(EXTRA_DSO_LIBS) \ + $(XPCOM_GLUE_LDOPTS) \ + $(XPCOM_LIBS) \ + $(NSPR_LIBS) \ + $(DEPTH)/toolkit/airbag/$(LIB_PREFIX)airbagexception_s.$(LIB_SUFFIX) \ + $(NULL) + +MOZILLA_INTERNAL_API = 1 + +include $(topsrcdir)/config/rules.mk + +ifeq ($(OS_ARCH),WINNT) +LIBS += \ + $(DEPTH)/toolkit/airbag/airbag/src/client/windows/handler/$(LIB_PREFIX)exception_handler.$(LIB_SUFFIX) \ + $(DEPTH)/toolkit/airbag/airbag/src/common/windows/$(LIB_PREFIX)airbag_common_s.$(LIB_SUFFIX) +LIBS += $(call expand_libname shell32) +endif + +OS_LIBS += $(call EXPAND_LIBNAME,ole32) + +check:: $(PROGRAM) + $(RUN_TEST_PROGRAM) $(DIST)/bin/TestCrashReporterAPI diff --git a/mozilla/toolkit/airbag/test/TestCrashReporterAPI.cpp b/mozilla/toolkit/airbag/test/TestCrashReporterAPI.cpp new file mode 100644 index 00000000000..987c30e4dc0 --- /dev/null +++ b/mozilla/toolkit/airbag/test/TestCrashReporterAPI.cpp @@ -0,0 +1,161 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** 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 Breakpad integration + * + * The Initial Developer of the Original Code is + * Ted Mielczarek + * Portions created by the Initial Developer are Copyright (C) 2007 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * 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 +#include + +#include "prenv.h" +#include "nsIComponentManager.h" +#include "nsISimpleEnumerator.h" +#include "nsIServiceManager.h" +#include "nsServiceManagerUtils.h" +#include "nsDirectoryServiceDefs.h" +#include "nsIProperties.h" +#include "nsCOMPtr.h" +#include "nsILocalFile.h" + +#include "nsAirbagExceptionHandler.h" +#include "nsICrashReporter.h" + +#define mu_assert(message, test) do { if (NS_FAILED(test)) \ + return message; } while (0) +#define mu_assert_failure(message, test) do { if (NS_SUCCEEDED(test)) \ + return message; } while (0) +#define mu_run_test(test) do { char *message = test(); tests_run++; \ + if (message) return message; } while (0) +int tests_run; + +char * +test_init_exception_handler() +{ + mu_assert("CrashReporter::SetExceptionHandler", + CrashReporter::SetExceptionHandler(nsnull)); + return 0; +} + +char * +test_set_minidump_path() +{ + nsresult rv; + nsCOMPtr directoryService = + do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv); + + mu_assert("do_GetService", rv); + + nsCOMPtr currentDirectory; + rv = directoryService->Get(NS_XPCOM_CURRENT_PROCESS_DIR, + NS_GET_IID(nsILocalFile), + getter_AddRefs(currentDirectory)); + mu_assert("directoryService->Get", rv); + + nsAutoString currentDirectoryPath; + rv = currentDirectory->GetPath(currentDirectoryPath); + mu_assert("currentDirectory->GetPath", rv); + + mu_assert("CrashReporter::SetMinidumpPath", + CrashReporter::SetMinidumpPath(currentDirectoryPath)); + + return 0; +} + +char * +test_annotate_crash_report_basic() +{ + mu_assert("CrashReporter::AnnotateCrashReport: basic", + CrashReporter::AnnotateCrashReport(NS_LITERAL_CSTRING("test"), + NS_LITERAL_CSTRING("some data"))); + + return 0; +} + +char * +test_annotate_crash_report_invalid_equals() +{ + mu_assert_failure("CrashReporter::AnnotateCrashReport: invalid = in key", + CrashReporter::AnnotateCrashReport(NS_LITERAL_CSTRING("test=something"), + NS_LITERAL_CSTRING("some data"))); + return 0; +} + +char * +test_annotate_crash_report_invalid_cr() +{ + mu_assert_failure("CrashReporter::AnnotateCrashReport: invalid \n in key", + CrashReporter::AnnotateCrashReport(NS_LITERAL_CSTRING("test\nsomething"), + NS_LITERAL_CSTRING("some data"))); + return 0; +} + +char * +test_unset_exception_handler() +{ + mu_assert("CrashReporter::UnsetExceptionHandler", + CrashReporter::UnsetExceptionHandler()); + return 0; +} + +static char* all_tests() +{ + mu_run_test(test_init_exception_handler); + mu_run_test(test_set_minidump_path); + mu_run_test(test_annotate_crash_report_basic); + mu_run_test(test_annotate_crash_report_invalid_equals); + mu_run_test(test_annotate_crash_report_invalid_cr); + mu_run_test(test_unset_exception_handler); + return 0; +} + +int +main (int argc, char **argv) +{ + NS_InitXPCOM2(nsnull, nsnull, nsnull); + + char* env = new char[13]; + strcpy(env, "MOZ_AIRBAG=1"); + PR_SetEnv(env); + + char* result = all_tests(); + if (result != 0) { + printf("FAIL: %s\n", result); + } + else { + printf("ALL TESTS PASSED\n"); + } + printf("Tests run: %d\n", tests_run); + + return result != 0; +} diff --git a/mozilla/toolkit/xre/nsAppRunner.cpp b/mozilla/toolkit/xre/nsAppRunner.cpp index 3d2dd38b52e..572d0bdc96c 100644 --- a/mozilla/toolkit/xre/nsAppRunner.cpp +++ b/mozilla/toolkit/xre/nsAppRunner.cpp @@ -195,6 +195,8 @@ extern "C" void ShowOSAlert(const char* aMessage); #ifdef MOZ_AIRBAG #include "nsAirbagExceptionHandler.h" +#include "nsICrashReporter.h" +#define NS_CRASHREPORTER_CONTRACTID "@mozilla.org/toolkit/crash-reporter;1" #endif // on x86 linux, the current builds of some popular plugins (notably @@ -499,6 +501,9 @@ PRBool gSafeMode = PR_FALSE; class nsXULAppInfo : public nsIXULAppInfo, #ifdef XP_WIN public nsIWinAppHelper, +#endif +#ifdef MOZ_AIRBAG + public nsICrashReporter, #endif public nsIXULRuntime @@ -507,6 +512,9 @@ public: NS_DECL_ISUPPORTS_INHERITED NS_DECL_NSIXULAPPINFO NS_DECL_NSIXULRUNTIME +#ifdef MOZ_AIRBAG + NS_DECL_NSICRASHREPORTER +#endif #ifdef XP_WIN NS_DECL_NSIWINAPPHELPER private: @@ -519,6 +527,9 @@ NS_INTERFACE_MAP_BEGIN(nsXULAppInfo) NS_INTERFACE_MAP_ENTRY(nsIXULRuntime) #ifdef XP_WIN NS_INTERFACE_MAP_ENTRY(nsIWinAppHelper) +#endif +#ifdef MOZ_AIRBAG + NS_INTERFACE_MAP_ENTRY(nsICrashReporter) #endif NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIXULAppInfo, gAppData) NS_INTERFACE_MAP_END @@ -716,6 +727,15 @@ nsXULAppInfo::PostUpdate(nsILocalFile *aLogFile) } #endif +#ifdef MOZ_AIRBAG +NS_IMETHODIMP +nsXULAppInfo::AnnotateCrashReport(const nsACString& key, + const nsACString& data) +{ + return CrashReporter::AnnotateCrashReport(key, data); +} +#endif + static const nsXULAppInfo kAppInfo; static NS_METHOD AppInfoConstructor(nsISupports* aOuter, REFNSIID aIID, void **aResult) @@ -791,6 +811,15 @@ static nsModuleComponentInfo kComponents[] = XULAPPINFO_SERVICE_CONTRACTID, AppInfoConstructor } +#ifdef MOZ_AIRBAG +, + { + "nsXULAppInfo", + APPINFO_CID, + NS_CRASHREPORTER_CONTRACTID, + AppInfoConstructor + } +#endif }; NS_IMPL_NSGETMODULE(Apprunner, kComponents)