Launch Services keeps a database, into which applications can register themselves as mime handlers, using CFBundleDocumentTypes and CFBundleURLTypes in Info.plist in their application Contents, which are parsed periodically (not sure when). Here is part of Safari's:
$defaults read /Applications/Safari.app/Contents/Info.plist { "Application-Group" = "dot-mac"; BuildMachineOSBuild = 12A251; CFBundleDevelopmentRegion = English; CFBundleDocumentTypes = ( { CFBundleTypeExtensions = ( css ); CFBundleTypeIconFile = "document.icns"; CFBundleTypeMIMETypes = ( "text/css" ); CFBundleTypeName = "CSS style sheet"; CFBundleTypeRole = Viewer; NSDocumentClass = BrowserDocument; }, { CFBundleTypeExtensions = ( pdf ); CFBundleTypeIconFile = "document.icns"; CFBundleTypeMIMETypes = ( "application/pdf" ); CFBundleTypeName = "PDF document"; CFBundleTypeRole = Viewer; NSDocumentClass = BrowserDocument; }, [snip]Also as an aside, safari has a list of file types that it will automatically open with the registered mime handler because they are considered 'safe'. The list is stored in:
/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/SystemWhere:
- LSRiskCategorySafe: Safari will automatically open these files after download
- LSRiskCategoryNeutral: Not auto-opened, no warnings
- LSRiskCategoryUnsafeExecutable: Warning displayed when opened by the user.
- LSRiskCategoryMayContainUnsafeExecutable: e.g. zip files. This will trigger a warning if Safari can't determine that the contents are safe or neutral
There is also an app (RCDefaultApp) that presents a more usable grapical frontend to the data.
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump | lessThe user also has some control over mime-type registration, and that information is stored in:
$ defaults read ~/Library/Preferences/com.apple.LaunchServices { LSHandlers = ( { LSHandlerRoleAll = "com.google.chrome"; LSHandlerURLScheme = http; }, { LSHandlerRoleAll = "com.google.chrome"; LSHandlerURLScheme = https; }, { LSHandlerContentType = "public.html"; LSHandlerRoleViewer = "com.google.chrome"; }, { LSHandlerContentType = "public.url"; LSHandlerRoleViewer = "com.google.chrome"; } ); }Reading the output of the database query and the plist above, it is difficult to determine which handler will fire for certain files where multiple handlers are registered. Apple provides some documentation, about how the mime handler is chosen for files and URLs in the case of multiple handers, but the flow chart ends with:
If two or more candidate applications remain after all of the foregoing criteria have been applied, Launch Services chooses one of the remaining applications in an unspecified manner.The quickest way to check is to use 'open', which according to the man page:
opens a file (or a directory or URL), just as if you had double-clicked the file's icon.So, creating a dummy css file and running open like this should pop up safari:
open blah.cssFind out a file's mime type with:
$ mdls -name kMDItemContentType -name kMDItemContentTypeTree test.dmg kMDItemContentType = "com.apple.disk-image-udif" kMDItemContentTypeTree = ( "com.apple.disk-image-udif", "com.apple.disk-image", "public.archive", "public.data", "public.item", "public.disk-image" )
2 comments:
Can it be told to run a script instead of opening an Application?
Can you have Launch Services run a script instead of an Application?
Post a Comment