From e26c5e1e505cb99d98e45d9fe798b9a9cd8fb4df Mon Sep 17 00:00:00 2001 From: Fedor Date: Mon, 20 May 2019 09:02:01 +0300 Subject: [PATCH] Remove crashreporter toolkit files. --- gfx/ipc/moz.build | 1 - ipc/glue/moz.build | 1 - toolkit/crashreporter/CrashReports.jsm | 91 - toolkit/crashreporter/CrashSubmit.jsm | 570 - toolkit/crashreporter/InjectCrashReporter.cpp | 84 - toolkit/crashreporter/InjectCrashReporter.h | 28 - toolkit/crashreporter/KeyValueParser.jsm | 54 - toolkit/crashreporter/LoadLibraryRemote.cpp | 454 - toolkit/crashreporter/LoadLibraryRemote.h | 24 - .../00-arm-exidx-rollup.patch | 1347 --- toolkit/crashreporter/breakpad-patches/README | 4 - .../breakpad-windows-libxul/moz.build | 32 - .../breakpad-windows-standalone/moz.build | 26 - toolkit/crashreporter/client/Makefile.in | 20 - .../crashreporter/client/Throbber-small.avi | Bin 3584 -> 0 bytes .../crashreporter/client/crashreporter.cpp | 759 -- .../client/crashreporter.exe.manifest | 37 - toolkit/crashreporter/client/crashreporter.h | 158 - .../crashreporter/client/crashreporter.ico | Bin 25214 -> 0 bytes toolkit/crashreporter/client/crashreporter.rc | 148 - .../client/crashreporter_gtk_common.cpp | 453 - .../client/crashreporter_gtk_common.h | 50 - .../client/crashreporter_linux.cpp | 576 - .../crashreporter/client/crashreporter_osx.h | 107 - .../crashreporter/client/crashreporter_osx.mm | 922 -- .../client/crashreporter_unix_common.cpp | 85 - .../client/crashreporter_win.cpp | 1568 --- .../client/macbuild/Contents/Info.plist | 32 - .../client/macbuild/Contents/PkgInfo | 2 - .../English.lproj/InfoPlist.strings.in | 8 - .../English.lproj/MainMenu.nib/classes.nib | 102 - .../English.lproj/MainMenu.nib/info.nib | 18 - .../MainMenu.nib/keyedobjects.nib | Bin 25518 -> 0 bytes .../English.lproj/MainMenuRTL.nib/classes.nib | 102 - .../English.lproj/MainMenuRTL.nib/info.nib | 18 - .../MainMenuRTL.nib/keyedobjects.nib | Bin 27032 -> 0 bytes .../Contents/Resources/crashreporter.icns | Bin 61743 -> 0 bytes toolkit/crashreporter/client/moz.build | 78 - toolkit/crashreporter/client/resource.h | 37 - toolkit/crashreporter/content/crashes.js | 179 - toolkit/crashreporter/content/crashes.xhtml | 123 - toolkit/crashreporter/crashreporter.mozbuild | 24 - toolkit/crashreporter/docs/index.rst | 195 - .../crashreporter/google-breakpad/.gitignore | 82 - toolkit/crashreporter/google-breakpad/AUTHORS | 1 - .../crashreporter/google-breakpad/ChangeLog | 0 toolkit/crashreporter/google-breakpad/DEPS | 75 - .../crashreporter/google-breakpad/GIT-INFO | 1 - toolkit/crashreporter/google-breakpad/INSTALL | 370 - toolkit/crashreporter/google-breakpad/LICENSE | 50 - .../crashreporter/google-breakpad/Makefile.am | 1510 --- .../crashreporter/google-breakpad/Makefile.in | 8221 --------------- toolkit/crashreporter/google-breakpad/NEWS | 0 .../google-breakpad/README.ANDROID | 139 - .../crashreporter/google-breakpad/README.md | 82 - .../crashreporter/google-breakpad/aclocal.m4 | 1297 --- .../android/common-functions.sh | 372 - .../android/google_breakpad/Android.mk | 103 - .../google-breakpad/android/run-checks.sh | 555 - .../google-breakpad/android/sample_app/README | 32 - .../android/sample_app/jni/Android.mk | 44 - .../android/sample_app/jni/Application.mk | 32 - .../android/sample_app/jni/test_breakpad.cpp | 57 - .../google-breakpad/android/test-driver | 131 - .../google-breakpad/android/test-shell.sh | 131 - .../google-breakpad/autotools/compile | 347 - .../google-breakpad/autotools/config.guess | 1447 --- .../google-breakpad/autotools/config.sub | 1813 ---- .../google-breakpad/autotools/depcomp | 791 -- .../google-breakpad/autotools/install-sh | 501 - .../google-breakpad/autotools/ltmain.sh | 8406 --------------- .../google-breakpad/autotools/missing | 215 - .../google-breakpad/autotools/test-driver | 148 - .../google-breakpad/breakpad-client.pc.in | 10 - .../google-breakpad/breakpad.pc.in | 10 - .../google-breakpad/codereview.settings | 4 - .../crashreporter/google-breakpad/configure | 9255 ----------------- .../google-breakpad/configure.ac | 204 - .../google-breakpad/m4/ax_pthread.m4 | 283 - .../google-breakpad/m4/libtool.m4 | 7377 ------------- .../google-breakpad/m4/ltoptions.m4 | 368 - .../google-breakpad/m4/ltsugar.m4 | 123 - .../google-breakpad/m4/ltversion.m4 | 23 - .../google-breakpad/m4/lt~obsolete.m4 | 92 - .../src/breakpad_googletest_includes.h | 57 - .../google-breakpad/src/build/all.gyp | 41 - .../google-breakpad/src/build/common.gypi | 1045 -- .../src/build/filename_rules.gypi | 57 - .../google-breakpad/src/build/gyp_breakpad | 67 - .../google-breakpad/src/build/testing.gypi | 90 - .../client/apple/Framework/BreakpadDefines.h | 73 - .../google-breakpad/src/client/ios/Breakpad.h | 246 - .../src/client/ios/Breakpad.mm | 916 -- .../ios/Breakpad.xcodeproj/project.pbxproj | 578 - .../src/client/ios/BreakpadController.h | 141 - .../src/client/ios/BreakpadController.mm | 354 - .../src/client/ios/Breakpad_Prefix.pch | 7 - .../ios_exception_minidump_generator.h | 74 - .../ios_exception_minidump_generator.mm | 210 - .../linux/crash_generation/client_info.h | 53 - .../crash_generation_client.cc | 105 - .../crash_generation_client.h | 65 - .../crash_generation_server.cc | 333 - .../crash_generation_server.h | 135 - .../src/client/linux/data/linux-gate-amd.sym | 3 - .../client/linux/data/linux-gate-intel.sym | 3 - .../linux/dump_writer_common/mapping_info.h | 61 - .../dump_writer_common/raw_context_cpu.h | 53 - .../linux/dump_writer_common/thread_info.cc | 305 - .../linux/dump_writer_common/thread_info.h | 91 - .../dump_writer_common/ucontext_reader.cc | 259 - .../dump_writer_common/ucontext_reader.h | 64 - .../client/linux/handler/exception_handler.cc | 789 -- .../client/linux/handler/exception_handler.h | 278 - .../handler/exception_handler_unittest.cc | 1179 --- .../linux/handler/microdump_extra_info.h | 52 - .../linux/handler/minidump_descriptor.cc | 87 - .../linux/handler/minidump_descriptor.h | 149 - .../src/client/linux/log/log.cc | 84 - .../src/client/linux/log/log.h | 55 - .../microdump_writer/microdump_writer.cc | 609 -- .../linux/microdump_writer/microdump_writer.h | 65 - .../microdump_writer_unittest.cc | 257 - .../client/linux/minidump_writer/cpu_set.h | 144 - .../linux/minidump_writer/cpu_set_unittest.cc | 164 - .../linux/minidump_writer/directory_reader.h | 106 - .../directory_reader_unittest.cc | 78 - .../linux/minidump_writer/line_reader.h | 131 - .../minidump_writer/line_reader_unittest.cc | 169 - .../minidump_writer/linux_core_dumper.cc | 258 - .../linux/minidump_writer/linux_core_dumper.h | 125 - .../linux_core_dumper_unittest.cc | 128 - .../linux/minidump_writer/linux_dumper.cc | 776 -- .../linux/minidump_writer/linux_dumper.h | 265 - .../linux_dumper_unittest_helper.cc | 94 - .../minidump_writer/linux_ptrace_dumper.cc | 355 - .../minidump_writer/linux_ptrace_dumper.h | 92 - .../linux_ptrace_dumper_unittest.cc | 470 - .../linux/minidump_writer/minidump_writer.cc | 1376 --- .../linux/minidump_writer/minidump_writer.h | 124 - .../minidump_writer_unittest.cc | 775 -- .../minidump_writer_unittest_utils.cc | 66 - .../minidump_writer_unittest_utils.h | 49 - .../minidump_writer/proc_cpuinfo_reader.h | 130 - .../proc_cpuinfo_reader_unittest.cc | 199 - .../src/client/linux/moz.build | 35 - .../sender/google_crash_report_sender.cc | 104 - .../mac/Breakpad.xcodeproj/project.pbxproj | 2788 ----- .../src/client/mac/Framework/Breakpad.h | 285 - .../src/client/mac/Framework/Breakpad.mm | 1043 -- .../client/mac/Framework/Breakpad_Prefix.pch | 8 - .../src/client/mac/Framework/Info.plist | 26 - .../src/client/mac/Framework/OnDemandServer.h | 145 - .../client/mac/Framework/OnDemandServer.mm | 189 - .../src/client/mac/UnitTests-Info.plist | 20 - .../client/mac/crash_generation/ConfigFile.h | 83 - .../client/mac/crash_generation/ConfigFile.mm | 167 - .../client/mac/crash_generation/Inspector.h | 162 - .../client/mac/crash_generation/Inspector.mm | 362 - .../mac/crash_generation/InspectorMain.mm | 65 - .../client/mac/crash_generation/client_info.h | 47 - .../crash_generation_client.cc | 72 - .../crash_generation_client.h | 65 - .../crash_generation_server.cc | 166 - .../crash_generation_server.h | 150 - .../src/client/mac/crash_generation/moz.build | 19 - .../client/mac/handler/breakpad_nlist_64.cc | 402 - .../client/mac/handler/breakpad_nlist_64.h | 47 - .../src/client/mac/handler/dynamic_images.cc | 573 - .../src/client/mac/handler/dynamic_images.h | 319 - .../client/mac/handler/exception_handler.cc | 854 -- .../client/mac/handler/exception_handler.h | 281 - .../src/client/mac/handler/mach_vm_compat.h | 48 - .../client/mac/handler/minidump_generator.cc | 1604 --- .../client/mac/handler/minidump_generator.h | 236 - .../minidump_test.xcodeproj/project.pbxproj | 841 -- .../mac/handler/minidump_tests32-Info.plist | 20 - .../mac/handler/minidump_tests64-Info.plist | 22 - .../src/client/mac/handler/moz.build | 22 - .../mac/handler/obj-cTestCases-Info.plist | 20 - .../mac/handler/protected_memory_allocator.cc | 92 - .../mac/handler/protected_memory_allocator.h | 85 - .../handler/testcases/DynamicImagesTests.cc | 79 - .../handler/testcases/DynamicImagesTests.h | 52 - .../handler/testcases/breakpad_nlist_test.cc | 106 - .../handler/testcases/breakpad_nlist_test.h | 62 - .../client/mac/handler/testcases/dwarftests.h | 46 - .../mac/handler/testcases/dwarftests.mm | 60 - .../testcases/testdata/dump_syms_dwarf_data | Bin 702795 -> 0 bytes .../testdata/dump_syms_i386_breakpad.sym | 5300 ---------- .../src/client/mac/handler/ucontext_compat.h | 47 - .../src/client/mac/sender/Breakpad.xib | 1140 -- .../sender/English.lproj/InfoPlist.strings | Bin 156 -> 0 bytes .../sender/English.lproj/Localizable.strings | Bin 2428 -> 0 bytes .../client/mac/sender/ReporterIcon.graffle | 2489 ----- .../mac/sender/crash_report_sender-Info.plist | 32 - .../client/mac/sender/crash_report_sender.h | 117 - .../mac/sender/crash_report_sender.icns | Bin 170816 -> 0 bytes .../client/mac/sender/crash_report_sender.m | 755 -- .../mac/sender/da.lproj/InfoPlist.strings | Bin 156 -> 0 bytes .../mac/sender/da.lproj/Localizable.strings | Bin 2428 -> 0 bytes .../mac/sender/de.lproj/InfoPlist.strings | Bin 192 -> 0 bytes .../mac/sender/de.lproj/Localizable.strings | Bin 2746 -> 0 bytes .../mac/sender/es.lproj/InfoPlist.strings | Bin 184 -> 0 bytes .../mac/sender/es.lproj/Localizable.strings | Bin 2578 -> 0 bytes .../mac/sender/fr.lproj/InfoPlist.strings | Bin 156 -> 0 bytes .../mac/sender/fr.lproj/Localizable.strings | Bin 2694 -> 0 bytes .../src/client/mac/sender/goArrow.png | Bin 3591 -> 0 bytes .../mac/sender/it.lproj/InfoPlist.strings | Bin 156 -> 0 bytes .../mac/sender/it.lproj/Localizable.strings | Bin 2590 -> 0 bytes .../mac/sender/ja.lproj/InfoPlist.strings | Bin 156 -> 0 bytes .../mac/sender/ja.lproj/Localizable.strings | Bin 1792 -> 0 bytes .../mac/sender/nl.lproj/InfoPlist.strings | Bin 156 -> 0 bytes .../mac/sender/nl.lproj/Localizable.strings | Bin 2546 -> 0 bytes .../mac/sender/no.lproj/InfoPlist.strings | Bin 156 -> 0 bytes .../mac/sender/no.lproj/Localizable.strings | Bin 2484 -> 0 bytes .../mac/sender/sl.lproj/InfoPlist.strings | Bin 184 -> 0 bytes .../mac/sender/sl.lproj/Localizable.strings | Bin 2632 -> 0 bytes .../mac/sender/sv.lproj/InfoPlist.strings | Bin 156 -> 0 bytes .../mac/sender/sv.lproj/Localizable.strings | Bin 2588 -> 0 bytes .../mac/sender/tr.lproj/InfoPlist.strings | Bin 168 -> 0 bytes .../mac/sender/tr.lproj/Localizable.strings | Bin 2430 -> 0 bytes .../src/client/mac/sender/uploader.h | 89 - .../src/client/mac/sender/uploader.mm | 636 -- .../src/client/mac/testapp/Controller.h | 65 - .../src/client/mac/testapp/Controller.m | 261 - .../testapp/English.lproj/InfoPlist.strings | Bin 192 -> 0 bytes .../mac/testapp/English.lproj/MainMenu.xib | 3748 ------- .../src/client/mac/testapp/Info.plist | 55 - .../src/client/mac/testapp/TestClass.h | 37 - .../src/client/mac/testapp/TestClass.mm | 95 - .../src/client/mac/testapp/bomb.icns | Bin 23659 -> 0 bytes .../src/client/mac/testapp/crashInMain | Bin 12588 -> 0 bytes .../src/client/mac/testapp/crashduringload | Bin 12588 -> 0 bytes .../src/client/mac/testapp/main.m | 34 - .../mac/tests/BreakpadFramework_Test.mm | 217 - .../mac/tests/crash_generation_server_test.cc | 398 - .../mac/tests/exception_handler_test.cc | 713 -- .../mac/tests/minidump_generator_test.cc | 319 - .../tests/minidump_generator_test_helper.cc | 74 - .../client/mac/tests/spawn_child_process.h | 149 - .../src/client/mac/tests/testlogging.h | 9 - .../src/client/minidump_file_writer-inl.h | 97 - .../src/client/minidump_file_writer.cc | 350 - .../src/client/minidump_file_writer.h | 272 - .../client/minidump_file_writer_unittest.cc | 179 - .../google-breakpad/src/client/moz.build | 18 - .../src/client/solaris/handler/Makefile | 78 - .../solaris/handler/exception_handler.cc | 258 - .../solaris/handler/exception_handler.h | 201 - .../solaris/handler/exception_handler_test.cc | 119 - .../solaris/handler/minidump_generator.cc | 786 -- .../solaris/handler/minidump_generator.h | 70 - .../client/solaris/handler/minidump_test.cc | 75 - .../src/client/solaris/handler/moz.build | 18 - .../src/client/solaris/handler/solaris_lwp.cc | 436 - .../src/client/solaris/handler/solaris_lwp.h | 160 - .../src/client/windows/breakpad_client.gyp | 66 - .../windows/common/auto_critical_section.h | 81 - .../src/client/windows/common/ipc_protocol.h | 181 - .../windows/crash_generation/ReadMe.txt | 58 - .../windows/crash_generation/client_info.cc | 223 - .../windows/crash_generation/client_info.h | 177 - .../crash_generation/crash_generation.gyp | 63 - .../crash_generation_client.cc | 405 - .../crash_generation_client.h | 182 - .../crash_generation_server.cc | 931 -- .../crash_generation_server.h | 299 - .../crash_generation/minidump_generator.cc | 579 -- .../crash_generation/minidump_generator.h | 199 - .../windows/crash_generation/objs.mozbuild | 17 - .../windows/handler/exception_handler.cc | 1073 -- .../windows/handler/exception_handler.gyp | 47 - .../windows/handler/exception_handler.h | 524 - .../src/client/windows/handler/objs.mozbuild | 14 - .../windows/sender/crash_report_sender.cc | 142 - .../windows/sender/crash_report_sender.gyp | 46 - .../windows/sender/crash_report_sender.h | 125 - .../src/client/windows/sender/objs.mozbuild | 14 - .../crash_generation_app/abstract_class.cc | 53 - .../crash_generation_app/abstract_class.h | 57 - .../crash_generation_app.cc | 522 - .../crash_generation_app.gyp | 63 - .../crash_generation_app.h | 35 - .../crash_generation_app.ico | Bin 23558 -> 0 bytes .../crash_generation_app.rc | 144 - .../tests/crash_generation_app/resource.h | 73 - .../tests/crash_generation_app/small.ico | Bin 23558 -> 0 bytes .../client/windows/unittests/client_tests.gyp | 80 - .../unittests/crash_generation_server_test.cc | 305 - .../client/windows/unittests/dump_analysis.cc | 184 - .../client/windows/unittests/dump_analysis.h | 102 - .../unittests/exception_handler_death_test.cc | 582 -- .../exception_handler_nesting_test.cc | 327 - .../unittests/exception_handler_test.cc | 501 - .../unittests/exception_handler_test.h | 61 - .../client/windows/unittests/minidump_test.cc | 333 - .../src/client/windows/unittests/testing.gyp | 83 - .../google-breakpad/src/common/Makefile.in | 9 - .../src/common/android/breakpad_getcontext.S | 489 - .../android/breakpad_getcontext_unittest.cc | 186 - .../src/common/android/include/elf.h | 168 - .../src/common/android/include/link.h | 73 - .../src/common/android/include/sgidefs.h | 41 - .../src/common/android/include/stab.h | 100 - .../src/common/android/include/sys/procfs.h | 124 - .../src/common/android/include/sys/signal.h | 35 - .../src/common/android/include/sys/user.h | 85 - .../src/common/android/include/ucontext.h | 56 - .../common/android/testing/include/wchar.h | 76 - .../src/common/android/testing/mkdtemp.h | 110 - .../common/android/testing/pthread_fixes.h | 99 - .../src/common/android/ucontext_constants.h | 144 - .../src/common/arm_ex_reader.cc | 487 - .../src/common/arm_ex_reader.h | 114 - .../src/common/arm_ex_to_module.cc | 209 - .../src/common/arm_ex_to_module.h | 119 - .../google-breakpad/src/common/basictypes.h | 58 - .../google-breakpad/src/common/byte_cursor.h | 265 - .../src/common/byte_cursor_unittest.cc | 776 -- .../google-breakpad/src/common/common.gyp | 250 - .../google-breakpad/src/common/convert_UTF.c | 554 - .../google-breakpad/src/common/convert_UTF.h | 164 - .../src/common/dwarf/bytereader-inl.h | 170 - .../src/common/dwarf/bytereader.cc | 250 - .../src/common/dwarf/bytereader.h | 315 - .../src/common/dwarf/bytereader_unittest.cc | 707 -- .../src/common/dwarf/cfi_assembler.cc | 198 - .../src/common/dwarf/cfi_assembler.h | 269 - .../src/common/dwarf/dwarf2diehandler.cc | 199 - .../src/common/dwarf/dwarf2diehandler.h | 365 - .../common/dwarf/dwarf2diehandler_unittest.cc | 527 - .../src/common/dwarf/dwarf2enums.h | 675 -- .../src/common/dwarf/dwarf2reader.cc | 2734 ----- .../src/common/dwarf/dwarf2reader.h | 1288 --- .../common/dwarf/dwarf2reader_cfi_unittest.cc | 2468 ----- .../common/dwarf/dwarf2reader_die_unittest.cc | 487 - .../common/dwarf/dwarf2reader_test_common.h | 149 - .../src/common/dwarf/elf_reader.cc | 1273 --- .../src/common/dwarf/elf_reader.h | 166 - .../src/common/dwarf/functioninfo.cc | 231 - .../src/common/dwarf/functioninfo.h | 188 - .../src/common/dwarf/line_state_machine.h | 61 - .../src/common/dwarf/moz.build | 35 - .../google-breakpad/src/common/dwarf/types.h | 51 - .../src/common/dwarf_cfi_to_module.cc | 295 - .../src/common/dwarf_cfi_to_module.h | 202 - .../common/dwarf_cfi_to_module_unittest.cc | 306 - .../src/common/dwarf_cu_to_module.cc | 1075 -- .../src/common/dwarf_cu_to_module.h | 320 - .../src/common/dwarf_cu_to_module_unittest.cc | 1804 ---- .../src/common/dwarf_line_to_module.cc | 143 - .../src/common/dwarf_line_to_module.h | 188 - .../common/dwarf_line_to_module_unittest.cc | 391 - .../google-breakpad/src/common/language.cc | 83 - .../google-breakpad/src/common/language.h | 88 - .../google-breakpad/src/common/linux/crc32.cc | 70 - .../google-breakpad/src/common/linux/crc32.h | 53 - .../src/common/linux/dump_symbols.cc | 1159 --- .../src/common/linux/dump_symbols.h | 86 - .../src/common/linux/dump_symbols_unittest.cc | 204 - .../src/common/linux/eintr_wrapper.h | 58 - .../src/common/linux/elf_core_dump.cc | 179 - .../src/common/linux/elf_core_dump.h | 148 - .../common/linux/elf_core_dump_unittest.cc | 256 - .../src/common/linux/elf_gnu_compat.h | 46 - .../src/common/linux/elf_symbols_to_module.cc | 178 - .../src/common/linux/elf_symbols_to_module.h | 58 - .../linux/elf_symbols_to_module_unittest.cc | 370 - .../src/common/linux/elfutils-inl.h | 74 - .../src/common/linux/elfutils.cc | 194 - .../src/common/linux/elfutils.h | 126 - .../src/common/linux/file_id.cc | 202 - .../src/common/linux/file_id.h | 87 - .../src/common/linux/file_id_unittest.cc | 338 - .../common/linux/google_crashdump_uploader.cc | 202 - .../common/linux/google_crashdump_uploader.h | 107 - .../linux/google_crashdump_uploader_test.cc | 170 - .../src/common/linux/guid_creator.cc | 104 - .../src/common/linux/guid_creator.h | 48 - .../src/common/linux/http_upload.cc | 230 - .../src/common/linux/http_upload.h | 90 - .../src/common/linux/ignore_ret.h | 40 - .../src/common/linux/libcurl_wrapper.cc | 241 - .../src/common/linux/libcurl_wrapper.h | 93 - .../src/common/linux/linux_libc_support.cc | 237 - .../src/common/linux/linux_libc_support.h | 96 - .../linux/linux_libc_support_unittest.cc | 213 - .../src/common/linux/memory_mapped_file.cc | 107 - .../src/common/linux/memory_mapped_file.h | 87 - .../linux/memory_mapped_file_unittest.cc | 208 - .../src/common/linux/moz.build | 56 - .../src/common/linux/safe_readlink.cc | 53 - .../src/common/linux/safe_readlink.h | 65 - .../common/linux/safe_readlink_unittest.cc | 89 - .../src/common/linux/symbol_upload.cc | 155 - .../src/common/linux/symbol_upload.h | 59 - .../src/common/linux/synth_elf.cc | 263 - .../src/common/linux/synth_elf.h | 197 - .../src/common/linux/synth_elf_unittest.cc | 413 - .../src/common/linux/tests/auto_testfile.h | 124 - .../src/common/linux/tests/crash_generator.cc | 322 - .../src/common/linux/tests/crash_generator.h | 117 - .../src/common/mac/Breakpad.xcconfig | 52 - .../src/common/mac/BreakpadDebug.xcconfig | 32 - .../src/common/mac/BreakpadRelease.xcconfig | 34 - .../src/common/mac/GTMDefines.h | 456 - .../src/common/mac/GTMLogger.h | 504 - .../src/common/mac/GTMLogger.m | 611 -- .../src/common/mac/HTTPMultipartUpload.h | 61 - .../src/common/mac/HTTPMultipartUpload.m | 269 - .../google-breakpad/src/common/mac/MachIPC.h | 301 - .../google-breakpad/src/common/mac/MachIPC.mm | 306 - .../src/common/mac/arch_utilities.cc | 211 - .../src/common/mac/arch_utilities.h | 47 - .../src/common/mac/bootstrap_compat.cc | 42 - .../src/common/mac/bootstrap_compat.h | 54 - .../google-breakpad/src/common/mac/byteswap.h | 73 - .../src/common/mac/dump_syms.cc | 646 -- .../src/common/mac/dump_syms.h | 196 - .../google-breakpad/src/common/mac/file_id.cc | 106 - .../google-breakpad/src/common/mac/file_id.h | 81 - .../src/common/mac/launch_reporter.cc | 84 - .../src/common/mac/launch_reporter.h | 43 - .../src/common/mac/macho_id.cc | 369 - .../google-breakpad/src/common/mac/macho_id.h | 131 - .../src/common/mac/macho_reader.cc | 539 - .../src/common/mac/macho_reader.h | 460 - .../src/common/mac/macho_reader_unittest.cc | 1902 ---- .../src/common/mac/macho_utilities.cc | 155 - .../src/common/mac/macho_utilities.h | 95 - .../src/common/mac/macho_walker.cc | 268 - .../src/common/mac/macho_walker.h | 119 - .../google-breakpad/src/common/mac/moz.build | 52 - .../src/common/mac/scoped_task_suspend-inl.h | 56 - .../src/common/mac/string_utilities.cc | 84 - .../src/common/mac/string_utilities.h | 52 - .../src/common/mac/super_fat_arch.h | 88 - .../src/common/mac/testing/GTMSenTestCase.h | 1110 -- .../src/common/mac/testing/GTMSenTestCase.m | 428 - .../google-breakpad/src/common/md5.cc | 251 - .../google-breakpad/src/common/md5.h | 27 - .../google-breakpad/src/common/memory.h | 249 - .../google-breakpad/src/common/memory_range.h | 145 - .../src/common/memory_range_unittest.cc | 193 - .../src/common/memory_unittest.cc | 124 - .../src/common/minidump_type_helper.h | 56 - .../google-breakpad/src/common/module.cc | 348 - .../google-breakpad/src/common/module.h | 351 - .../src/common/module_unittest.cc | 616 -- .../google-breakpad/src/common/moz.build | 72 - .../google-breakpad/src/common/scoped_ptr.h | 404 - .../src/common/simple_string_dictionary.cc | 45 - .../src/common/simple_string_dictionary.h | 260 - .../simple_string_dictionary_unittest.cc | 308 - .../src/common/solaris/dump_symbols.cc | 681 -- .../src/common/solaris/dump_symbols.h | 49 - .../src/common/solaris/file_id.cc | 197 - .../src/common/solaris/file_id.h | 66 - .../src/common/solaris/guid_creator.cc | 84 - .../src/common/solaris/guid_creator.h | 50 - .../src/common/solaris/message_output.h | 54 - .../src/common/solaris/moz.build | 34 - .../src/common/stabs_reader.cc | 315 - .../google-breakpad/src/common/stabs_reader.h | 325 - .../src/common/stabs_reader_unittest.cc | 611 -- .../src/common/stabs_to_module.cc | 197 - .../src/common/stabs_to_module.h | 143 - .../src/common/stabs_to_module_unittest.cc | 258 - .../src/common/stdio_wrapper.h | 43 - .../src/common/string_conversion.cc | 155 - .../src/common/string_conversion.h | 68 - .../google-breakpad/src/common/symbol_data.h | 42 - .../src/common/test_assembler.cc | 359 - .../src/common/test_assembler.h | 484 - .../src/common/test_assembler_unittest.cc | 1662 --- .../src/common/testdata/func-line-pairing.h | 676 -- .../src/common/tests/auto_tempdir.h | 100 - .../src/common/tests/file_utils.cc | 153 - .../src/common/tests/file_utils.h | 52 - .../google-breakpad/src/common/unordered.h | 62 - .../src/common/using_std_string.h | 65 - .../src/common/windows/common_windows.gyp | 105 - .../src/common/windows/dia_util.cc | 92 - .../src/common/windows/dia_util.h | 64 - .../src/common/windows/guid_string.cc | 76 - .../src/common/windows/guid_string.h | 58 - .../src/common/windows/http_upload.cc | 420 - .../src/common/windows/http_upload.h | 129 - .../src/common/windows/objs.mozbuild | 15 - .../src/common/windows/omap.cc | 694 -- .../google-breakpad/src/common/windows/omap.h | 72 - .../src/common/windows/omap_internal.h | 137 - .../src/common/windows/omap_unittest.cc | 330 - .../common/windows/pdb_source_line_writer.cc | 1369 --- .../common/windows/pdb_source_line_writer.h | 257 - .../src/common/windows/string_utils-inl.h | 142 - .../src/common/windows/string_utils.cc | 133 - .../google-breakpad/src/config.h.in | 79 - .../google_breakpad/common/breakpad_types.h | 68 - .../common/minidump_cpu_amd64.h | 235 - .../google_breakpad/common/minidump_cpu_arm.h | 151 - .../common/minidump_cpu_arm64.h | 140 - .../common/minidump_cpu_mips.h | 176 - .../google_breakpad/common/minidump_cpu_ppc.h | 168 - .../common/minidump_cpu_ppc64.h | 134 - .../common/minidump_cpu_sparc.h | 163 - .../google_breakpad/common/minidump_cpu_x86.h | 174 - .../common/minidump_exception_linux.h | 87 - .../common/minidump_exception_mac.h | 205 - .../common/minidump_exception_ps3.h | 67 - .../common/minidump_exception_solaris.h | 94 - .../common/minidump_exception_win32.h | 2264 ---- .../google_breakpad/common/minidump_format.h | 1045 -- .../google_breakpad/common/minidump_size.h | 113 - .../processor/basic_source_line_resolver.h | 144 - .../google_breakpad/processor/call_stack.h | 87 - .../google_breakpad/processor/code_module.h | 101 - .../google_breakpad/processor/code_modules.h | 111 - .../google_breakpad/processor/dump_context.h | 116 - .../google_breakpad/processor/dump_object.h | 53 - .../processor/exploitability.h | 82 - .../processor/fast_source_line_resolver.h | 100 - .../google_breakpad/processor/memory_region.h | 79 - .../src/google_breakpad/processor/microdump.h | 132 - .../processor/microdump_processor.h | 63 - .../src/google_breakpad/processor/minidump.h | 1171 --- .../processor/minidump_processor.h | 147 - .../processor/proc_maps_linux.h | 60 - .../processor/process_result.h | 66 - .../google_breakpad/processor/process_state.h | 198 - .../processor/source_line_resolver_base.h | 128 - .../source_line_resolver_interface.h | 117 - .../google_breakpad/processor/stack_frame.h | 144 - .../processor/stack_frame_cpu.h | 405 - .../processor/stack_frame_symbolizer.h | 108 - .../google_breakpad/processor/stackwalker.h | 235 - .../processor/symbol_supplier.h | 99 - .../google_breakpad/processor/system_info.h | 106 - .../src/processor/address_map-inl.h | 93 - .../src/processor/address_map.h | 85 - .../src/processor/address_map_unittest.cc | 196 - .../src/processor/basic_code_module.h | 116 - .../src/processor/basic_code_modules.cc | 155 - .../src/processor/basic_code_modules.h | 98 - .../processor/basic_source_line_resolver.cc | 612 -- .../basic_source_line_resolver_types.h | 177 - .../basic_source_line_resolver_unittest.cc | 682 -- .../src/processor/call_stack.cc | 54 - .../src/processor/cfi_frame_info-inl.h | 119 - .../src/processor/cfi_frame_info.cc | 186 - .../src/processor/cfi_frame_info.h | 275 - .../src/processor/cfi_frame_info_unittest.cc | 546 - .../src/processor/contained_range_map-inl.h | 197 - .../src/processor/contained_range_map.h | 150 - .../processor/contained_range_map_unittest.cc | 263 - .../src/processor/disassembler_x86.cc | 240 - .../src/processor/disassembler_x86.h | 127 - .../processor/disassembler_x86_unittest.cc | 233 - .../src/processor/dump_context.cc | 659 -- .../src/processor/dump_object.cc | 39 - .../src/processor/exploitability.cc | 119 - .../src/processor/exploitability_linux.cc | 625 -- .../src/processor/exploitability_linux.h | 129 - .../src/processor/exploitability_unittest.cc | 306 - .../src/processor/exploitability_win.cc | 283 - .../src/processor/exploitability_win.h | 55 - .../processor/fast_source_line_resolver.cc | 275 - .../fast_source_line_resolver_types.h | 185 - .../fast_source_line_resolver_unittest.cc | 491 - .../src/processor/linked_ptr.h | 193 - .../google-breakpad/src/processor/logging.cc | 111 - .../google-breakpad/src/processor/logging.h | 186 - .../src/processor/map_serializers-inl.h | 266 - .../src/processor/map_serializers.h | 168 - .../src/processor/map_serializers_unittest.cc | 386 - .../src/processor/microdump.cc | 385 - .../src/processor/microdump_processor.cc | 100 - .../processor/microdump_processor_unittest.cc | 273 - .../src/processor/microdump_stackwalk.cc | 151 - .../microdump_stackwalk_machine_readable_test | 43 - .../src/processor/microdump_stackwalk_test | 43 - .../processor/microdump_stackwalk_test_vars | 1 - .../google-breakpad/src/processor/minidump.cc | 4989 --------- .../src/processor/minidump_dump.cc | 213 - .../src/processor/minidump_dump_test | 36 - .../src/processor/minidump_processor.cc | 1577 --- .../processor/minidump_processor_unittest.cc | 645 -- .../src/processor/minidump_stackwalk.cc | 162 - .../minidump_stackwalk_machine_readable_test | 37 - .../src/processor/minidump_stackwalk_test | 37 - .../src/processor/minidump_unittest.cc | 1521 --- .../src/processor/module_comparer.cc | 302 - .../src/processor/module_comparer.h | 98 - .../src/processor/module_factory.h | 72 - .../src/processor/module_serializer.cc | 207 - .../src/processor/module_serializer.h | 127 - .../google-breakpad/src/processor/moz.build | 66 - .../src/processor/pathname_stripper.cc | 56 - .../src/processor/pathname_stripper.h | 53 - .../processor/pathname_stripper_unittest.cc | 87 - .../src/processor/postfix_evaluator-inl.h | 363 - .../src/processor/postfix_evaluator.h | 179 - .../processor/postfix_evaluator_unittest.cc | 403 - .../src/processor/proc_maps_linux.cc | 106 - .../src/processor/proc_maps_linux_unittest.cc | 251 - .../src/processor/process_state.cc | 69 - .../src/processor/processor.gyp | 184 - .../src/processor/processor_tools.gypi | 57 - .../src/processor/proto/README | 20 - .../src/processor/proto/process_state.proto | 210 - .../src/processor/range_map-inl.h | 272 - .../google-breakpad/src/processor/range_map.h | 161 - .../range_map_shrink_down_unittest.cc | 355 - .../src/processor/range_map_unittest.cc | 559 - .../src/processor/simple_serializer-inl.h | 260 - .../src/processor/simple_serializer.h | 63 - .../src/processor/simple_symbol_supplier.cc | 204 - .../src/processor/simple_symbol_supplier.h | 140 - .../processor/source_line_resolver_base.cc | 341 - .../source_line_resolver_base_types.h | 158 - .../src/processor/stack_frame_cpu.cc | 79 - .../src/processor/stack_frame_symbolizer.cc | 138 - .../src/processor/stackwalk_common.cc | 950 -- .../src/processor/stackwalk_common.h | 49 - .../src/processor/stackwalker.cc | 296 - .../src/processor/stackwalker_address_list.cc | 92 - .../src/processor/stackwalker_address_list.h | 72 - .../stackwalker_address_list_unittest.cc | 197 - .../src/processor/stackwalker_amd64.cc | 340 - .../src/processor/stackwalker_amd64.h | 116 - .../processor/stackwalker_amd64_unittest.cc | 932 -- .../src/processor/stackwalker_arm.cc | 296 - .../src/processor/stackwalker_arm.h | 107 - .../src/processor/stackwalker_arm64.cc | 278 - .../src/processor/stackwalker_arm64.h | 104 - .../processor/stackwalker_arm64_unittest.cc | 880 -- .../src/processor/stackwalker_arm_unittest.cc | 974 -- .../src/processor/stackwalker_mips.cc | 448 - .../src/processor/stackwalker_mips.h | 85 - .../processor/stackwalker_mips_unittest.cc | 707 -- .../src/processor/stackwalker_ppc.cc | 146 - .../src/processor/stackwalker_ppc.h | 79 - .../src/processor/stackwalker_ppc64.cc | 137 - .../src/processor/stackwalker_ppc64.h | 77 - .../src/processor/stackwalker_selftest.cc | 433 - .../src/processor/stackwalker_selftest_sol.s | 111 - .../src/processor/stackwalker_sparc.cc | 139 - .../src/processor/stackwalker_sparc.h | 78 - .../processor/stackwalker_unittest_utils.h | 224 - .../src/processor/stackwalker_x86.cc | 672 -- .../src/processor/stackwalker_x86.h | 117 - .../src/processor/stackwalker_x86_unittest.cc | 2128 ---- .../src/processor/static_address_map-inl.h | 71 - .../src/processor/static_address_map.h | 78 - .../processor/static_address_map_unittest.cc | 236 - .../static_contained_range_map-inl.h | 92 - .../processor/static_contained_range_map.h | 96 - .../static_contained_range_map_unittest.cc | 320 - .../src/processor/static_map-inl.h | 176 - .../src/processor/static_map.h | 144 - .../src/processor/static_map_iterator-inl.h | 147 - .../src/processor/static_map_iterator.h | 112 - .../src/processor/static_map_unittest.cc | 386 - .../src/processor/static_range_map-inl.h | 130 - .../src/processor/static_range_map.h | 106 - .../processor/static_range_map_unittest.cc | 421 - .../src/processor/symbolic_constants_win.cc | 6418 ------------ .../src/processor/symbolic_constants_win.h | 50 - .../src/processor/synth_minidump.cc | 391 - .../src/processor/synth_minidump.h | 372 - .../src/processor/synth_minidump_unittest.cc | 336 - .../processor/synth_minidump_unittest_data.h | 418 - .../google-breakpad/src/processor/tokenize.cc | 79 - .../google-breakpad/src/processor/tokenize.h | 63 - .../src/processor/windows_frame_info.h | 209 - .../src/third_party/curl/COPYING | 22 - .../src/third_party/curl/curl.h | 1936 ---- .../src/third_party/curl/curlbuild.h | 202 - .../src/third_party/curl/curlrules.h | 249 - .../src/third_party/curl/curlver.h | 70 - .../src/third_party/curl/easy.h | 103 - .../src/third_party/curl/mprintf.h | 82 - .../src/third_party/curl/multi.h | 346 - .../src/third_party/curl/stdcheaders.h | 34 - .../src/third_party/curl/typecheck-gcc.h | 551 - .../src/third_party/curl/types.h | 1 - .../src/third_party/libdisasm/Makefile.am | 43 - .../src/third_party/libdisasm/TODO | 43 - .../src/third_party/libdisasm/ia32_implicit.c | 422 - .../src/third_party/libdisasm/ia32_implicit.h | 13 - .../src/third_party/libdisasm/ia32_insn.c | 623 -- .../src/third_party/libdisasm/ia32_insn.h | 506 - .../third_party/libdisasm/ia32_invariant.c | 313 - .../third_party/libdisasm/ia32_invariant.h | 11 - .../src/third_party/libdisasm/ia32_modrm.c | 310 - .../src/third_party/libdisasm/ia32_modrm.h | 13 - .../libdisasm/ia32_opcode_tables.c | 2939 ------ .../libdisasm/ia32_opcode_tables.h | 57 - .../src/third_party/libdisasm/ia32_operand.c | 425 - .../src/third_party/libdisasm/ia32_operand.h | 11 - .../src/third_party/libdisasm/ia32_reg.c | 234 - .../src/third_party/libdisasm/ia32_reg.h | 41 - .../src/third_party/libdisasm/ia32_settings.c | 13 - .../src/third_party/libdisasm/ia32_settings.h | 27 - .../src/third_party/libdisasm/libdis.h | 832 -- .../src/third_party/libdisasm/libdisasm.gyp | 67 - .../src/third_party/libdisasm/qword.h | 14 - .../src/third_party/libdisasm/swig/Makefile | 70 - .../src/third_party/libdisasm/swig/README | 128 - .../third_party/libdisasm/swig/libdisasm.i | 508 - .../libdisasm/swig/libdisasm_oop.i | 1114 -- .../libdisasm/swig/perl/Makefile-swig | 65 - .../libdisasm/swig/perl/Makefile.PL | 7 - .../libdisasm/swig/python/Makefile-swig | 64 - .../libdisasm/swig/ruby/Makefile-swig | 68 - .../libdisasm/swig/ruby/extconf.rb | 4 - .../libdisasm/swig/tcl/Makefile-swig | 63 - .../src/third_party/libdisasm/x86_disasm.c | 210 - .../src/third_party/libdisasm/x86_format.c | 1430 --- .../src/third_party/libdisasm/x86_imm.c | 70 - .../src/third_party/libdisasm/x86_imm.h | 18 - .../src/third_party/libdisasm/x86_insn.c | 182 - .../src/third_party/libdisasm/x86_misc.c | 71 - .../third_party/libdisasm/x86_operand_list.c | 191 - .../third_party/libdisasm/x86_operand_list.h | 8 - .../third_party/linux/include/gflags/gflags.h | 533 - .../linux/include/gflags/gflags_completions.h | 121 - .../src/third_party/lss/codereview.settings | 5 - .../third_party/lss/linux_syscall_support.h | 4496 -------- .../src/third_party/mac_headers/README | 2 - .../mac_headers/architecture/byte_order.h | 45 - .../src/third_party/mac_headers/i386/_types.h | 34 - .../src/third_party/mac_headers/mach-o/arch.h | 105 - .../src/third_party/mac_headers/mach-o/fat.h | 64 - .../third_party/mac_headers/mach-o/loader.h | 1402 --- .../third_party/mac_headers/mach-o/nlist.h | 312 - .../third_party/mac_headers/mach/boolean.h | 88 - .../mac_headers/mach/i386/boolean.h | 74 - .../mac_headers/mach/i386/vm_param.h | 157 - .../mac_headers/mach/i386/vm_types.h | 140 - .../third_party/mac_headers/mach/machine.h | 346 - .../mac_headers/mach/machine/boolean.h | 40 - .../mac_headers/mach/machine/thread_state.h | 9 - .../mac_headers/mach/machine/thread_status.h | 1 - .../mac_headers/mach/machine/vm_types.h | 40 - .../mac_headers/mach/thread_status.h | 94 - .../third_party/mac_headers/mach/vm_prot.h | 140 - .../src/third_party/musl/COPYRIGHT | 163 - .../src/third_party/musl/README | 23 - .../src/third_party/musl/README.breakpad | 3 - .../src/third_party/musl/VERSION | 1 - .../src/third_party/musl/include/elf.h | 2827 ----- .../src/tools/linux/core2md/core2md.cc | 72 - .../src/tools/linux/dump_syms/dump_syms.cc | 113 - .../src/tools/linux/dump_syms/moz.build | 33 - .../tools/linux/md2core/minidump-2-core.cc | 1276 --- .../linux/md2core/minidump_memory_range.h | 89 - .../md2core/minidump_memory_range_unittest.cc | 258 - .../tools/linux/symupload/minidump_upload.cc | 153 - .../src/tools/linux/symupload/sym_upload.cc | 112 - .../src/tools/linux/tools_linux.gypi | 83 - .../tools/mac/crash_report/crash_report.mm | 408 - .../crash_report.xcodeproj/project.pbxproj | 587 -- .../crash_report/on_demand_symbol_supplier.h | 111 - .../crash_report/on_demand_symbol_supplier.mm | 316 - .../dump_syms.xcodeproj/project.pbxproj | 1839 ---- .../src/tools/mac/dump_syms/dump_syms_tool.cc | 264 - .../src/tools/mac/dump_syms/macho_dump.cc | 203 - .../src/tools/mac/dump_syms/moz.build | 40 - .../src/tools/mac/symupload/minidump_upload.m | 135 - .../src/tools/mac/symupload/symupload.m | 204 - .../symupload.xcodeproj/project.pbxproj | 254 - .../src/tools/mac/tools_mac.gypi | 116 - .../upload_system_symbols/arch_constants.h | 61 - .../mac/upload_system_symbols/arch_reader.go | 65 - .../upload_system_symbols.go | 420 - .../src/tools/python/filter_syms.py | 204 - .../python/tests/filter_syms_unittest.py | 138 - .../src/tools/solaris/dump_syms/Makefile | 64 - .../src/tools/solaris/dump_syms/Makefile.in | 5 - .../src/tools/solaris/dump_syms/dump_syms.cc | 54 - .../src/tools/solaris/dump_syms/moz.build | 29 - .../tools/solaris/dump_syms/run_regtest.sh | 51 - .../dump_syms/testdata/dump_syms_regtest.cc | 64 - .../testdata/dump_syms_regtest.stabs | 129 - .../dump_syms/testdata/dump_syms_regtest.sym | 33 - .../google-breakpad/src/tools/tools.gyp | 38 - .../src/tools/windows/binaries/dump_syms.exe | Bin 130048 -> 0 bytes .../src/tools/windows/binaries/symupload.exe | Bin 195072 -> 0 bytes .../converter/ms_symbol_server_converter.cc | 576 - .../converter/ms_symbol_server_converter.gyp | 46 - .../converter/ms_symbol_server_converter.h | 219 - .../src/tools/windows/dump_syms/dump_syms.cc | 61 - .../src/tools/windows/dump_syms/dump_syms.gyp | 64 - .../windows/dump_syms/dump_syms_unittest.cc | 204 - .../src/tools/windows/dump_syms/moz.build | 31 - .../tools/windows/dump_syms/run_regtest.sh | 53 - .../src/tools/windows/refresh_binaries.bat | 27 - .../src/tools/windows/symupload/symupload.cc | 259 - .../src/tools/windows/symupload/symupload.gyp | 45 - toolkit/crashreporter/injector/injector.cpp | 40 - toolkit/crashreporter/injector/moz.build | 26 - toolkit/crashreporter/jar.mn | 7 - toolkit/crashreporter/jsoncpp/AUTHORS | 1 - toolkit/crashreporter/jsoncpp/GIT-INFO | 1 - toolkit/crashreporter/jsoncpp/LICENSE | 55 - toolkit/crashreporter/jsoncpp/NEWS.txt | 175 - toolkit/crashreporter/jsoncpp/README.md | 214 - .../jsoncpp/include/json/allocator.h | 94 - .../jsoncpp/include/json/assertions.h | 54 - .../jsoncpp/include/json/autolink.h | 25 - .../jsoncpp/include/json/config.h | 178 - .../jsoncpp/include/json/features.h | 57 - .../jsoncpp/include/json/forwards.h | 37 - .../crashreporter/jsoncpp/include/json/json.h | 15 - .../jsoncpp/include/json/reader.h | 404 - .../jsoncpp/include/json/value.h | 867 -- .../jsoncpp/include/json/version.h | 20 - .../jsoncpp/include/json/writer.h | 331 - .../jsoncpp/src/lib_json/json_reader.cpp | 2039 ---- .../jsoncpp/src/lib_json/json_tool.h | 111 - .../jsoncpp/src/lib_json/json_value.cpp | 1604 --- .../src/lib_json/json_valueiterator.inl | 167 - .../jsoncpp/src/lib_json/json_writer.cpp | 1218 --- .../jsoncpp/src/lib_json/moz.build | 39 - toolkit/crashreporter/mac_utils.h | 14 - toolkit/crashreporter/mac_utils.mm | 41 - .../minidump-analyzer/minidump-analyzer.cpp | 437 - .../crashreporter/minidump-analyzer/moz.build | 34 - toolkit/crashreporter/moz.build | 122 - toolkit/crashreporter/nsExceptionHandler.cpp | 4101 -------- toolkit/crashreporter/nsExceptionHandler.h | 279 - toolkit/crashreporter/test/CrashTestUtils.jsm | 72 - .../crashreporter/test/browser/.eslintrc.js | 7 - .../crashreporter/test/browser/browser.ini | 8 - .../test/browser/browser_aboutCrashes.js | 27 - .../browser/browser_aboutCrashesResubmit.js | 152 - .../test/browser/browser_bug471404.js | 41 - .../test/browser/browser_clearReports.js | 124 - .../test/browser/crashreport.sjs | 180 - toolkit/crashreporter/test/browser/head.js | 139 - toolkit/crashreporter/test/dumputils.cpp | 99 - toolkit/crashreporter/test/moz.build | 40 - toolkit/crashreporter/test/nsTestCrasher.cpp | 126 - toolkit/crashreporter/test/unit/.eslintrc.js | 7 - .../test/unit/crasher_subprocess_head.js | 33 - .../test/unit/crasher_subprocess_tail.js | 15 - .../test/unit/head_crashreporter.js | 173 - .../test/unit/test_crash_AsyncShutdown.js | 102 - .../test/unit/test_crash_abort.js | 16 - ...crash_after_js_large_allocation_failure.js | 21 - ...r_js_large_allocation_failure_reporting.js | 27 - .../unit/test_crash_after_js_oom_recovered.js | 20 - .../unit/test_crash_after_js_oom_reported.js | 34 - .../test_crash_after_js_oom_reported_2.js | 26 - .../test/unit/test_crash_moz_crash.js | 16 - .../crashreporter/test/unit/test_crash_oom.js | 19 - .../test/unit/test_crash_purevirtual.js | 24 - .../test/unit/test_crash_runtimeabort.js | 21 - .../test/unit/test_crash_terminator.js | 40 - .../unit/test_crash_with_memory_report.js | 55 - .../test/unit/test_crashreporter.js | 85 - .../test/unit/test_crashreporter_appmem.js | 12 - .../test/unit/test_crashreporter_crash.js | 51 - .../test_crashreporter_crash_profile_lock.js | 26 - .../test/unit/test_event_files.js | 56 - .../test/unit/test_oom_annotation_windows.js | 27 - .../unit/test_override_exception_handler.js | 12 - toolkit/crashreporter/test/unit/xpcshell.ini | 37 - .../crashreporter/test/unit_ipc/.eslintrc.js | 7 - .../test/unit_ipc/test_content_annotation.js | 22 - .../test_content_exception_time_annotation.js | 17 - .../test/unit_ipc/test_content_memory_list.js | 23 - .../test_content_oom_annotation_windows.js | 23 - .../crashreporter/test/unit_ipc/xpcshell.ini | 15 - toolkit/crashreporter/tools/symbolstore.py | 1078 -- .../crashreporter/tools/unit-symbolstore.py | 583 -- toolkit/crashreporter/tools/upload_symbols.py | 102 - .../tools/win32/dump_syms_vc1600.exe | Bin 55296 -> 0 bytes .../tools/win32/dump_syms_vc1700.exe | Bin 52736 -> 0 bytes .../tools/win32/dump_syms_vc1800.exe | Bin 51200 -> 0 bytes toolkit/crashreporter/update-breakpad.sh | 65 - toolkit/crashreporter/update-jsoncpp.sh | 62 - toolkit/moz.build | 4 - toolkit/xre/moz.build | 1 - 886 files changed, 273247 deletions(-) delete mode 100644 toolkit/crashreporter/CrashReports.jsm delete mode 100644 toolkit/crashreporter/CrashSubmit.jsm delete mode 100644 toolkit/crashreporter/InjectCrashReporter.cpp delete mode 100644 toolkit/crashreporter/InjectCrashReporter.h delete mode 100644 toolkit/crashreporter/KeyValueParser.jsm delete mode 100644 toolkit/crashreporter/LoadLibraryRemote.cpp delete mode 100644 toolkit/crashreporter/LoadLibraryRemote.h delete mode 100644 toolkit/crashreporter/breakpad-patches/00-arm-exidx-rollup.patch delete mode 100644 toolkit/crashreporter/breakpad-patches/README delete mode 100644 toolkit/crashreporter/breakpad-windows-libxul/moz.build delete mode 100644 toolkit/crashreporter/breakpad-windows-standalone/moz.build delete mode 100644 toolkit/crashreporter/client/Makefile.in delete mode 100644 toolkit/crashreporter/client/Throbber-small.avi delete mode 100644 toolkit/crashreporter/client/crashreporter.cpp delete mode 100644 toolkit/crashreporter/client/crashreporter.exe.manifest delete mode 100644 toolkit/crashreporter/client/crashreporter.h delete mode 100644 toolkit/crashreporter/client/crashreporter.ico delete mode 100644 toolkit/crashreporter/client/crashreporter.rc delete mode 100644 toolkit/crashreporter/client/crashreporter_gtk_common.cpp delete mode 100644 toolkit/crashreporter/client/crashreporter_gtk_common.h delete mode 100644 toolkit/crashreporter/client/crashreporter_linux.cpp delete mode 100644 toolkit/crashreporter/client/crashreporter_osx.h delete mode 100644 toolkit/crashreporter/client/crashreporter_osx.mm delete mode 100644 toolkit/crashreporter/client/crashreporter_unix_common.cpp delete mode 100644 toolkit/crashreporter/client/crashreporter_win.cpp delete mode 100644 toolkit/crashreporter/client/macbuild/Contents/Info.plist delete mode 100644 toolkit/crashreporter/client/macbuild/Contents/PkgInfo delete mode 100644 toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in delete mode 100644 toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenu.nib/classes.nib delete mode 100644 toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenu.nib/info.nib delete mode 100644 toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenu.nib/keyedobjects.nib delete mode 100644 toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenuRTL.nib/classes.nib delete mode 100644 toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenuRTL.nib/info.nib delete mode 100644 toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenuRTL.nib/keyedobjects.nib delete mode 100644 toolkit/crashreporter/client/macbuild/Contents/Resources/crashreporter.icns delete mode 100644 toolkit/crashreporter/client/moz.build delete mode 100644 toolkit/crashreporter/client/resource.h delete mode 100644 toolkit/crashreporter/content/crashes.js delete mode 100644 toolkit/crashreporter/content/crashes.xhtml delete mode 100644 toolkit/crashreporter/crashreporter.mozbuild delete mode 100644 toolkit/crashreporter/docs/index.rst delete mode 100644 toolkit/crashreporter/google-breakpad/.gitignore delete mode 100644 toolkit/crashreporter/google-breakpad/AUTHORS delete mode 100644 toolkit/crashreporter/google-breakpad/ChangeLog delete mode 100644 toolkit/crashreporter/google-breakpad/DEPS delete mode 100644 toolkit/crashreporter/google-breakpad/GIT-INFO delete mode 100644 toolkit/crashreporter/google-breakpad/INSTALL delete mode 100644 toolkit/crashreporter/google-breakpad/LICENSE delete mode 100644 toolkit/crashreporter/google-breakpad/Makefile.am delete mode 100644 toolkit/crashreporter/google-breakpad/Makefile.in delete mode 100644 toolkit/crashreporter/google-breakpad/NEWS delete mode 100644 toolkit/crashreporter/google-breakpad/README.ANDROID delete mode 100644 toolkit/crashreporter/google-breakpad/README.md delete mode 100644 toolkit/crashreporter/google-breakpad/aclocal.m4 delete mode 100644 toolkit/crashreporter/google-breakpad/android/common-functions.sh delete mode 100644 toolkit/crashreporter/google-breakpad/android/google_breakpad/Android.mk delete mode 100644 toolkit/crashreporter/google-breakpad/android/run-checks.sh delete mode 100644 toolkit/crashreporter/google-breakpad/android/sample_app/README delete mode 100644 toolkit/crashreporter/google-breakpad/android/sample_app/jni/Android.mk delete mode 100644 toolkit/crashreporter/google-breakpad/android/sample_app/jni/Application.mk delete mode 100644 toolkit/crashreporter/google-breakpad/android/sample_app/jni/test_breakpad.cpp delete mode 100644 toolkit/crashreporter/google-breakpad/android/test-driver delete mode 100644 toolkit/crashreporter/google-breakpad/android/test-shell.sh delete mode 100644 toolkit/crashreporter/google-breakpad/autotools/compile delete mode 100644 toolkit/crashreporter/google-breakpad/autotools/config.guess delete mode 100644 toolkit/crashreporter/google-breakpad/autotools/config.sub delete mode 100644 toolkit/crashreporter/google-breakpad/autotools/depcomp delete mode 100644 toolkit/crashreporter/google-breakpad/autotools/install-sh delete mode 100644 toolkit/crashreporter/google-breakpad/autotools/ltmain.sh delete mode 100644 toolkit/crashreporter/google-breakpad/autotools/missing delete mode 100644 toolkit/crashreporter/google-breakpad/autotools/test-driver delete mode 100644 toolkit/crashreporter/google-breakpad/breakpad-client.pc.in delete mode 100644 toolkit/crashreporter/google-breakpad/breakpad.pc.in delete mode 100644 toolkit/crashreporter/google-breakpad/codereview.settings delete mode 100644 toolkit/crashreporter/google-breakpad/configure delete mode 100644 toolkit/crashreporter/google-breakpad/configure.ac delete mode 100644 toolkit/crashreporter/google-breakpad/m4/ax_pthread.m4 delete mode 100644 toolkit/crashreporter/google-breakpad/m4/libtool.m4 delete mode 100644 toolkit/crashreporter/google-breakpad/m4/ltoptions.m4 delete mode 100644 toolkit/crashreporter/google-breakpad/m4/ltsugar.m4 delete mode 100644 toolkit/crashreporter/google-breakpad/m4/ltversion.m4 delete mode 100644 toolkit/crashreporter/google-breakpad/m4/lt~obsolete.m4 delete mode 100644 toolkit/crashreporter/google-breakpad/src/breakpad_googletest_includes.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/build/all.gyp delete mode 100644 toolkit/crashreporter/google-breakpad/src/build/common.gypi delete mode 100644 toolkit/crashreporter/google-breakpad/src/build/filename_rules.gypi delete mode 100644 toolkit/crashreporter/google-breakpad/src/build/gyp_breakpad delete mode 100644 toolkit/crashreporter/google-breakpad/src/build/testing.gypi delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/apple/Framework/BreakpadDefines.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/ios/Breakpad.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/ios/Breakpad.mm delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/ios/Breakpad.xcodeproj/project.pbxproj delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/ios/BreakpadController.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/ios/BreakpadController.mm delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/ios/Breakpad_Prefix.pch delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/ios/handler/ios_exception_minidump_generator.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/ios/handler/ios_exception_minidump_generator.mm delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/crash_generation/client_info.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/crash_generation/crash_generation_client.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/crash_generation/crash_generation_client.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/crash_generation/crash_generation_server.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/crash_generation/crash_generation_server.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/data/linux-gate-amd.sym delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/data/linux-gate-intel.sym delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/dump_writer_common/mapping_info.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/dump_writer_common/thread_info.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/dump_writer_common/thread_info.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/dump_writer_common/ucontext_reader.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/handler/microdump_extra_info.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/handler/minidump_descriptor.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/handler/minidump_descriptor.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/log/log.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/log/log.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/microdump_writer/microdump_writer.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/microdump_writer/microdump_writer.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/cpu_set.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/cpu_set_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/directory_reader.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/directory_reader_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/line_reader.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/line_reader_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_core_dumper.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_dumper.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_dumper.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/moz.build delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/linux/sender/google_crash_report_sender.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/Breakpad.xcodeproj/project.pbxproj delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad.mm delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad_Prefix.pch delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Info.plist delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/Framework/OnDemandServer.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/Framework/OnDemandServer.mm delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/UnitTests-Info.plist delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/ConfigFile.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/ConfigFile.mm delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/Inspector.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/Inspector.mm delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/InspectorMain.mm delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/client_info.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/crash_generation_client.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/crash_generation_client.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/crash_generation_server.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/crash_generation_server.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/moz.build delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/breakpad_nlist_64.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/breakpad_nlist_64.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/dynamic_images.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/dynamic_images.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/mach_vm_compat.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_tests32-Info.plist delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_tests64-Info.plist delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/moz.build delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/obj-cTestCases-Info.plist delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/protected_memory_allocator.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/protected_memory_allocator.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/testcases/DynamicImagesTests.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/testcases/DynamicImagesTests.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/testcases/breakpad_nlist_test.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/testcases/breakpad_nlist_test.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/testcases/dwarftests.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/testcases/dwarftests.mm delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/testcases/testdata/dump_syms_dwarf_data delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/handler/ucontext_compat.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/Breakpad.xib delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/English.lproj/InfoPlist.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/English.lproj/Localizable.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/ReporterIcon.graffle delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender-Info.plist delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.icns delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.m delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/da.lproj/InfoPlist.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/da.lproj/Localizable.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/de.lproj/InfoPlist.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/de.lproj/Localizable.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/es.lproj/InfoPlist.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/es.lproj/Localizable.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/fr.lproj/InfoPlist.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/fr.lproj/Localizable.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/goArrow.png delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/it.lproj/InfoPlist.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/it.lproj/Localizable.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/ja.lproj/InfoPlist.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/ja.lproj/Localizable.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/nl.lproj/InfoPlist.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/nl.lproj/Localizable.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/no.lproj/InfoPlist.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/no.lproj/Localizable.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/sl.lproj/InfoPlist.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/sl.lproj/Localizable.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/sv.lproj/InfoPlist.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/sv.lproj/Localizable.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/tr.lproj/InfoPlist.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/tr.lproj/Localizable.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/uploader.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/sender/uploader.mm delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/testapp/Controller.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/testapp/Controller.m delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/testapp/English.lproj/InfoPlist.strings delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/testapp/English.lproj/MainMenu.xib delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/testapp/Info.plist delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/testapp/TestClass.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/testapp/TestClass.mm delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/testapp/bomb.icns delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/testapp/crashInMain delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/testapp/crashduringload delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/testapp/main.m delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/tests/BreakpadFramework_Test.mm delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/tests/crash_generation_server_test.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/tests/exception_handler_test.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/tests/minidump_generator_test.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/tests/minidump_generator_test_helper.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/tests/spawn_child_process.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/mac/tests/testlogging.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/moz.build delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/solaris/handler/Makefile delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/solaris/handler/exception_handler.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/solaris/handler/exception_handler.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/solaris/handler/exception_handler_test.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/solaris/handler/minidump_generator.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/solaris/handler/minidump_generator.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/solaris/handler/minidump_test.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/solaris/handler/moz.build delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/solaris/handler/solaris_lwp.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/solaris/handler/solaris_lwp.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/breakpad_client.gyp delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/common/auto_critical_section.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/common/ipc_protocol.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/ReadMe.txt delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/client_info.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/client_info.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/crash_generation.gyp delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/crash_generation_client.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/crash_generation_client.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/crash_generation_server.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/crash_generation_server.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/minidump_generator.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/minidump_generator.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/objs.mozbuild delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler.gyp delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/handler/objs.mozbuild delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/sender/crash_report_sender.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/sender/crash_report_sender.gyp delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/sender/crash_report_sender.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/sender/objs.mozbuild delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/tests/crash_generation_app/abstract_class.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/tests/crash_generation_app/abstract_class.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.gyp delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.ico delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.rc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/tests/crash_generation_app/resource.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/tests/crash_generation_app/small.ico delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/unittests/client_tests.gyp delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/unittests/crash_generation_server_test.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/unittests/dump_analysis.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/unittests/dump_analysis.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/unittests/exception_handler_death_test.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/unittests/exception_handler_nesting_test.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/unittests/exception_handler_test.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/unittests/exception_handler_test.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/unittests/minidump_test.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/client/windows/unittests/testing.gyp delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/Makefile.in delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/android/breakpad_getcontext.S delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/android/breakpad_getcontext_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/android/include/elf.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/android/include/link.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/android/include/sgidefs.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/android/include/stab.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/android/include/sys/procfs.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/android/include/sys/signal.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/android/include/sys/user.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/android/include/ucontext.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/android/testing/include/wchar.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/android/testing/mkdtemp.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/android/testing/pthread_fixes.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/android/ucontext_constants.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/arm_ex_reader.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/arm_ex_reader.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/arm_ex_to_module.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/arm_ex_to_module.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/basictypes.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/byte_cursor.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/byte_cursor_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/common.gyp delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/convert_UTF.c delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/convert_UTF.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/bytereader-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/bytereader.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/bytereader.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/bytereader_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/cfi_assembler.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/cfi_assembler.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2diehandler.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2diehandler.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2diehandler_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2enums.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2reader.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2reader.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2reader_cfi_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2reader_die_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2reader_test_common.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/elf_reader.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/elf_reader.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/functioninfo.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/functioninfo.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/line_state_machine.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/moz.build delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf/types.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf_cfi_to_module.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf_cfi_to_module.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf_cfi_to_module_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf_cu_to_module.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf_cu_to_module.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf_cu_to_module_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf_line_to_module.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf_line_to_module.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/dwarf_line_to_module_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/language.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/language.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/crc32.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/crc32.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/eintr_wrapper.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/elf_core_dump.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/elf_core_dump.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/elf_core_dump_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/elf_gnu_compat.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/elf_symbols_to_module.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/elf_symbols_to_module.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/elf_symbols_to_module_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/elfutils-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/elfutils.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/elfutils.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/file_id.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/file_id.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/file_id_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/google_crashdump_uploader.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/google_crashdump_uploader.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/google_crashdump_uploader_test.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/guid_creator.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/guid_creator.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/http_upload.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/http_upload.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/ignore_ret.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/libcurl_wrapper.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/libcurl_wrapper.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/linux_libc_support.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/linux_libc_support.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/linux_libc_support_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/memory_mapped_file.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/memory_mapped_file.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/memory_mapped_file_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/moz.build delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/safe_readlink.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/safe_readlink.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/safe_readlink_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/symbol_upload.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/symbol_upload.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/synth_elf.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/synth_elf.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/synth_elf_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/tests/auto_testfile.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/tests/crash_generator.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/linux/tests/crash_generator.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/Breakpad.xcconfig delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/BreakpadDebug.xcconfig delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/BreakpadRelease.xcconfig delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/GTMDefines.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/GTMLogger.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/GTMLogger.m delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/HTTPMultipartUpload.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/HTTPMultipartUpload.m delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/MachIPC.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/MachIPC.mm delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/arch_utilities.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/arch_utilities.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/bootstrap_compat.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/bootstrap_compat.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/byteswap.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/dump_syms.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/dump_syms.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/file_id.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/file_id.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/launch_reporter.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/launch_reporter.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/macho_id.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/macho_id.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/macho_reader.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/macho_reader.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/macho_reader_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/macho_utilities.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/macho_utilities.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/macho_walker.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/macho_walker.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/moz.build delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/scoped_task_suspend-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/string_utilities.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/string_utilities.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/super_fat_arch.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/testing/GTMSenTestCase.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/mac/testing/GTMSenTestCase.m delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/md5.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/md5.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/memory.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/memory_range.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/memory_range_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/memory_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/minidump_type_helper.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/module.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/module.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/module_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/moz.build delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/scoped_ptr.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/simple_string_dictionary.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/simple_string_dictionary.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/simple_string_dictionary_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/solaris/dump_symbols.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/solaris/dump_symbols.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/solaris/file_id.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/solaris/file_id.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/solaris/guid_creator.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/solaris/guid_creator.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/solaris/message_output.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/solaris/moz.build delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/stabs_reader.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/stabs_reader.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/stabs_reader_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/stabs_to_module.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/stabs_to_module.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/stabs_to_module_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/stdio_wrapper.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/string_conversion.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/string_conversion.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/symbol_data.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/test_assembler.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/test_assembler.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/test_assembler_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/testdata/func-line-pairing.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/tests/auto_tempdir.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/tests/file_utils.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/tests/file_utils.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/unordered.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/using_std_string.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/windows/common_windows.gyp delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/windows/dia_util.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/windows/dia_util.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/windows/guid_string.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/windows/guid_string.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/windows/http_upload.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/windows/http_upload.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/windows/objs.mozbuild delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/windows/omap.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/windows/omap.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/windows/omap_internal.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/windows/omap_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/windows/pdb_source_line_writer.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/windows/pdb_source_line_writer.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/windows/string_utils-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/common/windows/string_utils.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/config.h.in delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/common/breakpad_types.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_cpu_amd64.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_cpu_arm.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_cpu_arm64.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_cpu_mips.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_cpu_ppc.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_cpu_ppc64.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_cpu_sparc.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_cpu_x86.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_exception_linux.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_exception_mac.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_exception_ps3.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_exception_solaris.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_exception_win32.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_format.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_size.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/basic_source_line_resolver.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/call_stack.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/code_module.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/code_modules.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/dump_context.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/dump_object.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/exploitability.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/fast_source_line_resolver.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/memory_region.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/microdump.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/microdump_processor.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/minidump.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/minidump_processor.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/proc_maps_linux.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/process_result.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/process_state.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/source_line_resolver_base.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/source_line_resolver_interface.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/stack_frame.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/stack_frame_cpu.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/stack_frame_symbolizer.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/stackwalker.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/symbol_supplier.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/system_info.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/address_map-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/address_map.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/address_map_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/basic_code_module.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/basic_code_modules.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/basic_code_modules.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/basic_source_line_resolver.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/basic_source_line_resolver_types.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/basic_source_line_resolver_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/call_stack.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/cfi_frame_info-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/cfi_frame_info.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/cfi_frame_info.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/cfi_frame_info_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/contained_range_map-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/contained_range_map.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/contained_range_map_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/disassembler_x86.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/disassembler_x86.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/disassembler_x86_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/dump_context.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/dump_object.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/exploitability.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/exploitability_linux.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/exploitability_linux.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/exploitability_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/exploitability_win.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/exploitability_win.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/fast_source_line_resolver.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/fast_source_line_resolver_types.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/fast_source_line_resolver_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/linked_ptr.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/logging.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/logging.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/map_serializers-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/map_serializers.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/map_serializers_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/microdump.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/microdump_processor.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/microdump_processor_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/microdump_stackwalk.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/microdump_stackwalk_machine_readable_test delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/microdump_stackwalk_test delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/microdump_stackwalk_test_vars delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/minidump.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/minidump_dump.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/minidump_dump_test delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/minidump_processor.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/minidump_processor_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/minidump_stackwalk.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/minidump_stackwalk_machine_readable_test delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/minidump_stackwalk_test delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/minidump_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/module_comparer.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/module_comparer.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/module_factory.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/module_serializer.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/module_serializer.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/moz.build delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/pathname_stripper.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/pathname_stripper.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/pathname_stripper_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/postfix_evaluator-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/postfix_evaluator.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/postfix_evaluator_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/proc_maps_linux.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/proc_maps_linux_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/process_state.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/processor.gyp delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/processor_tools.gypi delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/proto/README delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/proto/process_state.proto delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/range_map-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/range_map.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/range_map_shrink_down_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/range_map_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/simple_serializer-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/simple_serializer.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/simple_symbol_supplier.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/simple_symbol_supplier.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/source_line_resolver_base.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/source_line_resolver_base_types.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stack_frame_cpu.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stack_frame_symbolizer.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalk_common.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalk_common.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_address_list.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_address_list.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_address_list_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_amd64.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_amd64.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_amd64_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_arm.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_arm.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_arm64.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_arm64.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_arm64_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_arm_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_mips.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_mips.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_mips_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_ppc.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_ppc.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_ppc64.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_ppc64.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_selftest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_selftest_sol.s delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_sparc.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_sparc.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_unittest_utils.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_x86.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_x86.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/stackwalker_x86_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/static_address_map-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/static_address_map.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/static_address_map_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/static_contained_range_map-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/static_contained_range_map.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/static_contained_range_map_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/static_map-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/static_map.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/static_map_iterator-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/static_map_iterator.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/static_map_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/static_range_map-inl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/static_range_map.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/static_range_map_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/symbolic_constants_win.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/symbolic_constants_win.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/synth_minidump.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/synth_minidump.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/synth_minidump_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/synth_minidump_unittest_data.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/tokenize.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/tokenize.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/processor/windows_frame_info.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/curl/COPYING delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/curl/curl.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/curl/curlbuild.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/curl/curlrules.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/curl/curlver.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/curl/easy.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/curl/mprintf.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/curl/multi.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/curl/stdcheaders.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/curl/typecheck-gcc.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/curl/types.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/Makefile.am delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/TODO delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/ia32_implicit.c delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/ia32_implicit.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/ia32_insn.c delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/ia32_insn.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/ia32_invariant.c delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/ia32_invariant.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/ia32_modrm.c delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/ia32_modrm.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/ia32_opcode_tables.c delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/ia32_opcode_tables.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/ia32_operand.c delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/ia32_operand.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/ia32_reg.c delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/ia32_reg.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/ia32_settings.c delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/ia32_settings.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/libdis.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/libdisasm.gyp delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/qword.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/swig/Makefile delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/swig/README delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/swig/libdisasm.i delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/swig/libdisasm_oop.i delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/swig/perl/Makefile-swig delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/swig/perl/Makefile.PL delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/swig/python/Makefile-swig delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/swig/ruby/Makefile-swig delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/swig/ruby/extconf.rb delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/swig/tcl/Makefile-swig delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/x86_disasm.c delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/x86_format.c delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/x86_imm.c delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/x86_imm.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/x86_insn.c delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/x86_misc.c delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/x86_operand_list.c delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/libdisasm/x86_operand_list.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/linux/include/gflags/gflags.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/linux/include/gflags/gflags_completions.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/lss/codereview.settings delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/lss/linux_syscall_support.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/README delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/architecture/byte_order.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/i386/_types.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/mach-o/arch.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/mach-o/fat.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/mach-o/loader.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/mach-o/nlist.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/mach/boolean.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/mach/i386/boolean.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/mach/i386/vm_param.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/mach/i386/vm_types.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/mach/machine.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/mach/machine/boolean.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/mach/machine/thread_state.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/mach/machine/thread_status.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/mach/machine/vm_types.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/mach/thread_status.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/mac_headers/mach/vm_prot.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/musl/COPYRIGHT delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/musl/README delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/musl/README.breakpad delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/musl/VERSION delete mode 100644 toolkit/crashreporter/google-breakpad/src/third_party/musl/include/elf.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/linux/core2md/core2md.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/linux/dump_syms/dump_syms.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/linux/dump_syms/moz.build delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/linux/md2core/minidump-2-core.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/linux/md2core/minidump_memory_range.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/linux/md2core/minidump_memory_range_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/linux/symupload/minidump_upload.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/linux/symupload/sym_upload.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/linux/tools_linux.gypi delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/crash_report.mm delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/on_demand_symbol_supplier.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/on_demand_symbol_supplier.mm delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/dump_syms_tool.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/macho_dump.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/moz.build delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/mac/symupload/minidump_upload.m delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/mac/symupload/symupload.m delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/mac/symupload/symupload.xcodeproj/project.pbxproj delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/mac/tools_mac.gypi delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/mac/upload_system_symbols/arch_constants.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/mac/upload_system_symbols/arch_reader.go delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/mac/upload_system_symbols/upload_system_symbols.go delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/python/filter_syms.py delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/python/tests/filter_syms_unittest.py delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/solaris/dump_syms/Makefile delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/solaris/dump_syms/Makefile.in delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/solaris/dump_syms/dump_syms.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/solaris/dump_syms/moz.build delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/solaris/dump_syms/run_regtest.sh delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.stabs delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.sym delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/tools.gyp delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/windows/binaries/dump_syms.exe delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/windows/binaries/symupload.exe delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/windows/converter/ms_symbol_server_converter.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/windows/converter/ms_symbol_server_converter.gyp delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/windows/converter/ms_symbol_server_converter.h delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/windows/dump_syms/dump_syms.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/windows/dump_syms/dump_syms.gyp delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/windows/dump_syms/dump_syms_unittest.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/windows/dump_syms/moz.build delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/windows/dump_syms/run_regtest.sh delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/windows/refresh_binaries.bat delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/windows/symupload/symupload.cc delete mode 100644 toolkit/crashreporter/google-breakpad/src/tools/windows/symupload/symupload.gyp delete mode 100644 toolkit/crashreporter/injector/injector.cpp delete mode 100644 toolkit/crashreporter/injector/moz.build delete mode 100644 toolkit/crashreporter/jar.mn delete mode 100644 toolkit/crashreporter/jsoncpp/AUTHORS delete mode 100644 toolkit/crashreporter/jsoncpp/GIT-INFO delete mode 100644 toolkit/crashreporter/jsoncpp/LICENSE delete mode 100644 toolkit/crashreporter/jsoncpp/NEWS.txt delete mode 100644 toolkit/crashreporter/jsoncpp/README.md delete mode 100644 toolkit/crashreporter/jsoncpp/include/json/allocator.h delete mode 100644 toolkit/crashreporter/jsoncpp/include/json/assertions.h delete mode 100644 toolkit/crashreporter/jsoncpp/include/json/autolink.h delete mode 100644 toolkit/crashreporter/jsoncpp/include/json/config.h delete mode 100644 toolkit/crashreporter/jsoncpp/include/json/features.h delete mode 100644 toolkit/crashreporter/jsoncpp/include/json/forwards.h delete mode 100644 toolkit/crashreporter/jsoncpp/include/json/json.h delete mode 100644 toolkit/crashreporter/jsoncpp/include/json/reader.h delete mode 100644 toolkit/crashreporter/jsoncpp/include/json/value.h delete mode 100644 toolkit/crashreporter/jsoncpp/include/json/version.h delete mode 100644 toolkit/crashreporter/jsoncpp/include/json/writer.h delete mode 100644 toolkit/crashreporter/jsoncpp/src/lib_json/json_reader.cpp delete mode 100644 toolkit/crashreporter/jsoncpp/src/lib_json/json_tool.h delete mode 100644 toolkit/crashreporter/jsoncpp/src/lib_json/json_value.cpp delete mode 100644 toolkit/crashreporter/jsoncpp/src/lib_json/json_valueiterator.inl delete mode 100644 toolkit/crashreporter/jsoncpp/src/lib_json/json_writer.cpp delete mode 100644 toolkit/crashreporter/jsoncpp/src/lib_json/moz.build delete mode 100644 toolkit/crashreporter/mac_utils.h delete mode 100644 toolkit/crashreporter/mac_utils.mm delete mode 100644 toolkit/crashreporter/minidump-analyzer/minidump-analyzer.cpp delete mode 100644 toolkit/crashreporter/minidump-analyzer/moz.build delete mode 100644 toolkit/crashreporter/moz.build delete mode 100644 toolkit/crashreporter/nsExceptionHandler.cpp delete mode 100644 toolkit/crashreporter/nsExceptionHandler.h delete mode 100644 toolkit/crashreporter/test/CrashTestUtils.jsm delete mode 100644 toolkit/crashreporter/test/browser/.eslintrc.js delete mode 100644 toolkit/crashreporter/test/browser/browser.ini delete mode 100644 toolkit/crashreporter/test/browser/browser_aboutCrashes.js delete mode 100644 toolkit/crashreporter/test/browser/browser_aboutCrashesResubmit.js delete mode 100644 toolkit/crashreporter/test/browser/browser_bug471404.js delete mode 100644 toolkit/crashreporter/test/browser/browser_clearReports.js delete mode 100644 toolkit/crashreporter/test/browser/crashreport.sjs delete mode 100644 toolkit/crashreporter/test/browser/head.js delete mode 100644 toolkit/crashreporter/test/dumputils.cpp delete mode 100644 toolkit/crashreporter/test/moz.build delete mode 100644 toolkit/crashreporter/test/nsTestCrasher.cpp delete mode 100644 toolkit/crashreporter/test/unit/.eslintrc.js delete mode 100644 toolkit/crashreporter/test/unit/crasher_subprocess_head.js delete mode 100644 toolkit/crashreporter/test/unit/crasher_subprocess_tail.js delete mode 100644 toolkit/crashreporter/test/unit/head_crashreporter.js delete mode 100644 toolkit/crashreporter/test/unit/test_crash_AsyncShutdown.js delete mode 100644 toolkit/crashreporter/test/unit/test_crash_abort.js delete mode 100644 toolkit/crashreporter/test/unit/test_crash_after_js_large_allocation_failure.js delete mode 100644 toolkit/crashreporter/test/unit/test_crash_after_js_large_allocation_failure_reporting.js delete mode 100644 toolkit/crashreporter/test/unit/test_crash_after_js_oom_recovered.js delete mode 100644 toolkit/crashreporter/test/unit/test_crash_after_js_oom_reported.js delete mode 100644 toolkit/crashreporter/test/unit/test_crash_after_js_oom_reported_2.js delete mode 100644 toolkit/crashreporter/test/unit/test_crash_moz_crash.js delete mode 100644 toolkit/crashreporter/test/unit/test_crash_oom.js delete mode 100644 toolkit/crashreporter/test/unit/test_crash_purevirtual.js delete mode 100644 toolkit/crashreporter/test/unit/test_crash_runtimeabort.js delete mode 100644 toolkit/crashreporter/test/unit/test_crash_terminator.js delete mode 100644 toolkit/crashreporter/test/unit/test_crash_with_memory_report.js delete mode 100644 toolkit/crashreporter/test/unit/test_crashreporter.js delete mode 100644 toolkit/crashreporter/test/unit/test_crashreporter_appmem.js delete mode 100644 toolkit/crashreporter/test/unit/test_crashreporter_crash.js delete mode 100644 toolkit/crashreporter/test/unit/test_crashreporter_crash_profile_lock.js delete mode 100644 toolkit/crashreporter/test/unit/test_event_files.js delete mode 100644 toolkit/crashreporter/test/unit/test_oom_annotation_windows.js delete mode 100644 toolkit/crashreporter/test/unit/test_override_exception_handler.js delete mode 100644 toolkit/crashreporter/test/unit/xpcshell.ini delete mode 100644 toolkit/crashreporter/test/unit_ipc/.eslintrc.js delete mode 100644 toolkit/crashreporter/test/unit_ipc/test_content_annotation.js delete mode 100644 toolkit/crashreporter/test/unit_ipc/test_content_exception_time_annotation.js delete mode 100644 toolkit/crashreporter/test/unit_ipc/test_content_memory_list.js delete mode 100644 toolkit/crashreporter/test/unit_ipc/test_content_oom_annotation_windows.js delete mode 100644 toolkit/crashreporter/test/unit_ipc/xpcshell.ini delete mode 100644 toolkit/crashreporter/tools/symbolstore.py delete mode 100644 toolkit/crashreporter/tools/unit-symbolstore.py delete mode 100644 toolkit/crashreporter/tools/upload_symbols.py delete mode 100644 toolkit/crashreporter/tools/win32/dump_syms_vc1600.exe delete mode 100644 toolkit/crashreporter/tools/win32/dump_syms_vc1700.exe delete mode 100644 toolkit/crashreporter/tools/win32/dump_syms_vc1800.exe delete mode 100644 toolkit/crashreporter/update-breakpad.sh delete mode 100644 toolkit/crashreporter/update-jsoncpp.sh diff --git a/gfx/ipc/moz.build b/gfx/ipc/moz.build index ff3a81228..309681444 100644 --- a/gfx/ipc/moz.build +++ b/gfx/ipc/moz.build @@ -70,7 +70,6 @@ IPDL_SOURCES = [ LOCAL_INCLUDES += [ '/dom/ipc', - '/toolkit/crashreporter', '/xpcom/threads', ] diff --git a/ipc/glue/moz.build b/ipc/glue/moz.build index d0d9f9937..85d7f8fa0 100644 --- a/ipc/glue/moz.build +++ b/ipc/glue/moz.build @@ -177,7 +177,6 @@ IPDL_SOURCES = [ LOCAL_INCLUDES += [ '/dom/ipc', - '/toolkit/crashreporter', '/toolkit/xre', '/xpcom/threads', ] diff --git a/toolkit/crashreporter/CrashReports.jsm b/toolkit/crashreporter/CrashReports.jsm deleted file mode 100644 index d34d6795e..000000000 --- a/toolkit/crashreporter/CrashReports.jsm +++ /dev/null @@ -1,91 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -Components.utils.import("resource://gre/modules/Services.jsm"); - -this.EXPORTED_SYMBOLS = [ - "CrashReports" -]; - -this.CrashReports = { - pendingDir: null, - reportsDir: null, - submittedDir: null, - getReports: function CrashReports_getReports() - { - let reports = []; - - try { - // Ignore any non http/https urls - if (!/^https?:/i.test(Services.prefs.getCharPref("breakpad.reportURL"))) - return reports; - } - catch (e) { } - - if (this.submittedDir.exists() && this.submittedDir.isDirectory()) { - let entries = this.submittedDir.directoryEntries; - while (entries.hasMoreElements()) { - let file = entries.getNext().QueryInterface(Components.interfaces.nsIFile); - let leaf = file.leafName; - if (leaf.startsWith("bp-") && - leaf.endsWith(".txt")) { - let entry = { - id: leaf.slice(0, -4), - date: file.lastModifiedTime, - pending: false - }; - reports.push(entry); - } - } - } - - if (this.pendingDir.exists() && this.pendingDir.isDirectory()) { - let uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; - let entries = this.pendingDir.directoryEntries; - while (entries.hasMoreElements()) { - let file = entries.getNext().QueryInterface(Components.interfaces.nsIFile); - let leaf = file.leafName; - let id = leaf.slice(0, -4); - if (leaf.endsWith(".dmp") && uuidRegex.test(id)) { - let entry = { - id: id, - date: file.lastModifiedTime, - pending: true - }; - reports.push(entry); - } - } - } - - // Sort reports descending by date - return reports.sort( (a, b) => b.date - a.date); - } -} - -function CrashReports_pendingDir() -{ - let pendingDir = Services.dirsvc.get("UAppData", Components.interfaces.nsIFile); - pendingDir.append("Crash Reports"); - pendingDir.append("pending"); - return pendingDir; -} - -function CrashReports_reportsDir() -{ - let reportsDir = Services.dirsvc.get("UAppData", Components.interfaces.nsIFile); - reportsDir.append("Crash Reports"); - return reportsDir; -} - -function CrashReports_submittedDir() -{ - let submittedDir = Services.dirsvc.get("UAppData", Components.interfaces.nsIFile); - submittedDir.append("Crash Reports"); - submittedDir.append("submitted"); - return submittedDir; -} - -this.CrashReports.pendingDir = CrashReports_pendingDir(); -this.CrashReports.reportsDir = CrashReports_reportsDir(); -this.CrashReports.submittedDir = CrashReports_submittedDir(); diff --git a/toolkit/crashreporter/CrashSubmit.jsm b/toolkit/crashreporter/CrashSubmit.jsm deleted file mode 100644 index 76eafbdad..000000000 --- a/toolkit/crashreporter/CrashSubmit.jsm +++ /dev/null @@ -1,570 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -const {classes: Cc, interfaces: Ci, utils: Cu} = Components; - -Cu.import("resource://gre/modules/Services.jsm"); -Cu.import("resource://gre/modules/KeyValueParser.jsm"); -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.importGlobalProperties(['File']); - -XPCOMUtils.defineLazyModuleGetter(this, "PromiseUtils", - "resource://gre/modules/PromiseUtils.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "OS", - "resource://gre/modules/osfile.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "Task", - "resource://gre/modules/Task.jsm"); - -this.EXPORTED_SYMBOLS = [ - "CrashSubmit" -]; - -const STATE_START = Ci.nsIWebProgressListener.STATE_START; -const STATE_STOP = Ci.nsIWebProgressListener.STATE_STOP; - -const SUCCESS = "success"; -const FAILED = "failed"; -const SUBMITTING = "submitting"; - -const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; - -function parseINIStrings(file) { - var factory = Cc["@mozilla.org/xpcom/ini-parser-factory;1"]. - getService(Ci.nsIINIParserFactory); - var parser = factory.createINIParser(file); - var obj = {}; - var en = parser.getKeys("Strings"); - while (en.hasMore()) { - var key = en.getNext(); - obj[key] = parser.getString("Strings", key); - } - return obj; -} - -// Since we're basically re-implementing part of the crashreporter -// client here, we'll just steal the strings we need from crashreporter.ini -function getL10nStrings() { - let dirSvc = Cc["@mozilla.org/file/directory_service;1"]. - getService(Ci.nsIProperties); - let path = dirSvc.get("GreD", Ci.nsIFile); - path.append("crashreporter.ini"); - if (!path.exists()) { - // see if we're on a mac - path = path.parent; - path = path.parent; - path.append("MacOS"); - path.append("crashreporter.app"); - path.append("Contents"); - path.append("Resources"); - path.append("crashreporter.ini"); - if (!path.exists()) { - // very bad, but I don't know how to recover - return null; - } - } - let crstrings = parseINIStrings(path); - let strings = { - 'crashid': crstrings.CrashID, - 'reporturl': crstrings.CrashDetailsURL - }; - - path = dirSvc.get("XCurProcD", Ci.nsIFile); - path.append("crashreporter-override.ini"); - if (path.exists()) { - crstrings = parseINIStrings(path); - if ('CrashID' in crstrings) - strings['crashid'] = crstrings.CrashID; - if ('CrashDetailsURL' in crstrings) - strings['reporturl'] = crstrings.CrashDetailsURL; - } - return strings; -} - -XPCOMUtils.defineLazyGetter(this, "strings", getL10nStrings); - -function getDir(name) { - let directoryService = Cc["@mozilla.org/file/directory_service;1"]. - getService(Ci.nsIProperties); - let dir = directoryService.get("UAppData", Ci.nsIFile); - dir.append("Crash Reports"); - dir.append(name); - return dir; -} - -function writeFile(dirName, fileName, data) { - let path = getDir(dirName); - if (!path.exists()) - path.create(Ci.nsIFile.DIRECTORY_TYPE, parseInt('0700', 8)); - path.append(fileName); - var fs = Cc["@mozilla.org/network/file-output-stream;1"]. - createInstance(Ci.nsIFileOutputStream); - // open, write, truncate - fs.init(path, -1, -1, 0); - var os = Cc["@mozilla.org/intl/converter-output-stream;1"]. - createInstance(Ci.nsIConverterOutputStream); - os.init(fs, "UTF-8", 0, 0x0000); - os.writeString(data); - os.close(); - fs.close(); -} - -function getPendingMinidump(id) { - let pendingDir = getDir("pending"); - let dump = pendingDir.clone(); - let extra = pendingDir.clone(); - let memory = pendingDir.clone(); - dump.append(id + ".dmp"); - extra.append(id + ".extra"); - memory.append(id + ".memory.json.gz"); - return [dump, extra, memory]; -} - -function getAllPendingMinidumpsIDs() { - let minidumps = []; - let pendingDir = getDir("pending"); - - if (!(pendingDir.exists() && pendingDir.isDirectory())) - return []; - let entries = pendingDir.directoryEntries; - - while (entries.hasMoreElements()) { - let entry = entries.getNext().QueryInterface(Ci.nsIFile); - if (entry.isFile()) { - let matches = entry.leafName.match(/(.+)\.extra$/); - if (matches) - minidumps.push(matches[1]); - } - } - - return minidumps; -} - -function pruneSavedDumps() { - const KEEP = 10; - - let pendingDir = getDir("pending"); - if (!(pendingDir.exists() && pendingDir.isDirectory())) - return; - let entries = pendingDir.directoryEntries; - let entriesArray = []; - - while (entries.hasMoreElements()) { - let entry = entries.getNext().QueryInterface(Ci.nsIFile); - if (entry.isFile()) { - let matches = entry.leafName.match(/(.+)\.extra$/); - if (matches) - entriesArray.push(entry); - } - } - - entriesArray.sort(function(a, b) { - let dateA = a.lastModifiedTime; - let dateB = b.lastModifiedTime; - if (dateA < dateB) - return -1; - if (dateB < dateA) - return 1; - return 0; - }); - - if (entriesArray.length > KEEP) { - for (let i = 0; i < entriesArray.length - KEEP; ++i) { - let extra = entriesArray[i]; - let matches = extra.leafName.match(/(.+)\.extra$/); - if (matches) { - let dump = extra.clone(); - dump.leafName = matches[1] + '.dmp'; - dump.remove(false); - - let memory = extra.clone(); - memory.leafName = matches[1] + '.memory.json.gz'; - if (memory.exists()) { - memory.remove(false); - } - - extra.remove(false); - } - } - } -} - -function addFormEntry(doc, form, name, value) { - var input = doc.createElement("input"); - input.type = "hidden"; - input.name = name; - input.value = value; - form.appendChild(input); -} - -function writeSubmittedReport(crashID, viewURL) { - var data = strings.crashid.replace("%s", crashID); - if (viewURL) - data += "\n" + strings.reporturl.replace("%s", viewURL); - - writeFile("submitted", crashID + ".txt", data); -} - -// the Submitter class represents an individual submission. -function Submitter(id, recordSubmission, noThrottle, extraExtraKeyVals) { - this.id = id; - this.recordSubmission = recordSubmission; - this.noThrottle = noThrottle; - this.additionalDumps = []; - this.extraKeyVals = extraExtraKeyVals || {}; - this.deferredSubmit = PromiseUtils.defer(); -} - -Submitter.prototype = { - submitSuccess: function Submitter_submitSuccess(ret) - { - // Write out the details file to submitted/ - writeSubmittedReport(ret.CrashID, ret.ViewURL); - - // Delete from pending dir - try { - this.dump.remove(false); - this.extra.remove(false); - - if (this.memory) { - this.memory.remove(false); - } - - for (let i of this.additionalDumps) { - i.dump.remove(false); - } - } - catch (ex) { - // report an error? not much the user can do here. - } - - this.notifyStatus(SUCCESS, ret); - this.cleanup(); - }, - - cleanup: function Submitter_cleanup() { - // drop some references just to be nice - this.iframe = null; - this.dump = null; - this.extra = null; - this.memory = null; - this.additionalDumps = null; - // remove this object from the list of active submissions - let idx = CrashSubmit._activeSubmissions.indexOf(this); - if (idx != -1) - CrashSubmit._activeSubmissions.splice(idx, 1); - }, - - submitForm: function Submitter_submitForm() - { - if (!('ServerURL' in this.extraKeyVals)) { - return false; - } - let serverURL = this.extraKeyVals.ServerURL; - - // Override the submission URL from the environment - - var envOverride = Cc['@mozilla.org/process/environment;1']. - getService(Ci.nsIEnvironment).get("MOZ_CRASHREPORTER_URL"); - if (envOverride != '') { - serverURL = envOverride; - } - - let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"] - .createInstance(Ci.nsIXMLHttpRequest); - xhr.open("POST", serverURL, true); - - let formData = Cc["@mozilla.org/files/formdata;1"] - .createInstance(Ci.nsIDOMFormData); - // add the data - for (let [name, value] of Object.entries(this.extraKeyVals)) { - if (name != "ServerURL") { - formData.append(name, value); - } - } - if (this.noThrottle) { - // tell the server not to throttle this, since it was manually submitted - formData.append("Throttleable", "0"); - } - // add the minidumps - formData.append("upload_file_minidump", File.createFromFileName(this.dump.path)); - if (this.memory) { - formData.append("memory_report", File.createFromFileName(this.memory.path)); - } - if (this.additionalDumps.length > 0) { - let names = []; - for (let i of this.additionalDumps) { - names.push(i.name); - formData.append("upload_file_minidump_"+i.name, - File.createFromFileName(i.dump.path)); - } - } - - let manager = Services.crashmanager; - let submissionID = manager.generateSubmissionID(); - - xhr.addEventListener("readystatechange", (evt) => { - if (xhr.readyState == 4) { - let ret = - xhr.status == 200 ? parseKeyValuePairs(xhr.responseText) : {}; - let submitted = !!ret.CrashID; - - if (this.recordSubmission) { - let result = submitted ? manager.SUBMISSION_RESULT_OK : - manager.SUBMISSION_RESULT_FAILED; - manager.addSubmissionResult(this.id, submissionID, new Date(), - result); - if (submitted) { - manager.setRemoteCrashID(this.id, ret.CrashID); - } - } - - if (submitted) { - this.submitSuccess(ret); - } - else { - this.notifyStatus(FAILED); - this.cleanup(); - } - } - }, false); - - if (this.recordSubmission) { - manager.addSubmissionAttempt(this.id, submissionID, new Date()); - } - xhr.send(formData); - return true; - }, - - notifyStatus: function Submitter_notify(status, ret) - { - let propBag = Cc["@mozilla.org/hash-property-bag;1"]. - createInstance(Ci.nsIWritablePropertyBag2); - propBag.setPropertyAsAString("minidumpID", this.id); - if (status == SUCCESS) { - propBag.setPropertyAsAString("serverCrashID", ret.CrashID); - } - - let extraKeyValsBag = Cc["@mozilla.org/hash-property-bag;1"]. - createInstance(Ci.nsIWritablePropertyBag2); - for (let key in this.extraKeyVals) { - extraKeyValsBag.setPropertyAsAString(key, this.extraKeyVals[key]); - } - propBag.setPropertyAsInterface("extra", extraKeyValsBag); - - Services.obs.notifyObservers(propBag, "crash-report-status", status); - - switch (status) { - case SUCCESS: - this.deferredSubmit.resolve(ret.CrashID); - break; - case FAILED: - this.deferredSubmit.reject(); - break; - default: - // no callbacks invoked. - } - }, - - submit: function Submitter_submit() - { - let [dump, extra, memory] = getPendingMinidump(this.id); - - if (!dump.exists() || !extra.exists()) { - this.notifyStatus(FAILED); - this.cleanup(); - return this.deferredSubmit.promise; - } - this.dump = dump; - this.extra = extra; - - // The memory file may or may not exist - if (memory.exists()) { - this.memory = memory; - } - - let extraKeyVals = parseKeyValuePairsFromFile(extra); - for (let key in extraKeyVals) { - if (!(key in this.extraKeyVals)) { - this.extraKeyVals[key] = extraKeyVals[key]; - } - } - - let additionalDumps = []; - if ("additional_minidumps" in this.extraKeyVals) { - let names = this.extraKeyVals.additional_minidumps.split(','); - for (let name of names) { - let [dump, extra, memory] = getPendingMinidump(this.id + "-" + name); - if (!dump.exists()) { - this.notifyStatus(FAILED); - this.cleanup(); - return this.deferredSubmit.promise; - } - additionalDumps.push({'name': name, 'dump': dump}); - } - } - - this.notifyStatus(SUBMITTING); - - this.additionalDumps = additionalDumps; - - if (!this.submitForm()) { - this.notifyStatus(FAILED); - this.cleanup(); - } - return this.deferredSubmit.promise; - } -}; - -// =================================== -// External API goes here -this.CrashSubmit = { - /** - * Submit the crash report named id.dmp from the "pending" directory. - * - * @param id - * Filename (minus .dmp extension) of the minidump to submit. - * @param params - * An object containing any of the following optional parameters: - * - recordSubmission - * If true, a submission event is recorded in CrashManager. - * - noThrottle - * If true, this crash report should be submitted with - * an extra parameter of "Throttleable=0" indicating that - * it should be processed right away. This should be set - * when the report is being submitted and the user expects - * to see the results immediately. Defaults to false. - * - extraExtraKeyVals - * An object whose key-value pairs will be merged with the data from - * the ".extra" file submitted with the report. The properties of - * this object will override properties of the same name in the - * .extra file. - * - * @return a Promise that is fulfilled with the server crash ID when the - * submission succeeds and rejected otherwise. - */ - submit: function CrashSubmit_submit(id, params) - { - params = params || {}; - let recordSubmission = false; - let submitSuccess = null; - let submitError = null; - let noThrottle = false; - let extraExtraKeyVals = null; - - if ('recordSubmission' in params) - recordSubmission = params.recordSubmission; - if ('noThrottle' in params) - noThrottle = params.noThrottle; - if ('extraExtraKeyVals' in params) - extraExtraKeyVals = params.extraExtraKeyVals; - - let submitter = new Submitter(id, recordSubmission, - noThrottle, extraExtraKeyVals); - CrashSubmit._activeSubmissions.push(submitter); - return submitter.submit(); - }, - - /** - * Delete the minidup from the "pending" directory. - * - * @param id - * Filename (minus .dmp extension) of the minidump to delete. - */ - delete: function CrashSubmit_delete(id) { - let [dump, extra, memory] = getPendingMinidump(id); - dump.remove(false); - extra.remove(false); - if (memory.exists()) { - memory.remove(false); - } - }, - - /** - * Add a .dmg.ignore file along side the .dmp file to indicate that the user - * shouldn't be prompted to submit this crash report again. - * - * @param id - * Filename (minus .dmp extension) of the report to ignore - */ - - ignore: function CrashSubmit_ignore(id) { - let [dump, extra, mem] = getPendingMinidump(id); - return OS.File.open(dump.path + ".ignore", {create: true}, - {unixFlags: OS.Constants.libc.O_CREAT}) - .then((file) => { file.close(); }); - }, - - /** - * Get the list of pending crash IDs. - * - * @return an array of string, each being an ID as - * expected to be passed to submit() - */ - pendingIDs: function CrashSubmit_pendingIDs() { - return getAllPendingMinidumpsIDs(); - }, - - /** - * Get the list of pending crash IDs, excluding those marked to be ignored - * @param maxFileDate - * A Date object. Any files last modified before that date will be ignored - * - * @return a Promise that is fulfilled with an array of string, each - * being an ID as expected to be passed to submit() or ignore() - */ - pendingIDsAsync: Task.async(function* CrashSubmit_pendingIDsAsync(maxFileDate) { - let ids = []; - let info = null; - try { - info = yield OS.File.stat(getDir("pending").path) - } catch (ex) { - /* pending dir doesn't exist, ignore */ - return ids; - } - - if (info.isDir) { - let iterator = new OS.File.DirectoryIterator(getDir("pending").path); - try { - yield iterator.forEach( - function onEntry(file) { - if (file.name.endsWith(".dmp")) { - return OS.File.exists(file.path + ".ignore") - .then(ignoreExists => { - if (!ignoreExists) { - let id = file.name.slice(0, -4); - if (UUID_REGEX.test(id)) { - return OS.File.stat(file.path) - .then(info => { - if (info.lastAccessDate.valueOf() > - maxFileDate.valueOf()) { - ids.push(id); - } - }); - } - } - return null; - }); - } - return null; - } - ); - } catch (ex) { - Cu.reportError(ex); - } finally { - iterator.close(); - } - } - return ids; - }), - - /** - * Prune the saved dumps. - */ - pruneSavedDumps: function CrashSubmit_pruneSavedDumps() { - pruneSavedDumps(); - }, - - // List of currently active submit objects - _activeSubmissions: [] -}; diff --git a/toolkit/crashreporter/InjectCrashReporter.cpp b/toolkit/crashreporter/InjectCrashReporter.cpp deleted file mode 100644 index 1b79f2cd1..000000000 --- a/toolkit/crashreporter/InjectCrashReporter.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "InjectCrashReporter.h" -#include "nsDirectoryServiceUtils.h" -#include "nsDirectoryServiceDefs.h" -#include "client/windows/crash_generation/crash_generation_client.h" -#include "nsExceptionHandler.h" -#include "LoadLibraryRemote.h" -#include "nsWindowsHelpers.h" - -using google_breakpad::CrashGenerationClient; -using CrashReporter::GetChildNotificationPipe; - -namespace mozilla { - -InjectCrashRunnable::InjectCrashRunnable(DWORD pid) - : mPID(pid) -{ - nsCOMPtr dll; - nsresult rv = NS_GetSpecialDirectory(NS_GRE_DIR, getter_AddRefs(dll)); - if (NS_SUCCEEDED(rv)) { - dll->Append(NS_LITERAL_STRING("breakpadinjector.dll")); - dll->GetPath(mInjectorPath); - } -} - -NS_IMETHODIMP -InjectCrashRunnable::Run() -{ - if (mInjectorPath.IsEmpty()) - return NS_OK; - - nsAutoHandle hProcess( - OpenProcess(PROCESS_CREATE_THREAD | - PROCESS_QUERY_INFORMATION | - PROCESS_DUP_HANDLE | - PROCESS_VM_OPERATION | - PROCESS_VM_WRITE | - PROCESS_VM_READ, FALSE, mPID)); - if (!hProcess) { - NS_WARNING("Unable to open remote process handle for crashreporter injection."); - return NS_OK; - } - - void* proc = LoadRemoteLibraryAndGetAddress(hProcess, mInjectorPath.get(), - "Start"); - if (!proc) { - NS_WARNING("Unable to inject crashreporter DLL."); - return NS_OK; - } - - HANDLE hRemotePipe = - CrashGenerationClient::DuplicatePipeToClientProcess( - NS_ConvertASCIItoUTF16(GetChildNotificationPipe()).get(), - hProcess); - if (INVALID_HANDLE_VALUE == hRemotePipe) { - NS_WARNING("Unable to duplicate crash reporter pipe to process."); - return NS_OK; - } - - nsAutoHandle hThread(CreateRemoteThread(hProcess, nullptr, 0, - (LPTHREAD_START_ROUTINE) proc, - (void*) hRemotePipe, 0, nullptr)); - if (!hThread) { - NS_WARNING("Unable to CreateRemoteThread"); - - // We have to close the remote pipe or else our crash generation client - // will be stuck unable to accept other remote requests. - HANDLE toClose = INVALID_HANDLE_VALUE; - if (DuplicateHandle(hProcess, hRemotePipe, ::GetCurrentProcess(), - &toClose, 0, FALSE, - DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) { - CloseHandle(toClose); - return NS_OK; - } - } - - return NS_OK; -} - -} // namespace mozilla diff --git a/toolkit/crashreporter/InjectCrashReporter.h b/toolkit/crashreporter/InjectCrashReporter.h deleted file mode 100644 index 5b40b49e3..000000000 --- a/toolkit/crashreporter/InjectCrashReporter.h +++ /dev/null @@ -1,28 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef InjectCrashReporter_h -#define InjectCrashReporter_h - -#include "nsThreadUtils.h" -#include - -namespace mozilla { - -class InjectCrashRunnable : public Runnable -{ -public: - InjectCrashRunnable(DWORD pid); - - NS_IMETHOD Run(); - -private: - DWORD mPID; - nsString mInjectorPath; -}; - -} // Namespace mozilla - -#endif diff --git a/toolkit/crashreporter/KeyValueParser.jsm b/toolkit/crashreporter/KeyValueParser.jsm deleted file mode 100644 index ec45354f3..000000000 --- a/toolkit/crashreporter/KeyValueParser.jsm +++ /dev/null @@ -1,54 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -Components.utils.import("resource://gre/modules/Services.jsm"); - -this.EXPORTED_SYMBOLS = [ - "parseKeyValuePairsFromLines", - "parseKeyValuePairs", - "parseKeyValuePairsFromFile" -]; - -const Cc = Components.classes; -const Ci = Components.interfaces; - -this.parseKeyValuePairsFromLines = function(lines) { - let data = {}; - for (let line of lines) { - if (line == '') - continue; - - // can't just .split() because the value might contain = characters - let eq = line.indexOf('='); - if (eq != -1) { - let [key, value] = [line.substring(0, eq), - line.substring(eq + 1)]; - if (key && value) - data[key] = value.replace(/\\n/g, "\n").replace(/\\\\/g, "\\"); - } - } - return data; -} - -this.parseKeyValuePairs = function parseKeyValuePairs(text) { - let lines = text.split('\n'); - return parseKeyValuePairsFromLines(lines); -}; - -this.parseKeyValuePairsFromFile = function parseKeyValuePairsFromFile(file) { - let fstream = Cc["@mozilla.org/network/file-input-stream;1"]. - createInstance(Ci.nsIFileInputStream); - fstream.init(file, -1, 0, 0); - let is = Cc["@mozilla.org/intl/converter-input-stream;1"]. - createInstance(Ci.nsIConverterInputStream); - is.init(fstream, "UTF-8", 1024, Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER); - let str = {}; - let contents = ''; - while (is.readString(4096, str) != 0) { - contents += str.value; - } - is.close(); - fstream.close(); - return parseKeyValuePairs(contents); -} diff --git a/toolkit/crashreporter/LoadLibraryRemote.cpp b/toolkit/crashreporter/LoadLibraryRemote.cpp deleted file mode 100644 index f22a6220f..000000000 --- a/toolkit/crashreporter/LoadLibraryRemote.cpp +++ /dev/null @@ -1,454 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef __GNUC__ -// disable warnings about pointer <-> DWORD conversions -#pragma warning( disable : 4311 4312 ) -#endif - -#ifdef _WIN64 -#define POINTER_TYPE ULONGLONG -#else -#define POINTER_TYPE DWORD -#endif - -#include -#include -#include -#ifdef DEBUG_OUTPUT -#include -#endif - -#include "nsWindowsHelpers.h" - -typedef const unsigned char* FileView; - -template<> -class nsAutoRefTraits -{ -public: - typedef FileView RawRef; - static FileView Void() - { - return nullptr; - } - - static void Release(RawRef aView) - { - if (nullptr != aView) - UnmapViewOfFile(aView); - } -}; - -#ifndef IMAGE_SIZEOF_BASE_RELOCATION -// Vista SDKs no longer define IMAGE_SIZEOF_BASE_RELOCATION!? -#define IMAGE_SIZEOF_BASE_RELOCATION (sizeof(IMAGE_BASE_RELOCATION)) -#endif - -#include "LoadLibraryRemote.h" - -typedef struct { - PIMAGE_NT_HEADERS headers; - unsigned char *localCodeBase; - unsigned char *remoteCodeBase; - HMODULE *modules; - int numModules; -} MEMORYMODULE, *PMEMORYMODULE; - -typedef BOOL (WINAPI *DllEntryProc)(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved); - -#define GET_HEADER_DICTIONARY(module, idx) &(module)->headers->OptionalHeader.DataDirectory[idx] - -#ifdef DEBUG_OUTPUT -static void -OutputLastError(const char *msg) -{ - char* tmp; - char *tmpmsg; - FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - nullptr, GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPSTR) &tmp, 0, nullptr); - tmpmsg = (char *)LocalAlloc(LPTR, strlen(msg) + strlen(tmp) + 3); - sprintf(tmpmsg, "%s: %s", msg, tmp); - OutputDebugStringA(tmpmsg); - LocalFree(tmpmsg); - LocalFree(tmp); -} -#endif - -static void -CopySections(const unsigned char *data, PIMAGE_NT_HEADERS old_headers, PMEMORYMODULE module) -{ - int i; - unsigned char *codeBase = module->localCodeBase; - unsigned char *dest; - PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(module->headers); - for (i=0; iheaders->FileHeader.NumberOfSections; i++, section++) { - dest = codeBase + section->VirtualAddress; - memset(dest, 0, section->Misc.VirtualSize); - if (section->SizeOfRawData) { - memcpy(dest, data + section->PointerToRawData, section->SizeOfRawData); - } - // section->Misc.PhysicalAddress = (POINTER_TYPE) module->remoteCodeBase + section->VirtualAddress; - } -} - -static bool -CopyRegion(HANDLE hRemoteProcess, void* remoteAddress, void* localAddress, DWORD size, DWORD protect) -{ - if (size > 0) { - // Copy the data from local->remote and set the memory protection - if (!VirtualAllocEx(hRemoteProcess, remoteAddress, size, MEM_COMMIT, PAGE_READWRITE)) - return false; - - if (!WriteProcessMemory(hRemoteProcess, - remoteAddress, - localAddress, - size, - nullptr)) { -#ifdef DEBUG_OUTPUT - OutputLastError("Error writing remote memory.\n"); -#endif - return false; - } - - DWORD oldProtect; - if (VirtualProtectEx(hRemoteProcess, remoteAddress, size, protect, &oldProtect) == 0) { -#ifdef DEBUG_OUTPUT - OutputLastError("Error protecting memory page"); -#endif - return false; - } - } - return true; -} -// Protection flags for memory pages (Executable, Readable, Writeable) -static int ProtectionFlags[2][2][2] = { - { - // not executable - {PAGE_NOACCESS, PAGE_WRITECOPY}, - {PAGE_READONLY, PAGE_READWRITE}, - }, { - // executable - {PAGE_EXECUTE, PAGE_EXECUTE_WRITECOPY}, - {PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE}, - }, -}; - -static bool -FinalizeSections(PMEMORYMODULE module, HANDLE hRemoteProcess) -{ -#ifdef DEBUG_OUTPUT - fprintf(stderr, "Finalizing sections: local base %p, remote base %p\n", - module->localCodeBase, module->remoteCodeBase); -#endif - - int i; - int numSections = module->headers->FileHeader.NumberOfSections; - - if (numSections < 1) - return false; - - PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(module->headers); - - // Copy any data before the first section (i.e. the image header) - if (!CopyRegion(hRemoteProcess, module->remoteCodeBase, module->localCodeBase, section->VirtualAddress, PAGE_READONLY)) - return false; - - // loop through all sections and change access flags - for (i=0; iCharacteristics & IMAGE_SCN_MEM_EXECUTE) != 0; - int readable = (section->Characteristics & IMAGE_SCN_MEM_READ) != 0; - int writeable = (section->Characteristics & IMAGE_SCN_MEM_WRITE) != 0; - - // determine protection flags based on characteristics - protect = ProtectionFlags[executable][readable][writeable]; - if (section->Characteristics & IMAGE_SCN_MEM_NOT_CACHED) { - protect |= PAGE_NOCACHE; - } - - void* remoteAddress = module->remoteCodeBase + section->VirtualAddress; - void* localAddress = module->localCodeBase + section->VirtualAddress; - - // determine size of region - size = section->Misc.VirtualSize; -#ifdef DEBUG_OUTPUT - fprintf(stderr, "Copying section %s to %p, size %x, executable %i readable %i writeable %i\n", - section->Name, remoteAddress, size, executable, readable, writeable); -#endif - if (!CopyRegion(hRemoteProcess, remoteAddress, localAddress, size, protect)) - return false; - } - return true; -} - -static void -PerformBaseRelocation(PMEMORYMODULE module, SIZE_T delta) -{ - DWORD i; - unsigned char *codeBase = module->localCodeBase; - - PIMAGE_DATA_DIRECTORY directory = GET_HEADER_DICTIONARY(module, IMAGE_DIRECTORY_ENTRY_BASERELOC); - if (directory->Size > 0) { - PIMAGE_BASE_RELOCATION relocation = (PIMAGE_BASE_RELOCATION) (codeBase + directory->VirtualAddress); - for (; relocation->VirtualAddress > 0; ) { - unsigned char *dest = codeBase + relocation->VirtualAddress; - unsigned short *relInfo = (unsigned short *)((unsigned char *)relocation + IMAGE_SIZEOF_BASE_RELOCATION); - for (i=0; i<((relocation->SizeOfBlock-IMAGE_SIZEOF_BASE_RELOCATION) / 2); i++, relInfo++) { - DWORD *patchAddrHL; -#ifdef _WIN64 - ULONGLONG *patchAddr64; -#endif - int type, offset; - - // the upper 4 bits define the type of relocation - type = *relInfo >> 12; - // the lower 12 bits define the offset - offset = *relInfo & 0xfff; - - switch (type) - { - case IMAGE_REL_BASED_ABSOLUTE: - // skip relocation - break; - - case IMAGE_REL_BASED_HIGHLOW: - // change complete 32 bit address - patchAddrHL = (DWORD *) (dest + offset); - *patchAddrHL += delta; - break; - -#ifdef _WIN64 - case IMAGE_REL_BASED_DIR64: - patchAddr64 = (ULONGLONG *) (dest + offset); - *patchAddr64 += delta; - break; -#endif - - default: - //printf("Unknown relocation: %d\n", type); - break; - } - } - - // advance to next relocation block - relocation = (PIMAGE_BASE_RELOCATION) (((char *) relocation) + relocation->SizeOfBlock); - } - } -} - -static int -BuildImportTable(PMEMORYMODULE module) -{ - int result=1; - unsigned char *codeBase = module->localCodeBase; - - PIMAGE_DATA_DIRECTORY directory = GET_HEADER_DICTIONARY(module, IMAGE_DIRECTORY_ENTRY_IMPORT); - if (directory->Size > 0) { - PIMAGE_IMPORT_DESCRIPTOR importDesc = (PIMAGE_IMPORT_DESCRIPTOR) (codeBase + directory->VirtualAddress); - PIMAGE_IMPORT_DESCRIPTOR importEnd = (PIMAGE_IMPORT_DESCRIPTOR) (codeBase + directory->VirtualAddress + directory->Size); - - for (; importDesc < importEnd && importDesc->Name; importDesc++) { - POINTER_TYPE *thunkRef; - FARPROC *funcRef; - HMODULE handle = GetModuleHandleA((LPCSTR) (codeBase + importDesc->Name)); - if (handle == nullptr) { -#if DEBUG_OUTPUT - OutputLastError("Can't load library"); -#endif - result = 0; - break; - } - - module->modules = (HMODULE *)realloc(module->modules, (module->numModules+1)*(sizeof(HMODULE))); - if (module->modules == nullptr) { - result = 0; - break; - } - - module->modules[module->numModules++] = handle; - if (importDesc->OriginalFirstThunk) { - thunkRef = (POINTER_TYPE *) (codeBase + importDesc->OriginalFirstThunk); - funcRef = (FARPROC *) (codeBase + importDesc->FirstThunk); - } else { - // no hint table - thunkRef = (POINTER_TYPE *) (codeBase + importDesc->FirstThunk); - funcRef = (FARPROC *) (codeBase + importDesc->FirstThunk); - } - for (; *thunkRef; thunkRef++, funcRef++) { - if (IMAGE_SNAP_BY_ORDINAL(*thunkRef)) { - *funcRef = (FARPROC)GetProcAddress(handle, (LPCSTR)IMAGE_ORDINAL(*thunkRef)); - } else { - PIMAGE_IMPORT_BY_NAME thunkData = (PIMAGE_IMPORT_BY_NAME) (codeBase + (*thunkRef)); - *funcRef = (FARPROC)GetProcAddress(handle, (LPCSTR)&thunkData->Name); - } - if (*funcRef == 0) { - result = 0; - break; - } - } - - if (!result) { - break; - } - } - } - - return result; -} - -static void* MemoryGetProcAddress(PMEMORYMODULE module, const char *name); - -void* LoadRemoteLibraryAndGetAddress(HANDLE hRemoteProcess, - const WCHAR* library, - const char* symbol) -{ - // Map the DLL into memory - nsAutoHandle hLibrary( - CreateFile(library, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, nullptr)); - if (INVALID_HANDLE_VALUE == hLibrary) { -#if DEBUG_OUTPUT - OutputLastError("Couldn't CreateFile the library.\n"); -#endif - return nullptr; - } - - nsAutoHandle hMapping( - CreateFileMapping(hLibrary, nullptr, PAGE_READONLY, 0, 0, nullptr)); - if (!hMapping) { -#if DEBUG_OUTPUT - OutputLastError("Couldn't CreateFileMapping.\n"); -#endif - return nullptr; - } - - nsAutoRef data( - (const unsigned char*) MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0)); - if (!data) { -#if DEBUG_OUTPUT - OutputLastError("Couldn't MapViewOfFile.\n"); -#endif - return nullptr; - } - - SIZE_T locationDelta; - - PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)data.get(); - if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) { -#if DEBUG_OUTPUT - OutputDebugStringA("Not a valid executable file.\n"); -#endif - return nullptr; - } - - PIMAGE_NT_HEADERS old_header = (PIMAGE_NT_HEADERS)(data + dos_header->e_lfanew); - if (old_header->Signature != IMAGE_NT_SIGNATURE) { -#if DEBUG_OUTPUT - OutputDebugStringA("No PE header found.\n"); -#endif - return nullptr; - } - - // reserve memory for image of library in this process and the target process - unsigned char* localCode = (unsigned char*) VirtualAlloc(nullptr, - old_header->OptionalHeader.SizeOfImage, - MEM_RESERVE | MEM_COMMIT, - PAGE_READWRITE); - if (!localCode) { -#if DEBUG_OUTPUT - OutputLastError("Can't reserve local memory."); -#endif - } - - unsigned char* remoteCode = (unsigned char*) VirtualAllocEx(hRemoteProcess, nullptr, - old_header->OptionalHeader.SizeOfImage, - MEM_RESERVE, - PAGE_EXECUTE_READ); - if (!remoteCode) { -#if DEBUG_OUTPUT - OutputLastError("Can't reserve remote memory."); -#endif - } - - MEMORYMODULE result; - result.localCodeBase = localCode; - result.remoteCodeBase = remoteCode; - result.numModules = 0; - result.modules = nullptr; - - // copy PE header to code - memcpy(localCode, dos_header, dos_header->e_lfanew + old_header->OptionalHeader.SizeOfHeaders); - result.headers = reinterpret_cast(localCode + dos_header->e_lfanew); - - // update position - result.headers->OptionalHeader.ImageBase = (POINTER_TYPE)remoteCode; - - // copy sections from DLL file block to new memory location - CopySections(data, old_header, &result); - - // adjust base address of imported data - locationDelta = (SIZE_T)(remoteCode - old_header->OptionalHeader.ImageBase); - if (locationDelta != 0) { - PerformBaseRelocation(&result, locationDelta); - } - - // load required dlls and adjust function table of imports - if (!BuildImportTable(&result)) { - return nullptr; - } - - // mark memory pages depending on section headers and release - // sections that are marked as "discardable" - if (!FinalizeSections(&result, hRemoteProcess)) { - return nullptr; - } - - return MemoryGetProcAddress(&result, symbol); -} - -static void* MemoryGetProcAddress(PMEMORYMODULE module, const char *name) -{ - unsigned char *localCodeBase = module->localCodeBase; - int idx=-1; - DWORD i, *nameRef; - WORD *ordinal; - PIMAGE_EXPORT_DIRECTORY exports; - PIMAGE_DATA_DIRECTORY directory = GET_HEADER_DICTIONARY(module, IMAGE_DIRECTORY_ENTRY_EXPORT); - if (directory->Size == 0) { - // no export table found - return nullptr; - } - - exports = (PIMAGE_EXPORT_DIRECTORY) (localCodeBase + directory->VirtualAddress); - if (exports->NumberOfNames == 0 || exports->NumberOfFunctions == 0) { - // DLL doesn't export anything - return nullptr; - } - - // search function name in list of exported names - nameRef = (DWORD *) (localCodeBase + exports->AddressOfNames); - ordinal = (WORD *) (localCodeBase + exports->AddressOfNameOrdinals); - for (i=0; iNumberOfNames; i++, nameRef++, ordinal++) { - if (stricmp(name, (const char *) (localCodeBase + (*nameRef))) == 0) { - idx = *ordinal; - break; - } - } - - if (idx == -1) { - // exported symbol not found - return nullptr; - } - - if ((DWORD)idx > exports->NumberOfFunctions) { - // name <-> ordinal number don't match - return nullptr; - } - - // AddressOfFunctions contains the RVAs to the "real" functions - return module->remoteCodeBase + (*(DWORD *) (localCodeBase + exports->AddressOfFunctions + (idx*4))); -} diff --git a/toolkit/crashreporter/LoadLibraryRemote.h b/toolkit/crashreporter/LoadLibraryRemote.h deleted file mode 100644 index 7beeaf4a5..000000000 --- a/toolkit/crashreporter/LoadLibraryRemote.h +++ /dev/null @@ -1,24 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef LoadLibraryRemote_h -#define LoadLibraryRemote_h - -#include - -/** - * Inject a library into a remote process. This injection has the following - * restrictions: - * - * - The DLL being injected must only depend on kernel32 and user32. - * - The entry point of the DLL is not run. If the DLL uses the CRT, it is - * the responsibility of the caller to make sure that _CRT_INIT is called. - * - There is no support for unloading a library once it has been loaded. - * - The symbol must be a named symbol and not an ordinal. - */ -void* LoadRemoteLibraryAndGetAddress(HANDLE hRemoteProcess, - const WCHAR* library, - const char* symbol); - -#endif // LoadLibraryRemote_h diff --git a/toolkit/crashreporter/breakpad-patches/00-arm-exidx-rollup.patch b/toolkit/crashreporter/breakpad-patches/00-arm-exidx-rollup.patch deleted file mode 100644 index 3ca5815d1..000000000 --- a/toolkit/crashreporter/breakpad-patches/00-arm-exidx-rollup.patch +++ /dev/null @@ -1,1347 +0,0 @@ -diff --git a/Makefile.am b/Makefile.am -index 42386be..e8f7402 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -524,6 +524,8 @@ src_tools_linux_dump_syms_dump_syms_SOURCES = \ - src/common/dwarf/bytereader.cc \ - src/common/dwarf/dwarf2diehandler.cc \ - src/common/dwarf/dwarf2reader.cc \ -+ src/common/arm_ex_reader.cc \ -+ src/common/arm_ex_to_module.cc \ - src/common/linux/crc32.cc \ - src/common/linux/dump_symbols.cc \ - src/common/linux/elf_symbols_to_module.cc \ -@@ -573,6 +575,8 @@ src_tools_mac_dump_syms_dump_syms_CXXFLAGS= \ - -DHAVE_MACH_O_NLIST_H - - src_common_dumper_unittest_SOURCES = \ -+ src/common/arm_ex_reader.cc \ -+ src/common/arm_ex_to_module.cc \ - src/common/byte_cursor_unittest.cc \ - src/common/dwarf_cfi_to_module.cc \ - src/common/dwarf_cfi_to_module_unittest.cc \ -@@ -1336,6 +1340,10 @@ EXTRA_DIST = \ - src/common/linux/crc32.cc \ - src/common/linux/dump_symbols.cc \ - src/common/linux/dump_symbols.h \ -+ src/common/arm_ex_reader.cc \ -+ src/common/arm_ex_reader.h \ -+ src/common/arm_ex_to_module.cc \ -+ src/common/arm_ex_to_module.h \ - src/common/linux/elf_symbols_to_module.cc \ - src/common/linux/elf_symbols_to_module.h \ - src/common/linux/elfutils.cc \ -diff --git a/src/common/arm_ex_reader.cc b/src/common/arm_ex_reader.cc -new file mode 100644 -index 0000000..2d1ed98 ---- /dev/null -+++ b/src/common/arm_ex_reader.cc -@@ -0,0 +1,487 @@ -+ -+/* libunwind - a platform-independent unwind library -+ Copyright 2011 Linaro Limited -+ -+This file is part of libunwind. -+ -+Permission is hereby granted, free of charge, to any person obtaining -+a copy of this software and associated documentation files (the -+"Software"), to deal in the Software without restriction, including -+without limitation the rights to use, copy, modify, merge, publish, -+distribute, sublicense, and/or sell copies of the Software, and to -+permit persons to whom the Software is furnished to do so, subject to -+the following conditions: -+ -+The above copyright notice and this permission notice shall be -+included in all copies or substantial portions of the Software. -+ -+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -+ -+// Copyright (c) 2010 Google Inc. -+// All rights reserved. -+// -+// Redistribution and use in source and binary forms, with or without -+// modification, are permitted provided that the following conditions are -+// met: -+// -+// * Redistributions of source code must retain the above copyright -+// notice, this list of conditions and the following disclaimer. -+// * Redistributions in binary form must reproduce the above -+// copyright notice, this list of conditions and the following disclaimer -+// in the documentation and/or other materials provided with the -+// distribution. -+// * Neither the name of Google Inc. nor the names of its -+// contributors may be used to endorse or promote products derived from -+// this software without specific prior written permission. -+// -+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ -+ -+// Derived from libunwind, with extensive modifications. -+ -+ -+#include "common/arm_ex_reader.h" -+ -+#include -+#include -+ -+// This file, in conjunction with arm_ex_to_module.cc, translates -+// EXIDX unwind information into the same format that Breakpad uses -+// for CFI information. Hence Breakpad's CFI unwinding abilities -+// also become usable for EXIDX. -+// -+// See: "Exception Handling ABI for the ARM Architecture", ARM IHI 0038A -+// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0038a/IHI0038A_ehabi.pdf -+ -+// EXIDX data is presented in two parts: -+// -+// * an index table. This contains two words per routine, -+// the first of which identifies the routine, and the second -+// of which is a reference to the unwind bytecode. If the -+// bytecode is very compact -- 3 bytes or less -- it can be -+// stored directly in the second word. -+// -+// * an area containing the unwind bytecodes. -+ -+// General flow is: ExceptionTableInfo::Start iterates over all -+// of the index table entries (pairs). For each entry, it: -+// -+// * calls ExceptionTableInfo::ExtabEntryExtract to copy the bytecode -+// out into an intermediate buffer. -+ -+// * uses ExceptionTableInfo::ExtabEntryDecode to parse the intermediate -+// buffer. Each bytecode instruction is bundled into a -+// arm_ex_to_module::extab_data structure, and handed to .. -+// -+// * .. ARMExToModule::ImproveStackFrame, which in turn hands it to -+// ARMExToModule::TranslateCmd, and that generates the pseudo-CFI -+// records that Breakpad stores. -+ -+#define ARM_EXIDX_CANT_UNWIND 0x00000001 -+#define ARM_EXIDX_COMPACT 0x80000000 -+#define ARM_EXTBL_OP_FINISH 0xb0 -+#define ARM_EXIDX_TABLE_LIMIT (255*4) -+ -+namespace arm_ex_reader { -+ -+using arm_ex_to_module::ARM_EXIDX_CMD_FINISH; -+using arm_ex_to_module::ARM_EXIDX_CMD_SUB_FROM_VSP; -+using arm_ex_to_module::ARM_EXIDX_CMD_ADD_TO_VSP; -+using arm_ex_to_module::ARM_EXIDX_CMD_REG_POP; -+using arm_ex_to_module::ARM_EXIDX_CMD_REG_TO_SP; -+using arm_ex_to_module::ARM_EXIDX_CMD_VFP_POP; -+using arm_ex_to_module::ARM_EXIDX_CMD_WREG_POP; -+using arm_ex_to_module::ARM_EXIDX_CMD_WCGR_POP; -+using arm_ex_to_module::ARM_EXIDX_CMD_RESERVED; -+using arm_ex_to_module::ARM_EXIDX_CMD_REFUSED; -+using arm_ex_to_module::exidx_entry; -+using arm_ex_to_module::ARM_EXIDX_VFP_SHIFT_16; -+using arm_ex_to_module::ARM_EXIDX_VFP_FSTMD; -+using google_breakpad::MemoryRange; -+ -+ -+static void* Prel31ToAddr(const void* addr) { -+ uint32_t offset32 = *reinterpret_cast(addr); -+ // sign extend offset32[30:0] to 64 bits -- copy bit 30 to positions -+ // 63:31 inclusive. -+ uint64_t offset64 = offset32; -+ if (offset64 & (1ULL << 30)) -+ offset64 |= 0xFFFFFFFF80000000ULL; -+ else -+ offset64 &= 0x000000007FFFFFFFULL; -+ return ((char*)addr) + (uintptr_t)offset64; -+} -+ -+ -+// Extract unwind bytecode for the function denoted by |entry| into |buf|, -+// and return the number of bytes of |buf| written, along with a code -+// indicating the outcome. -+ -+ExceptionTableInfo::ExExtractResult ExceptionTableInfo::ExtabEntryExtract( -+ const struct exidx_entry* entry, -+ uint8_t* buf, size_t buf_size, -+ size_t* buf_used) { -+ MemoryRange mr_out(buf, buf_size); -+ -+ *buf_used = 0; -+ -+# define PUT_BUF_U8(_byte) \ -+ do { if (!mr_out.Covers(*buf_used, 1)) return ExOutBufOverflow; \ -+ buf[(*buf_used)++] = (_byte); } while (0) -+ -+# define GET_EX_U32(_lval, _addr, _sec_mr) \ -+ do { if (!(_sec_mr).Covers(reinterpret_cast(_addr) \ -+ - (_sec_mr).data(), 4)) \ -+ return ExInBufOverflow; \ -+ (_lval) = *(reinterpret_cast(_addr)); } while (0) -+ -+# define GET_EXIDX_U32(_lval, _addr) \ -+ GET_EX_U32(_lval, _addr, mr_exidx_) -+# define GET_EXTAB_U32(_lval, _addr) \ -+ GET_EX_U32(_lval, _addr, mr_extab_) -+ -+ uint32_t data; -+ GET_EXIDX_U32(data, &entry->data); -+ -+ // A function can be marked CANT_UNWIND if (eg) it is known to be -+ // at the bottom of the stack. -+ if (data == ARM_EXIDX_CANT_UNWIND) -+ return ExCantUnwind; -+ -+ uint32_t pers; // personality number -+ uint32_t extra; // number of extra data words required -+ uint32_t extra_allowed; // number of extra data words allowed -+ uint32_t* extbl_data; // the handler entry, if not inlined -+ -+ if (data & ARM_EXIDX_COMPACT) { -+ // The handler table entry has been inlined into the index table entry. -+ // In this case it can only be an ARM-defined compact model, since -+ // bit 31 is 1. Only personalities 0, 1 and 2 are defined for the -+ // ARM compact model, but 1 and 2 are "Long format" and may require -+ // extra data words. Hence the allowable personalities here are: -+ // personality 0, in which case 'extra' has no meaning -+ // personality 1, with zero extra words -+ // personality 2, with zero extra words -+ extbl_data = NULL; -+ pers = (data >> 24) & 0x0F; -+ extra = (data >> 16) & 0xFF; -+ extra_allowed = 0; -+ } -+ else { -+ // The index table entry is a pointer to the handler entry. Note -+ // that Prel31ToAddr will read the given address, but we already -+ // range-checked above. -+ extbl_data = reinterpret_cast(Prel31ToAddr(&entry->data)); -+ GET_EXTAB_U32(data, extbl_data); -+ if (!(data & ARM_EXIDX_COMPACT)) { -+ // This denotes a "generic model" handler. That will involve -+ // executing arbitary machine code, which is something we -+ // can't represent here; hence reject it. -+ return ExCantRepresent; -+ } -+ // So we have a compact model representation. Again, 3 possible -+ // personalities, but this time up to 255 allowable extra words. -+ pers = (data >> 24) & 0x0F; -+ extra = (data >> 16) & 0xFF; -+ extra_allowed = 255; -+ extbl_data++; -+ } -+ -+ // Now look at the the handler table entry. The first word is -+ // |data| and subsequent words start at |*extbl_data|. The number -+ // of extra words to use is |extra|, provided that the personality -+ // allows extra words. Even if it does, none may be available -- -+ // extra_allowed is the maximum number of extra words allowed. */ -+ if (pers == 0) { -+ // "Su16" in the documentation -- 3 unwinding insn bytes -+ // |extra| has no meaning here; instead that byte is an unwind-info byte -+ PUT_BUF_U8(data >> 16); -+ PUT_BUF_U8(data >> 8); -+ PUT_BUF_U8(data); -+ } -+ else if ((pers == 1 || pers == 2) && extra <= extra_allowed) { -+ // "Lu16" or "Lu32" respectively -- 2 unwinding insn bytes, -+ // and up to 255 extra words. -+ PUT_BUF_U8(data >> 8); -+ PUT_BUF_U8(data); -+ for (uint32_t j = 0; j < extra; j++) { -+ GET_EXTAB_U32(data, extbl_data); -+ extbl_data++; -+ PUT_BUF_U8(data >> 24); -+ PUT_BUF_U8(data >> 16); -+ PUT_BUF_U8(data >> 8); -+ PUT_BUF_U8(data >> 0); -+ } -+ } -+ else { -+ // The entry is invalid. -+ return ExInvalid; -+ } -+ -+ // Make sure the entry is terminated with "FINISH" -+ if (*buf_used > 0 && buf[(*buf_used) - 1] != ARM_EXTBL_OP_FINISH) -+ PUT_BUF_U8(ARM_EXTBL_OP_FINISH); -+ -+ return ExSuccess; -+ -+# undef GET_EXTAB_U32 -+# undef GET_EXIDX_U32 -+# undef GET_U32 -+# undef PUT_BUF_U8 -+} -+ -+ -+// Take the unwind information extracted by ExtabEntryExtract -+// and parse it into frame-unwind instructions. These are as -+// specified in "Table 4, ARM-defined frame-unwinding instructions" -+// in the specification document detailed in comments at the top -+// of this file. -+// -+// This reads from |buf[0, +data_size)|. It checks for overruns of -+// the input buffer and returns a negative value if that happens, or -+// for any other failure cases. It returns zero in case of success. -+int ExceptionTableInfo::ExtabEntryDecode(const uint8_t* buf, size_t buf_size) { -+ if (buf == NULL || buf_size == 0) -+ return -1; -+ -+ MemoryRange mr_in(buf, buf_size); -+ const uint8_t* buf_initially = buf; -+ -+# define GET_BUF_U8(_lval) \ -+ do { if (!mr_in.Covers(buf - buf_initially, 1)) return -1; \ -+ (_lval) = *(buf++); } while (0) -+ -+ const uint8_t* end = buf + buf_size; -+ -+ while (buf < end) { -+ struct arm_ex_to_module::extab_data edata; -+ memset(&edata, 0, sizeof(edata)); -+ -+ uint8_t op; -+ GET_BUF_U8(op); -+ if ((op & 0xc0) == 0x00) { -+ // vsp = vsp + (xxxxxx << 2) + 4 -+ edata.cmd = ARM_EXIDX_CMD_ADD_TO_VSP; -+ edata.data = (((int)op & 0x3f) << 2) + 4; -+ } else if ((op & 0xc0) == 0x40) { -+ // vsp = vsp - (xxxxxx << 2) - 4 -+ edata.cmd = ARM_EXIDX_CMD_SUB_FROM_VSP; -+ edata.data = (((int)op & 0x3f) << 2) + 4; -+ } else if ((op & 0xf0) == 0x80) { -+ uint8_t op2; -+ GET_BUF_U8(op2); -+ if (op == 0x80 && op2 == 0x00) { -+ // Refuse to unwind -+ edata.cmd = ARM_EXIDX_CMD_REFUSED; -+ } else { -+ // Pop up to 12 integer registers under masks {r15-r12},{r11-r4} -+ edata.cmd = ARM_EXIDX_CMD_REG_POP; -+ edata.data = ((op & 0xf) << 8) | op2; -+ edata.data = edata.data << 4; -+ } -+ } else if ((op & 0xf0) == 0x90) { -+ if (op == 0x9d || op == 0x9f) { -+ // 9d: Reserved as prefix for ARM register to register moves -+ // 9f: Reserved as perfix for Intel Wireless MMX reg to reg moves -+ edata.cmd = ARM_EXIDX_CMD_RESERVED; -+ } else { -+ // Set vsp = r[nnnn] -+ edata.cmd = ARM_EXIDX_CMD_REG_TO_SP; -+ edata.data = op & 0x0f; -+ } -+ } else if ((op & 0xf0) == 0xa0) { -+ // Pop r4 to r[4+nnn], or -+ // Pop r4 to r[4+nnn] and r14 or -+ unsigned end = (op & 0x07); -+ edata.data = (1 << (end + 1)) - 1; -+ edata.data = edata.data << 4; -+ if (op & 0x08) edata.data |= 1 << 14; -+ edata.cmd = ARM_EXIDX_CMD_REG_POP; -+ } else if (op == ARM_EXTBL_OP_FINISH) { -+ // Finish -+ edata.cmd = ARM_EXIDX_CMD_FINISH; -+ buf = end; -+ } else if (op == 0xb1) { -+ uint8_t op2; -+ GET_BUF_U8(op2); -+ if (op2 == 0 || (op2 & 0xf0)) { -+ // Spare -+ edata.cmd = ARM_EXIDX_CMD_RESERVED; -+ } else { -+ // Pop integer registers under mask {r3,r2,r1,r0} -+ edata.cmd = ARM_EXIDX_CMD_REG_POP; -+ edata.data = op2 & 0x0f; -+ } -+ } else if (op == 0xb2) { -+ // vsp = vsp + 0x204 + (uleb128 << 2) -+ uint64_t offset = 0; -+ uint8_t byte, shift = 0; -+ do { -+ GET_BUF_U8(byte); -+ offset |= (byte & 0x7f) << shift; -+ shift += 7; -+ } while ((byte & 0x80) && buf < end); -+ edata.data = offset * 4 + 0x204; -+ edata.cmd = ARM_EXIDX_CMD_ADD_TO_VSP; -+ } else if (op == 0xb3 || op == 0xc8 || op == 0xc9) { -+ // b3: Pop VFP regs D[ssss] to D[ssss+cccc], FSTMFDX-ishly -+ // c8: Pop VFP regs D[16+ssss] to D[16+ssss+cccc], FSTMFDD-ishly -+ // c9: Pop VFP regs D[ssss] to D[ssss+cccc], FSTMFDD-ishly -+ edata.cmd = ARM_EXIDX_CMD_VFP_POP; -+ GET_BUF_U8(edata.data); -+ if (op == 0xc8) edata.data |= ARM_EXIDX_VFP_SHIFT_16; -+ if (op != 0xb3) edata.data |= ARM_EXIDX_VFP_FSTMD; -+ } else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0) { -+ // b8: Pop VFP regs D[8] to D[8+nnn], FSTMFDX-ishly -+ // d0: Pop VFP regs D[8] to D[8+nnn], FSTMFDD-ishly -+ edata.cmd = ARM_EXIDX_CMD_VFP_POP; -+ edata.data = 0x80 | (op & 0x07); -+ if ((op & 0xf8) == 0xd0) edata.data |= ARM_EXIDX_VFP_FSTMD; -+ } else if (op >= 0xc0 && op <= 0xc5) { -+ // Intel Wireless MMX pop wR[10]-wr[10+nnn], nnn != 6,7 -+ edata.cmd = ARM_EXIDX_CMD_WREG_POP; -+ edata.data = 0xa0 | (op & 0x07); -+ } else if (op == 0xc6) { -+ // Intel Wireless MMX pop wR[ssss] to wR[ssss+cccc] -+ edata.cmd = ARM_EXIDX_CMD_WREG_POP; -+ GET_BUF_U8(edata.data); -+ } else if (op == 0xc7) { -+ uint8_t op2; -+ GET_BUF_U8(op2); -+ if (op2 == 0 || (op2 & 0xf0)) { -+ // Spare -+ edata.cmd = ARM_EXIDX_CMD_RESERVED; -+ } else { -+ // Intel Wireless MMX pop wCGR registers under mask {wCGR3,2,1,0} -+ edata.cmd = ARM_EXIDX_CMD_WCGR_POP; -+ edata.data = op2 & 0x0f; -+ } -+ } else { -+ // Spare -+ edata.cmd = ARM_EXIDX_CMD_RESERVED; -+ } -+ -+ int ret = handler_->ImproveStackFrame(&edata); -+ if (ret < 0) -+ return ret; -+ } -+ return 0; -+ -+# undef GET_BUF_U8 -+} -+ -+void ExceptionTableInfo::Start() { -+ const struct exidx_entry* start -+ = reinterpret_cast(mr_exidx_.data()); -+ const struct exidx_entry* end -+ = reinterpret_cast(mr_exidx_.data() -+ + mr_exidx_.length()); -+ -+ // Iterate over each of the EXIDX entries (pairs of 32-bit words). -+ // These occupy the entire .exidx section. -+ for (const struct exidx_entry* entry = start; entry < end; ++entry) { -+ // Figure out the code address range that this table entry is -+ // associated with. -+ uint32_t addr = (reinterpret_cast(Prel31ToAddr(&entry->addr)) -+ - mapping_addr_ + loading_addr_) & 0x7fffffff; -+ uint32_t next_addr; -+ if (entry < end - 1) { -+ next_addr = (reinterpret_cast(Prel31ToAddr(&((entry + 1)->addr))) -+ - mapping_addr_ + loading_addr_) & 0x7fffffff; -+ } else { -+ // This is the last EXIDX entry in the sequence, so we don't -+ // have an address for the start of the next function, to limit -+ // this one. Instead use the address of the last byte of the -+ // text section associated with this .exidx section, that we -+ // have been given. So as to avoid junking up the CFI unwind -+ // tables with absurdly large address ranges in the case where -+ // text_last_svma_ is wrong, only use the value if it is nonzero -+ // and within one page of |addr|. Otherwise assume a length of 1. -+ // -+ // In some cases, gcc has been observed to finish the exidx -+ // section with an entry of length 1 marked CANT_UNWIND, -+ // presumably exactly for the purpose of giving a definite -+ // length for the last real entry, without having to look at -+ // text segment boundaries. -+ bool plausible = false; -+ next_addr = addr + 1; -+ if (text_last_svma_ != 0) { -+ uint32_t maybe_next_addr = text_last_svma_ + 1; -+ if (maybe_next_addr > addr && maybe_next_addr - addr <= 4096) { -+ next_addr = maybe_next_addr; -+ plausible = true; -+ } -+ } -+ if (!plausible) { -+ fprintf(stderr, "ExceptionTableInfo: implausible EXIDX last entry size " -+ "%d, using 1 instead.", (int32_t)(text_last_svma_ - addr)); -+ } -+ } -+ -+ // Extract the unwind info into |buf|. This might fail for -+ // various reasons. It involves reading both the .exidx and -+ // .extab sections. All accesses to those sections are -+ // bounds-checked. -+ uint8_t buf[ARM_EXIDX_TABLE_LIMIT]; -+ size_t buf_used = 0; -+ ExExtractResult res = ExtabEntryExtract(entry, buf, sizeof(buf), &buf_used); -+ if (res != ExSuccess) { -+ // Couldn't extract the unwind info, for some reason. Move on. -+ switch (res) { -+ case ExInBufOverflow: -+ fprintf(stderr, "ExtabEntryExtract: .exidx/.extab section overrun"); -+ break; -+ case ExOutBufOverflow: -+ fprintf(stderr, "ExtabEntryExtract: bytecode buffer overflow"); -+ break; -+ case ExCantUnwind: -+ fprintf(stderr, "ExtabEntryExtract: function is marked CANT_UNWIND"); -+ break; -+ case ExCantRepresent: -+ fprintf(stderr, "ExtabEntryExtract: bytecode can't be represented"); -+ break; -+ case ExInvalid: -+ fprintf(stderr, "ExtabEntryExtract: index table entry is invalid"); -+ break; -+ default: -+ fprintf(stderr, "ExtabEntryExtract: unknown error: %d", (int)res); -+ break; -+ } -+ continue; -+ } -+ -+ // Finally, work through the unwind instructions in |buf| and -+ // create CFI entries that Breakpad can use. This can also fail. -+ // First, add a new stack frame entry, into which ExtabEntryDecode -+ // will write the CFI entries. -+ if (!handler_->HasStackFrame(addr, next_addr - addr)) { -+ handler_->AddStackFrame(addr, next_addr - addr); -+ int ret = ExtabEntryDecode(buf, buf_used); -+ if (ret < 0) { -+ handler_->DeleteStackFrame(); -+ fprintf(stderr, "ExtabEntryDecode: failed with error code: %d", ret); -+ continue; -+ } -+ handler_->SubmitStackFrame(); -+ } -+ -+ } /* iterating over .exidx */ -+} -+ -+} // namespace arm_ex_reader -diff --git a/src/common/arm_ex_reader.h b/src/common/arm_ex_reader.h -new file mode 100644 -index 0000000..9b54e8a ---- /dev/null -+++ b/src/common/arm_ex_reader.h -@@ -0,0 +1,114 @@ -+/* libunwind - a platform-independent unwind library -+ Copyright 2011 Linaro Limited -+ -+This file is part of libunwind. -+ -+Permission is hereby granted, free of charge, to any person obtaining -+a copy of this software and associated documentation files (the -+"Software"), to deal in the Software without restriction, including -+without limitation the rights to use, copy, modify, merge, publish, -+distribute, sublicense, and/or sell copies of the Software, and to -+permit persons to whom the Software is furnished to do so, subject to -+the following conditions: -+ -+The above copyright notice and this permission notice shall be -+included in all copies or substantial portions of the Software. -+ -+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -+ -+// Copyright (c) 2010 Google Inc. -+// All rights reserved. -+// -+// Redistribution and use in source and binary forms, with or without -+// modification, are permitted provided that the following conditions are -+// met: -+// -+// * Redistributions of source code must retain the above copyright -+// notice, this list of conditions and the following disclaimer. -+// * Redistributions in binary form must reproduce the above -+// copyright notice, this list of conditions and the following disclaimer -+// in the documentation and/or other materials provided with the -+// distribution. -+// * Neither the name of Google Inc. nor the names of its -+// contributors may be used to endorse or promote products derived from -+// this software without specific prior written permission. -+// -+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ -+ -+// Derived from libunwind, with extensive modifications. -+ -+#ifndef COMMON_ARM_EX_READER_H__ -+#define COMMON_ARM_EX_READER_H__ -+ -+#include "common/arm_ex_to_module.h" -+#include "common/memory_range.h" -+ -+namespace arm_ex_reader { -+ -+// This class is a reader for ARM unwind information -+// from .ARM.exidx and .ARM.extab sections. -+class ExceptionTableInfo { -+ public: -+ ExceptionTableInfo(const char* exidx, size_t exidx_size, -+ const char* extab, size_t extab_size, -+ uint32_t text_last_svma, -+ arm_ex_to_module::ARMExToModule* handler, -+ const char* mapping_addr, -+ uint32_t loading_addr) -+ : mr_exidx_(google_breakpad::MemoryRange(exidx, exidx_size)), -+ mr_extab_(google_breakpad::MemoryRange(extab, extab_size)), -+ text_last_svma_(text_last_svma), -+ handler_(handler), mapping_addr_(mapping_addr), -+ loading_addr_(loading_addr) { } -+ -+ ~ExceptionTableInfo() { } -+ -+ // Parses the entries in .ARM.exidx and possibly -+ // in .ARM.extab tables, reports what we find to -+ // arm_ex_to_module::ARMExToModule. -+ void Start(); -+ -+ private: -+ google_breakpad::MemoryRange mr_exidx_; -+ google_breakpad::MemoryRange mr_extab_; -+ uint32_t text_last_svma_; -+ arm_ex_to_module::ARMExToModule* handler_; -+ const char* mapping_addr_; -+ uint32_t loading_addr_; -+ -+ enum ExExtractResult { -+ ExSuccess, // success -+ ExInBufOverflow, // out-of-range while reading .exidx -+ ExOutBufOverflow, // output buffer is too small -+ ExCantUnwind, // this function is marked CANT_UNWIND -+ ExCantRepresent, // entry valid, but we can't represent it -+ ExInvalid // entry is invalid -+ }; -+ ExExtractResult -+ ExtabEntryExtract(const struct arm_ex_to_module::exidx_entry* entry, -+ uint8_t* buf, size_t buf_size, -+ size_t* buf_used); -+ -+ int ExtabEntryDecode(const uint8_t* buf, size_t buf_size); -+}; -+ -+} // namespace arm_ex_reader -+ -+#endif // COMMON_ARM_EX_READER_H__ -diff --git a/src/common/arm_ex_to_module.cc b/src/common/arm_ex_to_module.cc -new file mode 100644 -index 0000000..c326744 ---- /dev/null -+++ b/src/common/arm_ex_to_module.cc -@@ -0,0 +1,209 @@ -+ -+/* libunwind - a platform-independent unwind library -+ Copyright 2011 Linaro Limited -+ -+This file is part of libunwind. -+ -+Permission is hereby granted, free of charge, to any person obtaining -+a copy of this software and associated documentation files (the -+"Software"), to deal in the Software without restriction, including -+without limitation the rights to use, copy, modify, merge, publish, -+distribute, sublicense, and/or sell copies of the Software, and to -+permit persons to whom the Software is furnished to do so, subject to -+the following conditions: -+ -+The above copyright notice and this permission notice shall be -+included in all copies or substantial portions of the Software. -+ -+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -+ -+// Copyright (c) 2010 Google Inc. -+// All rights reserved. -+// -+// Redistribution and use in source and binary forms, with or without -+// modification, are permitted provided that the following conditions are -+// met: -+// -+// * Redistributions of source code must retain the above copyright -+// notice, this list of conditions and the following disclaimer. -+// * Redistributions in binary form must reproduce the above -+// copyright notice, this list of conditions and the following disclaimer -+// in the documentation and/or other materials provided with the -+// distribution. -+// * Neither the name of Google Inc. nor the names of its -+// contributors may be used to endorse or promote products derived from -+// this software without specific prior written permission. -+// -+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ -+ -+// Derived from libunwind, with extensive modifications. -+ -+#include "common/arm_ex_to_module.h" -+ -+#include -+#include -+ -+// For big-picture comments on how the EXIDX reader works, -+// see arm_ex_reader.cc. -+ -+#define ARM_EXBUF_START(x) (((x) >> 4) & 0x0f) -+#define ARM_EXBUF_COUNT(x) ((x) & 0x0f) -+#define ARM_EXBUF_END(x) (ARM_EXBUF_START(x) + ARM_EXBUF_COUNT(x)) -+ -+using google_breakpad::Module; -+ -+namespace arm_ex_to_module { -+ -+static const char* const regnames[] = { -+ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", -+ "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", -+ "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", -+ "fps", "cpsr" -+}; -+ -+// Translate command from extab_data to command for Module. -+int ARMExToModule::TranslateCmd(const struct extab_data* edata, -+ Module::StackFrameEntry* entry, string& vsp) { -+ int ret = 0; -+ switch (edata->cmd) { -+ case ARM_EXIDX_CMD_FINISH: -+ /* Copy LR to PC if there isn't currently a rule for PC in force. */ -+ if (entry->initial_rules.find("pc") -+ == entry->initial_rules.end()) { -+ if (entry->initial_rules.find("lr") -+ == entry->initial_rules.end()) { -+ entry->initial_rules["pc"] = "lr"; -+ } else { -+ entry->initial_rules["pc"] = entry->initial_rules["lr"]; -+ } -+ } -+ break; -+ case ARM_EXIDX_CMD_SUB_FROM_VSP: -+ { -+ char c[16]; -+ sprintf(c, " %d -", edata->data); -+ vsp += c; -+ } -+ break; -+ case ARM_EXIDX_CMD_ADD_TO_VSP: -+ { -+ char c[16]; -+ sprintf(c, " %d +", edata->data); -+ vsp += c; -+ } -+ break; -+ case ARM_EXIDX_CMD_REG_POP: -+ for (unsigned int i = 0; i < 16; i++) { -+ if (edata->data & (1 << i)) { -+ entry->initial_rules[regnames[i]] -+ = vsp + " ^"; -+ vsp += " 4 +"; -+ } -+ } -+ /* Set cfa in case the SP got popped. */ -+ if (edata->data & (1 << 13)) { -+ vsp = entry->initial_rules["sp"]; -+ } -+ break; -+ case ARM_EXIDX_CMD_REG_TO_SP: { -+ assert (edata->data < 16); -+ const char* const regname = regnames[edata->data]; -+ if (entry->initial_rules.find(regname) == entry->initial_rules.end()) { -+ entry->initial_rules["sp"] = regname; -+ } else { -+ entry->initial_rules["sp"] = entry->initial_rules[regname]; -+ } -+ vsp = entry->initial_rules["sp"]; -+ break; -+ } -+ case ARM_EXIDX_CMD_VFP_POP: -+ /* Don't recover VFP registers, but be sure to adjust the stack -+ pointer. */ -+ for (unsigned int i = ARM_EXBUF_START(edata->data); -+ i <= ARM_EXBUF_END(edata->data); i++) { -+ vsp += " 8 +"; -+ } -+ if (!(edata->data & ARM_EXIDX_VFP_FSTMD)) { -+ vsp += " 4 +"; -+ } -+ break; -+ case ARM_EXIDX_CMD_WREG_POP: -+ for (unsigned int i = ARM_EXBUF_START(edata->data); -+ i <= ARM_EXBUF_END(edata->data); i++) { -+ vsp += " 8 +"; -+ } -+ break; -+ case ARM_EXIDX_CMD_WCGR_POP: -+ // Pop wCGR registers under mask {wCGR3,2,1,0}, hence "i < 4" -+ for (unsigned int i = 0; i < 4; i++) { -+ if (edata->data & (1 << i)) { -+ vsp += " 4 +"; -+ } -+ } -+ break; -+ case ARM_EXIDX_CMD_REFUSED: -+ case ARM_EXIDX_CMD_RESERVED: -+ ret = -1; -+ break; -+ } -+ return ret; -+} -+ -+bool ARMExToModule::HasStackFrame(uintptr_t addr, size_t size) { -+ // Invariant: the range [addr,covered) is covered by existing stack -+ // frame entries. -+ uintptr_t covered = addr; -+ while (covered < addr + size) { -+ const Module::StackFrameEntry *old_entry = -+ module_->FindStackFrameEntryByAddress(covered); -+ if (!old_entry) { -+ return false; -+ } -+ covered = old_entry->address + old_entry->size; -+ } -+ return true; -+} -+ -+void ARMExToModule::AddStackFrame(uintptr_t addr, size_t size) { -+ stack_frame_entry_ = new Module::StackFrameEntry; -+ stack_frame_entry_->address = addr; -+ stack_frame_entry_->size = size; -+ stack_frame_entry_->initial_rules[".cfa"] = "sp"; -+ vsp_ = "sp"; -+} -+ -+int ARMExToModule::ImproveStackFrame(const struct extab_data* edata) { -+ return TranslateCmd(edata, stack_frame_entry_, vsp_) ; -+} -+ -+void ARMExToModule::DeleteStackFrame() { -+ delete stack_frame_entry_; -+} -+ -+void ARMExToModule::SubmitStackFrame() { -+ // return address always winds up in pc -+ stack_frame_entry_->initial_rules[".ra"] -+ = stack_frame_entry_->initial_rules["pc"]; -+ // the final value of vsp is the new value of sp -+ stack_frame_entry_->initial_rules["sp"] = vsp_; -+ module_->AddStackFrameEntry(stack_frame_entry_); -+} -+ -+} // namespace arm_ex_to_module -diff --git a/src/common/arm_ex_to_module.h b/src/common/arm_ex_to_module.h -new file mode 100644 -index 0000000..f413a16 ---- /dev/null -+++ b/src/common/arm_ex_to_module.h -@@ -0,0 +1,119 @@ -+/* libunwind - a platform-independent unwind library -+ Copyright 2011 Linaro Limited -+ -+This file is part of libunwind. -+ -+Permission is hereby granted, free of charge, to any person obtaining -+a copy of this software and associated documentation files (the -+"Software"), to deal in the Software without restriction, including -+without limitation the rights to use, copy, modify, merge, publish, -+distribute, sublicense, and/or sell copies of the Software, and to -+permit persons to whom the Software is furnished to do so, subject to -+the following conditions: -+ -+The above copyright notice and this permission notice shall be -+included in all copies or substantial portions of the Software. -+ -+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -+ -+// Copyright (c) 2010 Google Inc. -+// All rights reserved. -+// -+// Redistribution and use in source and binary forms, with or without -+// modification, are permitted provided that the following conditions are -+// met: -+// -+// * Redistributions of source code must retain the above copyright -+// notice, this list of conditions and the following disclaimer. -+// * Redistributions in binary form must reproduce the above -+// copyright notice, this list of conditions and the following disclaimer -+// in the documentation and/or other materials provided with the -+// distribution. -+// * Neither the name of Google Inc. nor the names of its -+// contributors may be used to endorse or promote products derived from -+// this software without specific prior written permission. -+// -+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ -+ -+// Derived from libunwind, with extensive modifications. -+ -+#ifndef COMMON_ARM_EX_TO_MODULE__ -+#define COMMON_ARM_EX_TO_MODULE__ -+ -+#include "common/module.h" -+ -+#include -+ -+namespace arm_ex_to_module { -+ -+using google_breakpad::Module; -+ -+typedef enum extab_cmd { -+ ARM_EXIDX_CMD_FINISH, -+ ARM_EXIDX_CMD_SUB_FROM_VSP, -+ ARM_EXIDX_CMD_ADD_TO_VSP, -+ ARM_EXIDX_CMD_REG_POP, -+ ARM_EXIDX_CMD_REG_TO_SP, -+ ARM_EXIDX_CMD_VFP_POP, -+ ARM_EXIDX_CMD_WREG_POP, -+ ARM_EXIDX_CMD_WCGR_POP, -+ ARM_EXIDX_CMD_RESERVED, -+ ARM_EXIDX_CMD_REFUSED, -+} extab_cmd_t; -+ -+struct exidx_entry { -+ uint32_t addr; -+ uint32_t data; -+}; -+ -+struct extab_data { -+ extab_cmd_t cmd; -+ uint32_t data; -+}; -+ -+enum extab_cmd_flags { -+ ARM_EXIDX_VFP_SHIFT_16 = 1 << 16, -+ ARM_EXIDX_VFP_FSTMD = 1 << 17, // distinguishes FSTMxxD from FSTMxxX -+}; -+ -+// Receives information from arm_ex_reader::ExceptionTableInfo -+// and adds it to the Module object -+class ARMExToModule { -+ public: -+ ARMExToModule(Module* module) -+ : module_(module) { } -+ ~ARMExToModule() { } -+ bool HasStackFrame(uintptr_t addr, size_t size); -+ void AddStackFrame(uintptr_t addr, size_t size); -+ int ImproveStackFrame(const struct extab_data* edata); -+ void DeleteStackFrame(); -+ void SubmitStackFrame(); -+ private: -+ Module* module_; -+ Module::StackFrameEntry* stack_frame_entry_; -+ string vsp_; -+ int TranslateCmd(const struct extab_data* edata, -+ Module::StackFrameEntry* entry, -+ string& vsp); -+}; -+ -+} // namespace arm_ex_to_module -+ -+#endif // COMMON_ARM_EX_TO_MODULE__ -diff --git a/src/common/linux/dump_symbols.cc b/src/common/linux/dump_symbols.cc -index 1e96ca6..4222ce3 100644 ---- a/src/common/linux/dump_symbols.cc -+++ b/src/common/linux/dump_symbols.cc -@@ -52,6 +52,7 @@ - #include - #include - -+#include "common/arm_ex_reader.h" - #include "common/dwarf/bytereader-inl.h" - #include "common/dwarf/dwarf2diehandler.h" - #include "common/dwarf_cfi_to_module.h" -@@ -71,6 +72,11 @@ - #endif - #include "common/using_std_string.h" - -+#ifndef SHT_ARM_EXIDX -+// bionic and older glibc don't define this -+# define SHT_ARM_EXIDX (SHT_LOPROC + 1) -+#endif -+ - // This namespace contains helper functions. - namespace { - -@@ -373,6 +379,52 @@ bool LoadDwarfCFI(const string& dwarf_filename, - return true; - } - -+template -+bool LoadARMexidx(const typename ElfClass::Ehdr* elf_header, -+ const typename ElfClass::Shdr* exidx_section, -+ const typename ElfClass::Shdr* extab_section, -+ uint32_t loading_addr, -+ Module* module) { -+ // To do this properly we need to know: -+ // * the bounds of the .ARM.exidx section in the mapped image -+ // * the bounds of the .ARM.extab section in the mapped image -+ // * the vma of the last byte in the text section associated with the .exidx -+ // The first two are easy. The third is a bit tricky. If we can't -+ // figure out what it is, just pass in zero. -+ const char *exidx_img -+ = GetOffset(elf_header, exidx_section->sh_offset); -+ size_t exidx_size = exidx_section->sh_size; -+ const char *extab_img -+ = GetOffset(elf_header, extab_section->sh_offset); -+ size_t extab_size = extab_section->sh_size; -+ -+ // The sh_link field of the exidx section gives the section number -+ // for the associated text section. -+ uint32_t exidx_text_last_svma = 0; -+ int exidx_text_sno = exidx_section->sh_link; -+ typedef typename ElfClass::Shdr Shdr; -+ // |sections| points to the section header table -+ const Shdr* sections -+ = GetOffset(elf_header, elf_header->e_shoff); -+ const int num_sections = elf_header->e_shnum; -+ if (exidx_text_sno >= 0 && exidx_text_sno < num_sections) { -+ const Shdr* exidx_text_shdr = §ions[exidx_text_sno]; -+ if (exidx_text_shdr->sh_size > 0) { -+ exidx_text_last_svma -+ = exidx_text_shdr->sh_addr + exidx_text_shdr->sh_size - 1; -+ } -+ } -+ -+ arm_ex_to_module::ARMExToModule handler(module); -+ arm_ex_reader::ExceptionTableInfo -+ parser(exidx_img, exidx_size, extab_img, extab_size, exidx_text_last_svma, -+ &handler, -+ reinterpret_cast(elf_header), -+ loading_addr); -+ parser.Start(); -+ return true; -+} -+ - bool LoadELF(const string& obj_file, MmapWrapper* map_wrapper, - void** elf_header) { - int obj_fd = open(obj_file.c_str(), O_RDONLY); -@@ -756,6 +808,29 @@ bool LoadSymbols(const string& obj_file, - } - } - -+ // ARM has special unwind tables that can be used. -+ const Shdr* arm_exidx_section = -+ FindElfSectionByName(".ARM.exidx", SHT_ARM_EXIDX, -+ sections, names, names_end, -+ elf_header->e_shnum); -+ const Shdr* arm_extab_section = -+ FindElfSectionByName(".ARM.extab", SHT_PROGBITS, -+ sections, names, names_end, -+ elf_header->e_shnum); -+ // Load information from these sections even if there is -+ // .debug_info, because some functions (e.g., hand-written or -+ // script-generated assembly) could have exidx entries but no DWARF. -+ // (For functions with both, the DWARF info that has already been -+ // parsed will take precedence.) -+ if (arm_exidx_section && arm_extab_section && options.symbol_data != NO_CFI) { -+ info->LoadedSection(".ARM.exidx"); -+ info->LoadedSection(".ARM.extab"); -+ bool result = LoadARMexidx(elf_header, -+ arm_exidx_section, arm_extab_section, -+ loading_addr, module); -+ found_usable_info = found_usable_info || result; -+ } -+ - if (!found_debug_info_section) { - fprintf(stderr, "%s: file contains no debugging information" - " (no \".stab\" or \".debug_info\" sections)\n", -diff --git a/src/common/module.cc b/src/common/module.cc -index fa798f4..ca52f9f 100644 ---- a/src/common/module.cc -+++ b/src/common/module.cc -@@ -63,7 +63,7 @@ Module::~Module() { - it != functions_.end(); ++it) { - delete *it; - } -- for (vector::iterator it = stack_frame_entries_.begin(); -+ for (StackFrameEntrySet::iterator it = stack_frame_entries_.begin(); - it != stack_frame_entries_.end(); ++it) { - delete *it; - } -@@ -119,8 +119,14 @@ void Module::AddFunctions(vector::iterator begin, - AddFunction(*it); - } - --void Module::AddStackFrameEntry(StackFrameEntry *stack_frame_entry) { -- stack_frame_entries_.push_back(stack_frame_entry); -+void Module::AddStackFrameEntry(StackFrameEntry* stack_frame_entry) { -+ std::pair ret = -+ stack_frame_entries_.insert(stack_frame_entry); -+ if (!ret.second) { -+ // Free the duplicate that was not inserted because this Module -+ // now owns it. -+ delete stack_frame_entry; -+ } - } - - void Module::AddExtern(Extern *ext) { -@@ -180,8 +186,25 @@ void Module::GetFiles(vector *vec) { - vec->push_back(it->second); - } - --void Module::GetStackFrameEntries(vector *vec) const { -- *vec = stack_frame_entries_; -+void Module::GetStackFrameEntries(vector* vec) const { -+ vec->clear(); -+ vec->insert(vec->begin(), stack_frame_entries_.begin(), -+ stack_frame_entries_.end()); -+} -+ -+Module::StackFrameEntry* Module::FindStackFrameEntryByAddress(Address address) { -+ StackFrameEntry search; -+ search.address = address; -+ StackFrameEntrySet::iterator it = stack_frame_entries_.upper_bound(&search); -+ -+ if (it == stack_frame_entries_.begin()) -+ return NULL; -+ -+ it--; -+ if ((*it)->address <= address && address < (*it)->address + (*it)->size) -+ return *it; -+ -+ return NULL; - } - - void Module::AssignSourceIds() { -@@ -286,7 +309,7 @@ bool Module::Write(std::ostream &stream, SymbolData symbol_data) { - - if (symbol_data != NO_CFI) { - // Write out 'STACK CFI INIT' and 'STACK CFI' records. -- vector::const_iterator frame_it; -+ StackFrameEntrySet::const_iterator frame_it; - for (frame_it = stack_frame_entries_.begin(); - frame_it != stack_frame_entries_.end(); ++frame_it) { - StackFrameEntry *entry = *frame_it; -diff --git a/src/common/module.h b/src/common/module.h -index 65b5595..299bc38 100644 ---- a/src/common/module.h -+++ b/src/common/module.h -@@ -176,6 +176,13 @@ class Module { - } - }; - -+ struct StackFrameEntryCompare { -+ bool operator() (const StackFrameEntry* lhs, -+ const StackFrameEntry* rhs) const { -+ return lhs->address < rhs->address; -+ } -+ }; -+ - // Create a new module with the given name, operating system, - // architecture, and ID string. - Module(const string &name, const string &os, const string &architecture, -@@ -256,6 +263,10 @@ class Module { - // a more appropriate interface.) - void GetStackFrameEntries(vector *vec) const; - -+ // If this module has a StackFrameEntry whose address range covers -+ // ADDRESS, return it. Otherwise return NULL. -+ StackFrameEntry* FindStackFrameEntryByAddress(Address address); -+ - // Find those files in this module that are actually referred to by - // functions' line number data, and assign them source id numbers. - // Set the source id numbers for all other files --- unused by the -@@ -316,6 +327,9 @@ class Module { - // A set containing Extern structures, sorted by address. - typedef set ExternSet; - -+ // A set containing StackFrameEntry structures, sorted by address. -+ typedef set StackFrameEntrySet; -+ - // The module owns all the files and functions that have been added - // to it; destroying the module frees the Files and Functions these - // point to. -@@ -324,7 +338,7 @@ class Module { - - // The module owns all the call frame info entries that have been - // added to it. -- vector stack_frame_entries_; -+ StackFrameEntrySet stack_frame_entries_; - - // The module owns all the externs that have been added to it; - // destroying the module frees the Externs these point to. -diff --git a/src/common/module_unittest.cc b/src/common/module_unittest.cc -index 0b64327..bf72736 100644 ---- a/src/common/module_unittest.cc -+++ b/src/common/module_unittest.cc -@@ -326,11 +326,6 @@ TEST(Construct, AddFrames) { - m.Write(s, ALL_SYMBOL_DATA); - string contents = s.str(); - EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n" -- "STACK CFI INIT ddb5f41285aa7757 1486493370dc5073 \n" -- "STACK CFI INIT 8064f3af5e067e38 de2a5ee55509407" -- " .cfa: I think that I shall never see" -- " cannoli: a tree whose hungry mouth is prest" -- " stromboli: a poem lovely as a tree\n" - "STACK CFI INIT 5e8d0db0a7075c6c 1c7edb12a7aea229" - " .cfa: Whose woods are these\n" - "STACK CFI 36682fad3763ffff" -@@ -338,7 +333,12 @@ TEST(Construct, AddFrames) { - " stromboli: his house is in\n" - "STACK CFI 47ceb0f63c269d7f" - " calzone: the village though" -- " cannoli: he will not see me stopping here\n", -+ " cannoli: he will not see me stopping here\n" -+ "STACK CFI INIT 8064f3af5e067e38 de2a5ee55509407" -+ " .cfa: I think that I shall never see" -+ " cannoli: a tree whose hungry mouth is prest" -+ " stromboli: a poem lovely as a tree\n" -+ "STACK CFI INIT ddb5f41285aa7757 1486493370dc5073 \n", - contents.c_str()); - - // Check that GetStackFrameEntries works. -@@ -346,10 +346,18 @@ TEST(Construct, AddFrames) { - m.GetStackFrameEntries(&entries); - ASSERT_EQ(3U, entries.size()); - // Check first entry. -- EXPECT_EQ(0xddb5f41285aa7757ULL, entries[0]->address); -- EXPECT_EQ(0x1486493370dc5073ULL, entries[0]->size); -- ASSERT_EQ(0U, entries[0]->initial_rules.size()); -- ASSERT_EQ(0U, entries[0]->rule_changes.size()); -+ EXPECT_EQ(0x5e8d0db0a7075c6cULL, entries[0]->address); -+ EXPECT_EQ(0x1c7edb12a7aea229ULL, entries[0]->size); -+ Module::RuleMap entry1_initial; -+ entry1_initial[".cfa"] = "Whose woods are these"; -+ EXPECT_THAT(entries[0]->initial_rules, ContainerEq(entry1_initial)); -+ Module::RuleChangeMap entry1_changes; -+ entry1_changes[0x36682fad3763ffffULL][".cfa"] = "I think I know"; -+ entry1_changes[0x36682fad3763ffffULL]["stromboli"] = "his house is in"; -+ entry1_changes[0x47ceb0f63c269d7fULL]["calzone"] = "the village though"; -+ entry1_changes[0x47ceb0f63c269d7fULL]["cannoli"] = -+ "he will not see me stopping here"; -+ EXPECT_THAT(entries[0]->rule_changes, ContainerEq(entry1_changes)); - // Check second entry. - EXPECT_EQ(0x8064f3af5e067e38ULL, entries[1]->address); - EXPECT_EQ(0x0de2a5ee55509407ULL, entries[1]->size); -@@ -361,18 +369,10 @@ TEST(Construct, AddFrames) { - EXPECT_THAT(entries[1]->initial_rules, ContainerEq(entry2_initial)); - ASSERT_EQ(0U, entries[1]->rule_changes.size()); - // Check third entry. -- EXPECT_EQ(0x5e8d0db0a7075c6cULL, entries[2]->address); -- EXPECT_EQ(0x1c7edb12a7aea229ULL, entries[2]->size); -- Module::RuleMap entry3_initial; -- entry3_initial[".cfa"] = "Whose woods are these"; -- EXPECT_THAT(entries[2]->initial_rules, ContainerEq(entry3_initial)); -- Module::RuleChangeMap entry3_changes; -- entry3_changes[0x36682fad3763ffffULL][".cfa"] = "I think I know"; -- entry3_changes[0x36682fad3763ffffULL]["stromboli"] = "his house is in"; -- entry3_changes[0x47ceb0f63c269d7fULL]["calzone"] = "the village though"; -- entry3_changes[0x47ceb0f63c269d7fULL]["cannoli"] = -- "he will not see me stopping here"; -- EXPECT_THAT(entries[2]->rule_changes, ContainerEq(entry3_changes)); -+ EXPECT_EQ(0xddb5f41285aa7757ULL, entries[2]->address); -+ EXPECT_EQ(0x1486493370dc5073ULL, entries[2]->size); -+ ASSERT_EQ(0U, entries[2]->initial_rules.size()); -+ ASSERT_EQ(0U, entries[2]->rule_changes.size()); - } - - TEST(Construct, UniqueFiles) { -@@ -544,3 +544,62 @@ TEST(Construct, FunctionsAndThumbExternsWithSameAddress) { - "PUBLIC cc00 0 arm_func\n", - contents.c_str()); - } -+ -+TEST(Lookup, StackFrameEntries) { -+ Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); -+ -+ // First STACK CFI entry, with no initial rules or deltas. -+ Module::StackFrameEntry *entry1 = new Module::StackFrameEntry(); -+ entry1->address = 0x2000; -+ entry1->size = 0x900; -+ m.AddStackFrameEntry(entry1); -+ -+ // Second STACK CFI entry, with initial rules but no deltas. -+ Module::StackFrameEntry *entry2 = new Module::StackFrameEntry(); -+ entry2->address = 0x3000; -+ entry2->size = 0x900; -+ entry2->initial_rules[".cfa"] = "I think that I shall never see"; -+ entry2->initial_rules["stromboli"] = "a poem lovely as a tree"; -+ entry2->initial_rules["cannoli"] = "a tree whose hungry mouth is prest"; -+ m.AddStackFrameEntry(entry2); -+ -+ // Third STACK CFI entry, with initial rules and deltas. -+ Module::StackFrameEntry *entry3 = new Module::StackFrameEntry(); -+ entry3->address = 0x1000; -+ entry3->size = 0x900; -+ entry3->initial_rules[".cfa"] = "Whose woods are these"; -+ entry3->rule_changes[0x47ceb0f63c269d7fULL]["calzone"] = -+ "the village though"; -+ entry3->rule_changes[0x47ceb0f63c269d7fULL]["cannoli"] = -+ "he will not see me stopping here"; -+ entry3->rule_changes[0x36682fad3763ffffULL]["stromboli"] = -+ "his house is in"; -+ entry3->rule_changes[0x36682fad3763ffffULL][".cfa"] = -+ "I think I know"; -+ m.AddStackFrameEntry(entry3); -+ -+ Module::StackFrameEntry* s = m.FindStackFrameEntryByAddress(0x1000); -+ EXPECT_EQ(entry3, s); -+ s = m.FindStackFrameEntryByAddress(0x18FF); -+ EXPECT_EQ(entry3, s); -+ -+ s = m.FindStackFrameEntryByAddress(0x1900); -+ EXPECT_EQ((Module::StackFrameEntry*)NULL, s); -+ s = m.FindStackFrameEntryByAddress(0x1A00); -+ EXPECT_EQ((Module::StackFrameEntry*)NULL, s); -+ -+ s = m.FindStackFrameEntryByAddress(0x2000); -+ EXPECT_EQ(entry1, s); -+ s = m.FindStackFrameEntryByAddress(0x28FF); -+ EXPECT_EQ(entry1, s); -+ -+ s = m.FindStackFrameEntryByAddress(0x3000); -+ EXPECT_EQ(entry2, s); -+ s = m.FindStackFrameEntryByAddress(0x38FF); -+ EXPECT_EQ(entry2, s); -+ -+ s = m.FindStackFrameEntryByAddress(0x3900); -+ EXPECT_EQ((Module::StackFrameEntry*)NULL, s); -+ s = m.FindStackFrameEntryByAddress(0x3A00); -+ EXPECT_EQ((Module::StackFrameEntry*)NULL, s); -+} diff --git a/toolkit/crashreporter/breakpad-patches/README b/toolkit/crashreporter/breakpad-patches/README deleted file mode 100644 index b3f23b255..000000000 --- a/toolkit/crashreporter/breakpad-patches/README +++ /dev/null @@ -1,4 +0,0 @@ -Do not land local patches to Breakpad without the approval of -Ted Mielczarek - -All local patches must be in the process of being upstreamed. \ No newline at end of file diff --git a/toolkit/crashreporter/breakpad-windows-libxul/moz.build b/toolkit/crashreporter/breakpad-windows-libxul/moz.build deleted file mode 100644 index 347ad36ae..000000000 --- a/toolkit/crashreporter/breakpad-windows-libxul/moz.build +++ /dev/null @@ -1,32 +0,0 @@ -# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- -# vim: set filetype=python: -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -SOURCES += [ - '../google-breakpad/src/common/windows/http_upload.cc', -] - -Library('google_breakpad_libxul_s') - -FINAL_LIBRARY = 'xul' - -for var in ('UNICODE', 'UNICODE_', 'BREAKPAD_NO_TERMINATE_THREAD'): - DEFINES[var] = True - -LOCAL_INCLUDES += [ - '/toolkit/crashreporter/google-breakpad/src', -] - -include('/toolkit/crashreporter/google-breakpad/src/common/windows/objs.mozbuild') -include('/toolkit/crashreporter/google-breakpad/src/client/windows/handler/objs.mozbuild') -include('/toolkit/crashreporter/google-breakpad/src/client/windows/sender/objs.mozbuild') -include('/toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/objs.mozbuild') - -SOURCES += objs_common -SOURCES += objs_crash_generation -SOURCES += objs_handler -SOURCES += objs_sender - -DISABLE_STL_WRAPPING = True diff --git a/toolkit/crashreporter/breakpad-windows-standalone/moz.build b/toolkit/crashreporter/breakpad-windows-standalone/moz.build deleted file mode 100644 index a732ff99f..000000000 --- a/toolkit/crashreporter/breakpad-windows-standalone/moz.build +++ /dev/null @@ -1,26 +0,0 @@ -# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- -# vim: set filetype=python: -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -FINAL_LIBRARY = 'breakpadinjector' - -for var in ('UNICODE', 'UNICODE_', 'BREAKPAD_NO_TERMINATE_THREAD'): - DEFINES[var] = True - -LOCAL_INCLUDES += [ - '/toolkit/crashreporter/google-breakpad/src', -] - -include('/toolkit/crashreporter/google-breakpad/src/common/windows/objs.mozbuild') -include('/toolkit/crashreporter/google-breakpad/src/client/windows/handler/objs.mozbuild') -include('/toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/objs.mozbuild') - -SOURCES += objs_common -SOURCES += objs_crash_generation -SOURCES += objs_handler - -USE_STATIC_LIBS = True - -DISABLE_STL_WRAPPING = True diff --git a/toolkit/crashreporter/client/Makefile.in b/toolkit/crashreporter/client/Makefile.in deleted file mode 100644 index 88be52dff..000000000 --- a/toolkit/crashreporter/client/Makefile.in +++ /dev/null @@ -1,20 +0,0 @@ -# vim:set ts=8 sw=8 sts=8 noet: -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -ifeq ($(OS_ARCH),WINNT) -MOZ_WINCONSOLE = 0 -endif - -include $(topsrcdir)/config/rules.mk - -ifeq ($(OS_ARCH),Darwin) -libs:: - $(NSINSTALL) -D $(DIST)/bin/crashreporter.app - rsync -a -C --exclude '*.in' $(srcdir)/macbuild/Contents $(DIST)/bin/crashreporter.app - sed -e 's/%APP_NAME%/$(MOZ_APP_DISPLAYNAME)/' $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | \ - iconv -f UTF-8 -t UTF-16 > $(DIST)/bin/crashreporter.app/Contents/Resources/English.lproj/InfoPlist.strings - $(NSINSTALL) -D $(DIST)/bin/crashreporter.app/Contents/MacOS - $(NSINSTALL) $(DIST)/bin/crashreporter $(DIST)/bin/crashreporter.app/Contents/MacOS -endif diff --git a/toolkit/crashreporter/client/Throbber-small.avi b/toolkit/crashreporter/client/Throbber-small.avi deleted file mode 100644 index 640ea62c0eafe45e37f8d5a3e98f8f19a49987e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3584 zcmeH~J#W)c6oyX=LI^R$6;r14w)q%K&ADg`2jfZ2&6E0KzjQj{=S8BhlPK%@@* z0H%nMfuF&@Dd+LYshy}38p*K4`C5sBkiHk*y)c`jL&$zU*$X0v&F&0QZ} zrEgyUd2rW}TB{SN6Q~oY6Q~pTe-q%hInkfbkDun#v$OFi*GCB5 zLs%?2qco+4K<&;#Q2pebla7z#m>NZ1T@Srw2&XSYSgk@x5^C#^+FOdChftVmZ5`^a z!htITH>lF|_z0@@Fp7+h3a#qkU<4jUUR^IhaR3mWjtZ^n;P5CGp6I&mbP#gfnG0PwzPl({K2(8mq4ol1XhCAHQls&edt8U?)oLhKt?A7%G zlqLa)W12!ho)E!d5n89K9F~^%4R^SqDSK?IN_7jbJEK(?d3C)2rAYwd7)20}Cq!Ii z5n89K9F~^%4R^SqDSK?IN_7jbGon=(d3C)2rAg)5f`B|B;v$RCI$hUsf6lghOP0eL2gHP0fnPKW9E%TvBTSg*W)^HyG+f7_cs(HH*e e@$0?$>EZ72AA9p>`oBo^`d{0*+SKD868H;fPz6%} diff --git a/toolkit/crashreporter/client/crashreporter.cpp b/toolkit/crashreporter/client/crashreporter.cpp deleted file mode 100644 index 10aa65dd2..000000000 --- a/toolkit/crashreporter/client/crashreporter.cpp +++ /dev/null @@ -1,759 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "crashreporter.h" - -#ifdef _MSC_VER -// Disable exception handler warnings. -# pragma warning( disable : 4530 ) -#endif - -#include -#include -#include -#include -#include -#include - -using std::string; -using std::istream; -using std::ifstream; -using std::istringstream; -using std::ostringstream; -using std::ostream; -using std::ofstream; -using std::vector; -using std::auto_ptr; - -namespace CrashReporter { - -StringTable gStrings; -string gSettingsPath; -string gEventsPath; -int gArgc; -char** gArgv; - -enum SubmissionResult {Succeeded, Failed}; - -static auto_ptr gLogStream(nullptr); -static string gReporterDumpFile; -static string gExtraFile; -static string gMemoryFile; - -static const char kExtraDataExtension[] = ".extra"; -static const char kMemoryReportExtension[] = ".memory.json.gz"; - -void UIError(const string& message) -{ - string errorMessage; - if (!gStrings[ST_CRASHREPORTERERROR].empty()) { - char buf[2048]; - UI_SNPRINTF(buf, 2048, - gStrings[ST_CRASHREPORTERERROR].c_str(), - message.c_str()); - errorMessage = buf; - } else { - errorMessage = message; - } - - UIError_impl(errorMessage); -} - -static string Unescape(const string& str) -{ - string ret; - for (string::const_iterator iter = str.begin(); - iter != str.end(); - iter++) { - if (*iter == '\\') { - iter++; - if (*iter == '\\'){ - ret.push_back('\\'); - } else if (*iter == 'n') { - ret.push_back('\n'); - } else if (*iter == 't') { - ret.push_back('\t'); - } - } else { - ret.push_back(*iter); - } - } - - return ret; -} - -static string Escape(const string& str) -{ - string ret; - for (string::const_iterator iter = str.begin(); - iter != str.end(); - iter++) { - if (*iter == '\\') { - ret += "\\\\"; - } else if (*iter == '\n') { - ret += "\\n"; - } else if (*iter == '\t') { - ret += "\\t"; - } else { - ret.push_back(*iter); - } - } - - return ret; -} - -bool ReadStrings(istream& in, StringTable& strings, bool unescape) -{ - string currentSection; - while (!in.eof()) { - string line; - std::getline(in, line); - int sep = line.find('='); - if (sep >= 0) { - string key, value; - key = line.substr(0, sep); - value = line.substr(sep + 1); - if (unescape) - value = Unescape(value); - strings[key] = value; - } - } - - return true; -} - -bool ReadStringsFromFile(const string& path, - StringTable& strings, - bool unescape) -{ - ifstream* f = UIOpenRead(path); - bool success = false; - if (f->is_open()) { - success = ReadStrings(*f, strings, unescape); - f->close(); - } - - delete f; - return success; -} - -bool WriteStrings(ostream& out, - const string& header, - StringTable& strings, - bool escape) -{ - out << "[" << header << "]" << std::endl; - for (StringTable::iterator iter = strings.begin(); - iter != strings.end(); - iter++) { - out << iter->first << "="; - if (escape) - out << Escape(iter->second); - else - out << iter->second; - - out << std::endl; - } - - return true; -} - -bool WriteStringsToFile(const string& path, - const string& header, - StringTable& strings, - bool escape) -{ - ofstream* f = UIOpenWrite(path.c_str()); - bool success = false; - if (f->is_open()) { - success = WriteStrings(*f, header, strings, escape); - f->close(); - } - - delete f; - return success; -} - -static string Basename(const string& file) -{ - string::size_type slashIndex = file.rfind(UI_DIR_SEPARATOR); - if (slashIndex != string::npos) - return file.substr(slashIndex + 1); - else - return file; -} - -static string GetDumpLocalID() -{ - string localId = Basename(gReporterDumpFile); - string::size_type dot = localId.rfind('.'); - - if (dot == string::npos) - return ""; - - return localId.substr(0, dot); -} - -// This appends the StackTraces entry generated by the minidump analyzer to the -// main crash event so that it can be picked up by Firefox once it restarts -static void AppendStackTracesToEventFile(const string& aStackTraces) -{ - if (gEventsPath.empty()) { - // If there is no path for finding the crash event, skip this step. - return; - } - - string localId = GetDumpLocalID(); - string path = gEventsPath + UI_DIR_SEPARATOR + localId; - ofstream* f = UIOpenWrite(path.c_str(), true); - - if (f->is_open()) { - *f << "StackTraces=" << aStackTraces; - f->close(); - } - - delete f; -} - -static void WriteSubmissionEvent(SubmissionResult result, - const string& remoteId) -{ - if (gEventsPath.empty()) { - // If there is no path for writing the submission event, skip it. - return; - } - - string localId = GetDumpLocalID(); - string fpath = gEventsPath + UI_DIR_SEPARATOR + localId + "-submission"; - ofstream* f = UIOpenWrite(fpath.c_str(), false, true); - time_t tm; - time(&tm); - - if (f->is_open()) { - *f << "crash.submission.1\n"; - *f << tm << "\n"; - *f << localId << "\n"; - *f << (result == Succeeded ? "true" : "false") << "\n"; - *f << remoteId; - - f->close(); - } - - delete f; -} - -void LogMessage(const std::string& message) -{ - if (gLogStream.get()) { - char date[64]; - time_t tm; - time(&tm); - if (strftime(date, sizeof(date) - 1, "%c", localtime(&tm)) == 0) - date[0] = '\0'; - (*gLogStream) << "[" << date << "] " << message << std::endl; - } -} - -static void OpenLogFile() -{ - string logPath = gSettingsPath + UI_DIR_SEPARATOR + "submit.log"; - gLogStream.reset(UIOpenWrite(logPath.c_str(), true)); -} - -static bool ReadConfig() -{ - string iniPath; - if (!UIGetIniPath(iniPath)) - return false; - - if (!ReadStringsFromFile(iniPath, gStrings, true)) - return false; - - // See if we have a string override file, if so process it - char* overrideEnv = getenv("MOZ_CRASHREPORTER_STRINGS_OVERRIDE"); - if (overrideEnv && *overrideEnv && UIFileExists(overrideEnv)) - ReadStringsFromFile(overrideEnv, gStrings, true); - - return true; -} - -static string -GetAdditionalFilename(const string& dumpfile, const char* extension) -{ - string filename(dumpfile); - int dot = filename.rfind('.'); - if (dot < 0) - return ""; - - filename.replace(dot, filename.length() - dot, extension); - return filename; -} - -static bool MoveCrashData(const string& toDir, - string& dumpfile, - string& extrafile, - string& memoryfile) -{ - if (!UIEnsurePathExists(toDir)) { - UIError(gStrings[ST_ERROR_CREATEDUMPDIR]); - return false; - } - - string newDump = toDir + UI_DIR_SEPARATOR + Basename(dumpfile); - string newExtra = toDir + UI_DIR_SEPARATOR + Basename(extrafile); - string newMemory = toDir + UI_DIR_SEPARATOR + Basename(memoryfile); - - if (!UIMoveFile(dumpfile, newDump)) { - UIError(gStrings[ST_ERROR_DUMPFILEMOVE]); - return false; - } - - if (!UIMoveFile(extrafile, newExtra)) { - UIError(gStrings[ST_ERROR_EXTRAFILEMOVE]); - return false; - } - - if (!memoryfile.empty()) { - // Ignore errors from moving the memory file - if (!UIMoveFile(memoryfile, newMemory)) { - UIDeleteFile(memoryfile); - newMemory.erase(); - } - memoryfile = newMemory; - } - - dumpfile = newDump; - extrafile = newExtra; - - return true; -} - -static bool AddSubmittedReport(const string& serverResponse) -{ - StringTable responseItems; - istringstream in(serverResponse); - ReadStrings(in, responseItems, false); - - if (responseItems.find("StopSendingReportsFor") != responseItems.end()) { - // server wants to tell us to stop sending reports for a certain version - string reportPath = - gSettingsPath + UI_DIR_SEPARATOR + "EndOfLife" + - responseItems["StopSendingReportsFor"]; - - ofstream* reportFile = UIOpenWrite(reportPath); - if (reportFile->is_open()) { - // don't really care about the contents - *reportFile << 1 << "\n"; - reportFile->close(); - } - delete reportFile; - } - - if (responseItems.find("Discarded") != responseItems.end()) { - // server discarded this report... save it so the user can resubmit it - // manually - return false; - } - - if (responseItems.find("CrashID") == responseItems.end()) - return false; - - string submittedDir = - gSettingsPath + UI_DIR_SEPARATOR + "submitted"; - if (!UIEnsurePathExists(submittedDir)) { - return false; - } - - string path = submittedDir + UI_DIR_SEPARATOR + - responseItems["CrashID"] + ".txt"; - - ofstream* file = UIOpenWrite(path); - if (!file->is_open()) { - delete file; - return false; - } - - char buf[1024]; - UI_SNPRINTF(buf, 1024, - gStrings["CrashID"].c_str(), - responseItems["CrashID"].c_str()); - *file << buf << "\n"; - - if (responseItems.find("ViewURL") != responseItems.end()) { - UI_SNPRINTF(buf, 1024, - gStrings["CrashDetailsURL"].c_str(), - responseItems["ViewURL"].c_str()); - *file << buf << "\n"; - } - - file->close(); - delete file; - - WriteSubmissionEvent(Succeeded, responseItems["CrashID"]); - return true; -} - -void DeleteDump() -{ - const char* noDelete = getenv("MOZ_CRASHREPORTER_NO_DELETE_DUMP"); - if (!noDelete || *noDelete == '\0') { - if (!gReporterDumpFile.empty()) - UIDeleteFile(gReporterDumpFile); - if (!gExtraFile.empty()) - UIDeleteFile(gExtraFile); - if (!gMemoryFile.empty()) - UIDeleteFile(gMemoryFile); - } -} - -void SendCompleted(bool success, const string& serverResponse) -{ - if (success) { - if (AddSubmittedReport(serverResponse)) { - DeleteDump(); - } - else { - string directory = gReporterDumpFile; - int slashpos = directory.find_last_of("/\\"); - if (slashpos < 2) - return; - directory.resize(slashpos); - UIPruneSavedDumps(directory); - WriteSubmissionEvent(Failed, ""); - } - } else { - WriteSubmissionEvent(Failed, ""); - } -} - -bool ShouldEnableSending() -{ - srand(time(0)); - return ((rand() % 100) < MOZ_CRASHREPORTER_ENABLE_PERCENT); -} - -} // namespace CrashReporter - -using namespace CrashReporter; - -void RewriteStrings(StringTable& queryParameters) -{ - // rewrite some UI strings with the values from the query parameters - string product = queryParameters["ProductName"]; - string vendor = queryParameters["Vendor"]; - if (vendor.empty()) { - // Assume Mozilla if no vendor is specified - vendor = "Mozilla"; - } - - char buf[4096]; - UI_SNPRINTF(buf, sizeof(buf), - gStrings[ST_CRASHREPORTERVENDORTITLE].c_str(), - vendor.c_str()); - gStrings[ST_CRASHREPORTERTITLE] = buf; - - - string str = gStrings[ST_CRASHREPORTERPRODUCTERROR]; - // Only do the replacement here if the string has two - // format specifiers to start. Otherwise - // we assume it has the product name hardcoded. - string::size_type pos = str.find("%s"); - if (pos != string::npos) - pos = str.find("%s", pos+2); - if (pos != string::npos) { - // Leave a format specifier for UIError to fill in - UI_SNPRINTF(buf, sizeof(buf), - gStrings[ST_CRASHREPORTERPRODUCTERROR].c_str(), - product.c_str(), - "%s"); - gStrings[ST_CRASHREPORTERERROR] = buf; - } - else { - // product name is hardcoded - gStrings[ST_CRASHREPORTERERROR] = str; - } - - UI_SNPRINTF(buf, sizeof(buf), - gStrings[ST_CRASHREPORTERDESCRIPTION].c_str(), - product.c_str()); - gStrings[ST_CRASHREPORTERDESCRIPTION] = buf; - - UI_SNPRINTF(buf, sizeof(buf), - gStrings[ST_CHECKSUBMIT].c_str(), - vendor.c_str()); - gStrings[ST_CHECKSUBMIT] = buf; - - UI_SNPRINTF(buf, sizeof(buf), - gStrings[ST_CHECKEMAIL].c_str(), - vendor.c_str()); - gStrings[ST_CHECKEMAIL] = buf; - - UI_SNPRINTF(buf, sizeof(buf), - gStrings[ST_RESTART].c_str(), - product.c_str()); - gStrings[ST_RESTART] = buf; - - UI_SNPRINTF(buf, sizeof(buf), - gStrings[ST_QUIT].c_str(), - product.c_str()); - gStrings[ST_QUIT] = buf; - - UI_SNPRINTF(buf, sizeof(buf), - gStrings[ST_ERROR_ENDOFLIFE].c_str(), - product.c_str()); - gStrings[ST_ERROR_ENDOFLIFE] = buf; -} - -bool CheckEndOfLifed(string version) -{ - string reportPath = - gSettingsPath + UI_DIR_SEPARATOR + "EndOfLife" + version; - return UIFileExists(reportPath); -} - -#ifndef RELEASE_OR_BETA - -static string -GetMinidumpAnalyzerPath() -{ - string path = gArgv[0]; - size_t pos = path.rfind(UI_CRASH_REPORTER_FILENAME BIN_SUFFIX); - path.erase(pos); - path.append(UI_MINIDUMP_ANALYZER_FILENAME BIN_SUFFIX); - - return path; -} - -#endif - -int main(int argc, char** argv) -{ - gArgc = argc; - gArgv = argv; - - if (!ReadConfig()) { - UIError("Couldn't read configuration."); - return 0; - } - - if (!UIInit()) - return 0; - - if (argc > 1) { - gReporterDumpFile = argv[1]; - } - - if (gReporterDumpFile.empty()) { - // no dump file specified, run the default UI - UIShowDefaultUI(); - } else { -#ifndef RELEASE_OR_BETA - // start by running minidump analyzer, this is currently enabled only in - // nightly and aurora - UIRunMinidumpAnalyzer(GetMinidumpAnalyzerPath(), gReporterDumpFile); -#endif - - // go ahead with the crash reporter - gExtraFile = GetAdditionalFilename(gReporterDumpFile, kExtraDataExtension); - if (gExtraFile.empty()) { - UIError(gStrings[ST_ERROR_BADARGUMENTS]); - return 0; - } - - if (!UIFileExists(gExtraFile)) { - UIError(gStrings[ST_ERROR_EXTRAFILEEXISTS]); - return 0; - } - - gMemoryFile = GetAdditionalFilename(gReporterDumpFile, - kMemoryReportExtension); - if (!UIFileExists(gMemoryFile)) { - gMemoryFile.erase(); - } - - StringTable queryParameters; - if (!ReadStringsFromFile(gExtraFile, queryParameters, true)) { - UIError(gStrings[ST_ERROR_EXTRAFILEREAD]); - return 0; - } - - if (queryParameters.find("ProductName") == queryParameters.end()) { - UIError(gStrings[ST_ERROR_NOPRODUCTNAME]); - return 0; - } - - // There is enough information in the extra file to rewrite strings - // to be product specific - RewriteStrings(queryParameters); - - if (queryParameters.find("ServerURL") == queryParameters.end()) { - UIError(gStrings[ST_ERROR_NOSERVERURL]); - return 0; - } - - // Hopefully the settings path exists in the environment. Try that before - // asking the platform-specific code to guess. -#ifdef XP_WIN32 - static const wchar_t kDataDirKey[] = L"MOZ_CRASHREPORTER_DATA_DIRECTORY"; - const wchar_t *settingsPath = _wgetenv(kDataDirKey); - if (settingsPath && *settingsPath) { - gSettingsPath = WideToUTF8(settingsPath); - } -#else - static const char kDataDirKey[] = "MOZ_CRASHREPORTER_DATA_DIRECTORY"; - const char *settingsPath = getenv(kDataDirKey); - if (settingsPath && *settingsPath) { - gSettingsPath = settingsPath; - } -#endif - else { - string product = queryParameters["ProductName"]; - string vendor = queryParameters["Vendor"]; - if (!UIGetSettingsPath(vendor, product, gSettingsPath)) { - gSettingsPath.clear(); - } - } - - if (gSettingsPath.empty() || !UIEnsurePathExists(gSettingsPath)) { - UIError(gStrings[ST_ERROR_NOSETTINGSPATH]); - return 0; - } - - OpenLogFile(); - -#ifdef XP_WIN32 - static const wchar_t kEventsDirKey[] = L"MOZ_CRASHREPORTER_EVENTS_DIRECTORY"; - const wchar_t *eventsPath = _wgetenv(kEventsDirKey); - if (eventsPath && *eventsPath) { - gEventsPath = WideToUTF8(eventsPath); - } -#else - static const char kEventsDirKey[] = "MOZ_CRASHREPORTER_EVENTS_DIRECTORY"; - const char *eventsPath = getenv(kEventsDirKey); - if (eventsPath && *eventsPath) { - gEventsPath = eventsPath; - } -#endif - else { - gEventsPath.clear(); - } - - // Update the crash event with stacks if they are present - auto stackTracesItr = queryParameters.find("StackTraces"); - if (stackTracesItr != queryParameters.end()) { - AppendStackTracesToEventFile(stackTracesItr->second); - } - - if (!UIFileExists(gReporterDumpFile)) { - UIError(gStrings[ST_ERROR_DUMPFILEEXISTS]); - return 0; - } - - string pendingDir = gSettingsPath + UI_DIR_SEPARATOR + "pending"; - if (!MoveCrashData(pendingDir, gReporterDumpFile, gExtraFile, - gMemoryFile)) { - return 0; - } - - string sendURL = queryParameters["ServerURL"]; - // we don't need to actually send this - queryParameters.erase("ServerURL"); - - queryParameters["Throttleable"] = "1"; - - // re-set XUL_APP_FILE for xulrunner wrapped apps - const char *appfile = getenv("MOZ_CRASHREPORTER_RESTART_XUL_APP_FILE"); - if (appfile && *appfile) { - const char prefix[] = "XUL_APP_FILE="; - char *env = (char*) malloc(strlen(appfile) + strlen(prefix) + 1); - if (!env) { - UIError("Out of memory"); - return 0; - } - strcpy(env, prefix); - strcat(env, appfile); - putenv(env); - free(env); - } - - vector restartArgs; - - ostringstream paramName; - int i = 0; - paramName << "MOZ_CRASHREPORTER_RESTART_ARG_" << i++; - const char *param = getenv(paramName.str().c_str()); - while (param && *param) { - restartArgs.push_back(param); - - paramName.str(""); - paramName << "MOZ_CRASHREPORTER_RESTART_ARG_" << i++; - param = getenv(paramName.str().c_str()); - } - - // allow override of the server url via environment variable - //XXX: remove this in the far future when our robot - // masters force everyone to use XULRunner - char* urlEnv = getenv("MOZ_CRASHREPORTER_URL"); - if (urlEnv && *urlEnv) { - sendURL = urlEnv; - } - - // see if this version has been end-of-lifed - if (queryParameters.find("Version") != queryParameters.end() && - CheckEndOfLifed(queryParameters["Version"])) { - UIError(gStrings[ST_ERROR_ENDOFLIFE]); - DeleteDump(); - return 0; - } - - StringTable files; - files["upload_file_minidump"] = gReporterDumpFile; - if (!gMemoryFile.empty()) { - files["memory_report"] = gMemoryFile; - } - - if (!UIShowCrashUI(files, queryParameters, sendURL, restartArgs)) - DeleteDump(); - } - - UIShutdown(); - - return 0; -} - -#if defined(XP_WIN) && !defined(__GNUC__) -#include - -// We need WinMain in order to not be a console app. This function is unused -// if we are a console application. -int WINAPI wWinMain( HINSTANCE, HINSTANCE, LPWSTR args, int ) -{ - // Remove everything except close window from the context menu - { - HKEY hkApp; - RegCreateKeyExW(HKEY_CURRENT_USER, L"Software\\Classes\\Applications", 0, - nullptr, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, nullptr, - &hkApp, nullptr); - RegCloseKey(hkApp); - if (RegCreateKeyExW(HKEY_CURRENT_USER, - L"Software\\Classes\\Applications\\crashreporter.exe", - 0, nullptr, REG_OPTION_VOLATILE, KEY_SET_VALUE, - nullptr, &hkApp, nullptr) == ERROR_SUCCESS) { - RegSetValueExW(hkApp, L"IsHostApp", 0, REG_NONE, 0, 0); - RegSetValueExW(hkApp, L"NoOpenWith", 0, REG_NONE, 0, 0); - RegSetValueExW(hkApp, L"NoStartPage", 0, REG_NONE, 0, 0); - RegCloseKey(hkApp); - } - } - - char** argv = static_cast(malloc(__argc * sizeof(char*))); - for (int i = 0; i < __argc; i++) { - argv[i] = strdup(WideToUTF8(__wargv[i]).c_str()); - } - - // Do the real work. - return main(__argc, argv); -} -#endif diff --git a/toolkit/crashreporter/client/crashreporter.exe.manifest b/toolkit/crashreporter/client/crashreporter.exe.manifest deleted file mode 100644 index e6b2ceefb..000000000 --- a/toolkit/crashreporter/client/crashreporter.exe.manifest +++ /dev/null @@ -1,37 +0,0 @@ - - - -Crash Reporter - - - - - - - - - - - - - - - - - - - - - diff --git a/toolkit/crashreporter/client/crashreporter.h b/toolkit/crashreporter/client/crashreporter.h deleted file mode 100644 index 8c5ca3613..000000000 --- a/toolkit/crashreporter/client/crashreporter.h +++ /dev/null @@ -1,158 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef CRASHREPORTER_H__ -#define CRASHREPORTER_H__ - -#ifdef _MSC_VER -# pragma warning( push ) -// Disable exception handler warnings. -# pragma warning( disable : 4530 ) -#endif - -#include -#include -#include -#include -#include -#include -#include - -#define MAX_COMMENT_LENGTH 500 - -#if defined(XP_WIN32) - -#include - -#define UI_SNPRINTF _snprintf -#define UI_DIR_SEPARATOR "\\" - -std::string WideToUTF8(const std::wstring& wide, bool* success = 0); - -#else - -#define UI_SNPRINTF snprintf -#define UI_DIR_SEPARATOR "/" - -#endif - -#define UI_CRASH_REPORTER_FILENAME "crashreporter" -#define UI_MINIDUMP_ANALYZER_FILENAME "minidump-analyzer" - -typedef std::map StringTable; - -#define ST_CRASHREPORTERTITLE "CrashReporterTitle" -#define ST_CRASHREPORTERVENDORTITLE "CrashReporterVendorTitle" -#define ST_CRASHREPORTERERROR "CrashReporterErrorText" -#define ST_CRASHREPORTERPRODUCTERROR "CrashReporterProductErrorText2" -#define ST_CRASHREPORTERHEADER "CrashReporterSorry" -#define ST_CRASHREPORTERDESCRIPTION "CrashReporterDescriptionText2" -#define ST_CRASHREPORTERDEFAULT "CrashReporterDefault" -#define ST_VIEWREPORT "Details" -#define ST_VIEWREPORTTITLE "ViewReportTitle" -#define ST_COMMENTGRAYTEXT "CommentGrayText" -#define ST_EXTRAREPORTINFO "ExtraReportInfo" -#define ST_CHECKSUBMIT "CheckSendReport" -#define ST_CHECKURL "CheckIncludeURL" -#define ST_CHECKEMAIL "CheckAllowEmail" -#define ST_EMAILGRAYTEXT "EmailGrayText" -#define ST_REPORTPRESUBMIT "ReportPreSubmit2" -#define ST_REPORTDURINGSUBMIT "ReportDuringSubmit2" -#define ST_REPORTSUBMITSUCCESS "ReportSubmitSuccess" -#define ST_SUBMITFAILED "ReportSubmitFailed" -#define ST_QUIT "Quit2" -#define ST_RESTART "Restart" -#define ST_OK "Ok" -#define ST_CLOSE "Close" - -#define ST_ERROR_BADARGUMENTS "ErrorBadArguments" -#define ST_ERROR_EXTRAFILEEXISTS "ErrorExtraFileExists" -#define ST_ERROR_EXTRAFILEREAD "ErrorExtraFileRead" -#define ST_ERROR_EXTRAFILEMOVE "ErrorExtraFileMove" -#define ST_ERROR_DUMPFILEEXISTS "ErrorDumpFileExists" -#define ST_ERROR_DUMPFILEMOVE "ErrorDumpFileMove" -#define ST_ERROR_NOPRODUCTNAME "ErrorNoProductName" -#define ST_ERROR_NOSERVERURL "ErrorNoServerURL" -#define ST_ERROR_NOSETTINGSPATH "ErrorNoSettingsPath" -#define ST_ERROR_CREATEDUMPDIR "ErrorCreateDumpDir" -#define ST_ERROR_ENDOFLIFE "ErrorEndOfLife" - -//============================================================================= -// implemented in crashreporter.cpp -//============================================================================= - -namespace CrashReporter { - extern StringTable gStrings; - extern std::string gSettingsPath; - extern std::string gEventsPath; - extern int gArgc; - extern char** gArgv; - - void UIError(const std::string& message); - - // The UI finished sending the report - void SendCompleted(bool success, const std::string& serverResponse); - - bool ReadStrings(std::istream& in, - StringTable& strings, - bool unescape); - bool ReadStringsFromFile(const std::string& path, - StringTable& strings, - bool unescape); - bool WriteStrings(std::ostream& out, - const std::string& header, - StringTable& strings, - bool escape); - bool WriteStringsToFile(const std::string& path, - const std::string& header, - StringTable& strings, - bool escape); - void LogMessage(const std::string& message); - void DeleteDump(); - bool ShouldEnableSending(); - - static const unsigned int kSaveCount = 10; -} - -//============================================================================= -// implemented in the platform-specific files -//============================================================================= - -bool UIInit(); -void UIShutdown(); - -// Run the UI for when the app was launched without a dump file -void UIShowDefaultUI(); - -// Run the UI for when the app was launched with a dump file -// Return true if the user sent (or tried to send) the crash report, -// false if they chose not to, and it should be deleted. -bool UIShowCrashUI(const StringTable& files, - const StringTable& queryParameters, - const std::string& sendURL, - const std::vector& restartArgs); - -void UIError_impl(const std::string& message); - -bool UIGetIniPath(std::string& path); -bool UIGetSettingsPath(const std::string& vendor, - const std::string& product, - std::string& settingsPath); -bool UIEnsurePathExists(const std::string& path); -bool UIFileExists(const std::string& path); -bool UIMoveFile(const std::string& oldfile, const std::string& newfile); -bool UIDeleteFile(const std::string& oldfile); -std::ifstream* UIOpenRead(const std::string& filename); -std::ofstream* UIOpenWrite(const std::string& filename, - bool append=false, - bool binary=false); -void UIPruneSavedDumps(const std::string& directory); -void UIRunMinidumpAnalyzer(const std::string& exename, - const std::string& filename); - -#ifdef _MSC_VER -# pragma warning( pop ) -#endif - -#endif diff --git a/toolkit/crashreporter/client/crashreporter.ico b/toolkit/crashreporter/client/crashreporter.ico deleted file mode 100644 index 29ac3c61899884f105e28f1cf75e458da0c6b2d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25214 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "common/linux/http_upload.h" -#include "crashreporter.h" -#include "crashreporter_gtk_common.h" - -#ifndef GDK_KEY_Escape -#define GDK_KEY_Escape GDK_Escape -#endif - -using std::string; -using std::vector; - -using namespace CrashReporter; - -GtkWidget* gWindow = 0; -GtkWidget* gSubmitReportCheck = 0; -GtkWidget* gIncludeURLCheck = 0; -GtkWidget* gThrobber = 0; -GtkWidget* gProgressLabel = 0; -GtkWidget* gCloseButton = 0; -GtkWidget* gRestartButton = 0; - -bool gInitialized = false; -bool gDidTrySend = false; -StringTable gFiles; -StringTable gQueryParameters; -string gHttpProxy; -string gAuth; -string gCACertificateFile; -string gSendURL; -string gURLParameter; -vector gRestartArgs; -GThread* gSendThreadID; - -// From crashreporter_linux.cpp -void SaveSettings(); -void SendReport(); -void TryInitGnome(); -void UpdateSubmit(); - -static bool RestartApplication() -{ - char** argv = reinterpret_cast( - malloc(sizeof(char*) * (gRestartArgs.size() + 1))); - - if (!argv) return false; - - unsigned int i; - for (i = 0; i < gRestartArgs.size(); i++) { - argv[i] = (char*)gRestartArgs[i].c_str(); - } - argv[i] = 0; - - pid_t pid = fork(); - if (pid == -1) - return false; - else if (pid == 0) { - (void)execv(argv[0], argv); - _exit(1); - } - - free(argv); - - return true; -} - -// Quit the app, used as a timeout callback -static gboolean CloseApp(gpointer data) -{ - gtk_main_quit(); - g_thread_join(gSendThreadID); - return FALSE; -} - -static gboolean ReportCompleted(gpointer success) -{ - gtk_widget_hide(gThrobber); - string str = success ? gStrings[ST_REPORTSUBMITSUCCESS] - : gStrings[ST_SUBMITFAILED]; - gtk_label_set_text(GTK_LABEL(gProgressLabel), str.c_str()); - g_timeout_add(5000, CloseApp, 0); - return FALSE; -} - -#ifdef MOZ_ENABLE_GCONF -#define HTTP_PROXY_DIR "/system/http_proxy" - -void LoadProxyinfo() -{ - class GConfClient; - typedef GConfClient * (*_gconf_default_fn)(); - typedef gboolean (*_gconf_bool_fn)(GConfClient *, const gchar *, GError **); - typedef gint (*_gconf_int_fn)(GConfClient *, const gchar *, GError **); - typedef gchar * (*_gconf_string_fn)(GConfClient *, const gchar *, GError **); - - if (getenv ("http_proxy")) - return; // libcurl can use the value from the environment - - static void* gconfLib = dlopen("libgconf-2.so.4", RTLD_LAZY); - if (!gconfLib) - return; - - _gconf_default_fn gconf_client_get_default = - (_gconf_default_fn)dlsym(gconfLib, "gconf_client_get_default"); - _gconf_bool_fn gconf_client_get_bool = - (_gconf_bool_fn)dlsym(gconfLib, "gconf_client_get_bool"); - _gconf_int_fn gconf_client_get_int = - (_gconf_int_fn)dlsym(gconfLib, "gconf_client_get_int"); - _gconf_string_fn gconf_client_get_string = - (_gconf_string_fn)dlsym(gconfLib, "gconf_client_get_string"); - - if(!(gconf_client_get_default && - gconf_client_get_bool && - gconf_client_get_int && - gconf_client_get_string)) { - dlclose(gconfLib); - return; - } - - GConfClient *conf = gconf_client_get_default(); - - if (gconf_client_get_bool(conf, HTTP_PROXY_DIR "/use_http_proxy", nullptr)) { - gint port; - gchar *host = nullptr, *httpproxy = nullptr; - - host = gconf_client_get_string(conf, HTTP_PROXY_DIR "/host", nullptr); - port = gconf_client_get_int(conf, HTTP_PROXY_DIR "/port", nullptr); - - if (port && host && *host != '\0') { - httpproxy = g_strdup_printf("http://%s:%d/", host, port); - gHttpProxy = httpproxy; - } - - g_free(host); - g_free(httpproxy); - - if (gconf_client_get_bool(conf, HTTP_PROXY_DIR "/use_authentication", - nullptr)) { - gchar *user, *password, *auth = nullptr; - - user = gconf_client_get_string(conf, - HTTP_PROXY_DIR "/authentication_user", - nullptr); - password = gconf_client_get_string(conf, - HTTP_PROXY_DIR - "/authentication_password", - nullptr); - - if (user && password) { - auth = g_strdup_printf("%s:%s", user, password); - gAuth = auth; - } - - g_free(user); - g_free(password); - g_free(auth); - } - } - - g_object_unref(conf); - - // Don't dlclose gconfLib as libORBit-2 uses atexit(). -} -#endif - -gpointer SendThread(gpointer args) -{ - string response, error; - long response_code; - - bool success = google_breakpad::HTTPUpload::SendRequest - (gSendURL, - gQueryParameters, - gFiles, - gHttpProxy, gAuth, - gCACertificateFile, - &response, - &response_code, - &error); - if (success) { - LogMessage("Crash report submitted successfully"); - } - else { - LogMessage("Crash report submission failed: " + error); - } - - SendCompleted(success, response); - // Apparently glib is threadsafe, and will schedule this - // on the main thread, see: - // http://library.gnome.org/devel/gtk-faq/stable/x499.html - g_idle_add(ReportCompleted, (gpointer)success); - - return nullptr; -} - -gboolean WindowDeleted(GtkWidget* window, - GdkEvent* event, - gpointer userData) -{ - SaveSettings(); - gtk_main_quit(); - return TRUE; -} - -gboolean check_escape(GtkWidget* window, - GdkEventKey* event, - gpointer userData) -{ - if (event->keyval == GDK_KEY_Escape) { - gtk_main_quit(); - return TRUE; - } - return FALSE; -} - -static void MaybeSubmitReport() -{ - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gSubmitReportCheck))) { - gDidTrySend = true; - SendReport(); - } else { - gtk_main_quit(); - } -} - -void CloseClicked(GtkButton* button, - gpointer userData) -{ - SaveSettings(); - MaybeSubmitReport(); -} - -void RestartClicked(GtkButton* button, - gpointer userData) -{ - SaveSettings(); - RestartApplication(); - MaybeSubmitReport(); -} - -static void UpdateURL() -{ - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gIncludeURLCheck))) { - gQueryParameters["URL"] = gURLParameter; - } else { - gQueryParameters.erase("URL"); - } -} - -void SubmitReportChecked(GtkButton* sender, gpointer userData) -{ - UpdateSubmit(); -} - -void IncludeURLClicked(GtkButton* sender, gpointer userData) -{ - UpdateURL(); -} - -/* === Crashreporter UI Functions === */ - -bool UIInit() -{ - // breakpad probably left us with blocked signals, unblock them here - sigset_t signals, old; - sigfillset(&signals); - sigprocmask(SIG_UNBLOCK, &signals, &old); - - // tell glib we're going to use threads - g_thread_init(nullptr); - - if (gtk_init_check(&gArgc, &gArgv)) { - gInitialized = true; - - if (gStrings.find("isRTL") != gStrings.end() && - gStrings["isRTL"] == "yes") - gtk_widget_set_default_direction(GTK_TEXT_DIR_RTL); - - return true; - } - - return false; -} - -void UIShowDefaultUI() -{ - GtkWidget* errorDialog = - gtk_message_dialog_new(nullptr, GTK_DIALOG_MODAL, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - "%s", gStrings[ST_CRASHREPORTERDEFAULT].c_str()); - - gtk_window_set_title(GTK_WINDOW(errorDialog), - gStrings[ST_CRASHREPORTERTITLE].c_str()); - gtk_dialog_run(GTK_DIALOG(errorDialog)); -} - -void UIError_impl(const string& message) -{ - if (!gInitialized) { - // Didn't initialize, this is the best we can do - printf("Error: %s\n", message.c_str()); - return; - } - - GtkWidget* errorDialog = - gtk_message_dialog_new(nullptr, GTK_DIALOG_MODAL, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - "%s", message.c_str()); - - gtk_window_set_title(GTK_WINDOW(errorDialog), - gStrings[ST_CRASHREPORTERTITLE].c_str()); - gtk_dialog_run(GTK_DIALOG(errorDialog)); -} - -bool UIGetIniPath(string& path) -{ - path = gArgv[0]; - path.append(".ini"); - - return true; -} - -/* - * Settings are stored in ~/.vendor/product, or - * ~/.product if vendor is empty. - */ -bool UIGetSettingsPath(const string& vendor, - const string& product, - string& settingsPath) -{ - char* home = getenv("HOME"); - - if (!home) - return false; - - settingsPath = home; - settingsPath += "/."; - if (!vendor.empty()) { - string lc_vendor; - std::transform(vendor.begin(), vendor.end(), back_inserter(lc_vendor), - (int(*)(int)) std::tolower); - settingsPath += lc_vendor + "/"; - } - string lc_product; - std::transform(product.begin(), product.end(), back_inserter(lc_product), - (int(*)(int)) std::tolower); - settingsPath += lc_product + "/Crash Reports"; - return true; -} - -bool UIEnsurePathExists(const string& path) -{ - int ret = mkdir(path.c_str(), S_IRWXU); - int e = errno; - if (ret == -1 && e != EEXIST) - return false; - - return true; -} - -bool UIFileExists(const string& path) -{ - struct stat sb; - int ret = stat(path.c_str(), &sb); - if (ret == -1 || !(sb.st_mode & S_IFREG)) - return false; - - return true; -} - -bool UIMoveFile(const string& file, const string& newfile) -{ - if (!rename(file.c_str(), newfile.c_str())) - return true; - if (errno != EXDEV) - return false; - - // use system /bin/mv instead, time to fork - pid_t pID = vfork(); - if (pID < 0) { - // Failed to fork - return false; - } - if (pID == 0) { - char* const args[4] = { - const_cast("mv"), - strdup(file.c_str()), - strdup(newfile.c_str()), - 0 - }; - if (args[1] && args[2]) - execve("/bin/mv", args, 0); - free(args[1]); - free(args[2]); - exit(-1); - } - int status; - waitpid(pID, &status, 0); - return UIFileExists(newfile); -} - -bool UIDeleteFile(const string& file) -{ - return (unlink(file.c_str()) != -1); -} - -std::ifstream* UIOpenRead(const string& filename) -{ - return new std::ifstream(filename.c_str(), std::ios::in); -} - -std::ofstream* UIOpenWrite(const string& filename, - bool append, // append=false - bool binary) // binary=false -{ - std::ios_base::openmode mode = std::ios::out; - - if (append) { - mode = mode | std::ios::app; - } - - if (binary) { - mode = mode | std::ios::binary; - } - - return new std::ofstream(filename.c_str(), mode); -} diff --git a/toolkit/crashreporter/client/crashreporter_gtk_common.h b/toolkit/crashreporter/client/crashreporter_gtk_common.h deleted file mode 100644 index 3a6350c5b..000000000 --- a/toolkit/crashreporter/client/crashreporter_gtk_common.h +++ /dev/null @@ -1,50 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef CRASHREPORTER_GTK_COMMON_H__ -#define CRASHREPORTER_GTK_COMMON_H__ - -#include -#include - -#include -#include - -const char kIniFile[] = "crashreporter.ini"; - -extern GtkWidget* gWindow; -extern GtkWidget* gSubmitReportCheck; -extern GtkWidget* gIncludeURLCheck; -extern GtkWidget* gThrobber; -extern GtkWidget* gProgressLabel; -extern GtkWidget* gCloseButton; -extern GtkWidget* gRestartButton; - -extern std::vector gRestartArgs; -extern GThread* gSendThreadID; - -extern bool gInitialized; -extern bool gDidTrySend; -extern StringTable gFiles; -extern StringTable gQueryParameters; -extern std::string gHttpProxy; -extern std::string gAuth; -extern std::string gCACertificateFile; -extern std::string gSendURL; -extern std::string gURLParameter; - -void LoadProxyinfo(); -gpointer SendThread(gpointer args); -gboolean WindowDeleted(GtkWidget* window, - GdkEvent* event, - gpointer userData); -gboolean check_escape(GtkWidget* window, GdkEventKey* event, gpointer data); -void SubmitReportChecked(GtkButton* sender, gpointer userData); -void IncludeURLClicked(GtkButton* sender, gpointer userData); -void CloseClicked(GtkButton* button, - gpointer userData); -void RestartClicked(GtkButton* button, - gpointer userData); - -#endif // CRASHREPORTER_GTK_COMMON_H__ diff --git a/toolkit/crashreporter/client/crashreporter_linux.cpp b/toolkit/crashreporter/client/crashreporter_linux.cpp deleted file mode 100644 index 6e7ccce40..000000000 --- a/toolkit/crashreporter/client/crashreporter_linux.cpp +++ /dev/null @@ -1,576 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include -#include -#include -#include -#include - -#include - -#include "crashreporter.h" -#include "crashreporter_gtk_common.h" - -#define LABEL_MAX_CHAR_WIDTH 48 - -using std::string; -using std::vector; - -using namespace CrashReporter; - -static GtkWidget* gViewReportButton = 0; -static GtkWidget* gCommentTextLabel = 0; -static GtkWidget* gCommentText = 0; -static GtkWidget* gEmailMeCheck = 0; -static GtkWidget* gEmailEntryLabel = 0; -static GtkWidget* gEmailEntry = 0; - -static bool gEmailFieldHint = true; -static bool gCommentFieldHint = true; - -// handle from dlopen'ing libgnome -static void* gnomeLib = nullptr; -// handle from dlopen'ing libgnomeui -static void* gnomeuiLib = nullptr; - -static void LoadSettings() -{ - /* - * NOTE! This code needs to stay in sync with the preference checking - * code in in nsExceptionHandler.cpp. - */ - - StringTable settings; - if (ReadStringsFromFile(gSettingsPath + "/" + kIniFile, settings, true)) { - if (settings.find("Email") != settings.end()) { - gtk_entry_set_text(GTK_ENTRY(gEmailEntry), settings["Email"].c_str()); - gEmailFieldHint = false; - } - if (settings.find("EmailMe") != settings.end()) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gEmailMeCheck), - settings["EmailMe"][0] != '0'); - } - if (settings.find("IncludeURL") != settings.end() && - gIncludeURLCheck != 0) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gIncludeURLCheck), - settings["IncludeURL"][0] != '0'); - } - bool enabled; - if (settings.find("SubmitReport") != settings.end()) - enabled = settings["SubmitReport"][0] != '0'; - else - enabled = ShouldEnableSending(); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gSubmitReportCheck), - enabled); - } -} - -void SaveSettings() -{ - /* - * NOTE! This code needs to stay in sync with the preference setting - * code in in nsExceptionHandler.cpp. - */ - - StringTable settings; - - ReadStringsFromFile(gSettingsPath + "/" + kIniFile, settings, true); - if (!gEmailFieldHint) - settings["Email"] = gtk_entry_get_text(GTK_ENTRY(gEmailEntry)); - else - settings.erase("Email"); - - settings["EmailMe"] = - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gEmailMeCheck)) ? "1" : "0"; - if (gIncludeURLCheck != 0) - settings["IncludeURL"] = - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gIncludeURLCheck)) - ? "1" : "0"; - settings["SubmitReport"] = - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gSubmitReportCheck)) - ? "1" : "0"; - - WriteStringsToFile(gSettingsPath + "/" + kIniFile, - "Crash Reporter", settings, true); -} - -void SendReport() -{ - // disable all our gui controls, show the throbber + change the progress text - gtk_widget_set_sensitive(gSubmitReportCheck, FALSE); - gtk_widget_set_sensitive(gViewReportButton, FALSE); - gtk_widget_set_sensitive(gCommentText, FALSE); - if (gIncludeURLCheck) - gtk_widget_set_sensitive(gIncludeURLCheck, FALSE); - gtk_widget_set_sensitive(gEmailMeCheck, FALSE); - gtk_widget_set_sensitive(gEmailEntry, FALSE); - gtk_widget_set_sensitive(gCloseButton, FALSE); - if (gRestartButton) - gtk_widget_set_sensitive(gRestartButton, FALSE); - gtk_widget_show_all(gThrobber); - gtk_label_set_text(GTK_LABEL(gProgressLabel), - gStrings[ST_REPORTDURINGSUBMIT].c_str()); - -#ifdef MOZ_ENABLE_GCONF - LoadProxyinfo(); -#endif - - // and spawn a thread to do the sending - GError* err; - gSendThreadID = g_thread_create(SendThread, nullptr, TRUE, &err); -} - -static void ShowReportInfo(GtkTextView* viewReportTextView) -{ - GtkTextBuffer* buffer = - gtk_text_view_get_buffer(viewReportTextView); - - GtkTextIter start, end; - gtk_text_buffer_get_start_iter(buffer, &start); - gtk_text_buffer_get_end_iter(buffer, &end); - - gtk_text_buffer_delete(buffer, &start, &end); - - for (StringTable::iterator iter = gQueryParameters.begin(); - iter != gQueryParameters.end(); - iter++) { - gtk_text_buffer_insert(buffer, &end, iter->first.c_str(), -1); - gtk_text_buffer_insert(buffer, &end, ": ", -1); - gtk_text_buffer_insert(buffer, &end, iter->second.c_str(), -1); - gtk_text_buffer_insert(buffer, &end, "\n", -1); - } - - gtk_text_buffer_insert(buffer, &end, "\n", -1); - gtk_text_buffer_insert(buffer, &end, - gStrings[ST_EXTRAREPORTINFO].c_str(), -1); -} - -void UpdateSubmit() -{ - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gSubmitReportCheck))) { - gtk_widget_set_sensitive(gViewReportButton, TRUE); - gtk_widget_set_sensitive(gCommentText, TRUE); - if (gIncludeURLCheck) - gtk_widget_set_sensitive(gIncludeURLCheck, TRUE); - gtk_widget_set_sensitive(gEmailMeCheck, TRUE); - gtk_widget_set_sensitive(gEmailEntry, - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gEmailMeCheck))); - gtk_label_set_text(GTK_LABEL(gProgressLabel), - gStrings[ST_REPORTPRESUBMIT].c_str()); - } else { - gtk_widget_set_sensitive(gViewReportButton, FALSE); - gtk_widget_set_sensitive(gCommentText, FALSE); - if (gIncludeURLCheck) - gtk_widget_set_sensitive(gIncludeURLCheck, FALSE); - gtk_widget_set_sensitive(gEmailMeCheck, FALSE); - gtk_widget_set_sensitive(gEmailEntry, FALSE); - gtk_label_set_text(GTK_LABEL(gProgressLabel), ""); - } -} - -static void ViewReportClicked(GtkButton* button, - gpointer userData) -{ - GtkDialog* dialog = - GTK_DIALOG(gtk_dialog_new_with_buttons(gStrings[ST_VIEWREPORTTITLE].c_str(), - GTK_WINDOW(gWindow), - GTK_DIALOG_MODAL, - GTK_STOCK_OK, - GTK_RESPONSE_OK, - nullptr)); - - GtkWidget* scrolled = gtk_scrolled_window_new(0, 0); - gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(dialog)), scrolled); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), - GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), - GTK_SHADOW_IN); -#if (MOZ_WIDGET_GTK >= 3) - gtk_widget_set_vexpand(scrolled, TRUE); -#endif - - GtkWidget* viewReportTextView = gtk_text_view_new(); - gtk_container_add(GTK_CONTAINER(scrolled), viewReportTextView); - gtk_text_view_set_editable(GTK_TEXT_VIEW(viewReportTextView), FALSE); - gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(viewReportTextView), - GTK_WRAP_WORD); - gtk_widget_set_size_request(GTK_WIDGET(viewReportTextView), -1, 100); - - ShowReportInfo(GTK_TEXT_VIEW(viewReportTextView)); - - gtk_dialog_set_default_response(dialog, GTK_RESPONSE_OK); - gtk_widget_set_size_request(GTK_WIDGET(dialog), 400, 200); - gtk_widget_show_all(GTK_WIDGET(dialog)); - gtk_dialog_run(dialog); - gtk_widget_destroy(GTK_WIDGET(dialog)); -} - -static void CommentChanged(GtkTextBuffer* buffer, gpointer userData) -{ - GtkTextIter start, end; - gtk_text_buffer_get_start_iter(buffer, &start); - gtk_text_buffer_get_end_iter(buffer, &end); - const char* comment = gtk_text_buffer_get_text(buffer, &start, &end, TRUE); - if (comment[0] == '\0' || gCommentFieldHint) - gQueryParameters.erase("Comments"); - else - gQueryParameters["Comments"] = comment; -} - -static void CommentInsert(GtkTextBuffer* buffer, - GtkTextIter* location, - gchar* text, - gint len, - gpointer userData) -{ - GtkTextIter start, end; - gtk_text_buffer_get_start_iter(buffer, &start); - gtk_text_buffer_get_end_iter(buffer, &end); - const char* comment = gtk_text_buffer_get_text(buffer, &start, &end, TRUE); - - // limit to 500 bytes in utf-8 - if (strlen(comment) + len > MAX_COMMENT_LENGTH) { - g_signal_stop_emission_by_name(buffer, "insert-text"); - } -} - -static void UpdateHintText(GtkWidget* widget, gboolean gainedFocus, - bool* hintShowing, const char* hintText) -{ - GtkTextBuffer* buffer = nullptr; - if (GTK_IS_TEXT_VIEW(widget)) - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); - - if (gainedFocus) { - if (*hintShowing) { - if (buffer == nullptr) { // sort of cheating - gtk_entry_set_text(GTK_ENTRY(widget), ""); - } - else { // GtkTextView - gtk_text_buffer_set_text(buffer, "", 0); - } - gtk_widget_modify_text(widget, GTK_STATE_NORMAL, nullptr); - *hintShowing = false; - } - } - else { - // lost focus - const char* text = nullptr; - if (buffer == nullptr) { - text = gtk_entry_get_text(GTK_ENTRY(widget)); - } - else { - GtkTextIter start, end; - gtk_text_buffer_get_start_iter(buffer, &start); - gtk_text_buffer_get_end_iter(buffer, &end); - text = gtk_text_buffer_get_text(buffer, &start, &end, TRUE); - } - - if (text == nullptr || text[0] == '\0') { - *hintShowing = true; - - if (buffer == nullptr) { - gtk_entry_set_text(GTK_ENTRY(widget), hintText); - } - else { - gtk_text_buffer_set_text(buffer, hintText, -1); - } - - gtk_widget_modify_text(widget, GTK_STATE_NORMAL, - >k_widget_get_style(widget)->text[GTK_STATE_INSENSITIVE]); - } - } -} - -static gboolean CommentFocusChange(GtkWidget* widget, GdkEventFocus* event, - gpointer userData) -{ - UpdateHintText(widget, event->in, &gCommentFieldHint, - gStrings[ST_COMMENTGRAYTEXT].c_str()); - - return FALSE; -} - -static void UpdateEmail() -{ - const char* email = gtk_entry_get_text(GTK_ENTRY(gEmailEntry)); - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gEmailMeCheck))) { - gtk_widget_set_sensitive(gEmailEntry, TRUE); - } else { - email = ""; - gtk_widget_set_sensitive(gEmailEntry, FALSE); - } - if (email[0] == '\0' || gEmailFieldHint) - gQueryParameters.erase("Email"); - else - gQueryParameters["Email"] = email; -} - -static void EmailMeClicked(GtkButton* sender, gpointer userData) -{ - UpdateEmail(); -} - -static void EmailChanged(GtkEditable* editable, gpointer userData) -{ - UpdateEmail(); -} - -static gboolean EmailFocusChange(GtkWidget* widget, GdkEventFocus* event, - gpointer userData) -{ - UpdateHintText(widget, event->in, &gEmailFieldHint, - gStrings[ST_EMAILGRAYTEXT].c_str()); - - return FALSE; -} - -typedef struct _GnomeProgram GnomeProgram; -typedef struct _GnomeModuleInfo GnomeModuleInfo; -typedef GnomeProgram * (*_gnome_program_init_fn)(const char *, const char *, - const GnomeModuleInfo *, int, - char **, const char *, ...); -typedef const GnomeModuleInfo * (*_libgnomeui_module_info_get_fn)(); - -void TryInitGnome() -{ - gnomeLib = dlopen("libgnome-2.so.0", RTLD_LAZY); - if (!gnomeLib) - return; - - gnomeuiLib = dlopen("libgnomeui-2.so.0", RTLD_LAZY); - if (!gnomeuiLib) - return; - - _gnome_program_init_fn gnome_program_init = - (_gnome_program_init_fn)(dlsym(gnomeLib, "gnome_program_init")); - _libgnomeui_module_info_get_fn libgnomeui_module_info_get = - (_libgnomeui_module_info_get_fn)(dlsym(gnomeuiLib, "libgnomeui_module_info_get")); - - if (gnome_program_init && libgnomeui_module_info_get) { - gnome_program_init("crashreporter", "1.0", libgnomeui_module_info_get(), - gArgc, gArgv, nullptr); - } - -} - -/* === Crashreporter UI Functions === */ - -/* - * Anything not listed here is in crashreporter_gtk_common.cpp: - * UIInit - * UIShowDefaultUI - * UIError_impl - * UIGetIniPath - * UIGetSettingsPath - * UIEnsurePathExists - * UIFileExists - * UIMoveFile - * UIDeleteFile - * UIOpenRead - * UIOpenWrite - */ - -void UIShutdown() -{ - if (gnomeuiLib) - dlclose(gnomeuiLib); - // Don't dlclose gnomeLib as libgnomevfs and libORBit-2 use atexit(). -} - -bool UIShowCrashUI(const StringTable& files, - const StringTable& queryParameters, - const string& sendURL, - const vector& restartArgs) -{ - gFiles = files; - gQueryParameters = queryParameters; - gSendURL = sendURL; - gRestartArgs = restartArgs; - if (gQueryParameters.find("URL") != gQueryParameters.end()) - gURLParameter = gQueryParameters["URL"]; - - gWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_title(GTK_WINDOW(gWindow), - gStrings[ST_CRASHREPORTERTITLE].c_str()); - gtk_window_set_resizable(GTK_WINDOW(gWindow), FALSE); - gtk_window_set_position(GTK_WINDOW(gWindow), GTK_WIN_POS_CENTER); - gtk_container_set_border_width(GTK_CONTAINER(gWindow), 12); - g_signal_connect(gWindow, "delete-event", G_CALLBACK(WindowDeleted), 0); - g_signal_connect(gWindow, "key_press_event", G_CALLBACK(check_escape), nullptr); - - GtkWidget* vbox = gtk_vbox_new(FALSE, 6); - gtk_container_add(GTK_CONTAINER(gWindow), vbox); - - GtkWidget* titleLabel = gtk_label_new(""); - gtk_box_pack_start(GTK_BOX(vbox), titleLabel, FALSE, FALSE, 0); - gtk_misc_set_alignment(GTK_MISC(titleLabel), 0, 0.5); - char* markup = g_strdup_printf("%s", - gStrings[ST_CRASHREPORTERHEADER].c_str()); - gtk_label_set_markup(GTK_LABEL(titleLabel), markup); - g_free(markup); - - GtkWidget* descriptionLabel = - gtk_label_new(gStrings[ST_CRASHREPORTERDESCRIPTION].c_str()); - gtk_box_pack_start(GTK_BOX(vbox), descriptionLabel, TRUE, TRUE, 0); - // force the label to line wrap -#if (MOZ_WIDGET_GTK == 2) - gtk_widget_set_size_request(descriptionLabel, 400, -1); -#else - gtk_label_set_max_width_chars(GTK_LABEL(descriptionLabel), LABEL_MAX_CHAR_WIDTH); -#endif - gtk_label_set_line_wrap(GTK_LABEL(descriptionLabel), TRUE); - gtk_label_set_selectable(GTK_LABEL(descriptionLabel), TRUE); - gtk_misc_set_alignment(GTK_MISC(descriptionLabel), 0, 0.5); - - // this is honestly how they suggest you indent a section - GtkWidget* indentBox = gtk_hbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(vbox), indentBox, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(indentBox), gtk_label_new(""), FALSE, FALSE, 6); - - GtkWidget* innerVBox1 = gtk_vbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(indentBox), innerVBox1, TRUE, TRUE, 0); - - gSubmitReportCheck = - gtk_check_button_new_with_label(gStrings[ST_CHECKSUBMIT].c_str()); - gtk_box_pack_start(GTK_BOX(innerVBox1), gSubmitReportCheck, FALSE, FALSE, 0); - g_signal_connect(gSubmitReportCheck, "clicked", - G_CALLBACK(SubmitReportChecked), 0); - - // indent again, below the "submit report" checkbox - GtkWidget* indentBox2 = gtk_hbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(innerVBox1), indentBox2, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(indentBox2), gtk_label_new(""), FALSE, FALSE, 6); - - GtkWidget* innerVBox = gtk_vbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(indentBox2), innerVBox, TRUE, TRUE, 0); - gtk_box_set_spacing(GTK_BOX(innerVBox), 6); - - GtkWidget* viewReportButtonBox = gtk_hbutton_box_new(); - gtk_box_pack_start(GTK_BOX(innerVBox), viewReportButtonBox, FALSE, FALSE, 0); - gtk_box_set_spacing(GTK_BOX(viewReportButtonBox), 6); - gtk_button_box_set_layout(GTK_BUTTON_BOX(viewReportButtonBox), GTK_BUTTONBOX_START); - - gViewReportButton = - gtk_button_new_with_label(gStrings[ST_VIEWREPORT].c_str()); - gtk_box_pack_start(GTK_BOX(viewReportButtonBox), gViewReportButton, FALSE, FALSE, 0); - g_signal_connect(gViewReportButton, "clicked", G_CALLBACK(ViewReportClicked), 0); - - GtkWidget* scrolled = gtk_scrolled_window_new(0, 0); - gtk_container_add(GTK_CONTAINER(innerVBox), scrolled); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), - GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), - GTK_SHADOW_IN); -#if (MOZ_WIDGET_GTK >= 3) - gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrolled), 100); -#endif - - gCommentTextLabel = gtk_label_new(gStrings[ST_COMMENTGRAYTEXT].c_str()); - gCommentText = gtk_text_view_new(); - gtk_label_set_mnemonic_widget(GTK_LABEL(gCommentTextLabel), gCommentText); - gtk_text_view_set_accepts_tab(GTK_TEXT_VIEW(gCommentText), FALSE); - g_signal_connect(gCommentText, "focus-in-event", G_CALLBACK(CommentFocusChange), 0); - g_signal_connect(gCommentText, "focus-out-event", G_CALLBACK(CommentFocusChange), 0); - - GtkTextBuffer* commentBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gCommentText)); - g_signal_connect(commentBuffer, "changed", G_CALLBACK(CommentChanged), 0); - g_signal_connect(commentBuffer, "insert-text", G_CALLBACK(CommentInsert), 0); - - gtk_container_add(GTK_CONTAINER(scrolled), gCommentText); - gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(gCommentText), - GTK_WRAP_WORD); - gtk_widget_set_size_request(GTK_WIDGET(gCommentText), -1, 100); - - if (gQueryParameters.find("URL") != gQueryParameters.end()) { - gIncludeURLCheck = - gtk_check_button_new_with_label(gStrings[ST_CHECKURL].c_str()); - gtk_box_pack_start(GTK_BOX(innerVBox), gIncludeURLCheck, FALSE, FALSE, 0); - g_signal_connect(gIncludeURLCheck, "clicked", G_CALLBACK(IncludeURLClicked), 0); - // on by default - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gIncludeURLCheck), TRUE); - } - - gEmailMeCheck = - gtk_check_button_new_with_label(gStrings[ST_CHECKEMAIL].c_str()); - gtk_box_pack_start(GTK_BOX(innerVBox), gEmailMeCheck, FALSE, FALSE, 0); - g_signal_connect(gEmailMeCheck, "clicked", G_CALLBACK(EmailMeClicked), 0); - - GtkWidget* emailIndentBox = gtk_hbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(innerVBox), emailIndentBox, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(emailIndentBox), gtk_label_new(""), - FALSE, FALSE, 9); - - gEmailEntryLabel = gtk_label_new(gStrings[ST_EMAILGRAYTEXT].c_str()); - gEmailEntry = gtk_entry_new(); - gtk_label_set_mnemonic_widget(GTK_LABEL(gEmailEntryLabel), gEmailEntry); - gtk_box_pack_start(GTK_BOX(emailIndentBox), gEmailEntry, TRUE, TRUE, 0); - g_signal_connect(gEmailEntry, "changed", G_CALLBACK(EmailChanged), 0); - g_signal_connect(gEmailEntry, "focus-in-event", G_CALLBACK(EmailFocusChange), 0); - g_signal_connect(gEmailEntry, "focus-out-event", G_CALLBACK(EmailFocusChange), 0); - - GtkWidget* progressBox = gtk_hbox_new(FALSE, 6); - gtk_box_pack_start(GTK_BOX(vbox), progressBox, TRUE, TRUE, 0); - - // Get the throbber image from alongside the executable - char* dir = g_path_get_dirname(gArgv[0]); - char* path = g_build_filename(dir, "Throbber-small.gif", nullptr); - g_free(dir); - gThrobber = gtk_image_new_from_file(path); - gtk_box_pack_start(GTK_BOX(progressBox), gThrobber, FALSE, FALSE, 0); - - gProgressLabel = - gtk_label_new(gStrings[ST_REPORTPRESUBMIT].c_str()); - gtk_box_pack_start(GTK_BOX(progressBox), gProgressLabel, TRUE, TRUE, 0); - // force the label to line wrap -#if (MOZ_WIDGET_GTK == 2) - gtk_widget_set_size_request(gProgressLabel, 400, -1); -#else - gtk_label_set_max_width_chars(GTK_LABEL(gProgressLabel), LABEL_MAX_CHAR_WIDTH); -#endif - gtk_label_set_line_wrap(GTK_LABEL(gProgressLabel), TRUE); - - GtkWidget* buttonBox = gtk_hbutton_box_new(); - gtk_box_pack_end(GTK_BOX(vbox), buttonBox, FALSE, FALSE, 0); - gtk_box_set_spacing(GTK_BOX(buttonBox), 6); - gtk_button_box_set_layout(GTK_BUTTON_BOX(buttonBox), GTK_BUTTONBOX_END); - - gCloseButton = - gtk_button_new_with_label(gStrings[ST_QUIT].c_str()); - gtk_box_pack_start(GTK_BOX(buttonBox), gCloseButton, FALSE, FALSE, 0); - gtk_widget_set_can_default(gCloseButton, TRUE); - g_signal_connect(gCloseButton, "clicked", G_CALLBACK(CloseClicked), 0); - - gRestartButton = 0; - if (restartArgs.size() > 0) { - gRestartButton = gtk_button_new_with_label(gStrings[ST_RESTART].c_str()); - gtk_box_pack_start(GTK_BOX(buttonBox), gRestartButton, FALSE, FALSE, 0); - gtk_widget_set_can_default(gRestartButton, TRUE); - g_signal_connect(gRestartButton, "clicked", G_CALLBACK(RestartClicked), 0); - } - - gtk_widget_grab_focus(gSubmitReportCheck); - - gtk_widget_grab_default(gRestartButton ? gRestartButton : gCloseButton); - - LoadSettings(); - - UpdateEmail(); - UpdateSubmit(); - - UpdateHintText(gCommentText, FALSE, &gCommentFieldHint, - gStrings[ST_COMMENTGRAYTEXT].c_str()); - UpdateHintText(gEmailEntry, FALSE, &gEmailFieldHint, - gStrings[ST_EMAILGRAYTEXT].c_str()); - - gtk_widget_show_all(gWindow); - // stick this here to avoid the show_all above... - gtk_widget_hide(gThrobber); - - gtk_main(); - - return gDidTrySend; -} diff --git a/toolkit/crashreporter/client/crashreporter_osx.h b/toolkit/crashreporter/client/crashreporter_osx.h deleted file mode 100644 index e274de0de..000000000 --- a/toolkit/crashreporter/client/crashreporter_osx.h +++ /dev/null @@ -1,107 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef CRASHREPORTER_OSX_H__ -#define CRASHREPORTER_OSX_H__ - -#include -#include "HTTPMultipartUpload.h" -#include "crashreporter.h" - -// Defined below -@class TextViewWithPlaceHolder; - -@interface CrashReporterUI : NSObject -{ - IBOutlet NSWindow* mWindow; - - /* Crash reporter view */ - IBOutlet NSTextField* mHeaderLabel; - IBOutlet NSTextField* mDescriptionLabel; - IBOutlet NSButton* mViewReportButton; - IBOutlet NSScrollView* mCommentScrollView; - IBOutlet TextViewWithPlaceHolder* mCommentText; - IBOutlet NSButton* mSubmitReportButton; - IBOutlet NSButton* mIncludeURLButton; - IBOutlet NSButton* mEmailMeButton; - IBOutlet NSTextField* mEmailText; - IBOutlet NSButton* mCloseButton; - IBOutlet NSButton* mRestartButton; - IBOutlet NSProgressIndicator* mProgressIndicator; - IBOutlet NSTextField* mProgressText; - - /* Error view */ - IBOutlet NSView* mErrorView; - IBOutlet NSTextField* mErrorHeaderLabel; - IBOutlet NSTextField* mErrorLabel; - IBOutlet NSButton* mErrorCloseButton; - - /* For "show info" alert */ - IBOutlet NSWindow* mViewReportWindow; - IBOutlet NSTextView* mViewReportTextView; - IBOutlet NSButton* mViewReportOkButton; - - HTTPMultipartUpload* mPost; -} - -- (void)showCrashUI:(const StringTable&)files - queryParameters:(const StringTable&)queryParameters - sendURL:(const std::string&)sendURL; -- (void)showErrorUI:(const std::string&)message; -- (void)showReportInfo; -- (void)maybeSubmitReport; -- (void)closeMeDown:(id)unused; - -- (IBAction)submitReportClicked:(id)sender; -- (IBAction)viewReportClicked:(id)sender; -- (IBAction)viewReportOkClicked:(id)sender; -- (IBAction)closeClicked:(id)sender; -- (IBAction)restartClicked:(id)sender; -- (IBAction)includeURLClicked:(id)sender; -- (IBAction)emailMeClicked:(id)sender; - -- (void)controlTextDidChange:(NSNotification *)note; -- (void)textDidChange:(NSNotification *)aNotification; -- (BOOL)textView:(NSTextView *)aTextView shouldChangeTextInRange:(NSRange)affectedCharRange replacementString:(NSString *)replacementString; - -- (void)doInitialResizing; -- (float)setStringFitVertically:(NSControl*)control - string:(NSString*)str - resizeWindow:(BOOL)resizeWindow; -- (void)setView:(NSView*)v animate: (BOOL) animate; -- (void)enableControls:(BOOL)enabled; -- (void)updateSubmit; -- (void)updateURL; -- (void)updateEmail; -- (void)sendReport; -- (bool)setupPost; -- (void)uploadThread:(HTTPMultipartUpload*)post; -- (void)uploadComplete:(NSData*)data; - --(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)theApplication; --(void)applicationWillTerminate:(NSNotification *)aNotification; - -@end - -/* - * Subclass NSTextView to provide a text view with placeholder text. - * Also provide a setEnabled implementation. - */ -@interface TextViewWithPlaceHolder : NSTextView { - NSMutableAttributedString *mPlaceHolderString; -} - -- (BOOL)becomeFirstResponder; -- (void)drawRect:(NSRect)rect; -- (BOOL)resignFirstResponder; -- (void)setPlaceholder:(NSString*)placeholder; -- (void)insertTab:(id)sender; -- (void)insertBacktab:(id)sender; -- (void)setEnabled:(BOOL)enabled; -- (void)dealloc; - -@end - -#endif diff --git a/toolkit/crashreporter/client/crashreporter_osx.mm b/toolkit/crashreporter/client/crashreporter_osx.mm deleted file mode 100644 index 0768d6da3..000000000 --- a/toolkit/crashreporter/client/crashreporter_osx.mm +++ /dev/null @@ -1,922 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#import -#import -#include "crashreporter.h" -#include "crashreporter_osx.h" -#include -#include -#include -#include -#include -#include - -using std::string; -using std::vector; -using std::ostringstream; - -using namespace CrashReporter; - -static NSAutoreleasePool* gMainPool; -static CrashReporterUI* gUI = 0; -static StringTable gFiles; -static StringTable gQueryParameters; -static string gURLParameter; -static string gSendURL; -static vector gRestartArgs; -static bool gDidTrySend = false; -static bool gRTLlayout = false; - -static cpu_type_t pref_cpu_types[2] = { -#if defined(__i386__) - CPU_TYPE_X86, -#elif defined(__x86_64__) - CPU_TYPE_X86_64, -#elif defined(__ppc__) - CPU_TYPE_POWERPC, -#endif - CPU_TYPE_ANY }; - -#define NSSTR(s) [NSString stringWithUTF8String:(s).c_str()] - -static NSString* Str(const char* aName) -{ - string str = gStrings[aName]; - if (str.empty()) str = "?"; - return NSSTR(str); -} - -static bool RestartApplication() -{ - vector argv(gRestartArgs.size() + 1); - - posix_spawnattr_t spawnattr; - if (posix_spawnattr_init(&spawnattr) != 0) { - return false; - } - - // Set spawn attributes. - size_t attr_count = sizeof(pref_cpu_types) / sizeof(pref_cpu_types[0]); - size_t attr_ocount = 0; - if (posix_spawnattr_setbinpref_np(&spawnattr, - attr_count, - pref_cpu_types, - &attr_ocount) != 0 || - attr_ocount != attr_count) { - posix_spawnattr_destroy(&spawnattr); - return false; - } - - unsigned int i; - for (i = 0; i < gRestartArgs.size(); i++) { - argv[i] = (char*)gRestartArgs[i].c_str(); - } - argv[i] = 0; - - char **env = NULL; - char ***nsEnv = _NSGetEnviron(); - if (nsEnv) - env = *nsEnv; - int result = posix_spawnp(NULL, - argv[0], - NULL, - &spawnattr, - &argv[0], - env); - - posix_spawnattr_destroy(&spawnattr); - - return result == 0; -} - -@implementation CrashReporterUI - --(void)awakeFromNib -{ - gUI = self; - [mWindow center]; - - [mWindow setTitle:[[NSBundle mainBundle] - objectForInfoDictionaryKey:@"CFBundleName"]]; -} - --(void)showCrashUI:(const StringTable&)files - queryParameters:(const StringTable&)queryParameters - sendURL:(const string&)sendURL -{ - gFiles = files; - gQueryParameters = queryParameters; - gSendURL = sendURL; - - [mWindow setTitle:Str(ST_CRASHREPORTERTITLE)]; - [mHeaderLabel setStringValue:Str(ST_CRASHREPORTERHEADER)]; - - NSRect viewReportFrame = [mViewReportButton frame]; - [mViewReportButton setTitle:Str(ST_VIEWREPORT)]; - [mViewReportButton sizeToFit]; - if (gRTLlayout) { - // sizeToFit will keep the left side fixed, so realign - float oldWidth = viewReportFrame.size.width; - viewReportFrame = [mViewReportButton frame]; - viewReportFrame.origin.x += oldWidth - viewReportFrame.size.width; - [mViewReportButton setFrame: viewReportFrame]; - } - - [mSubmitReportButton setTitle:Str(ST_CHECKSUBMIT)]; - [mIncludeURLButton setTitle:Str(ST_CHECKURL)]; - [mEmailMeButton setTitle:Str(ST_CHECKEMAIL)]; - [mViewReportOkButton setTitle:Str(ST_OK)]; - - [mCommentText setPlaceholder:Str(ST_COMMENTGRAYTEXT)]; - if (gRTLlayout) - [mCommentText toggleBaseWritingDirection:self]; - [[mEmailText cell] setPlaceholderString:Str(ST_EMAILGRAYTEXT)]; - - if (gQueryParameters.find("URL") != gQueryParameters.end()) { - // save the URL value in case the checkbox gets unchecked - gURLParameter = gQueryParameters["URL"]; - } - else { - // no URL specified, hide checkbox - [mIncludeURLButton removeFromSuperview]; - // shrink window to fit - NSRect frame = [mWindow frame]; - NSRect includeURLFrame = [mIncludeURLButton frame]; - NSRect emailFrame = [mEmailMeButton frame]; - int buttonMask = [mViewReportButton autoresizingMask]; - int checkMask = [mSubmitReportButton autoresizingMask]; - int commentScrollMask = [mCommentScrollView autoresizingMask]; - - [mViewReportButton setAutoresizingMask:NSViewMinYMargin]; - [mSubmitReportButton setAutoresizingMask:NSViewMinYMargin]; - [mCommentScrollView setAutoresizingMask:NSViewMinYMargin]; - - // remove all the space in between - frame.size.height -= includeURLFrame.origin.y - emailFrame.origin.y; - [mWindow setFrame:frame display: true animate:NO]; - - [mViewReportButton setAutoresizingMask:buttonMask]; - [mSubmitReportButton setAutoresizingMask:checkMask]; - [mCommentScrollView setAutoresizingMask:commentScrollMask]; - } - - // resize some buttons horizontally and possibly some controls vertically - [self doInitialResizing]; - - // load default state of submit checkbox - // we don't just do this via IB because we want the default to be - // off a certain percentage of the time - BOOL submitChecked = NO; - NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; - if (nil != [userDefaults objectForKey:@"submitReport"]) { - submitChecked = [userDefaults boolForKey:@"submitReport"]; - } - else { - // use compile-time specified enable percentage - submitChecked = ShouldEnableSending(); - [userDefaults setBool:submitChecked forKey:@"submitReport"]; - } - [mSubmitReportButton setState:(submitChecked ? NSOnState : NSOffState)]; - - [self updateSubmit]; - [self updateURL]; - [self updateEmail]; - - [mWindow makeKeyAndOrderFront:nil]; -} - --(void)showErrorUI:(const string&)message -{ - [self setView: mErrorView animate: NO]; - - [mErrorHeaderLabel setStringValue:Str(ST_CRASHREPORTERHEADER)]; - [self setStringFitVertically:mErrorLabel - string:NSSTR(message) - resizeWindow:YES]; - [mErrorCloseButton setTitle:Str(ST_OK)]; - - [mErrorCloseButton setKeyEquivalent:@"\r"]; - [mWindow makeFirstResponder:mErrorCloseButton]; - [mWindow makeKeyAndOrderFront:nil]; -} - --(void)showReportInfo -{ - NSDictionary* boldAttr = [NSDictionary - dictionaryWithObject: - [NSFont boldSystemFontOfSize: - [NSFont smallSystemFontSize]] - forKey:NSFontAttributeName]; - NSDictionary* normalAttr = [NSDictionary - dictionaryWithObject: - [NSFont systemFontOfSize: - [NSFont smallSystemFontSize]] - forKey:NSFontAttributeName]; - - [mViewReportTextView setString:@""]; - for (StringTable::iterator iter = gQueryParameters.begin(); - iter != gQueryParameters.end(); - iter++) { - NSAttributedString* key = [[NSAttributedString alloc] - initWithString:NSSTR(iter->first + ": ") - attributes:boldAttr]; - NSAttributedString* value = [[NSAttributedString alloc] - initWithString:NSSTR(iter->second + "\n") - attributes:normalAttr]; - [[mViewReportTextView textStorage] appendAttributedString: key]; - [[mViewReportTextView textStorage] appendAttributedString: value]; - [key release]; - [value release]; - } - - NSAttributedString* extra = [[NSAttributedString alloc] - initWithString:NSSTR("\n" + gStrings[ST_EXTRAREPORTINFO]) - attributes:normalAttr]; - [[mViewReportTextView textStorage] appendAttributedString: extra]; - [extra release]; -} - -- (void)maybeSubmitReport -{ - if ([mSubmitReportButton state] == NSOnState) { - [self setStringFitVertically:mProgressText - string:Str(ST_REPORTDURINGSUBMIT) - resizeWindow:YES]; - // disable all the controls - [self enableControls:NO]; - [mSubmitReportButton setEnabled:NO]; - [mRestartButton setEnabled:NO]; - [mCloseButton setEnabled:NO]; - [mProgressIndicator startAnimation:self]; - gDidTrySend = true; - [self sendReport]; - } else { - [NSApp terminate:self]; - } -} - -- (void)closeMeDown:(id)unused -{ - [NSApp terminate:self]; -} - --(IBAction)submitReportClicked:(id)sender -{ - [self updateSubmit]; - NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; - [userDefaults setBool:([mSubmitReportButton state] == NSOnState) - forKey:@"submitReport"]; - [userDefaults synchronize]; -} - --(IBAction)viewReportClicked:(id)sender -{ - [self showReportInfo]; - [NSApp beginSheet:mViewReportWindow modalForWindow:mWindow - modalDelegate:nil didEndSelector:nil contextInfo:nil]; -} - -- (IBAction)viewReportOkClicked:(id)sender -{ - [mViewReportWindow orderOut:nil]; - [NSApp endSheet:mViewReportWindow]; -} - --(IBAction)closeClicked:(id)sender -{ - [self maybeSubmitReport]; -} - --(IBAction)restartClicked:(id)sender -{ - RestartApplication(); - [self maybeSubmitReport]; -} - -- (IBAction)includeURLClicked:(id)sender -{ - [self updateURL]; -} - --(IBAction)emailMeClicked:(id)sender -{ - [self updateEmail]; -} - --(void)controlTextDidChange:(NSNotification *)note -{ - [self updateEmail]; -} - -- (void)textDidChange:(NSNotification *)aNotification -{ - // update comment parameter - if ([[[mCommentText textStorage] mutableString] length] > 0) - gQueryParameters["Comments"] = [[[mCommentText textStorage] mutableString] - UTF8String]; - else - gQueryParameters.erase("Comments"); -} - -// Limit the comment field to 500 bytes in UTF-8 -- (BOOL)textView:(NSTextView *)aTextView shouldChangeTextInRange:(NSRange)affectedCharRange replacementString:(NSString *)replacementString -{ - // current string length + replacement text length - replaced range length - if (([[aTextView string] - lengthOfBytesUsingEncoding:NSUTF8StringEncoding] - + [replacementString lengthOfBytesUsingEncoding:NSUTF8StringEncoding] - - [[[aTextView string] substringWithRange:affectedCharRange] - lengthOfBytesUsingEncoding:NSUTF8StringEncoding]) - > MAX_COMMENT_LENGTH) { - return NO; - } - return YES; -} - -- (void)doInitialResizing -{ - NSRect windowFrame = [mWindow frame]; - NSRect restartFrame = [mRestartButton frame]; - NSRect closeFrame = [mCloseButton frame]; - // resize close button to fit text - float oldCloseWidth = closeFrame.size.width; - [mCloseButton setTitle:Str(ST_QUIT)]; - [mCloseButton sizeToFit]; - closeFrame = [mCloseButton frame]; - // move close button left if it grew - if (!gRTLlayout) { - closeFrame.origin.x -= closeFrame.size.width - oldCloseWidth; - } - - if (gRestartArgs.size() == 0) { - [mRestartButton removeFromSuperview]; - if (!gRTLlayout) { - closeFrame.origin.x = restartFrame.origin.x + - (restartFrame.size.width - closeFrame.size.width); - } - else { - closeFrame.origin.x = restartFrame.origin.x; - } - [mCloseButton setFrame: closeFrame]; - [mCloseButton setKeyEquivalent:@"\r"]; - } else { - [mRestartButton setTitle:Str(ST_RESTART)]; - // resize "restart" button - float oldRestartWidth = restartFrame.size.width; - [mRestartButton sizeToFit]; - restartFrame = [mRestartButton frame]; - if (!gRTLlayout) { - // move left by the amount that the button grew - restartFrame.origin.x -= restartFrame.size.width - oldRestartWidth; - closeFrame.origin.x -= restartFrame.size.width - oldRestartWidth; - } - else { - // shift the close button right in RTL - closeFrame.origin.x += restartFrame.size.width - oldRestartWidth; - } - [mRestartButton setFrame: restartFrame]; - [mCloseButton setFrame: closeFrame]; - // possibly resize window if both buttons no longer fit - // leave 20 px from either side of the window, and 12 px - // between the buttons - float neededWidth = closeFrame.size.width + restartFrame.size.width + - 2*20 + 12; - - if (neededWidth > windowFrame.size.width) { - windowFrame.size.width = neededWidth; - [mWindow setFrame:windowFrame display: true animate: NO]; - } - [mRestartButton setKeyEquivalent:@"\r"]; - } - - NSButton *checkboxes[] = { - mSubmitReportButton, - mIncludeURLButton, - mEmailMeButton - }; - - for (int i=0; i<3; i++) { - NSRect frame = [checkboxes[i] frame]; - [checkboxes[i] sizeToFit]; - if (gRTLlayout) { - // sizeToFit will keep the left side fixed, so realign - float oldWidth = frame.size.width; - frame = [checkboxes[i] frame]; - frame.origin.x += oldWidth - frame.size.width; - [checkboxes[i] setFrame: frame]; - } - // keep existing spacing on left side, + 20 px spare on right - float neededWidth = frame.origin.x + frame.size.width + 20; - if (neededWidth > windowFrame.size.width) { - windowFrame.size.width = neededWidth; - [mWindow setFrame:windowFrame display: true animate: NO]; - } - } - - // do this down here because we may have made the window wider - // up above - [self setStringFitVertically:mDescriptionLabel - string:Str(ST_CRASHREPORTERDESCRIPTION) - resizeWindow:YES]; - - // now pin all the controls (except quit/submit) in place, - // if we lengthen the window after this, it's just to lengthen - // the progress text, so nothing above that text should move. - NSView* views[] = { - mSubmitReportButton, - mViewReportButton, - mCommentScrollView, - mIncludeURLButton, - mEmailMeButton, - mEmailText, - mProgressIndicator, - mProgressText - }; - for (unsigned int i=0; ifirst); - NSString* value = NSSTR(i->second); - if (key && value) { - [parameters setObject: value forKey: key]; - } else { - ostringstream message; - message << "Warning: skipping annotation '" << i->first - << "' due to malformed UTF-8 encoding"; - LogMessage(message.str()); - } - } - - for (StringTable::const_iterator i = gFiles.begin(); - i != gFiles.end(); - i++) { - [mPost addFileAtPath: NSSTR(i->second) name: NSSTR(i->first)]; - } - - [mPost setParameters: parameters]; - [parameters release]; - - return true; -} - --(void)uploadComplete:(NSData*)data -{ - NSHTTPURLResponse* response = [mPost response]; - [mPost release]; - - bool success; - string reply; - if (!data || !response || [response statusCode] != 200) { - success = false; - reply = ""; - - // if data is nil, we probably logged an error in uploadThread - if (data != nil && response != nil) { - ostringstream message; - message << "Crash report submission failed: server returned status " - << [response statusCode]; - LogMessage(message.str()); - } - } else { - success = true; - LogMessage("Crash report submitted successfully"); - - NSString* encodingName = [response textEncodingName]; - NSStringEncoding encoding; - if (encodingName) { - encoding = CFStringConvertEncodingToNSStringEncoding( - CFStringConvertIANACharSetNameToEncoding((CFStringRef)encodingName)); - } else { - encoding = NSISOLatin1StringEncoding; - } - NSString* r = [[NSString alloc] initWithData: data encoding: encoding]; - reply = [r UTF8String]; - [r release]; - } - - SendCompleted(success, reply); - - [mProgressIndicator stopAnimation:self]; - if (success) { - [self setStringFitVertically:mProgressText - string:Str(ST_REPORTSUBMITSUCCESS) - resizeWindow:YES]; - } else { - [self setStringFitVertically:mProgressText - string:Str(ST_SUBMITFAILED) - resizeWindow:YES]; - } - // quit after 5 seconds - [self performSelector:@selector(closeMeDown:) withObject:nil - afterDelay:5.0]; -} - --(void)uploadThread:(HTTPMultipartUpload*)post -{ - NSAutoreleasePool* autoreleasepool = [[NSAutoreleasePool alloc] init]; - NSError* error = nil; - NSData* data = [post send: &error]; - if (error) { - data = nil; - NSString* errorDesc = [error localizedDescription]; - string message = [errorDesc UTF8String]; - LogMessage("Crash report submission failed: " + message); - } - - [self performSelectorOnMainThread: @selector(uploadComplete:) - withObject: data - waitUntilDone: YES]; - - [autoreleasepool release]; -} - -// to get auto-quit when we close the window --(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)theApplication -{ - return YES; -} - --(void)applicationWillTerminate:(NSNotification *)aNotification -{ - // since we use [NSApp terminate:] we never return to main, - // so do our cleanup here - if (!gDidTrySend) - DeleteDump(); -} - -@end - -@implementation TextViewWithPlaceHolder - -- (BOOL)becomeFirstResponder -{ - [self setNeedsDisplay:YES]; - return [super becomeFirstResponder]; -} - -- (void)drawRect:(NSRect)rect -{ - [super drawRect:rect]; - if (mPlaceHolderString && [[self string] isEqualToString:@""] && - self != [[self window] firstResponder]) - [mPlaceHolderString drawInRect:[self frame]]; -} - -- (BOOL)resignFirstResponder -{ - [self setNeedsDisplay:YES]; - return [super resignFirstResponder]; -} - -- (void)setPlaceholder:(NSString*)placeholder -{ - NSColor* txtColor = [NSColor disabledControlTextColor]; - NSDictionary* txtDict = [NSDictionary - dictionaryWithObjectsAndKeys:txtColor, - NSForegroundColorAttributeName, nil]; - mPlaceHolderString = [[NSMutableAttributedString alloc] - initWithString:placeholder attributes:txtDict]; - if (gRTLlayout) - [mPlaceHolderString setAlignment:NSRightTextAlignment - range:NSMakeRange(0, [placeholder length])]; - -} - -- (void)insertTab:(id)sender -{ - // don't actually want to insert tabs, just tab to next control - [[self window] selectNextKeyView:sender]; -} - -- (void)insertBacktab:(id)sender -{ - [[self window] selectPreviousKeyView:sender]; -} - -- (void)setEnabled:(BOOL)enabled -{ - [self setSelectable:enabled]; - [self setEditable:enabled]; - if (![[self string] isEqualToString:@""]) { - NSAttributedString* colorString; - NSColor* txtColor; - if (enabled) - txtColor = [NSColor textColor]; - else - txtColor = [NSColor disabledControlTextColor]; - NSDictionary *txtDict = [NSDictionary - dictionaryWithObjectsAndKeys:txtColor, - NSForegroundColorAttributeName, nil]; - colorString = [[NSAttributedString alloc] - initWithString:[self string] - attributes:txtDict]; - [[self textStorage] setAttributedString: colorString]; - [self setInsertionPointColor:txtColor]; - [colorString release]; - } -} - -- (void)dealloc -{ - [mPlaceHolderString release]; - [super dealloc]; -} - -@end - -/* === Crashreporter UI Functions === */ - -bool UIInit() -{ - gMainPool = [[NSAutoreleasePool alloc] init]; - [NSApplication sharedApplication]; - - if (gStrings.find("isRTL") != gStrings.end() && - gStrings["isRTL"] == "yes") - gRTLlayout = true; - - [NSBundle loadNibNamed:(gRTLlayout ? @"MainMenuRTL" : @"MainMenu") - owner:NSApp]; - - return true; -} - -void UIShutdown() -{ - [gMainPool release]; -} - -void UIShowDefaultUI() -{ - [gUI showErrorUI: gStrings[ST_CRASHREPORTERDEFAULT]]; - [NSApp run]; -} - -bool UIShowCrashUI(const StringTable& files, - const StringTable& queryParameters, - const string& sendURL, - const vector& restartArgs) -{ - gRestartArgs = restartArgs; - - [gUI showCrashUI: files - queryParameters: queryParameters - sendURL: sendURL]; - [NSApp run]; - - return gDidTrySend; -} - -void UIError_impl(const string& message) -{ - if (!gUI) { - // UI failed to initialize, printing is the best we can do - printf("Error: %s\n", message.c_str()); - return; - } - - [gUI showErrorUI: message]; - [NSApp run]; -} - -bool UIGetIniPath(string& path) -{ - NSString* tmpPath = [NSString stringWithUTF8String:gArgv[0]]; - NSString* iniName = [tmpPath lastPathComponent]; - iniName = [iniName stringByAppendingPathExtension:@"ini"]; - tmpPath = [tmpPath stringByDeletingLastPathComponent]; - tmpPath = [tmpPath stringByDeletingLastPathComponent]; - tmpPath = [tmpPath stringByAppendingPathComponent:@"Resources"]; - tmpPath = [tmpPath stringByAppendingPathComponent:iniName]; - path = [tmpPath UTF8String]; - return true; -} - -bool UIGetSettingsPath(const string& vendor, - const string& product, - string& settingsPath) -{ - FSRef foundRef; - OSErr err = FSFindFolder(kUserDomain, kApplicationSupportFolderType, - kCreateFolder, &foundRef); - if (err != noErr) - return false; - - unsigned char path[PATH_MAX]; - FSRefMakePath(&foundRef, path, sizeof(path)); - NSString* destPath = [NSString stringWithUTF8String:reinterpret_cast(path)]; - - // Note that MacOS ignores the vendor when creating the profile hierarchy - - // all application preferences directories live alongside one another in - // ~/Library/Application Support/ - destPath = [destPath stringByAppendingPathComponent: NSSTR(product)]; - // Thunderbird stores its profile in ~/Library/Thunderbird, - // but we're going to put stuff in ~/Library/Application Support/Thunderbird - // anyway, so we have to ensure that path exists. - string tempPath = [destPath UTF8String]; - if (!UIEnsurePathExists(tempPath)) - return false; - - destPath = [destPath stringByAppendingPathComponent: @"Crash Reports"]; - - settingsPath = [destPath UTF8String]; - - return true; -} - -bool UIEnsurePathExists(const string& path) -{ - int ret = mkdir(path.c_str(), S_IRWXU); - int e = errno; - if (ret == -1 && e != EEXIST) - return false; - - return true; -} - -bool UIFileExists(const string& path) -{ - struct stat sb; - int ret = stat(path.c_str(), &sb); - if (ret == -1 || !(sb.st_mode & S_IFREG)) - return false; - - return true; -} - -bool UIMoveFile(const string& file, const string& newfile) -{ - if (!rename(file.c_str(), newfile.c_str())) - return true; - if (errno != EXDEV) - return false; - - NSFileManager *fileManager = [NSFileManager defaultManager]; - NSString *source = [fileManager stringWithFileSystemRepresentation:file.c_str() length:file.length()]; - NSString *dest = [fileManager stringWithFileSystemRepresentation:newfile.c_str() length:newfile.length()]; - if (!source || !dest) - return false; - - [fileManager moveItemAtPath:source toPath:dest error:NULL]; - return UIFileExists(newfile); -} - -bool UIDeleteFile(const string& file) -{ - return (unlink(file.c_str()) != -1); -} - -std::ifstream* UIOpenRead(const string& filename) -{ - return new std::ifstream(filename.c_str(), std::ios::in); -} - -std::ofstream* UIOpenWrite(const string& filename, - bool append, // append=false - bool binary) // binary=false -{ - std::ios_base::openmode mode = std::ios::out; - - if (append) { - mode = mode | std::ios::app; - } - - if (binary) { - mode = mode | std::ios::binary; - } - - return new std::ofstream(filename.c_str(), mode); -} diff --git a/toolkit/crashreporter/client/crashreporter_unix_common.cpp b/toolkit/crashreporter/client/crashreporter_unix_common.cpp deleted file mode 100644 index f42a35616..000000000 --- a/toolkit/crashreporter/client/crashreporter_unix_common.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "crashreporter.h" - -#include - -#include -#include -#include -#include - -using namespace CrashReporter; -using std::string; -using std::vector; -using std::sort; - -struct FileData -{ - time_t timestamp; - string path; -}; - -static bool CompareFDTime(const FileData& fd1, const FileData& fd2) -{ - return fd1.timestamp > fd2.timestamp; -} - -void UIPruneSavedDumps(const std::string& directory) -{ - DIR *dirfd = opendir(directory.c_str()); - if (!dirfd) - return; - - vector dumpfiles; - - while (dirent *dir = readdir(dirfd)) { - FileData fd; - fd.path = directory + '/' + dir->d_name; - if (fd.path.size() < 5) - continue; - - if (fd.path.compare(fd.path.size() - 4, 4, ".dmp") != 0) - continue; - - struct stat st; - if (stat(fd.path.c_str(), &st)) { - closedir(dirfd); - return; - } - - fd.timestamp = st.st_mtime; - - dumpfiles.push_back(fd); - } - - sort(dumpfiles.begin(), dumpfiles.end(), CompareFDTime); - - while (dumpfiles.size() > kSaveCount) { - // get the path of the oldest file - string path = dumpfiles[dumpfiles.size() - 1].path; - UIDeleteFile(path.c_str()); - - // s/.dmp/.extra/ - path.replace(path.size() - 4, 4, ".extra"); - UIDeleteFile(path.c_str()); - - dumpfiles.pop_back(); - } -} - -void UIRunMinidumpAnalyzer(const string& exename, const string& filename) -{ - // Run the minidump analyzer and wait for it to finish - pid_t pid = fork(); - - if (pid == -1) { - return; // Nothing to do upon failure - } else if (pid == 0) { - execl(exename.c_str(), exename.c_str(), filename.c_str(), nullptr); - } else { - waitpid(pid, nullptr, 0); - } -} diff --git a/toolkit/crashreporter/client/crashreporter_win.cpp b/toolkit/crashreporter/client/crashreporter_win.cpp deleted file mode 100644 index 57ca495ba..000000000 --- a/toolkit/crashreporter/client/crashreporter_win.cpp +++ /dev/null @@ -1,1568 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifdef WIN32_LEAN_AND_MEAN -#undef WIN32_LEAN_AND_MEAN -#endif - -#include "crashreporter.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "resource.h" -#include "client/windows/sender/crash_report_sender.h" -#include "common/windows/string_utils-inl.h" - -#define CRASH_REPORTER_VALUE L"Enabled" -#define SUBMIT_REPORT_VALUE L"SubmitCrashReport" -#define SUBMIT_REPORT_OLD L"SubmitReport" -#define INCLUDE_URL_VALUE L"IncludeURL" -#define EMAIL_ME_VALUE L"EmailMe" -#define EMAIL_VALUE L"Email" -#define MAX_EMAIL_LENGTH 1024 - -#define SENDURL_ORIGINAL L"https://crash-reports.mozilla.com/submit" -#define SENDURL_XPSP2 L"https://crash-reports-xpsp2.mozilla.com/submit" - -#define WM_UPLOADCOMPLETE WM_APP - -// Thanks, Windows.h :( -#undef min -#undef max - -using std::string; -using std::wstring; -using std::map; -using std::vector; -using std::set; -using std::ios; -using std::ifstream; -using std::ofstream; - -using namespace CrashReporter; - -typedef struct { - HWND hDlg; - map queryParameters; - map files; - wstring sendURL; - - wstring serverResponse; -} SendThreadData; - -/* - * Per http://msdn2.microsoft.com/en-us/library/ms645398(VS.85).aspx - * "The DLGTEMPLATEEX structure is not defined in any standard header file. - * The structure definition is provided here to explain the format of an - * extended template for a dialog box. -*/ -typedef struct { - WORD dlgVer; - WORD signature; - DWORD helpID; - DWORD exStyle; - // There's more to this struct, but it has weird variable-length - // members, and I only actually need to touch exStyle on an existing - // instance, so I've omitted the rest. -} DLGTEMPLATEEX; - -static HANDLE gThreadHandle; -static SendThreadData gSendData = { 0, }; -static vector gRestartArgs; -static map gQueryParameters; -static wstring gCrashReporterKey(L"Software\\Mozilla\\Crash Reporter"); -static wstring gURLParameter; -static int gCheckboxPadding = 6; -static bool gRTLlayout = false; - -// When vertically resizing the dialog, these items should move down -static set gAttachedBottom; - -// Default set of items for gAttachedBottom -static const UINT kDefaultAttachedBottom[] = { - IDC_SUBMITREPORTCHECK, - IDC_VIEWREPORTBUTTON, - IDC_COMMENTTEXT, - IDC_INCLUDEURLCHECK, - IDC_EMAILMECHECK, - IDC_EMAILTEXT, - IDC_PROGRESSTEXT, - IDC_THROBBER, - IDC_CLOSEBUTTON, - IDC_RESTARTBUTTON, -}; - -static wstring UTF8ToWide(const string& utf8, bool *success = 0); -static DWORD WINAPI SendThreadProc(LPVOID param); - -static wstring Str(const char* key) -{ - return UTF8ToWide(gStrings[key]); -} - -/* === win32 helper functions === */ - -static void DoInitCommonControls() -{ - INITCOMMONCONTROLSEX ic; - ic.dwSize = sizeof(INITCOMMONCONTROLSEX); - ic.dwICC = ICC_PROGRESS_CLASS; - InitCommonControlsEx(&ic); - // also get the rich edit control - LoadLibrary(L"Msftedit.dll"); -} - -static bool GetBoolValue(HKEY hRegKey, LPCTSTR valueName, DWORD* value) -{ - DWORD type, dataSize; - dataSize = sizeof(DWORD); - if (RegQueryValueEx(hRegKey, valueName, nullptr, - &type, (LPBYTE)value, &dataSize) == ERROR_SUCCESS && - type == REG_DWORD) - return true; - - return false; -} - -// Removes a value from HKEY_LOCAL_MACHINE and HKEY_CURRENT_USER, if it exists. -static void RemoveUnusedValues(const wchar_t* key, LPCTSTR valueName) -{ - HKEY hRegKey; - - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, KEY_SET_VALUE, &hRegKey) - == ERROR_SUCCESS) { - RegDeleteValue(hRegKey, valueName); - RegCloseKey(hRegKey); - } - - if (RegOpenKeyEx(HKEY_CURRENT_USER, key, 0, KEY_SET_VALUE, &hRegKey) - == ERROR_SUCCESS) { - RegDeleteValue(hRegKey, valueName); - RegCloseKey(hRegKey); - } -} - -static bool CheckBoolKey(const wchar_t* key, - const wchar_t* valueName, - bool* enabled) -{ - /* - * NOTE! This code needs to stay in sync with the preference checking - * code in in nsExceptionHandler.cpp. - */ - *enabled = false; - bool found = false; - HKEY hRegKey; - DWORD val; - // see if our reg key is set globally - if (RegOpenKey(HKEY_LOCAL_MACHINE, key, &hRegKey) == ERROR_SUCCESS) { - if (GetBoolValue(hRegKey, valueName, &val)) { - *enabled = (val == 1); - found = true; - } - RegCloseKey(hRegKey); - } else { - // look for it in user settings - if (RegOpenKey(HKEY_CURRENT_USER, key, &hRegKey) == ERROR_SUCCESS) { - if (GetBoolValue(hRegKey, valueName, &val)) { - *enabled = (val == 1); - found = true; - } - RegCloseKey(hRegKey); - } - } - - return found; -} - -static void SetBoolKey(const wchar_t* key, const wchar_t* value, bool enabled) -{ - /* - * NOTE! This code needs to stay in sync with the preference setting - * code in in nsExceptionHandler.cpp. - */ - HKEY hRegKey; - - // remove the old value from the registry if it exists - RemoveUnusedValues(key, SUBMIT_REPORT_OLD); - - if (RegCreateKey(HKEY_CURRENT_USER, key, &hRegKey) == ERROR_SUCCESS) { - DWORD data = (enabled ? 1 : 0); - RegSetValueEx(hRegKey, value, 0, REG_DWORD, (LPBYTE)&data, sizeof(data)); - RegCloseKey(hRegKey); - } -} - -static bool GetStringValue(HKEY hRegKey, LPCTSTR valueName, wstring& value) -{ - DWORD type, dataSize; - wchar_t buf[2048]; - dataSize = sizeof(buf); - if (RegQueryValueEx(hRegKey, valueName, nullptr, - &type, (LPBYTE)buf, &dataSize) == ERROR_SUCCESS && - type == REG_SZ) { - value = buf; - return true; - } - - return false; -} - -static bool GetStringKey(const wchar_t* key, - const wchar_t* valueName, - wstring& value) -{ - value = L""; - bool found = false; - HKEY hRegKey; - // see if our reg key is set globally - if (RegOpenKey(HKEY_LOCAL_MACHINE, key, &hRegKey) == ERROR_SUCCESS) { - if (GetStringValue(hRegKey, valueName, value)) { - found = true; - } - RegCloseKey(hRegKey); - } else { - // look for it in user settings - if (RegOpenKey(HKEY_CURRENT_USER, key, &hRegKey) == ERROR_SUCCESS) { - if (GetStringValue(hRegKey, valueName, value)) { - found = true; - } - RegCloseKey(hRegKey); - } - } - - return found; -} - -static void SetStringKey(const wchar_t* key, - const wchar_t* valueName, - const wstring& value) -{ - HKEY hRegKey; - if (RegCreateKey(HKEY_CURRENT_USER, key, &hRegKey) == ERROR_SUCCESS) { - RegSetValueEx(hRegKey, valueName, 0, REG_SZ, - (LPBYTE)value.c_str(), - (value.length() + 1) * sizeof(wchar_t)); - RegCloseKey(hRegKey); - } -} - -static string FormatLastError() -{ - DWORD err = GetLastError(); - LPWSTR s; - string message = "Crash report submission failed: "; - // odds are it's a WinInet error - HANDLE hInetModule = GetModuleHandle(L"WinInet.dll"); - if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_FROM_HMODULE, - hInetModule, - err, - 0, - (LPWSTR)&s, - 0, - nullptr) != 0) { - message += WideToUTF8(s, nullptr); - LocalFree(s); - // strip off any trailing newlines - string::size_type n = message.find_last_not_of("\r\n"); - if (n < message.size() - 1) { - message.erase(n+1); - } - } - else { - char buf[64]; - sprintf(buf, "Unknown error, error code: 0x%08x", err); - message += buf; - } - return message; -} - -#define TS_DRAW 2 -#define BP_CHECKBOX 3 - -typedef HANDLE (WINAPI*OpenThemeDataPtr)(HWND hwnd, LPCWSTR pszClassList); -typedef HRESULT (WINAPI*CloseThemeDataPtr)(HANDLE hTheme); -typedef HRESULT (WINAPI*GetThemePartSizePtr)(HANDLE hTheme, HDC hdc, int iPartId, - int iStateId, RECT* prc, int ts, - SIZE* psz); -typedef HRESULT (WINAPI*GetThemeContentRectPtr)(HANDLE hTheme, HDC hdc, int iPartId, - int iStateId, const RECT* pRect, - RECT* pContentRect); - - -static void GetThemeSizes(HWND hwnd) -{ - HMODULE themeDLL = LoadLibrary(L"uxtheme.dll"); - - if (!themeDLL) - return; - - OpenThemeDataPtr openTheme = - (OpenThemeDataPtr)GetProcAddress(themeDLL, "OpenThemeData"); - CloseThemeDataPtr closeTheme = - (CloseThemeDataPtr)GetProcAddress(themeDLL, "CloseThemeData"); - GetThemePartSizePtr getThemePartSize = - (GetThemePartSizePtr)GetProcAddress(themeDLL, "GetThemePartSize"); - - if (!openTheme || !closeTheme || !getThemePartSize) { - FreeLibrary(themeDLL); - return; - } - - HANDLE buttonTheme = openTheme(hwnd, L"Button"); - if (!buttonTheme) { - FreeLibrary(themeDLL); - return; - } - HDC hdc = GetDC(hwnd); - SIZE s; - getThemePartSize(buttonTheme, hdc, BP_CHECKBOX, 0, nullptr, TS_DRAW, &s); - gCheckboxPadding = s.cx; - closeTheme(buttonTheme); - FreeLibrary(themeDLL); -} - -// Gets the position of a window relative to another window's client area -static void GetRelativeRect(HWND hwnd, HWND hwndParent, RECT* r) -{ - GetWindowRect(hwnd, r); - MapWindowPoints(nullptr, hwndParent, (POINT*)r, 2); -} - -static void SetDlgItemVisible(HWND hwndDlg, UINT item, bool visible) -{ - HWND hwnd = GetDlgItem(hwndDlg, item); - - ShowWindow(hwnd, visible ? SW_SHOW : SW_HIDE); -} - -static void SetDlgItemDisabled(HWND hwndDlg, UINT item, bool disabled) -{ - HWND hwnd = GetDlgItem(hwndDlg, item); - LONG style = GetWindowLong(hwnd, GWL_STYLE); - if (!disabled) - style |= WS_DISABLED; - else - style &= ~WS_DISABLED; - - SetWindowLong(hwnd, GWL_STYLE, style); -} - -/* === Crash Reporting Dialog === */ - -static void StretchDialog(HWND hwndDlg, int ydiff) -{ - RECT r; - GetWindowRect(hwndDlg, &r); - r.bottom += ydiff; - MoveWindow(hwndDlg, r.left, r.top, - r.right - r.left, r.bottom - r.top, TRUE); -} - -static void ReflowDialog(HWND hwndDlg, int ydiff) -{ - // Move items attached to the bottom down/up by as much as - // the window resize - for (set::const_iterator item = gAttachedBottom.begin(); - item != gAttachedBottom.end(); - item++) { - RECT r; - HWND hwnd = GetDlgItem(hwndDlg, *item); - GetRelativeRect(hwnd, hwndDlg, &r); - r.top += ydiff; - r.bottom += ydiff; - MoveWindow(hwnd, r.left, r.top, - r.right - r.left, r.bottom - r.top, TRUE); - } -} - -static DWORD WINAPI SendThreadProc(LPVOID param) -{ - bool finishedOk; - SendThreadData* td = (SendThreadData*)param; - - if (td->sendURL.empty()) { - finishedOk = false; - LogMessage("No server URL, not sending report"); - } else { - google_breakpad::CrashReportSender sender(L""); - finishedOk = (sender.SendCrashReport(td->sendURL, - td->queryParameters, - td->files, - &td->serverResponse) - == google_breakpad::RESULT_SUCCEEDED); - if (finishedOk) { - LogMessage("Crash report submitted successfully"); - } - else { - // get an error string and print it to the log - //XXX: would be nice to get the HTTP status code here, filed: - // http://code.google.com/p/google-breakpad/issues/detail?id=220 - LogMessage(FormatLastError()); - } - } - - PostMessage(td->hDlg, WM_UPLOADCOMPLETE, finishedOk ? 1 : 0, 0); - - return 0; -} - -static void EndCrashReporterDialog(HWND hwndDlg, int code) -{ - // Save the current values to the registry - wchar_t email[MAX_EMAIL_LENGTH]; - GetDlgItemTextW(hwndDlg, IDC_EMAILTEXT, email, - sizeof(email) / sizeof(email[0])); - SetStringKey(gCrashReporterKey.c_str(), EMAIL_VALUE, email); - - SetBoolKey(gCrashReporterKey.c_str(), INCLUDE_URL_VALUE, - IsDlgButtonChecked(hwndDlg, IDC_INCLUDEURLCHECK) != 0); - SetBoolKey(gCrashReporterKey.c_str(), EMAIL_ME_VALUE, - IsDlgButtonChecked(hwndDlg, IDC_EMAILMECHECK) != 0); - SetBoolKey(gCrashReporterKey.c_str(), SUBMIT_REPORT_VALUE, - IsDlgButtonChecked(hwndDlg, IDC_SUBMITREPORTCHECK) != 0); - - EndDialog(hwndDlg, code); -} - -static void MaybeResizeProgressText(HWND hwndDlg) -{ - HWND hwndProgress = GetDlgItem(hwndDlg, IDC_PROGRESSTEXT); - HDC hdc = GetDC(hwndProgress); - HFONT hfont = (HFONT)SendMessage(hwndProgress, WM_GETFONT, 0, 0); - if (hfont) - SelectObject(hdc, hfont); - SIZE size; - RECT rect; - GetRelativeRect(hwndProgress, hwndDlg, &rect); - - wchar_t text[1024]; - GetWindowText(hwndProgress, text, 1024); - - if (!GetTextExtentPoint32(hdc, text, wcslen(text), &size)) - return; - - if (size.cx < (rect.right - rect.left)) - return; - - // Figure out how much we need to resize things vertically - // This is sort of a fudge, but it should be good enough. - int wantedHeight = size.cy * - (int)ceil((float)size.cx / (float)(rect.right - rect.left)); - int diff = wantedHeight - (rect.bottom - rect.top); - if (diff <= 0) - return; - - MoveWindow(hwndProgress, rect.left, rect.top, - rect.right - rect.left, - wantedHeight, - TRUE); - - gAttachedBottom.clear(); - gAttachedBottom.insert(IDC_CLOSEBUTTON); - gAttachedBottom.insert(IDC_RESTARTBUTTON); - - StretchDialog(hwndDlg, diff); - - for (int i = 0; i < sizeof(kDefaultAttachedBottom) / sizeof(UINT); i++) { - gAttachedBottom.insert(kDefaultAttachedBottom[i]); - } -} - -static void MaybeSendReport(HWND hwndDlg) -{ - if (!IsDlgButtonChecked(hwndDlg, IDC_SUBMITREPORTCHECK)) { - EndCrashReporterDialog(hwndDlg, 0); - return; - } - - // disable all the form controls - EnableWindow(GetDlgItem(hwndDlg, IDC_SUBMITREPORTCHECK), false); - EnableWindow(GetDlgItem(hwndDlg, IDC_VIEWREPORTBUTTON), false); - EnableWindow(GetDlgItem(hwndDlg, IDC_COMMENTTEXT), false); - EnableWindow(GetDlgItem(hwndDlg, IDC_INCLUDEURLCHECK), false); - EnableWindow(GetDlgItem(hwndDlg, IDC_EMAILMECHECK), false); - EnableWindow(GetDlgItem(hwndDlg, IDC_EMAILTEXT), false); - EnableWindow(GetDlgItem(hwndDlg, IDC_CLOSEBUTTON), false); - EnableWindow(GetDlgItem(hwndDlg, IDC_RESTARTBUTTON), false); - - SetDlgItemText(hwndDlg, IDC_PROGRESSTEXT, Str(ST_REPORTDURINGSUBMIT).c_str()); - MaybeResizeProgressText(hwndDlg); - // start throbber - // play entire AVI, and loop - Animate_Play(GetDlgItem(hwndDlg, IDC_THROBBER), 0, -1, -1); - SetDlgItemVisible(hwndDlg, IDC_THROBBER, true); - gThreadHandle = nullptr; - gSendData.hDlg = hwndDlg; - gSendData.queryParameters = gQueryParameters; - - gThreadHandle = CreateThread(nullptr, 0, SendThreadProc, &gSendData, 0, - nullptr); -} - -static void RestartApplication() -{ - wstring cmdLine; - - for (unsigned int i = 0; i < gRestartArgs.size(); i++) { - cmdLine += L"\"" + UTF8ToWide(gRestartArgs[i]) + L"\" "; - } - - STARTUPINFO si; - PROCESS_INFORMATION pi; - - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - si.dwFlags = STARTF_USESHOWWINDOW; - si.wShowWindow = SW_SHOWNORMAL; - ZeroMemory(&pi, sizeof(pi)); - - if (CreateProcess(nullptr, (LPWSTR)cmdLine.c_str(), nullptr, nullptr, FALSE, - 0, nullptr, nullptr, &si, &pi)) { - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - } -} - -static void ShowReportInfo(HWND hwndDlg) -{ - wstring description; - - for (map::const_iterator i = gQueryParameters.begin(); - i != gQueryParameters.end(); - i++) { - description += i->first; - description += L": "; - description += i->second; - description += L"\n"; - } - - description += L"\n"; - description += Str(ST_EXTRAREPORTINFO); - - SetDlgItemText(hwndDlg, IDC_VIEWREPORTTEXT, description.c_str()); -} - -static void UpdateURL(HWND hwndDlg) -{ - if (IsDlgButtonChecked(hwndDlg, IDC_INCLUDEURLCHECK)) { - gQueryParameters[L"URL"] = gURLParameter; - } else { - gQueryParameters.erase(L"URL"); - } -} - -static void UpdateEmail(HWND hwndDlg) -{ - if (IsDlgButtonChecked(hwndDlg, IDC_EMAILMECHECK)) { - wchar_t email[MAX_EMAIL_LENGTH]; - GetDlgItemTextW(hwndDlg, IDC_EMAILTEXT, email, - sizeof(email) / sizeof(email[0])); - gQueryParameters[L"Email"] = email; - if (IsDlgButtonChecked(hwndDlg, IDC_SUBMITREPORTCHECK)) - EnableWindow(GetDlgItem(hwndDlg, IDC_EMAILTEXT), true); - } else { - gQueryParameters.erase(L"Email"); - EnableWindow(GetDlgItem(hwndDlg, IDC_EMAILTEXT), false); - } -} - -static void UpdateComment(HWND hwndDlg) -{ - wchar_t comment[MAX_COMMENT_LENGTH + 1]; - GetDlgItemTextW(hwndDlg, IDC_COMMENTTEXT, comment, - sizeof(comment) / sizeof(comment[0])); - if (wcslen(comment) > 0) - gQueryParameters[L"Comments"] = comment; - else - gQueryParameters.erase(L"Comments"); -} - -/* - * Dialog procedure for the "view report" dialog. - */ -static BOOL CALLBACK ViewReportDialogProc(HWND hwndDlg, UINT message, - WPARAM wParam, LPARAM lParam) -{ - switch (message) { - case WM_INITDIALOG: { - SetWindowText(hwndDlg, Str(ST_VIEWREPORTTITLE).c_str()); - SetDlgItemText(hwndDlg, IDOK, Str(ST_OK).c_str()); - SendDlgItemMessage(hwndDlg, IDC_VIEWREPORTTEXT, - EM_SETTARGETDEVICE, (WPARAM)nullptr, 0); - ShowReportInfo(hwndDlg); - SetFocus(GetDlgItem(hwndDlg, IDOK)); - return FALSE; - } - - case WM_COMMAND: { - if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDOK) - EndDialog(hwndDlg, 0); - return FALSE; - } - } - return FALSE; -} - -// Return the number of bytes this string will take encoded -// in UTF-8 -static inline int BytesInUTF8(wchar_t* str) -{ - // Just count size of buffer for UTF-8, minus one - // (we don't need to count the null terminator) - return WideCharToMultiByte(CP_UTF8, 0, str, -1, - nullptr, 0, nullptr, nullptr) - 1; -} - -// Calculate the length of the text in this edit control (in bytes, -// in the UTF-8 encoding) after replacing the current selection -// with |insert|. -static int NewTextLength(HWND hwndEdit, wchar_t* insert) -{ - wchar_t current[MAX_COMMENT_LENGTH + 1]; - - GetWindowText(hwndEdit, current, MAX_COMMENT_LENGTH + 1); - DWORD selStart, selEnd; - SendMessage(hwndEdit, EM_GETSEL, (WPARAM)&selStart, (LPARAM)&selEnd); - - int selectionLength = 0; - if (selEnd - selStart > 0) { - wchar_t selection[MAX_COMMENT_LENGTH + 1]; - google_breakpad::WindowsStringUtils::safe_wcsncpy(selection, - MAX_COMMENT_LENGTH + 1, - current + selStart, - selEnd - selStart); - selection[selEnd - selStart] = '\0'; - selectionLength = BytesInUTF8(selection); - } - - // current string length + replacement text length - // - replaced selection length - return BytesInUTF8(current) + BytesInUTF8(insert) - selectionLength; -} - -// Window procedure for subclassing edit controls -static LRESULT CALLBACK EditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, - LPARAM lParam) -{ - static WNDPROC super = nullptr; - - if (super == nullptr) - super = (WNDPROC)GetWindowLongPtr(hwnd, GWLP_USERDATA); - - switch (uMsg) { - case WM_PAINT: { - HDC hdc; - PAINTSTRUCT ps; - RECT r; - wchar_t windowText[1024]; - - GetWindowText(hwnd, windowText, 1024); - // if the control contains text or is focused, draw it normally - if (GetFocus() == hwnd || windowText[0] != '\0') - return CallWindowProc(super, hwnd, uMsg, wParam, lParam); - - GetClientRect(hwnd, &r); - hdc = BeginPaint(hwnd, &ps); - FillRect(hdc, &r, GetSysColorBrush(IsWindowEnabled(hwnd) - ? COLOR_WINDOW : COLOR_BTNFACE)); - SetTextColor(hdc, GetSysColor(COLOR_GRAYTEXT)); - SelectObject(hdc, (HFONT)GetStockObject(DEFAULT_GUI_FONT)); - SetBkMode(hdc, TRANSPARENT); - wchar_t* txt = (wchar_t*)GetProp(hwnd, L"PROP_GRAYTEXT"); - // Get the actual edit control rect - CallWindowProc(super, hwnd, EM_GETRECT, 0, (LPARAM)&r); - UINT format = DT_EDITCONTROL | DT_NOPREFIX | DT_WORDBREAK | DT_INTERNAL; - if (gRTLlayout) - format |= DT_RIGHT; - if (txt) - DrawText(hdc, txt, wcslen(txt), &r, format); - EndPaint(hwnd, &ps); - return 0; - } - - // We handle WM_CHAR and WM_PASTE to limit the comment box to 500 - // bytes in UTF-8. - case WM_CHAR: { - // Leave accelerator keys and non-printing chars (except LF) alone - if (wParam & (1<<24) || wParam & (1<<29) || - (wParam < ' ' && wParam != '\n')) - break; - - wchar_t ch[2] = { (wchar_t)wParam, 0 }; - if (NewTextLength(hwnd, ch) > MAX_COMMENT_LENGTH) - return 0; - - break; - } - - case WM_PASTE: { - if (IsClipboardFormatAvailable(CF_UNICODETEXT) && - OpenClipboard(hwnd)) { - HGLOBAL hg = GetClipboardData(CF_UNICODETEXT); - wchar_t* pastedText = (wchar_t*)GlobalLock(hg); - int newSize = 0; - - if (pastedText) - newSize = NewTextLength(hwnd, pastedText); - - GlobalUnlock(hg); - CloseClipboard(); - - if (newSize > MAX_COMMENT_LENGTH) - return 0; - } - break; - } - - case WM_SETFOCUS: - case WM_KILLFOCUS: { - RECT r; - GetClientRect(hwnd, &r); - InvalidateRect(hwnd, &r, TRUE); - break; - } - - case WM_DESTROY: { - // cleanup our property - HGLOBAL hData = RemoveProp(hwnd, L"PROP_GRAYTEXT"); - if (hData) - GlobalFree(hData); - } - } - - return CallWindowProc(super, hwnd, uMsg, wParam, lParam); -} - -// Resize a control to fit this text -static int ResizeControl(HWND hwndButton, RECT& rect, wstring text, - bool shiftLeft, int userDefinedPadding) -{ - HDC hdc = GetDC(hwndButton); - HFONT hfont = (HFONT)SendMessage(hwndButton, WM_GETFONT, 0, 0); - if (hfont) - SelectObject(hdc, hfont); - SIZE size, oldSize; - int sizeDiff = 0; - - wchar_t oldText[1024]; - GetWindowText(hwndButton, oldText, 1024); - - if (GetTextExtentPoint32(hdc, text.c_str(), text.length(), &size) - // default text on the button - && GetTextExtentPoint32(hdc, oldText, wcslen(oldText), &oldSize)) { - /* - Expand control widths to accomidate wider text strings. For most - controls (including buttons) the text padding is defined by the - dialog's rc file. Some controls (such as checkboxes) have padding - that extends to the end of the dialog, in which case we ignore the - rc padding and rely on a user defined value passed in through - userDefinedPadding. - */ - int textIncrease = size.cx - oldSize.cx; - if (textIncrease < 0) - return 0; - int existingTextPadding; - if (userDefinedPadding == 0) - existingTextPadding = (rect.right - rect.left) - oldSize.cx; - else - existingTextPadding = userDefinedPadding; - sizeDiff = textIncrease + existingTextPadding; - - if (shiftLeft) { - // shift left by the amount the button should grow - rect.left -= sizeDiff; - } - else { - // grow right instead - rect.right += sizeDiff; - } - MoveWindow(hwndButton, rect.left, rect.top, - rect.right - rect.left, - rect.bottom - rect.top, - TRUE); - } - return sizeDiff; -} - -// The window was resized horizontally, so widen some of our -// controls to make use of the space -static void StretchControlsToFit(HWND hwndDlg) -{ - int controls[] = { - IDC_DESCRIPTIONTEXT, - IDC_SUBMITREPORTCHECK, - IDC_COMMENTTEXT, - IDC_INCLUDEURLCHECK, - IDC_EMAILMECHECK, - IDC_EMAILTEXT, - IDC_PROGRESSTEXT - }; - - RECT dlgRect; - GetClientRect(hwndDlg, &dlgRect); - - for (int i=0; iexStyle |= WS_EX_LAYOUTRTL; - - rv = DialogBoxIndirectParam(nullptr, (LPCDLGTEMPLATE)pMyDlgTemplate, - hwndParent, dlgProc, param); - GlobalUnlock(hMyDlgTemplate); - GlobalFree(hMyDlgTemplate); - } - else { - rv = DialogBoxParam(nullptr, MAKEINTRESOURCE(idd), hwndParent, - dlgProc, param); - } - - return rv; -} - - -static BOOL CALLBACK CrashReporterDialogProc(HWND hwndDlg, UINT message, - WPARAM wParam, LPARAM lParam) -{ - static int sHeight = 0; - - bool success; - bool enabled; - - switch (message) { - case WM_INITDIALOG: { - GetThemeSizes(hwndDlg); - RECT r; - GetClientRect(hwndDlg, &r); - sHeight = r.bottom - r.top; - - SetWindowText(hwndDlg, Str(ST_CRASHREPORTERTITLE).c_str()); - HICON hIcon = LoadIcon(GetModuleHandle(nullptr), - MAKEINTRESOURCE(IDI_MAINICON)); - SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon); - SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon); - - // resize the "View Report" button based on the string length - RECT rect; - HWND hwnd = GetDlgItem(hwndDlg, IDC_VIEWREPORTBUTTON); - GetRelativeRect(hwnd, hwndDlg, &rect); - ResizeControl(hwnd, rect, Str(ST_VIEWREPORT), false, 0); - SetDlgItemText(hwndDlg, IDC_VIEWREPORTBUTTON, Str(ST_VIEWREPORT).c_str()); - - hwnd = GetDlgItem(hwndDlg, IDC_SUBMITREPORTCHECK); - GetRelativeRect(hwnd, hwndDlg, &rect); - long maxdiff = ResizeControl(hwnd, rect, Str(ST_CHECKSUBMIT), false, - gCheckboxPadding); - SetDlgItemText(hwndDlg, IDC_SUBMITREPORTCHECK, - Str(ST_CHECKSUBMIT).c_str()); - - if (!CheckBoolKey(gCrashReporterKey.c_str(), - SUBMIT_REPORT_VALUE, &enabled)) - enabled = ShouldEnableSending(); - - CheckDlgButton(hwndDlg, IDC_SUBMITREPORTCHECK, enabled ? BST_CHECKED - : BST_UNCHECKED); - SubmitReportChecked(hwndDlg); - - HWND hwndComment = GetDlgItem(hwndDlg, IDC_COMMENTTEXT); - WNDPROC OldWndProc = (WNDPROC)SetWindowLongPtr(hwndComment, - GWLP_WNDPROC, - (LONG_PTR)EditSubclassProc); - - // Subclass comment edit control to get placeholder text - SetWindowLongPtr(hwndComment, GWLP_USERDATA, (LONG_PTR)OldWndProc); - wstring commentGrayText = Str(ST_COMMENTGRAYTEXT); - wchar_t* hMem = (wchar_t*)GlobalAlloc(GPTR, (commentGrayText.length() + 1)*sizeof(wchar_t)); - wcscpy(hMem, commentGrayText.c_str()); - SetProp(hwndComment, L"PROP_GRAYTEXT", hMem); - - hwnd = GetDlgItem(hwndDlg, IDC_INCLUDEURLCHECK); - GetRelativeRect(hwnd, hwndDlg, &rect); - long diff = ResizeControl(hwnd, rect, Str(ST_CHECKURL), false, - gCheckboxPadding); - maxdiff = std::max(diff, maxdiff); - SetDlgItemText(hwndDlg, IDC_INCLUDEURLCHECK, Str(ST_CHECKURL).c_str()); - - // want this on by default - if (CheckBoolKey(gCrashReporterKey.c_str(), INCLUDE_URL_VALUE, &enabled) && - !enabled) { - CheckDlgButton(hwndDlg, IDC_INCLUDEURLCHECK, BST_UNCHECKED); - } else { - CheckDlgButton(hwndDlg, IDC_INCLUDEURLCHECK, BST_CHECKED); - } - - hwnd = GetDlgItem(hwndDlg, IDC_EMAILMECHECK); - GetRelativeRect(hwnd, hwndDlg, &rect); - diff = ResizeControl(hwnd, rect, Str(ST_CHECKEMAIL), false, - gCheckboxPadding); - maxdiff = std::max(diff, maxdiff); - SetDlgItemText(hwndDlg, IDC_EMAILMECHECK, Str(ST_CHECKEMAIL).c_str()); - - if (CheckBoolKey(gCrashReporterKey.c_str(), EMAIL_ME_VALUE, &enabled) && - enabled) { - CheckDlgButton(hwndDlg, IDC_EMAILMECHECK, BST_CHECKED); - } else { - CheckDlgButton(hwndDlg, IDC_EMAILMECHECK, BST_UNCHECKED); - } - - wstring email; - if (GetStringKey(gCrashReporterKey.c_str(), EMAIL_VALUE, email)) { - SetDlgItemText(hwndDlg, IDC_EMAILTEXT, email.c_str()); - } - - // Subclass email edit control to get placeholder text - HWND hwndEmail = GetDlgItem(hwndDlg, IDC_EMAILTEXT); - OldWndProc = (WNDPROC)SetWindowLongPtr(hwndEmail, - GWLP_WNDPROC, - (LONG_PTR)EditSubclassProc); - SetWindowLongPtr(hwndEmail, GWLP_USERDATA, (LONG_PTR)OldWndProc); - wstring emailGrayText = Str(ST_EMAILGRAYTEXT); - hMem = (wchar_t*)GlobalAlloc(GPTR, (emailGrayText.length() + 1)*sizeof(wchar_t)); - wcscpy(hMem, emailGrayText.c_str()); - SetProp(hwndEmail, L"PROP_GRAYTEXT", hMem); - - SetDlgItemText(hwndDlg, IDC_PROGRESSTEXT, Str(ST_REPORTPRESUBMIT).c_str()); - - RECT closeRect; - HWND hwndClose = GetDlgItem(hwndDlg, IDC_CLOSEBUTTON); - GetRelativeRect(hwndClose, hwndDlg, &closeRect); - - RECT restartRect; - HWND hwndRestart = GetDlgItem(hwndDlg, IDC_RESTARTBUTTON); - GetRelativeRect(hwndRestart, hwndDlg, &restartRect); - - // set the close button text and shift the buttons around - // since the size may need to change - int sizeDiff = ResizeControl(hwndClose, closeRect, Str(ST_QUIT), - true, 0); - restartRect.left -= sizeDiff; - restartRect.right -= sizeDiff; - SetDlgItemText(hwndDlg, IDC_CLOSEBUTTON, Str(ST_QUIT).c_str()); - - if (gRestartArgs.size() > 0) { - // Resize restart button to fit text - ResizeControl(hwndRestart, restartRect, Str(ST_RESTART), true, 0); - SetDlgItemText(hwndDlg, IDC_RESTARTBUTTON, Str(ST_RESTART).c_str()); - } else { - // No restart arguments, so just hide the restart button - SetDlgItemVisible(hwndDlg, IDC_RESTARTBUTTON, false); - } - // See if we need to widen the window - // Leave 6 pixels on either side + 6 pixels between the buttons - int neededSize = closeRect.right - closeRect.left + - restartRect.right - restartRect.left + 6 * 3; - GetClientRect(hwndDlg, &r); - // We may already have resized one of the checkboxes above - maxdiff = std::max(maxdiff, neededSize - (r.right - r.left)); - - if (maxdiff > 0) { - // widen window - GetWindowRect(hwndDlg, &r); - r.right += maxdiff; - MoveWindow(hwndDlg, r.left, r.top, - r.right - r.left, r.bottom - r.top, TRUE); - // shift both buttons right - if (restartRect.left + maxdiff < 6) - maxdiff += 6; - closeRect.left += maxdiff; - closeRect.right += maxdiff; - restartRect.left += maxdiff; - restartRect.right += maxdiff; - MoveWindow(hwndClose, closeRect.left, closeRect.top, - closeRect.right - closeRect.left, - closeRect.bottom - closeRect.top, - TRUE); - StretchControlsToFit(hwndDlg); - } - // need to move the restart button regardless - MoveWindow(hwndRestart, restartRect.left, restartRect.top, - restartRect.right - restartRect.left, - restartRect.bottom - restartRect.top, - TRUE); - - // Resize the description text last, in case the window was resized - // before this. - SendDlgItemMessage(hwndDlg, IDC_DESCRIPTIONTEXT, - EM_SETEVENTMASK, (WPARAM)nullptr, - ENM_REQUESTRESIZE); - - wstring description = Str(ST_CRASHREPORTERHEADER); - description += L"\n\n"; - description += Str(ST_CRASHREPORTERDESCRIPTION); - SetDlgItemText(hwndDlg, IDC_DESCRIPTIONTEXT, description.c_str()); - - - // Make the title bold. - CHARFORMAT fmt = { 0, }; - fmt.cbSize = sizeof(fmt); - fmt.dwMask = CFM_BOLD; - fmt.dwEffects = CFE_BOLD; - SendDlgItemMessage(hwndDlg, IDC_DESCRIPTIONTEXT, EM_SETSEL, - 0, Str(ST_CRASHREPORTERHEADER).length()); - SendDlgItemMessage(hwndDlg, IDC_DESCRIPTIONTEXT, EM_SETCHARFORMAT, - SCF_SELECTION, (LPARAM)&fmt); - SendDlgItemMessage(hwndDlg, IDC_DESCRIPTIONTEXT, EM_SETSEL, 0, 0); - // Force redraw. - SendDlgItemMessage(hwndDlg, IDC_DESCRIPTIONTEXT, - EM_SETTARGETDEVICE, (WPARAM)nullptr, 0); - // Force resize. - SendDlgItemMessage(hwndDlg, IDC_DESCRIPTIONTEXT, - EM_REQUESTRESIZE, 0, 0); - - // if no URL was given, hide the URL checkbox - if (gQueryParameters.find(L"URL") == gQueryParameters.end()) { - RECT urlCheckRect, emailCheckRect; - GetWindowRect(GetDlgItem(hwndDlg, IDC_INCLUDEURLCHECK), &urlCheckRect); - GetWindowRect(GetDlgItem(hwndDlg, IDC_EMAILMECHECK), &emailCheckRect); - - SetDlgItemVisible(hwndDlg, IDC_INCLUDEURLCHECK, false); - - gAttachedBottom.erase(IDC_VIEWREPORTBUTTON); - gAttachedBottom.erase(IDC_SUBMITREPORTCHECK); - gAttachedBottom.erase(IDC_COMMENTTEXT); - - StretchDialog(hwndDlg, urlCheckRect.top - emailCheckRect.top); - - gAttachedBottom.insert(IDC_VIEWREPORTBUTTON); - gAttachedBottom.insert(IDC_SUBMITREPORTCHECK); - gAttachedBottom.insert(IDC_COMMENTTEXT); - } - - MaybeResizeProgressText(hwndDlg); - - // Open the AVI resource for the throbber - Animate_Open(GetDlgItem(hwndDlg, IDC_THROBBER), - MAKEINTRESOURCE(IDR_THROBBER)); - - UpdateURL(hwndDlg); - UpdateEmail(hwndDlg); - - SetFocus(GetDlgItem(hwndDlg, IDC_SUBMITREPORTCHECK)); - return FALSE; - } - case WM_SIZE: { - ReflowDialog(hwndDlg, HIWORD(lParam) - sHeight); - sHeight = HIWORD(lParam); - InvalidateRect(hwndDlg, nullptr, TRUE); - return FALSE; - } - case WM_NOTIFY: { - NMHDR* notification = reinterpret_cast(lParam); - if (notification->code == EN_REQUESTRESIZE) { - // Resizing the rich edit control to fit the description text. - REQRESIZE* reqresize = reinterpret_cast(lParam); - RECT newSize = reqresize->rc; - RECT oldSize; - GetRelativeRect(notification->hwndFrom, hwndDlg, &oldSize); - - // resize the text box as requested - MoveWindow(notification->hwndFrom, newSize.left, newSize.top, - newSize.right - newSize.left, newSize.bottom - newSize.top, - TRUE); - - // Resize the dialog to fit (the WM_SIZE handler will move the controls) - StretchDialog(hwndDlg, newSize.bottom - oldSize.bottom); - } - return FALSE; - } - case WM_COMMAND: { - if (HIWORD(wParam) == BN_CLICKED) { - switch(LOWORD(wParam)) { - case IDC_VIEWREPORTBUTTON: - DialogBoxParamMaybeRTL(IDD_VIEWREPORTDIALOG, hwndDlg, - (DLGPROC)ViewReportDialogProc, 0); - break; - case IDC_SUBMITREPORTCHECK: - SubmitReportChecked(hwndDlg); - break; - case IDC_INCLUDEURLCHECK: - UpdateURL(hwndDlg); - break; - case IDC_EMAILMECHECK: - UpdateEmail(hwndDlg); - break; - case IDC_CLOSEBUTTON: - MaybeSendReport(hwndDlg); - break; - case IDC_RESTARTBUTTON: - RestartApplication(); - MaybeSendReport(hwndDlg); - break; - } - } else if (HIWORD(wParam) == EN_CHANGE) { - switch(LOWORD(wParam)) { - case IDC_EMAILTEXT: - UpdateEmail(hwndDlg); - break; - case IDC_COMMENTTEXT: - UpdateComment(hwndDlg); - } - } - - return FALSE; - } - case WM_UPLOADCOMPLETE: { - WaitForSingleObject(gThreadHandle, INFINITE); - success = (wParam == 1); - SendCompleted(success, WideToUTF8(gSendData.serverResponse)); - // hide throbber - Animate_Stop(GetDlgItem(hwndDlg, IDC_THROBBER)); - SetDlgItemVisible(hwndDlg, IDC_THROBBER, false); - - SetDlgItemText(hwndDlg, IDC_PROGRESSTEXT, - success ? - Str(ST_REPORTSUBMITSUCCESS).c_str() : - Str(ST_SUBMITFAILED).c_str()); - MaybeResizeProgressText(hwndDlg); - // close dialog after 5 seconds - SetTimer(hwndDlg, 0, 5000, nullptr); - // - return TRUE; - } - - case WM_LBUTTONDOWN: { - HWND hwndEmail = GetDlgItem(hwndDlg, IDC_EMAILTEXT); - POINT p = { LOWORD(lParam), HIWORD(lParam) }; - // if the email edit control is clicked, enable it, - // check the email checkbox, and focus the email edit control - if (ChildWindowFromPoint(hwndDlg, p) == hwndEmail && - IsWindowEnabled(GetDlgItem(hwndDlg, IDC_RESTARTBUTTON)) && - !IsWindowEnabled(hwndEmail) && - IsDlgButtonChecked(hwndDlg, IDC_SUBMITREPORTCHECK) != 0) { - CheckDlgButton(hwndDlg, IDC_EMAILMECHECK, BST_CHECKED); - UpdateEmail(hwndDlg); - SetFocus(hwndEmail); - } - break; - } - - case WM_TIMER: { - // The "1" gets used down in UIShowCrashUI to indicate that we at least - // tried to send the report. - EndCrashReporterDialog(hwndDlg, 1); - return FALSE; - } - - case WM_CLOSE: { - EndCrashReporterDialog(hwndDlg, 0); - return FALSE; - } - } - return FALSE; -} - -static wstring UTF8ToWide(const string& utf8, bool *success) -{ - wchar_t* buffer = nullptr; - int buffer_size = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), - -1, nullptr, 0); - if(buffer_size == 0) { - if (success) - *success = false; - return L""; - } - - buffer = new wchar_t[buffer_size]; - if(buffer == nullptr) { - if (success) - *success = false; - return L""; - } - - MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), - -1, buffer, buffer_size); - wstring str = buffer; - delete [] buffer; - - if (success) - *success = true; - - return str; -} - -static string WideToMBCP(const wstring& wide, - unsigned int cp, - bool* success = nullptr) -{ - char* buffer = nullptr; - int buffer_size = WideCharToMultiByte(cp, 0, wide.c_str(), - -1, nullptr, 0, nullptr, nullptr); - if(buffer_size == 0) { - if (success) - *success = false; - return ""; - } - - buffer = new char[buffer_size]; - if(buffer == nullptr) { - if (success) - *success = false; - return ""; - } - - WideCharToMultiByte(cp, 0, wide.c_str(), - -1, buffer, buffer_size, nullptr, nullptr); - string mb = buffer; - delete [] buffer; - - if (success) - *success = true; - - return mb; -} - -string WideToUTF8(const wstring& wide, bool* success) -{ - return WideToMBCP(wide, CP_UTF8, success); -} - -/* === Crashreporter UI Functions === */ - -bool UIInit() -{ - for (int i = 0; i < sizeof(kDefaultAttachedBottom) / sizeof(UINT); i++) { - gAttachedBottom.insert(kDefaultAttachedBottom[i]); - } - - DoInitCommonControls(); - - return true; -} - -void UIShutdown() -{ -} - -void UIShowDefaultUI() -{ - MessageBox(nullptr, Str(ST_CRASHREPORTERDEFAULT).c_str(), - L"Crash Reporter", - MB_OK | MB_ICONSTOP); -} - -static bool CanUseMainCrashReportServer() -{ - // Any NT from 6.0 and above is fine. - if (IsWindowsVersionOrGreater(6, 0, 0)) { - return true; - } - - // On NT 5 servers, we need Server 2003 SP2. - if (IsWindowsServer()) { - return IsWindowsVersionOrGreater(5, 2, 2); - } - - // Otherwise we have an NT 5 client. - // We need exactly XP SP3 (version 5.1 SP3 but not version 5.2). - return (IsWindowsVersionOrGreater(5, 1, 3) && - !IsWindowsVersionOrGreater(5, 2, 0)); -} - -bool UIShowCrashUI(const StringTable& files, - const StringTable& queryParameters, - const string& sendURL, - const vector& restartArgs) -{ - gSendData.hDlg = nullptr; - gSendData.sendURL = UTF8ToWide(sendURL); - - // Older Windows don't support the crash report server's crypto. - // This is a hack to use an alternate server. - if (!CanUseMainCrashReportServer() && - gSendData.sendURL.find(SENDURL_ORIGINAL) == 0) { - gSendData.sendURL.replace(0, ARRAYSIZE(SENDURL_ORIGINAL) - 1, - SENDURL_XPSP2); - } - - for (StringTable::const_iterator i = files.begin(); - i != files.end(); - i++) { - gSendData.files[UTF8ToWide(i->first)] = UTF8ToWide(i->second); - } - - for (StringTable::const_iterator i = queryParameters.begin(); - i != queryParameters.end(); - i++) { - gQueryParameters[UTF8ToWide(i->first)] = UTF8ToWide(i->second); - } - - if (gQueryParameters.find(L"Vendor") != gQueryParameters.end()) { - gCrashReporterKey = L"Software\\"; - if (!gQueryParameters[L"Vendor"].empty()) { - gCrashReporterKey += gQueryParameters[L"Vendor"] + L"\\"; - } - gCrashReporterKey += gQueryParameters[L"ProductName"] + L"\\Crash Reporter"; - } - - if (gQueryParameters.find(L"URL") != gQueryParameters.end()) - gURLParameter = gQueryParameters[L"URL"]; - - gRestartArgs = restartArgs; - - if (gStrings.find("isRTL") != gStrings.end() && - gStrings["isRTL"] == "yes") - gRTLlayout = true; - - return 1 == DialogBoxParamMaybeRTL(IDD_SENDDIALOG, nullptr, - (DLGPROC)CrashReporterDialogProc, 0); -} - -void UIError_impl(const string& message) -{ - wstring title = Str(ST_CRASHREPORTERTITLE); - if (title.empty()) - title = L"Crash Reporter Error"; - - MessageBox(nullptr, UTF8ToWide(message).c_str(), title.c_str(), - MB_OK | MB_ICONSTOP); -} - -bool UIGetIniPath(string& path) -{ - wchar_t fileName[MAX_PATH]; - if (GetModuleFileName(nullptr, fileName, MAX_PATH)) { - // get crashreporter ini - wchar_t* s = wcsrchr(fileName, '.'); - if (s) { - wcscpy(s, L".ini"); - path = WideToUTF8(fileName); - return true; - } - } - - return false; -} - -bool UIGetSettingsPath(const string& vendor, - const string& product, - string& settings_path) -{ - wchar_t path[MAX_PATH]; - HRESULT hRes = SHGetFolderPath(nullptr, - CSIDL_APPDATA, - nullptr, - 0, - path); - if (FAILED(hRes)) { - // This provides a fallback for getting the path to APPDATA by querying the - // registry when the call to SHGetFolderPath is unable to provide this path - // (Bug 513958). - HKEY key; - DWORD type, size, dwRes; - dwRes = ::RegOpenKeyExW(HKEY_CURRENT_USER, - L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", - 0, - KEY_READ, - &key); - if (dwRes != ERROR_SUCCESS) - return false; - - dwRes = RegQueryValueExW(key, - L"AppData", - nullptr, - &type, - (LPBYTE)&path, - &size); - ::RegCloseKey(key); - // The call to RegQueryValueExW must succeed, the type must be REG_SZ, the - // buffer size must not equal 0, and the buffer size be a multiple of 2. - if (dwRes != ERROR_SUCCESS || type != REG_SZ || size == 0 || size % 2 != 0) - return false; - } - - if (!vendor.empty()) { - PathAppend(path, UTF8ToWide(vendor).c_str()); - } - PathAppend(path, UTF8ToWide(product).c_str()); - PathAppend(path, L"Crash Reports"); - settings_path = WideToUTF8(path); - return true; -} - -bool UIEnsurePathExists(const string& path) -{ - if (CreateDirectory(UTF8ToWide(path).c_str(), nullptr) == 0) { - if (GetLastError() != ERROR_ALREADY_EXISTS) - return false; - } - - return true; -} - -bool UIFileExists(const string& path) -{ - DWORD attrs = GetFileAttributes(UTF8ToWide(path).c_str()); - return (attrs != INVALID_FILE_ATTRIBUTES); -} - -bool UIMoveFile(const string& oldfile, const string& newfile) -{ - if (oldfile == newfile) - return true; - - return MoveFile(UTF8ToWide(oldfile).c_str(), UTF8ToWide(newfile).c_str()) - == TRUE; -} - -bool UIDeleteFile(const string& oldfile) -{ - return DeleteFile(UTF8ToWide(oldfile).c_str()) == TRUE; -} - -ifstream* UIOpenRead(const string& filename) -{ - // adapted from breakpad's src/common/windows/http_upload.cc - -#if defined(_MSC_VER) - ifstream* file = new ifstream(); - file->open(UTF8ToWide(filename).c_str(), ios::in); -#else // GCC - ifstream* file = new ifstream(WideToMBCP(UTF8ToWide(filename), CP_ACP).c_str(), - ios::in); -#endif // _MSC_VER - - return file; -} - -ofstream* UIOpenWrite(const string& filename, - bool append, // append=false - bool binary) // binary=false -{ - // adapted from breakpad's src/common/windows/http_upload.cc - std::ios_base::openmode mode = ios::out; - if (append) { - mode = mode | ios::app; - } - if (binary) { - mode = mode | ios::binary; - } - -#if defined(_MSC_VER) - ofstream* file = new ofstream(); - file->open(UTF8ToWide(filename).c_str(), mode); -#else // GCC - ofstream* file = new ofstream(WideToMBCP(UTF8ToWide(filename), CP_ACP).c_str(), - mode); -#endif // _MSC_VER - - return file; -} - -struct FileData -{ - FILETIME timestamp; - wstring path; -}; - -static bool CompareFDTime(const FileData& fd1, const FileData& fd2) -{ - return CompareFileTime(&fd1.timestamp, &fd2.timestamp) > 0; -} - -void UIPruneSavedDumps(const std::string& directory) -{ - wstring wdirectory = UTF8ToWide(directory); - - WIN32_FIND_DATA fdata; - wstring findpath = wdirectory + L"\\*.dmp"; - HANDLE dirlist = FindFirstFile(findpath.c_str(), &fdata); - if (dirlist == INVALID_HANDLE_VALUE) - return; - - vector dumpfiles; - - for (BOOL ok = true; ok; ok = FindNextFile(dirlist, &fdata)) { - FileData fd = {fdata.ftLastWriteTime, wdirectory + L"\\" + fdata.cFileName}; - dumpfiles.push_back(fd); - } - - sort(dumpfiles.begin(), dumpfiles.end(), CompareFDTime); - - while (dumpfiles.size() > kSaveCount) { - // get the path of the oldest file - wstring path = (--dumpfiles.end())->path; - DeleteFile(path.c_str()); - - // s/.dmp/.extra/ - path.replace(path.size() - 4, 4, L".extra"); - DeleteFile(path.c_str()); - - dumpfiles.pop_back(); - } -} - -void UIRunMinidumpAnalyzer(const string& exename, const string& filename) -{ - wstring cmdLine; - - cmdLine += L"\"" + UTF8ToWide(exename) + L"\" "; - cmdLine += L"\"" + UTF8ToWide(filename) + L"\" "; - - STARTUPINFO si = {}; - PROCESS_INFORMATION pi = {}; - - si.cb = sizeof(si); - si.dwFlags = STARTF_USESHOWWINDOW; - si.wShowWindow = SW_SHOWNORMAL; - - if (CreateProcess(nullptr, (LPWSTR)cmdLine.c_str(), nullptr, nullptr, FALSE, - 0, nullptr, nullptr, &si, &pi)) { - WaitForSingleObject(pi.hProcess, INFINITE); - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - } -} diff --git a/toolkit/crashreporter/client/macbuild/Contents/Info.plist b/toolkit/crashreporter/client/macbuild/Contents/Info.plist deleted file mode 100644 index 299581f52..000000000 --- a/toolkit/crashreporter/client/macbuild/Contents/Info.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleDisplayName - crashreporter - CFBundleExecutable - crashreporter - CFBundleIconFile - crashreporter.icns - CFBundleIdentifier - org.mozilla.crashreporter - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - crashreporter - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSHasLocalizedDisplayName - - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff --git a/toolkit/crashreporter/client/macbuild/Contents/PkgInfo b/toolkit/crashreporter/client/macbuild/Contents/PkgInfo deleted file mode 100644 index cae6d0a58..000000000 --- a/toolkit/crashreporter/client/macbuild/Contents/PkgInfo +++ /dev/null @@ -1,2 +0,0 @@ -APPL???? - diff --git a/toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in b/toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in deleted file mode 100644 index 6fe086e35..000000000 --- a/toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in +++ /dev/null @@ -1,8 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -/* Localized versions of Info.plist keys */ - -CFBundleName = "Crash Reporter"; -CFBundleDisplayName = "Crash Reporter"; diff --git a/toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenu.nib/classes.nib b/toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenu.nib/classes.nib deleted file mode 100644 index e31ff0bfb..000000000 --- a/toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenu.nib/classes.nib +++ /dev/null @@ -1,102 +0,0 @@ - - - - - IBClasses - - - ACTIONS - - closeClicked - id - emailMeClicked - id - includeURLClicked - id - restartClicked - id - submitReportClicked - id - viewReportClicked - id - viewReportOkClicked - id - - CLASS - CrashReporterUI - LANGUAGE - ObjC - OUTLETS - - mCloseButton - NSButton - mCommentScrollView - NSScrollView - mCommentText - TextViewWithPlaceHolder - mDescriptionLabel - NSTextField - mEmailMeButton - NSButton - mEmailText - NSTextField - mErrorCloseButton - NSButton - mErrorHeaderLabel - NSTextField - mErrorLabel - NSTextField - mErrorView - NSView - mHeaderLabel - NSTextField - mIncludeURLButton - NSButton - mProgressIndicator - NSProgressIndicator - mProgressText - NSTextField - mRestartButton - NSButton - mSubmitReportButton - NSButton - mViewReportButton - NSButton - mViewReportOkButton - NSButton - mViewReportTextView - NSTextView - mViewReportWindow - NSWindow - mWindow - NSWindow - - SUPERCLASS - NSObject - - - ACTIONS - - insertTab - id - - CLASS - TextViewWithPlaceHolder - LANGUAGE - ObjC - SUPERCLASS - NSTextView - - - CLASS - FirstResponder - LANGUAGE - ObjC - SUPERCLASS - NSObject - - - IBVersion - 1 - - diff --git a/toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenu.nib/info.nib b/toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenu.nib/info.nib deleted file mode 100644 index 517349ffc..000000000 --- a/toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenu.nib/info.nib +++ /dev/null @@ -1,18 +0,0 @@ - - - - - IBFramework Version - 629 - IBOldestOS - 5 - IBOpenObjects - - 2 - - IBSystem Version - 9C7010 - targetFramework - IBCocoaFramework - - diff --git a/toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenu.nib/keyedobjects.nib b/toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenu.nib/keyedobjects.nib deleted file mode 100644 index bfdcccb74c66424472a22a064c429f5c67171ef3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25518 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%0A7L((mvRutW$sJWZ?mcpAY_AwG`830X)yzMRP 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 - - - - IBClasses - - - ACTIONS - - closeClicked - id - emailMeClicked - id - includeURLClicked - id - restartClicked - id - submitReportClicked - id - viewReportClicked - id - viewReportOkClicked - id - - CLASS - CrashReporterUI - LANGUAGE - ObjC - OUTLETS - - mCloseButton - NSButton - mCommentScrollView - NSScrollView - mCommentText - TextViewWithPlaceHolder - mDescriptionLabel - NSTextField - mEmailMeButton - NSButton - mEmailText - NSTextField - mErrorCloseButton - NSButton - mErrorHeaderLabel - NSTextField - mErrorLabel - NSTextField - mErrorView - NSView - mHeaderLabel - NSTextField - mIncludeURLButton - NSButton - mProgressIndicator - NSProgressIndicator - mProgressText - NSTextField - mRestartButton - NSButton - mSubmitReportButton - NSButton - mViewReportButton - NSButton - mViewReportOkButton - NSButton - mViewReportTextView - NSTextView - mViewReportWindow - NSWindow - mWindow - NSWindow - - SUPERCLASS - NSObject - - - ACTIONS - - insertTab - id - - CLASS - TextViewWithPlaceHolder - LANGUAGE - ObjC - SUPERCLASS - NSTextView - - - CLASS - FirstResponder - LANGUAGE - ObjC - SUPERCLASS - NSObject - - - IBVersion - 1 - - diff --git a/toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenuRTL.nib/info.nib b/toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenuRTL.nib/info.nib deleted file mode 100644 index 4a2251aaf..000000000 --- a/toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenuRTL.nib/info.nib +++ /dev/null @@ -1,18 +0,0 @@ - - - - - IBFramework Version - 629 - IBOldestOS - 5 - IBOpenObjects - - 2 - - IBSystem Version - 9D34 - targetFramework - IBCocoaFramework - - diff --git a/toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenuRTL.nib/keyedobjects.nib b/toolkit/crashreporter/client/macbuild/Contents/Resources/English.lproj/MainMenuRTL.nib/keyedobjects.nib deleted file mode 100644 index 6c93849b94ff6db75660a631b6882f14a219b00e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27032 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 VS-yNY10uxvE3R_>w*D=%{2vLmwHW{a diff --git a/toolkit/crashreporter/client/macbuild/Contents/Resources/crashreporter.icns b/toolkit/crashreporter/client/macbuild/Contents/Resources/crashreporter.icns deleted file mode 100644 index 341cd05a4d00a3a602ba21f518e9970c91c40d60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61743 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 { - link.className = ""; - // Reset the link to point at our new crash report. This way, if the - // user clicks "Back", the link will be correct. - link.firstChild.textContent = remoteCrashID; - link.setAttribute("id", remoteCrashID); - link.removeEventListener("click", submitPendingReport, true); - - if (reportURL) { - link.setAttribute("href", reportURL + remoteCrashID); - // redirect the user to their brand new crash report - window.location.href = reportURL + remoteCrashID; - } - }, - () => { - // XXX: do something more useful here - link.className = ""; - - // Dispatch an event, useful for testing - let event = document.createEvent("Events"); - event.initEvent("CrashSubmitFailed", true, false); - document.dispatchEvent(event); - }); - event.preventDefault(); - return false; -} - -function populateReportList() { - - Services.telemetry.getHistogramById("ABOUTCRASHES_OPENED_COUNT").add(1); - - var prefService = Cc["@mozilla.org/preferences-service;1"]. - getService(Ci.nsIPrefBranch); - - try { - reportURL = prefService.getCharPref("breakpad.reportURL"); - // Ignore any non http/https urls - if (!/^https?:/i.test(reportURL)) - reportURL = null; - } - catch (e) { } - if (!reportURL) { - document.getElementById("clear-reports").style.display = "none"; - document.getElementById("reportList").style.display = "none"; - document.getElementById("noConfig").style.display = "block"; - return; - } - let reports = CrashReports.getReports(); - - if (reports.length == 0) { - document.getElementById("clear-reports").style.display = "none"; - document.getElementById("reportList").style.display = "none"; - document.getElementById("noReports").style.display = "block"; - return; - } - - const locale = Cc["@mozilla.org/chrome/chrome-registry;1"] - .getService(Ci.nsIXULChromeRegistry) - .getSelectedLocale("global", true); - var dateFormatter = new Intl.DateTimeFormat(locale, { year: '2-digit', - month: 'numeric', - day: 'numeric' }); - var timeFormatter = new Intl.DateTimeFormat(locale, { hour: 'numeric', - minute: 'numeric' }); - var ios = Cc["@mozilla.org/network/io-service;1"]. - getService(Ci.nsIIOService); - var reportURI = ios.newURI(reportURL, null, null); - // resolving this URI relative to /report/index - var aboutThrottling = ios.newURI("../../about/throttling", null, reportURI); - - for (var i = 0; i < reports.length; i++) { - var row = document.createElement("tr"); - var cell = document.createElement("td"); - row.appendChild(cell); - var link = document.createElement("a"); - if (reports[i].pending) { - link.setAttribute("href", aboutThrottling.spec); - link.addEventListener("click", submitPendingReport, true); - } - else { - link.setAttribute("href", reportURL + reports[i].id); - } - link.setAttribute("id", reports[i].id); - link.classList.add("crashReport"); - link.appendChild(document.createTextNode(reports[i].id)); - cell.appendChild(link); - - var date = new Date(reports[i].date); - cell = document.createElement("td"); - cell.appendChild(document.createTextNode(dateFormatter.format(date))); - row.appendChild(cell); - cell = document.createElement("td"); - cell.appendChild(document.createTextNode(timeFormatter.format(date))); - row.appendChild(cell); - if (reports[i].pending) { - document.getElementById("unsubmitted").appendChild(row); - } else { - document.getElementById("submitted").appendChild(row); - } - } -} - -var clearReports = Task.async(function*() { - let bundle = Services.strings.createBundle("chrome://global/locale/crashes.properties"); - - if (!Services. - prompt.confirm(window, - bundle.GetStringFromName("deleteconfirm.title"), - bundle.GetStringFromName("deleteconfirm.description"))) { - return; - } - - let cleanupFolder = Task.async(function*(path, filter) { - let iterator = new OS.File.DirectoryIterator(path); - try { - yield iterator.forEach(Task.async(function*(aEntry) { - if (!filter || (yield filter(aEntry))) { - yield OS.File.remove(aEntry.path); - } - })); - } catch (e) { - if (!(e instanceof OS.File.Error) || !e.becauseNoSuchFile) { - throw e; - } - } finally { - iterator.close(); - } - }); - - yield cleanupFolder(CrashReports.submittedDir.path, function*(aEntry) { - return aEntry.name.startsWith("bp-") && aEntry.name.endsWith(".txt"); - }); - - let oneYearAgo = Date.now() - 31586000000; - yield cleanupFolder(CrashReports.reportsDir.path, function*(aEntry) { - if (!aEntry.name.startsWith("InstallTime") || - aEntry.name == "InstallTime" + buildID) { - return false; - } - - let date = aEntry.winLastWriteDate; - if (!date) { - let stat = yield OS.File.stat(aEntry.path); - date = stat.lastModificationDate; - } - - return (date < oneYearAgo); - }); - - yield cleanupFolder(CrashReports.pendingDir.path); - - document.getElementById("clear-reports").style.display = "none"; - document.getElementById("reportList").style.display = "none"; - document.getElementById("noReports").style.display = "block"; -}); diff --git a/toolkit/crashreporter/content/crashes.xhtml b/toolkit/crashreporter/content/crashes.xhtml deleted file mode 100644 index 695320356..000000000 --- a/toolkit/crashreporter/content/crashes.xhtml +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - %globalDTD; - %crashesDTD; -]> - - - - - -