1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/shell_integration.h"
6
7#include "base/mac/mac_util.h"
8#include "chrome/browser/platform_util.h"
9#import "third_party/mozilla/NSWorkspace+Utils.h"
10
11// Sets Chromium as default browser (only for current user). Returns false if
12// this operation fails.
13bool ShellIntegration::SetAsDefaultBrowser() {
14  if (!platform_util::CanSetAsDefaultBrowser())
15    return false;
16
17  // We really do want the main bundle here, not base::mac::MainAppBundle(),
18  // which is the bundle for the framework.
19  NSString* identifier = [[NSBundle mainBundle] bundleIdentifier];
20  [[NSWorkspace sharedWorkspace] setDefaultBrowserWithIdentifier:identifier];
21  return true;
22}
23
24namespace {
25
26// Returns true if |identifier| is the bundle id of the default browser.
27bool IsIdentifierDefaultBrowser(NSString* identifier) {
28  NSString* defaultBrowser =
29      [[NSWorkspace sharedWorkspace] defaultBrowserIdentifier];
30  if (!defaultBrowser)
31    return false;
32  // We need to ensure we do the comparison case-insensitive as LS doesn't
33  // persist the case of our bundle id.
34  NSComparisonResult result =
35    [defaultBrowser caseInsensitiveCompare:identifier];
36  return result == NSOrderedSame;
37}
38
39}  // namespace
40
41// Attempt to determine if this instance of Chrome is the default browser and
42// return the appropriate state. (Defined as being the handler for HTTP/HTTPS
43// protocols; we don't want to report "no" here if the user has simply chosen
44// to open HTML files in a text editor and FTP links with an FTP client.)
45ShellIntegration::DefaultBrowserState ShellIntegration::IsDefaultBrowser() {
46  // As above, we want to use the real main bundle.
47  NSString* myIdentifier = [[NSBundle mainBundle] bundleIdentifier];
48  if (!myIdentifier)
49    return UNKNOWN_DEFAULT_BROWSER;
50  return IsIdentifierDefaultBrowser(myIdentifier) ? IS_DEFAULT_BROWSER
51                                                  : NOT_DEFAULT_BROWSER;
52}
53
54// Returns true if Firefox is the default browser for the current user.
55bool ShellIntegration::IsFirefoxDefaultBrowser() {
56  return IsIdentifierDefaultBrowser(@"org.mozilla.firefox");
57}
58