Index: chrome/browser/chrome_browser_application_mac.mm |
diff --git a/chrome/browser/chrome_browser_application_mac.mm b/chrome/browser/chrome_browser_application_mac.mm |
index 745e0ab4dbb9396913f4db9a7f0da5232da12271..d407dde98ff9d5227666c69ba3e5485e945b54ec 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 |