How come Dropbox gets an icon in Finder sidebar?

How come Dropbox gets a non-generic icon in Finder's sidebar, when other directories like Google Drive and Sites (native in OS X before Lion) all have the same generic one?

enter image description here

How can I customise the icons used by the folders in the sidebar? OS X used to show individual icons of all folders there — not any longer.


Solution 1:

As you've noticed, recent versions of OS X only display generic folder icons in the sidebar. So why does Dropbox get special treatment?

The short answer is that Dropbox uses undocumented API to accomplish this. In non-technical speak, it's a special hack that's installed by the Dropbox application.


Some curious folks on StackOverflow found the specific mechanism used by Dropbox: good ol' mach_inject. The same bundle provides both the toolbar item and the sidebar icon.

If you're curious, the resource files live here (at least, on my system):

/Library/DropboxHelperTools/Dropbox_u502/DropboxBundle.bundle/Contents/Resources

Clearly, Dropbox goes to great lengths in order to integrate seamlessly into the Finder. Lacking similar treatment, other ordinary folders have only generic icons in the sidebar.


Edit 10/1/2015: As of Yosemite (10.10), there is a new, sanctioned Finder Sync API for integration, as doovers points out in another answer. In El Capitan (10.11), System Integrity Protection will not permit the old mach_inject-style approach.

Solution 2:

According to the documentation for the Finder Sync Extension:

You can also use the extension point’s API to add a toolbar button to the Finder window or a sidebar icon for the monitored folder.

I would guess this is what Dropbox uses to achieve this and some/all the other functionality facilitated by this extension. For example you can also:

  • Register a set of folders to monitor.
  • Receive notifications when the user starts or stops browsing the content of a monitored folder. For example, the extension receives notification when the user opens a monitored folder in the Finder or in an Open or Save dialog.
  • Add, remove, and update badges and labels on items in a monitored folder.
  • Display a contextual menu when the user Control-clicks an item inside a monitored folder.
  • Add a custom button to the Finder’s toolbar.

Edit:

As Mugen mentions below, El Capitan will not allow code injection making FinderSync the only option going forward. With FinderSync only available from 10.10+ the best option would be to case it like:

if (floor(NSAppKitVersionNumber) < NSAppKitVersionNumber10_10) { ... }