diff options
author | shess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-24 22:07:05 +0000 |
---|---|---|
committer | shess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-24 22:07:05 +0000 |
commit | 39e3b9538deaedaaa8104f1cc67bcddaacad8269 (patch) | |
tree | 1954c4dbd73ffdce24040d2dea10bbc3a6e59691 /chrome/browser/chrome_browser_application_mac.mm | |
parent | 3aca95d4039b0f7d4ffb3a811a94622afa7f4114 (diff) | |
download | chromium_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.mm | 26 |
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 |