15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROME_BROWSER_APPLICATION_MAC_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_CHROME_BROWSER_APPLICATION_MAC_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __OBJC__
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import <AppKit/AppKit.h>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import "base/mac/scoped_sending_event.h"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#import "base/message_loop/message_pump_mac.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@interface BrowserCrApplication : NSApplication<CrAppProtocol,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                CrAppControlProtocol> {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @private
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOL handlingSendEvent_;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOL cyclingWindows_;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // App's previous key windows. Most recent key window is last.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Does not include current key window. Elements of this vector are weak
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // references.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<NSWindow*> previousKeyWindows_;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Guards previousKeyWindows_.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Lock previousKeyWindowsLock_;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Our implementation of |-terminate:| only attempts to terminate the
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// application, i.e., begins a process which may lead to termination. This
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// method cancels that process.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)cancelTerminate:(id)sender;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Keep track of the previous key windows and whether windows are being
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cycled for use in determining whether a Panel window can become the
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// key window.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSWindow*)previousKeyWindow;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (BOOL)isCyclingWindows;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome_browser_application_mac {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Bin for unknown exceptions. Exposed for testing purposes.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const size_t kUnknownNSException;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the histogram bin for |exception| if it is one we track
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specifically, or |kUnknownNSException| if unknown.  Exposed for testing
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// purposes.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t BinForException(NSException* exception);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use UMA to track exception occurance. Exposed for testing purposes.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RecordExceptionWithUma(NSException* exception);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chrome_browser_application_mac
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // __OBJC__
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome_browser_application_mac {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To be used to instantiate BrowserCrApplication from C++ code.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RegisterBrowserCrApp();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Calls -[NSApp terminate:].
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Terminate();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cancels a termination started by |Terminate()|.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CancelTerminate();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chrome_browser_application_mac
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_CHROME_BROWSER_APPLICATION_MAC_H_
76