| 
									
										
										
										
											2014-10-31 11:17:05 -07:00
										 |  |  | // Copyright (c) 2013 GitHub, Inc. | 
					
						
							| 
									
										
										
										
											2014-04-25 17:49:37 +08:00
										 |  |  | // Use of this source code is governed by the MIT license that can be | 
					
						
							| 
									
										
										
										
											2013-05-02 23:43:23 +08:00
										 |  |  | // found in the LICENSE file. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-16 08:30:26 +08:00
										 |  |  | #include "atom/browser/browser.h" | 
					
						
							| 
									
										
										
										
											2013-05-02 23:43:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-02 14:05:37 +02:00
										 |  |  | #include <string> | 
					
						
							|  |  |  | #include <utility> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-14 15:55:41 +08:00
										 |  |  | #include "atom/browser/mac/atom_application.h" | 
					
						
							|  |  |  | #include "atom/browser/mac/atom_application_delegate.h" | 
					
						
							| 
									
										
										
										
											2016-05-05 16:26:44 +09:00
										 |  |  | #include "atom/browser/mac/dict_util.h" | 
					
						
							| 
									
										
										
										
											2014-06-25 11:55:33 +08:00
										 |  |  | #include "atom/browser/native_window.h" | 
					
						
							|  |  |  | #include "atom/browser/window_list.h" | 
					
						
							| 
									
										
										
										
											2018-10-24 12:49:10 +02:00
										 |  |  | #include "atom/common/application_info.h" | 
					
						
							| 
									
										
										
										
											2018-04-20 14:47:04 -04:00
										 |  |  | #include "atom/common/platform_util.h" | 
					
						
							| 
									
										
										
										
											2019-02-12 21:06:33 -08:00
										 |  |  | #include "atom/common/promise_util.h" | 
					
						
							| 
									
										
										
										
											2016-03-21 11:24:25 -07:00
										 |  |  | #include "base/mac/bundle_locations.h" | 
					
						
							| 
									
										
										
										
											2015-04-14 15:55:41 +08:00
										 |  |  | #include "base/mac/foundation_util.h" | 
					
						
							| 
									
										
										
										
											2016-07-06 11:43:44 -07:00
										 |  |  | #include "base/mac/mac_util.h" | 
					
						
							| 
									
										
										
										
											2019-02-21 22:43:43 +05:30
										 |  |  | #include "base/mac/scoped_cftyperef.h" | 
					
						
							| 
									
										
										
										
											2016-07-01 17:39:01 +09:00
										 |  |  | #include "base/strings/string_number_conversions.h" | 
					
						
							| 
									
										
										
										
											2016-07-02 10:36:11 +09:00
										 |  |  | #include "base/strings/sys_string_conversions.h" | 
					
						
							| 
									
										
										
										
											2016-05-23 11:49:46 -04:00
										 |  |  | #include "net/base/mac/url_conversions.h" | 
					
						
							| 
									
										
										
										
											2018-03-06 16:12:10 +09:00
										 |  |  | #include "ui/gfx/image/image.h" | 
					
						
							| 
									
										
										
										
											2016-05-23 11:49:46 -04:00
										 |  |  | #include "url/gurl.h" | 
					
						
							| 
									
										
										
										
											2013-05-02 23:43:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace atom { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-05 16:13:35 +09:00
										 |  |  | void Browser::SetShutdownHandler(base::Callback<bool()> handler) { | 
					
						
							|  |  |  |   [[AtomApplication sharedApplication] setShutdownHandler:std::move(handler)]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-30 19:24:47 +08:00
										 |  |  | void Browser::Focus() { | 
					
						
							| 
									
										
										
										
											2019-02-26 09:44:38 +08:00
										 |  |  |   [[AtomApplication sharedApplication] activateIgnoringOtherApps:NO]; | 
					
						
							| 
									
										
										
										
											2013-05-30 19:24:47 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-29 12:30:19 +01:00
										 |  |  | void Browser::Hide() { | 
					
						
							|  |  |  |   [[AtomApplication sharedApplication] hide:nil]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-30 21:40:32 +01:00
										 |  |  | void Browser::Show() { | 
					
						
							|  |  |  |   [[AtomApplication sharedApplication] unhide:nil]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-17 13:05:06 +08:00
										 |  |  | void Browser::AddRecentDocument(const base::FilePath& path) { | 
					
						
							| 
									
										
										
										
											2015-12-15 17:17:24 +08:00
										 |  |  |   NSString* path_string = base::mac::FilePathToNSString(path); | 
					
						
							|  |  |  |   if (!path_string) | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   NSURL* u = [NSURL fileURLWithPath:path_string]; | 
					
						
							|  |  |  |   if (!u) | 
					
						
							|  |  |  |     return; | 
					
						
							| 
									
										
										
										
											2014-11-17 13:05:06 +08:00
										 |  |  |   [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:u]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-17 16:13:47 +08:00
										 |  |  | void Browser::ClearRecentDocuments() { | 
					
						
							| 
									
										
										
										
											2015-12-29 18:35:54 -06:00
										 |  |  |   [[NSDocumentController sharedDocumentController] clearRecentDocuments:nil]; | 
					
						
							| 
									
										
										
										
											2014-11-17 16:13:47 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-16 15:54:30 +10:00
										 |  |  | bool Browser::RemoveAsDefaultProtocolClient(const std::string& protocol, | 
					
						
							|  |  |  |                                             mate::Arguments* args) { | 
					
						
							| 
									
										
										
										
											2016-05-07 11:07:58 -07:00
										 |  |  |   NSString* identifier = [base::mac::MainBundle() bundleIdentifier]; | 
					
						
							|  |  |  |   if (!identifier) | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-16 17:40:44 +10:00
										 |  |  |   if (!Browser::IsDefaultProtocolClient(protocol, args)) | 
					
						
							| 
									
										
										
										
											2016-05-08 10:50:17 -07:00
										 |  |  |     return false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-07 11:07:58 -07:00
										 |  |  |   NSString* protocol_ns = [NSString stringWithUTF8String:protocol.c_str()]; | 
					
						
							|  |  |  |   CFStringRef protocol_cf = base::mac::NSToCFCast(protocol_ns); | 
					
						
							|  |  |  |   CFArrayRef bundleList = LSCopyAllHandlersForURLScheme(protocol_cf); | 
					
						
							|  |  |  |   if (!bundleList) { | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-06-18 15:26:26 +02:00
										 |  |  |   // On macOS, we can't query the default, but the handlers list seems to put | 
					
						
							| 
									
										
										
										
											2016-05-07 11:07:58 -07:00
										 |  |  |   // Apple's defaults first, so we'll use the first option that isn't our bundle | 
					
						
							|  |  |  |   CFStringRef other = nil; | 
					
						
							| 
									
										
										
										
											2017-03-30 22:56:21 +02:00
										 |  |  |   for (CFIndex i = 0; i < CFArrayGetCount(bundleList); ++i) { | 
					
						
							| 
									
										
										
										
											2018-04-20 14:47:04 -04:00
										 |  |  |     other = | 
					
						
							|  |  |  |         base::mac::CFCast<CFStringRef>(CFArrayGetValueAtIndex(bundleList, i)); | 
					
						
							|  |  |  |     if (![identifier isEqualToString:(__bridge NSString*)other]) { | 
					
						
							| 
									
										
										
										
											2016-05-07 11:07:58 -07:00
										 |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 20:16:37 -07:00
										 |  |  |   // No other app was found set it to none instead of setting it back to itself. | 
					
						
							|  |  |  |   if ([identifier isEqualToString:(__bridge NSString*)other]) { | 
					
						
							|  |  |  |     other = base::mac::NSToCFCast(@"None"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-07 11:07:58 -07:00
										 |  |  |   OSStatus return_code = LSSetDefaultHandlerForURLScheme(protocol_cf, other); | 
					
						
							|  |  |  |   return return_code == noErr; | 
					
						
							| 
									
										
										
										
											2016-03-24 10:55:09 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-16 15:54:30 +10:00
										 |  |  | bool Browser::SetAsDefaultProtocolClient(const std::string& protocol, | 
					
						
							| 
									
										
										
										
											2016-08-22 09:50:58 +09:00
										 |  |  |                                          mate::Arguments* args) { | 
					
						
							| 
									
										
										
										
											2016-03-21 11:24:25 -07:00
										 |  |  |   if (protocol.empty()) | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   NSString* identifier = [base::mac::MainBundle() bundleIdentifier]; | 
					
						
							|  |  |  |   if (!identifier) | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   NSString* protocol_ns = [NSString stringWithUTF8String:protocol.c_str()]; | 
					
						
							| 
									
										
										
										
											2018-04-20 14:47:04 -04:00
										 |  |  |   OSStatus return_code = LSSetDefaultHandlerForURLScheme( | 
					
						
							|  |  |  |       base::mac::NSToCFCast(protocol_ns), base::mac::NSToCFCast(identifier)); | 
					
						
							| 
									
										
										
										
											2016-03-21 11:24:25 -07:00
										 |  |  |   return return_code == noErr; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-16 15:54:30 +10:00
										 |  |  | bool Browser::IsDefaultProtocolClient(const std::string& protocol, | 
					
						
							|  |  |  |                                       mate::Arguments* args) { | 
					
						
							| 
									
										
										
										
											2016-04-24 22:17:01 -07:00
										 |  |  |   if (protocol.empty()) | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   NSString* identifier = [base::mac::MainBundle() bundleIdentifier]; | 
					
						
							|  |  |  |   if (!identifier) | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   NSString* protocol_ns = [NSString stringWithUTF8String:protocol.c_str()]; | 
					
						
							| 
									
										
										
										
											2016-04-30 11:17:29 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-21 22:43:43 +05:30
										 |  |  |   base::ScopedCFTypeRef<CFStringRef> bundleId( | 
					
						
							|  |  |  |       LSCopyDefaultHandlerForURLScheme(base::mac::NSToCFCast(protocol_ns))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-24 22:17:01 -07:00
										 |  |  |   if (!bundleId) | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-30 11:17:29 -07:00
										 |  |  |   // Ensure the comparison is case-insensitive | 
					
						
							| 
									
										
										
										
											2016-04-24 22:17:01 -07:00
										 |  |  |   // as LS does not persist the case of the bundle id. | 
					
						
							| 
									
										
										
										
											2019-02-21 22:43:43 +05:30
										 |  |  |   NSComparisonResult result = | 
					
						
							|  |  |  |       [base::mac::CFToNSCast(bundleId) caseInsensitiveCompare:identifier]; | 
					
						
							| 
									
										
										
										
											2016-04-24 22:17:01 -07:00
										 |  |  |   return result == NSOrderedSame; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-20 14:47:04 -04:00
										 |  |  | void Browser::SetAppUserModelID(const base::string16& name) {} | 
					
						
							| 
									
										
										
										
											2015-11-03 15:09:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-01 22:18:39 +09:00
										 |  |  | bool Browser::SetBadgeCount(int count) { | 
					
						
							| 
									
										
										
										
											2019-04-20 13:20:37 -04:00
										 |  |  |   DockSetBadgeText(count != 0 ? base::NumberToString(count) : ""); | 
					
						
							| 
									
										
										
										
											2016-07-02 10:36:11 +09:00
										 |  |  |   badge_count_ = count; | 
					
						
							| 
									
										
										
										
											2016-07-01 22:18:39 +09:00
										 |  |  |   return true; | 
					
						
							| 
									
										
										
										
											2016-07-01 17:39:01 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-23 11:49:46 -04:00
										 |  |  | void Browser::SetUserActivity(const std::string& type, | 
					
						
							|  |  |  |                               const base::DictionaryValue& user_info, | 
					
						
							|  |  |  |                               mate::Arguments* args) { | 
					
						
							|  |  |  |   std::string url_string; | 
					
						
							|  |  |  |   args->GetNext(&url_string); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-05 16:38:47 +09:00
										 |  |  |   [[AtomApplication sharedApplication] | 
					
						
							|  |  |  |       setCurrentActivity:base::SysUTF8ToNSString(type) | 
					
						
							| 
									
										
										
										
											2016-05-23 11:49:46 -04:00
										 |  |  |             withUserInfo:DictionaryValueToNSDictionary(user_info) | 
					
						
							|  |  |  |           withWebpageURL:net::NSURLWithGURL(GURL(url_string))]; | 
					
						
							| 
									
										
										
										
											2016-05-03 15:51:31 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | std::string Browser::GetCurrentActivityType() { | 
					
						
							| 
									
										
										
										
											2019-02-25 18:21:57 +01:00
										 |  |  |   NSUserActivity* userActivity = | 
					
						
							|  |  |  |       [[AtomApplication sharedApplication] getCurrentActivity]; | 
					
						
							|  |  |  |   return base::SysNSStringToUTF8(userActivity.activityType); | 
					
						
							| 
									
										
										
										
											2016-04-29 17:35:07 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-26 16:14:44 -03:00
										 |  |  | void Browser::InvalidateCurrentActivity() { | 
					
						
							|  |  |  |   [[AtomApplication sharedApplication] invalidateCurrentActivity]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Browser::UpdateCurrentActivity(const std::string& type, | 
					
						
							|  |  |  |                                     const base::DictionaryValue& user_info) { | 
					
						
							| 
									
										
										
										
											2017-09-14 16:12:34 +09:00
										 |  |  |   [[AtomApplication sharedApplication] | 
					
						
							| 
									
										
										
										
											2017-06-26 16:14:44 -03:00
										 |  |  |       updateCurrentActivity:base::SysUTF8ToNSString(type) | 
					
						
							|  |  |  |                withUserInfo:DictionaryValueToNSDictionary(user_info)]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool Browser::WillContinueUserActivity(const std::string& type) { | 
					
						
							|  |  |  |   bool prevent_default = false; | 
					
						
							| 
									
										
										
										
											2017-09-14 16:12:34 +09:00
										 |  |  |   for (BrowserObserver& observer : observers_) | 
					
						
							|  |  |  |     observer.OnWillContinueUserActivity(&prevent_default, type); | 
					
						
							| 
									
										
										
										
											2017-06-26 16:14:44 -03:00
										 |  |  |   return prevent_default; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-09-14 16:12:34 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-26 16:14:44 -03:00
										 |  |  | void Browser::DidFailToContinueUserActivity(const std::string& type, | 
					
						
							|  |  |  |                                             const std::string& error) { | 
					
						
							|  |  |  |   for (BrowserObserver& observer : observers_) | 
					
						
							|  |  |  |     observer.OnDidFailToContinueUserActivity(type, error); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-23 11:49:46 -04:00
										 |  |  | bool Browser::ContinueUserActivity(const std::string& type, | 
					
						
							|  |  |  |                                    const base::DictionaryValue& user_info) { | 
					
						
							| 
									
										
										
										
											2016-05-05 16:26:44 +09:00
										 |  |  |   bool prevent_default = false; | 
					
						
							| 
									
										
										
										
											2017-01-24 12:34:39 +09:00
										 |  |  |   for (BrowserObserver& observer : observers_) | 
					
						
							|  |  |  |     observer.OnContinueUserActivity(&prevent_default, type, user_info); | 
					
						
							| 
									
										
										
										
											2016-05-05 16:26:44 +09:00
										 |  |  |   return prevent_default; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-09-14 16:12:34 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-26 16:14:44 -03:00
										 |  |  | void Browser::UserActivityWasContinued(const std::string& type, | 
					
						
							|  |  |  |                                        const base::DictionaryValue& user_info) { | 
					
						
							|  |  |  |   for (BrowserObserver& observer : observers_) | 
					
						
							|  |  |  |     observer.OnUserActivityWasContinued(type, user_info); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-09 12:09:47 -03:00
										 |  |  | bool Browser::UpdateUserActivityState(const std::string& type, | 
					
						
							| 
									
										
										
										
											2017-06-26 16:14:44 -03:00
										 |  |  |                                       const base::DictionaryValue& user_info) { | 
					
						
							| 
									
										
										
										
											2017-08-09 12:09:47 -03:00
										 |  |  |   bool prevent_default = false; | 
					
						
							| 
									
										
										
										
											2017-06-26 16:14:44 -03:00
										 |  |  |   for (BrowserObserver& observer : observers_) | 
					
						
							| 
									
										
										
										
											2017-08-09 12:09:47 -03:00
										 |  |  |     observer.OnUpdateUserActivityState(&prevent_default, type, user_info); | 
					
						
							|  |  |  |   return prevent_default; | 
					
						
							| 
									
										
										
										
											2017-06-26 16:14:44 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-05-05 16:26:44 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-30 14:01:40 -08:00
										 |  |  | Browser::LoginItemSettings Browser::GetLoginItemSettings( | 
					
						
							| 
									
										
										
										
											2017-03-29 21:29:52 +02:00
										 |  |  |     const LoginItemSettings& options) { | 
					
						
							| 
									
										
										
										
											2016-07-07 16:29:09 -07:00
										 |  |  |   LoginItemSettings settings; | 
					
						
							| 
									
										
										
										
											2017-10-17 16:28:29 +09:00
										 |  |  | #if defined(MAS_BUILD) | 
					
						
							|  |  |  |   settings.open_at_login = platform_util::GetLoginItemEnabled(); | 
					
						
							|  |  |  | #else | 
					
						
							| 
									
										
										
										
											2018-04-20 14:47:04 -04:00
										 |  |  |   settings.open_at_login = | 
					
						
							|  |  |  |       base::mac::CheckLoginItemStatus(&settings.open_as_hidden); | 
					
						
							| 
									
										
										
										
											2016-07-07 16:29:09 -07:00
										 |  |  |   settings.restore_state = base::mac::WasLaunchedAsLoginItemRestoreState(); | 
					
						
							|  |  |  |   settings.opened_at_login = base::mac::WasLaunchedAsLoginOrResumeItem(); | 
					
						
							|  |  |  |   settings.opened_as_hidden = base::mac::WasLaunchedAsHiddenLoginItem(); | 
					
						
							| 
									
										
										
										
											2017-10-17 16:28:29 +09:00
										 |  |  | #endif | 
					
						
							| 
									
										
										
										
											2016-07-07 16:29:09 -07:00
										 |  |  |   return settings; | 
					
						
							| 
									
										
										
										
											2016-07-06 13:26:16 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 15:19:27 -07:00
										 |  |  | // copied from GetLoginItemForApp in base/mac/mac_util.mm | 
					
						
							|  |  |  | LSSharedFileListItemRef GetLoginItemForApp() { | 
					
						
							|  |  |  |   base::ScopedCFTypeRef<LSSharedFileListRef> login_items( | 
					
						
							|  |  |  |       LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL)); | 
					
						
							|  |  |  |   if (!login_items.get()) { | 
					
						
							|  |  |  |     LOG(ERROR) << "Couldn't get a Login Items list."; | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   base::scoped_nsobject<NSArray> login_items_array( | 
					
						
							|  |  |  |       base::mac::CFToNSCast(LSSharedFileListCopySnapshot(login_items, NULL))); | 
					
						
							|  |  |  |   NSURL* url = [NSURL fileURLWithPath:[base::mac::MainBundle() bundlePath]]; | 
					
						
							|  |  |  |   for (NSUInteger i = 0; i < [login_items_array count]; ++i) { | 
					
						
							|  |  |  |     LSSharedFileListItemRef item = | 
					
						
							|  |  |  |         reinterpret_cast<LSSharedFileListItemRef>(login_items_array[i]); | 
					
						
							| 
									
										
										
										
											2019-02-04 22:37:51 +05:30
										 |  |  |     base::ScopedCFTypeRef<CFErrorRef> error; | 
					
						
							|  |  |  |     CFURLRef item_url_ref = | 
					
						
							|  |  |  |         LSSharedFileListItemCopyResolvedURL(item, 0, error.InitializeInto()); | 
					
						
							|  |  |  |     if (!error && item_url_ref) { | 
					
						
							| 
									
										
										
										
											2018-10-12 15:19:27 -07:00
										 |  |  |       base::ScopedCFTypeRef<CFURLRef> item_url(item_url_ref); | 
					
						
							|  |  |  |       if (CFEqual(item_url, url)) { | 
					
						
							|  |  |  |         CFRetain(item); | 
					
						
							|  |  |  |         return item; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void RemoveFromLoginItems() { | 
					
						
							|  |  |  |   base::ScopedCFTypeRef<LSSharedFileListRef> list( | 
					
						
							|  |  |  |       LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL)); | 
					
						
							|  |  |  |   if (!list) { | 
					
						
							|  |  |  |     LOG(ERROR) << "Unable to access shared file list"; | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (GetLoginItemForApp() != NULL) { | 
					
						
							|  |  |  |     base::scoped_nsobject<NSArray> login_items_array( | 
					
						
							|  |  |  |         base::mac::CFToNSCast(LSSharedFileListCopySnapshot(list, NULL))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!login_items_array) { | 
					
						
							|  |  |  |       LOG(ERROR) << "No items in list of auto-loaded apps"; | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (NSUInteger i = 0; i < [login_items_array count]; ++i) { | 
					
						
							|  |  |  |       LSSharedFileListItemRef item = | 
					
						
							|  |  |  |           reinterpret_cast<LSSharedFileListItemRef>(login_items_array[i]); | 
					
						
							| 
									
										
										
										
											2019-02-04 22:37:51 +05:30
										 |  |  |       base::ScopedCFTypeRef<CFErrorRef> error; | 
					
						
							|  |  |  |       CFURLRef url_ref = | 
					
						
							|  |  |  |           LSSharedFileListItemCopyResolvedURL(item, 0, error.InitializeInto()); | 
					
						
							|  |  |  |       if (!error && url_ref) { | 
					
						
							| 
									
										
										
										
											2018-10-12 15:19:27 -07:00
										 |  |  |         base::ScopedCFTypeRef<CFURLRef> url(url_ref); | 
					
						
							|  |  |  |         if ([[base::mac::CFToNSCast(url.get()) path] | 
					
						
							|  |  |  |                 hasPrefix:[[NSBundle mainBundle] bundlePath]]) | 
					
						
							|  |  |  |           LSSharedFileListItemRemove(list, item); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-30 14:01:40 -08:00
										 |  |  | void Browser::SetLoginItemSettings(LoginItemSettings settings) { | 
					
						
							| 
									
										
										
										
											2017-10-17 16:28:29 +09:00
										 |  |  | #if defined(MAS_BUILD) | 
					
						
							| 
									
										
										
										
											2018-11-27 23:16:53 -05:00
										 |  |  |   if (!platform_util::SetLoginItemEnabled(settings.open_at_login)) { | 
					
						
							|  |  |  |     LOG(ERROR) << "Unable to set login item enabled on sandboxed app."; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-10-17 16:28:29 +09:00
										 |  |  | #else | 
					
						
							| 
									
										
										
										
											2019-05-02 14:05:37 +02:00
										 |  |  |   if (settings.open_at_login) { | 
					
						
							| 
									
										
										
										
											2016-07-07 16:29:09 -07:00
										 |  |  |     base::mac::AddToLoginItems(settings.open_as_hidden); | 
					
						
							| 
									
										
										
										
											2019-05-02 14:05:37 +02:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2018-10-12 15:19:27 -07:00
										 |  |  |     RemoveFromLoginItems(); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-10-17 16:28:29 +09:00
										 |  |  | #endif | 
					
						
							| 
									
										
										
										
											2016-07-06 13:26:16 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-05 10:26:01 +08:00
										 |  |  | std::string Browser::GetExecutableFileVersion() const { | 
					
						
							| 
									
										
										
										
											2018-10-24 12:49:10 +02:00
										 |  |  |   return GetApplicationVersion(); | 
					
						
							| 
									
										
										
										
											2013-06-19 13:41:54 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-05 10:42:04 +08:00
										 |  |  | std::string Browser::GetExecutableFileProductName() const { | 
					
						
							| 
									
										
										
										
											2018-10-24 12:49:10 +02:00
										 |  |  |   return GetApplicationName(); | 
					
						
							| 
									
										
										
										
											2013-12-05 10:42:04 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 16:19:56 +08:00
										 |  |  | int Browser::DockBounce(BounceType type) { | 
					
						
							| 
									
										
										
										
											2015-12-21 10:52:49 +08:00
										 |  |  |   return [[AtomApplication sharedApplication] | 
					
						
							| 
									
										
										
										
											2017-03-30 23:05:47 +02:00
										 |  |  |       requestUserAttention:static_cast<NSRequestUserAttentionType>(type)]; | 
					
						
							| 
									
										
										
										
											2013-08-06 16:19:56 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-23 22:59:05 +09:00
										 |  |  | void Browser::DockCancelBounce(int request_id) { | 
					
						
							|  |  |  |   [[AtomApplication sharedApplication] cancelUserAttentionRequest:request_id]; | 
					
						
							| 
									
										
										
										
											2013-08-06 16:19:56 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Browser::DockSetBadgeText(const std::string& label) { | 
					
						
							| 
									
										
										
										
											2018-04-20 14:47:04 -04:00
										 |  |  |   NSDockTile* tile = [[AtomApplication sharedApplication] dockTile]; | 
					
						
							| 
									
										
										
										
											2013-08-06 16:19:56 +08:00
										 |  |  |   [tile setBadgeLabel:base::SysUTF8ToNSString(label)]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-10 15:02:56 -04:00
										 |  |  | void Browser::DockDownloadFinished(const std::string& filePath) { | 
					
						
							|  |  |  |   [[NSDistributedNotificationCenter defaultCenter] | 
					
						
							| 
									
										
										
										
											2018-04-20 14:47:04 -04:00
										 |  |  |       postNotificationName:@"com.apple.DownloadFileFinished" | 
					
						
							|  |  |  |                     object:base::SysUTF8ToNSString(filePath)]; | 
					
						
							| 
									
										
										
										
											2016-05-10 15:02:56 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 16:39:31 +08:00
										 |  |  | std::string Browser::DockGetBadgeText() { | 
					
						
							| 
									
										
										
										
											2018-04-20 14:47:04 -04:00
										 |  |  |   NSDockTile* tile = [[AtomApplication sharedApplication] dockTile]; | 
					
						
							| 
									
										
										
										
											2013-08-06 16:39:31 +08:00
										 |  |  |   return base::SysNSStringToUTF8([tile badgeLabel]); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-25 11:55:33 +08:00
										 |  |  | void Browser::DockHide() { | 
					
						
							| 
									
										
										
										
											2018-04-17 15:41:47 -07:00
										 |  |  |   for (auto* const& window : WindowList::GetWindows()) | 
					
						
							| 
									
										
										
										
											2019-01-09 12:25:19 -08:00
										 |  |  |     [window->GetNativeWindow().GetNativeNSWindow() setCanHide:NO]; | 
					
						
							| 
									
										
										
										
											2014-06-25 11:55:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-20 14:47:04 -04:00
										 |  |  |   ProcessSerialNumber psn = {0, kCurrentProcess}; | 
					
						
							| 
									
										
										
										
											2014-06-25 11:55:33 +08:00
										 |  |  |   TransformProcessType(&psn, kProcessTransformToUIElementApplication); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-01 15:22:37 -07:00
										 |  |  | bool Browser::DockIsVisible() { | 
					
						
							|  |  |  |   // Because DockShow has a slight delay this may not be true immediately | 
					
						
							|  |  |  |   // after that call. | 
					
						
							| 
									
										
										
										
											2018-04-20 14:47:04 -04:00
										 |  |  |   return ([[NSRunningApplication currentApplication] activationPolicy] == | 
					
						
							|  |  |  |           NSApplicationActivationPolicyRegular); | 
					
						
							| 
									
										
										
										
											2016-08-01 15:22:37 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-12 21:06:33 -08:00
										 |  |  | v8::Local<v8::Promise> Browser::DockShow(v8::Isolate* isolate) { | 
					
						
							| 
									
										
										
										
											2019-02-21 12:32:44 +00:00
										 |  |  |   util::Promise promise(isolate); | 
					
						
							|  |  |  |   v8::Local<v8::Promise> handle = promise.GetHandle(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-17 14:00:04 -06:00
										 |  |  |   BOOL active = [[NSRunningApplication currentApplication] isActive]; | 
					
						
							| 
									
										
										
										
											2018-04-20 14:47:04 -04:00
										 |  |  |   ProcessSerialNumber psn = {0, kCurrentProcess}; | 
					
						
							| 
									
										
										
										
											2015-12-17 14:00:04 -06:00
										 |  |  |   if (active) { | 
					
						
							| 
									
										
										
										
											2015-12-21 10:52:49 +08:00
										 |  |  |     // Workaround buggy behavior of TransformProcessType. | 
					
						
							|  |  |  |     // http://stackoverflow.com/questions/7596643/ | 
					
						
							|  |  |  |     NSArray* runningApps = [NSRunningApplication | 
					
						
							|  |  |  |         runningApplicationsWithBundleIdentifier:@"com.apple.dock"]; | 
					
						
							|  |  |  |     for (NSRunningApplication* app in runningApps) { | 
					
						
							| 
									
										
										
										
											2015-12-17 14:00:04 -06:00
										 |  |  |       [app activateWithOptions:NSApplicationActivateIgnoringOtherApps]; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-02-21 12:32:44 +00:00
										 |  |  |     __block util::Promise p = std::move(promise); | 
					
						
							| 
									
										
										
										
											2015-12-21 10:52:49 +08:00
										 |  |  |     dispatch_time_t one_ms = dispatch_time(DISPATCH_TIME_NOW, USEC_PER_SEC); | 
					
						
							|  |  |  |     dispatch_after(one_ms, dispatch_get_main_queue(), ^{ | 
					
						
							| 
									
										
										
										
											2015-12-17 14:00:04 -06:00
										 |  |  |       TransformProcessType(&psn, kProcessTransformToForegroundApplication); | 
					
						
							| 
									
										
										
										
											2015-12-21 10:52:49 +08:00
										 |  |  |       dispatch_time_t one_ms = dispatch_time(DISPATCH_TIME_NOW, USEC_PER_SEC); | 
					
						
							|  |  |  |       dispatch_after(one_ms, dispatch_get_main_queue(), ^{ | 
					
						
							|  |  |  |         [[NSRunningApplication currentApplication] | 
					
						
							|  |  |  |             activateWithOptions:NSApplicationActivateIgnoringOtherApps]; | 
					
						
							| 
									
										
										
										
											2019-02-21 12:32:44 +00:00
										 |  |  |         p.Resolve(); | 
					
						
							| 
									
										
										
										
											2015-12-21 10:52:49 +08:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-12-17 14:00:04 -06:00
										 |  |  |     }); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     TransformProcessType(&psn, kProcessTransformToForegroundApplication); | 
					
						
							| 
									
										
										
										
											2019-02-21 12:32:44 +00:00
										 |  |  |     promise.Resolve(); | 
					
						
							| 
									
										
										
										
											2015-12-17 14:00:04 -06:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-02-21 12:32:44 +00:00
										 |  |  |   return handle; | 
					
						
							| 
									
										
										
										
											2014-06-25 11:55:33 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-02 11:47:40 +09:00
										 |  |  | void Browser::DockSetMenu(AtomMenuModel* model) { | 
					
						
							| 
									
										
										
										
											2018-04-20 14:47:04 -04:00
										 |  |  |   AtomApplicationDelegate* delegate = | 
					
						
							|  |  |  |       (AtomApplicationDelegate*)[NSApp delegate]; | 
					
						
							| 
									
										
										
										
											2014-11-16 23:04:31 +08:00
										 |  |  |   [delegate setApplicationDockMenu:model]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-24 08:30:14 +09:00
										 |  |  | void Browser::DockSetIcon(const gfx::Image& image) { | 
					
						
							| 
									
										
										
										
											2016-02-01 17:06:09 +09:00
										 |  |  |   [[AtomApplication sharedApplication] | 
					
						
							| 
									
										
										
										
											2016-01-24 08:30:14 +09:00
										 |  |  |       setApplicationIconImage:image.AsNSImage()]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-10 13:30:58 -07:00
										 |  |  | void Browser::ShowAboutPanel() { | 
					
						
							|  |  |  |   NSDictionary* options = DictionaryValueToNSDictionary(about_panel_options_); | 
					
						
							| 
									
										
										
										
											2016-11-15 09:36:23 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Credits must be a NSAttributedString instead of NSString | 
					
						
							|  |  |  |   id credits = options[@"Credits"]; | 
					
						
							|  |  |  |   if (credits != nil) { | 
					
						
							|  |  |  |     NSMutableDictionary* mutable_options = [options mutableCopy]; | 
					
						
							|  |  |  |     mutable_options[@"Credits"] = [[[NSAttributedString alloc] | 
					
						
							|  |  |  |         initWithString:(NSString*)credits] autorelease]; | 
					
						
							|  |  |  |     options = [NSDictionary dictionaryWithDictionary:mutable_options]; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-10 13:30:58 -07:00
										 |  |  |   [[AtomApplication sharedApplication] | 
					
						
							|  |  |  |       orderFrontStandardAboutPanelWithOptions:options]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Browser::SetAboutPanelOptions(const base::DictionaryValue& options) { | 
					
						
							|  |  |  |   about_panel_options_.Clear(); | 
					
						
							| 
									
										
										
										
											2016-10-12 10:52:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-13 17:12:24 -05:00
										 |  |  |   for (const auto& pair : options) { | 
					
						
							|  |  |  |     std::string key = pair.first; | 
					
						
							|  |  |  |     const auto& val = pair.second; | 
					
						
							|  |  |  |     if (!key.empty() && val->is_string()) { | 
					
						
							| 
									
										
										
										
											2016-10-12 10:52:59 -07:00
										 |  |  |       key[0] = base::ToUpperASCII(key[0]); | 
					
						
							| 
									
										
										
										
											2018-11-13 17:12:24 -05:00
										 |  |  |       about_panel_options_.SetString(key, val->GetString()); | 
					
						
							| 
									
										
										
										
											2016-10-12 10:52:59 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-10-10 13:30:58 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-14 13:39:52 -07:00
										 |  |  | void Browser::ShowEmojiPanel() { | 
					
						
							|  |  |  |   [[AtomApplication sharedApplication] orderFrontCharacterPalette:nil]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool Browser::IsEmojiPanelSupported() { | 
					
						
							|  |  |  |   return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-02 23:43:23 +08:00
										 |  |  | }  // namespace atom |