summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chrome_browser_application_mac.mm
diff options
context:
space:
mode:
authorshess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-24 22:07:05 +0000
committershess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-24 22:07:05 +0000
commit39e3b9538deaedaaa8104f1cc67bcddaacad8269 (patch)
tree1954c4dbd73ffdce24040d2dea10bbc3a6e59691 /chrome/browser/chrome_browser_application_mac.mm
parent3aca95d4039b0f7d4ffb3a811a94622afa7f4114 (diff)
downloadchromium_src-39e3b9538deaedaaa8104f1cc67bcddaacad8269.zip
chromium_src-39e3b9538deaedaaa8104f1cc67bcddaacad8269.tar.gz
chromium_src-39e3b9538deaedaaa8104f1cc67bcddaacad8269.tar.bz2
[Mac] Allow NSExceptions in certain cases.
Thirdy-party print drivers seem to be a source of NSExceptions which Chromium will never be able to fix. ScopedNSExceptionEnabler causes the code which makes throwing an NSException fatal to allow throws. The flag will be reset in -reportException: in most cases. For now, allow exceptions to be thrown for -selectPDE: (bug 80686) and PrintingContextMac::AskUserForSettings() (bug 82589). BUG=80686, 82589 TEST=Monitor crash server. Review URL: http://codereview.chromium.org/7038010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@86503 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/chrome_browser_application_mac.mm')
-rw-r--r--chrome/browser/chrome_browser_application_mac.mm26
1 files changed, 24 insertions, 2 deletions
diff --git a/chrome/browser/chrome_browser_application_mac.mm b/chrome/browser/chrome_browser_application_mac.mm
index 745e0ab..d407dde 100644
--- a/chrome/browser/chrome_browser_application_mac.mm
+++ b/chrome/browser/chrome_browser_application_mac.mm
@@ -5,6 +5,7 @@
#import "chrome/browser/chrome_browser_application_mac.h"
#import "base/logging.h"
+#import "base/mac/scoped_nsexception_enabler.h"
#import "base/metrics/histogram.h"
#import "base/memory/scoped_nsobject.h"
#import "base/sys_string_conversions.h"
@@ -93,7 +94,8 @@ static IMP gOriginalInitIMP = NULL;
// (destructors are skipped). Chrome should be NSException-free,
// please check your backtrace and see if you can't file a bug
// with a repro case.
- if (fatal) {
+ const bool allow = base::mac::GetNSExceptionsAllowed();
+ if (fatal && !allow) {
LOG(FATAL) << "Someone is trying to raise an exception! "
<< base::SysNSStringToUTF8(value);
} else {
@@ -101,7 +103,7 @@ static IMP gOriginalInitIMP = NULL;
// exceptions.
DLOG(ERROR) << "Someone is trying to raise an exception! "
<< base::SysNSStringToUTF8(value);
- NOTREACHED();
+ DCHECK(allow);
}
}
@@ -329,6 +331,21 @@ BOOL SwizzleNSExceptionInit() {
[sender className], tag, actionString, aTarget];
ScopedCrashKey key(kActionKey, value);
+
+ // Certain third-party code, such as print drivers, can still throw
+ // exceptions and Chromium cannot fix them. This provides a way to
+ // work around those on a spot basis.
+ bool enableNSExceptions = false;
+
+ // http://crbug.com/80686 , an Epson printer driver.
+ if (anAction == @selector(selectPDE:)) {
+ enableNSExceptions = true;
+ }
+
+ // Minimize the window by keeping this close to the super call.
+ scoped_ptr<base::mac::ScopedNSExceptionEnabler> enabler(NULL);
+ if (enableNSExceptions)
+ enabler.reset(new base::mac::ScopedNSExceptionEnabler());
return [super sendAction:anAction to:aTarget from:sender];
}
@@ -354,6 +371,11 @@ BOOL SwizzleNSExceptionInit() {
// addressed elsewhere.
[self clearIsHandlingSendEvent];
+ // If |ScopedNSExceptionEnabler| is used to allow exceptions, and an
+ // uncaught exception is thrown, it will throw past all of the scopers.
+ // Reset the flag so that future exceptions are not masked.
+ base::mac::SetNSExceptionsAllowed(false);
+
// Store some human-readable information in breakpad keys in case
// there is a crash. Since breakpad does not provide infinite
// storage, we track two exceptions. The first exception thrown