OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "chrome/browser/chrome_browser_application_mac.h" | 5 #import "chrome/browser/chrome_browser_application_mac.h" |
6 | 6 |
7 #import "base/auto_reset.h" | 7 #import "base/auto_reset.h" |
8 #import "base/logging.h" | 8 #import "base/logging.h" |
9 #include "base/mac/crash_logging.h" | 9 #include "base/mac/crash_logging.h" |
10 #import "base/mac/scoped_nsexception_enabler.h" | 10 #import "base/mac/scoped_nsexception_enabler.h" |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 | 225 |
226 + (void)initialize { | 226 + (void)initialize { |
227 // Turn all deallocated Objective-C objects into zombies, keeping | 227 // Turn all deallocated Objective-C objects into zombies, keeping |
228 // the most recent 10,000 of them on the treadmill. | 228 // the most recent 10,000 of them on the treadmill. |
229 ObjcEvilDoers::ZombieEnable(true, 10000); | 229 ObjcEvilDoers::ZombieEnable(true, 10000); |
230 } | 230 } |
231 | 231 |
232 - (id)init { | 232 - (id)init { |
233 SwizzleInit(); | 233 SwizzleInit(); |
234 if ((self = [super init])) { | 234 if ((self = [super init])) { |
235 eventHooks_.reset([[NSMutableArray alloc] init]); | |
236 } | 235 } |
237 | 236 |
238 // Sanity check to alert if overridden methods are not supported. | 237 // Sanity check to alert if overridden methods are not supported. |
239 DCHECK([NSApplication | 238 DCHECK([NSApplication |
240 instancesRespondToSelector:@selector(_cycleWindowsReversed:)]); | 239 instancesRespondToSelector:@selector(_cycleWindowsReversed:)]); |
241 DCHECK([NSApplication | 240 DCHECK([NSApplication |
242 instancesRespondToSelector:@selector(_removeWindow:)]); | 241 instancesRespondToSelector:@selector(_removeWindow:)]); |
243 DCHECK([NSApplication | 242 DCHECK([NSApplication |
244 instancesRespondToSelector:@selector(_setKeyWindow:)]); | 243 instancesRespondToSelector:@selector(_setKeyWindow:)]); |
245 | 244 |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
406 enableNSExceptions = true; | 405 enableNSExceptions = true; |
407 } | 406 } |
408 | 407 |
409 // Minimize the window by keeping this close to the super call. | 408 // Minimize the window by keeping this close to the super call. |
410 scoped_ptr<base::mac::ScopedNSExceptionEnabler> enabler(NULL); | 409 scoped_ptr<base::mac::ScopedNSExceptionEnabler> enabler(NULL); |
411 if (enableNSExceptions) | 410 if (enableNSExceptions) |
412 enabler.reset(new base::mac::ScopedNSExceptionEnabler()); | 411 enabler.reset(new base::mac::ScopedNSExceptionEnabler()); |
413 return [super sendAction:anAction to:aTarget from:sender]; | 412 return [super sendAction:anAction to:aTarget from:sender]; |
414 } | 413 } |
415 | 414 |
416 - (void)addEventHook:(id<CrApplicationEventHookProtocol>)handler { | |
417 [eventHooks_ addObject:handler]; | |
418 } | |
419 | |
420 - (void)removeEventHook:(id<CrApplicationEventHookProtocol>)handler { | |
421 [eventHooks_ removeObject:handler]; | |
422 } | |
423 | |
424 - (BOOL)isHandlingSendEvent { | 415 - (BOOL)isHandlingSendEvent { |
425 return handlingSendEvent_; | 416 return handlingSendEvent_; |
426 } | 417 } |
427 | 418 |
428 - (void)setHandlingSendEvent:(BOOL)handlingSendEvent { | 419 - (void)setHandlingSendEvent:(BOOL)handlingSendEvent { |
429 handlingSendEvent_ = handlingSendEvent; | 420 handlingSendEvent_ = handlingSendEvent; |
430 } | 421 } |
431 | 422 |
432 - (void)sendEvent:(NSEvent*)event { | |
433 base::mac::ScopedSendingEvent sendingEventScoper; | |
434 for (id<CrApplicationEventHookProtocol> handler in eventHooks_.get()) { | |
435 [handler hookForEvent:event]; | |
436 } | |
437 [super sendEvent:event]; | |
438 } | |
439 | |
440 // NSExceptions which are caught by the event loop are logged here. | 423 // NSExceptions which are caught by the event loop are logged here. |
441 // NSException uses setjmp/longjmp, which can be very bad for C++, so | 424 // NSException uses setjmp/longjmp, which can be very bad for C++, so |
442 // we attempt to track and report them. | 425 // we attempt to track and report them. |
443 - (void)reportException:(NSException *)anException { | 426 - (void)reportException:(NSException *)anException { |
444 // If we throw an exception in this code, we can create an infinite | 427 // If we throw an exception in this code, we can create an infinite |
445 // loop. If we throw out of the if() without resetting | 428 // loop. If we throw out of the if() without resetting |
446 // |reportException|, we'll stop reporting exceptions for this run. | 429 // |reportException|, we'll stop reporting exceptions for this run. |
447 static BOOL reportingException = NO; | 430 static BOOL reportingException = NO; |
448 DCHECK(!reportingException); | 431 DCHECK(!reportingException); |
449 if (!reportingException) { | 432 if (!reportingException) { |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 std::vector<NSWindow*>::iterator window_iterator = | 552 std::vector<NSWindow*>::iterator window_iterator = |
570 std::find(previousKeyWindows_.begin(), | 553 std::find(previousKeyWindows_.begin(), |
571 previousKeyWindows_.end(), | 554 previousKeyWindows_.end(), |
572 window); | 555 window); |
573 if (window_iterator != previousKeyWindows_.end()) { | 556 if (window_iterator != previousKeyWindows_.end()) { |
574 previousKeyWindows_.erase(window_iterator); | 557 previousKeyWindows_.erase(window_iterator); |
575 } | 558 } |
576 } | 559 } |
577 | 560 |
578 @end | 561 @end |
OLD | NEW |