Merge pull request #5440 from electron/bengotow/remove-default-protocol
Implement RemoveAsDefaultProtocolClient on OS X
This commit is contained in:
		
				commit
				
					
						6b79f53416
					
				
			
		
					 2 changed files with 26 additions and 5 deletions
				
			
		|  | @ -43,7 +43,31 @@ void Browser::ClearRecentDocuments() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool Browser::RemoveAsDefaultProtocolClient(const std::string& protocol) { | bool Browser::RemoveAsDefaultProtocolClient(const std::string& protocol) { | ||||||
|  |   NSString* identifier = [base::mac::MainBundle() bundleIdentifier]; | ||||||
|  |   if (!identifier) | ||||||
|     return false; |     return false; | ||||||
|  | 
 | ||||||
|  |   if (!Browser::IsDefaultProtocolClient(protocol)) | ||||||
|  |     return false; | ||||||
|  | 
 | ||||||
|  |   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; | ||||||
|  |   } | ||||||
|  |   // On Mac OS X, we can't query the default, but the handlers list seems to put | ||||||
|  |   // Apple's defaults first, so we'll use the first option that isn't our bundle | ||||||
|  |   CFStringRef other = nil; | ||||||
|  |   for (CFIndex i = 0; i < CFArrayGetCount(bundleList); i++) { | ||||||
|  |     other = (CFStringRef)CFArrayGetValueAtIndex(bundleList, i); | ||||||
|  |     if (![identifier isEqualToString: (__bridge NSString *)other]) { | ||||||
|  |       break; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   OSStatus return_code = LSSetDefaultHandlerForURLScheme(protocol_cf, other); | ||||||
|  |   return return_code == noErr; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool Browser::SetAsDefaultProtocolClient(const std::string& protocol) { | bool Browser::SetAsDefaultProtocolClient(const std::string& protocol) { | ||||||
|  |  | ||||||
|  | @ -393,16 +393,13 @@ Please refer to [Apple's documentation][CFBundleURLTypes] for details. | ||||||
| 
 | 
 | ||||||
| The API uses the Windows Registry and LSSetDefaultHandlerForURLScheme internally. | The API uses the Windows Registry and LSSetDefaultHandlerForURLScheme internally. | ||||||
| 
 | 
 | ||||||
| ### `app.removeAsDefaultProtocolClient(protocol)` _Windows_ | ### `app.removeAsDefaultProtocolClient(protocol)` _OS X_ _Windows_ | ||||||
| 
 | 
 | ||||||
| * `protocol` String - The name of your protocol, without `://`. | * `protocol` String - The name of your protocol, without `://`. | ||||||
| 
 | 
 | ||||||
| This method checks if the current executable as the default handler for a protocol | This method checks if the current executable as the default handler for a protocol | ||||||
| (aka URI scheme). If so, it will remove the app as the default handler. | (aka URI scheme). If so, it will remove the app as the default handler. | ||||||
| 
 | 
 | ||||||
| **Note:** On OS X, removing the app will automatically remove the app as the |  | ||||||
| default protocol handler. |  | ||||||
| 
 |  | ||||||
| ### `app.isDefaultProtocolClient(protocol)` _OS X_ _Windows_ | ### `app.isDefaultProtocolClient(protocol)` _OS X_ _Windows_ | ||||||
| 
 | 
 | ||||||
| * `protocol` String - The name of your protocol, without `://`. | * `protocol` String - The name of your protocol, without `://`. | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Cheng Zhao
				Cheng Zhao