| 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
|
|
|