Index: chrome/browser/shell_integration_linux.cc |
diff --git a/chrome/browser/shell_integration_linux.cc b/chrome/browser/shell_integration_linux.cc |
index 57072b8a9a67f0e32e99a7b504e94fb9fd6a96a6..afdcd87c33abbd0e8c5ec1501454e0f3c7c2694c 100644 |
--- a/chrome/browser/shell_integration_linux.cc |
+++ b/chrome/browser/shell_integration_linux.cc |
@@ -164,27 +164,26 @@ bool SetDefaultWebClient(const std::string& protocol) { |
#endif |
} |
-// If |protocol| is empty this function checks if Chrome is the default browser, |
-// otherwise it checks if Chrome is the default handler application for |
-// |protocol|. |
-DefaultWebClientState GetIsDefaultWebClient(const std::string& protocol) { |
-#if defined(OS_CHROMEOS) |
- return UNKNOWN_DEFAULT; |
-#else |
- base::ThreadRestrictions::AssertIOAllowed(); |
- |
- std::unique_ptr<base::Environment> env(base::Environment::Create()); |
- |
+#if !defined(OS_CHROMEOS) |
+// If |check| is true, returns the output of "xdg-settings check {property} |
+// *.desktop", otherwise returns the output of "xdg-settings get {property}", |
+// where property is "default-web-browser" if |protocol| is empty or |
+// "default-url-scheme-handler |protocol|" otherwise. Returns "" if |
+// xdg-settings fails for any reason. |
+std::string GetXdgSettingsOutput(bool check, |
+ const std::string& protocol, |
+ base::Environment* env) { |
std::vector<std::string> argv; |
argv.push_back(kXdgSettings); |
- argv.push_back("check"); |
+ argv.push_back(check ? "check" : "get"); |
if (protocol.empty()) { |
argv.push_back(kXdgSettingsDefaultBrowser); |
} else { |
argv.push_back(kXdgSettingsDefaultSchemeHandler); |
argv.push_back(protocol); |
} |
- argv.push_back(shell_integration_linux::GetDesktopName(env.get())); |
+ if (check) |
+ argv.push_back(shell_integration_linux::GetDesktopName(env)); |
std::string reply; |
int success_code; |
@@ -197,15 +196,47 @@ DefaultWebClientState GetIsDefaultWebClient(const std::string& protocol) { |
} |
} |
- if (!ran_ok || success_code != EXIT_SUCCESS) { |
- // xdg-settings failed: we can't determine or set the default browser. |
- return UNKNOWN_DEFAULT; |
+ if (!ran_ok || success_code != EXIT_SUCCESS) |
+ return std::string(); |
+ |
+ return reply; |
+} |
+#endif |
+ |
+// If |protocol| is empty this function checks if Chrome is the default browser, |
+// otherwise it checks if Chrome is the default handler application for |
+// |protocol|. |
+DefaultWebClientState GetDefaultWebClient(const std::string& protocol) { |
+#if defined(OS_CHROMEOS) |
+ return UNKNOWN_DEFAULT; |
+#else |
+ base::ThreadRestrictions::AssertIOAllowed(); |
+ |
+ std::unique_ptr<base::Environment> env(base::Environment::Create()); |
+ std::string xdg_is_default = GetXdgSettingsOutput(true, protocol, env.get()); |
+ if (base::StartsWith(xdg_is_default, "yes", base::CompareCase::SENSITIVE)) { |
+ return IS_DEFAULT; |
+ } |
+ if (base::StartsWith(xdg_is_default, "no", base::CompareCase::SENSITIVE)) { |
+ // An output of "no" does not necessarily mean Chrom[e,ium] is not the |
Mike Mammarella
2017/03/11 03:05:04
So, you're sort of defeating the purpose of having
|
+ // default. According to the xdg-settings man page, this can happen when |
+ // "only some of the underlying settings actually reflect that value". Don't |
+ // return NOT_DEFAULT unless we're sure, or else an annoying "Chrome is not |
+ // your default browser" banner will appear on every launch |
+ // (https://crbug.com/578888). |
+ if (base::StartsWith(GetXdgSettingsOutput(false, protocol, env.get()), |
+ shell_integration_linux::GetDesktopName(env.get()), |
+ base::CompareCase::SENSITIVE)) { |
+ // This is the odd case where 'xdg-settings check' said that Chrome wasn't |
+ // the default, but 'xdg-settings get' returned Chrome as the default. |
+ return UNKNOWN_DEFAULT; |
+ } |
+ // xdg-settings says the default is non-Chrome, and is self-consistent. |
+ return NOT_DEFAULT; |
} |
- // Allow any reply that starts with "yes". |
- return base::StartsWith(reply, "yes", base::CompareCase::SENSITIVE) |
- ? IS_DEFAULT |
- : NOT_DEFAULT; |
+ // xdg-settings failed: we can't determine or set the default browser. |
+ return UNKNOWN_DEFAULT; |
#endif |
} |
@@ -243,7 +274,7 @@ base::string16 GetApplicationNameForProtocol(const GURL& url) { |
} |
DefaultWebClientState GetDefaultBrowser() { |
- return GetIsDefaultWebClient(std::string()); |
+ return GetDefaultWebClient(std::string()); |
} |
bool IsFirefoxDefaultBrowser() { |
@@ -259,7 +290,7 @@ bool IsFirefoxDefaultBrowser() { |
} |
DefaultWebClientState IsDefaultProtocolClient(const std::string& protocol) { |
- return GetIsDefaultWebClient(protocol); |
+ return GetDefaultWebClient(protocol); |
} |
} // namespace shell_integration |