| Index: base/mac_util.mm
|
| diff --git a/base/mac_util.mm b/base/mac_util.mm
|
| index de07c8813894d025df5024bff8575e5da9792c17..0eee0e20f26410e442f29eeff8ad18573004e0bb 100644
|
| --- a/base/mac_util.mm
|
| +++ b/base/mac_util.mm
|
| @@ -188,4 +188,53 @@ void ActivateProcess(pid_t pid) {
|
| }
|
| }
|
|
|
| +// Takes a path to an (executable) binary and tries to provide the path to an
|
| +// application bundle containing it. It takes the outermost bundle that it can
|
| +// find (so for "/Foo/Bar.app/.../Baz.app/..." it produces "/Foo/Bar.app").
|
| +// |exec_name| - path to the binary
|
| +// returns - path to the application bundle, or empty on error
|
| +FilePath GetAppBundlePath(const FilePath& exec_name) {
|
| + const char kExt[] = ".app";
|
| + const size_t kExtLength = arraysize(kExt) - 1;
|
| +
|
| + // Split the path into components.
|
| + std::vector<std::string> components;
|
| + exec_name.GetComponents(&components);
|
| +
|
| + // It's an error if we don't get any components.
|
| + if (!components.size())
|
| + return FilePath();
|
| +
|
| + // Don't prepend '/' to the first component.
|
| + std::vector<std::string>::const_iterator it = components.begin();
|
| + std::string bundle_name = *it;
|
| + DCHECK(it->length() > 0);
|
| + // If the first component ends in ".app", we're already done.
|
| + if (it->length() > kExtLength &&
|
| + !it->compare(it->length() - kExtLength, kExtLength, kExt, kExtLength))
|
| + return FilePath(bundle_name);
|
| +
|
| + // The first component may be "/" or "//", etc. Only append '/' if it doesn't
|
| + // already end in '/'.
|
| + if (bundle_name[bundle_name.length() - 1] != '/')
|
| + bundle_name += '/';
|
| +
|
| + // Go through the remaining components.
|
| + for (++it; it != components.end(); ++it) {
|
| + DCHECK(it->length() > 0);
|
| +
|
| + bundle_name += *it;
|
| +
|
| + // If the current component ends in ".app", we're done.
|
| + if (it->length() > kExtLength &&
|
| + !it->compare(it->length() - kExtLength, kExtLength, kExt, kExtLength))
|
| + return FilePath(bundle_name);
|
| +
|
| + // Separate this component from the next one.
|
| + bundle_name += '/';
|
| + }
|
| +
|
| + return FilePath();
|
| +}
|
| +
|
| } // namespace mac_util
|
|
|