Index: chrome/browser/local_discovery/service_discovery_shared_client.cc |
diff --git a/chrome/browser/local_discovery/service_discovery_shared_client.cc b/chrome/browser/local_discovery/service_discovery_shared_client.cc |
index a18481216c5f4c719c78edf680dc4beffcc52627..2ffbc09e335599ab6eb25bb27869db0b3d5aaf22 100644 |
--- a/chrome/browser/local_discovery/service_discovery_shared_client.cc |
+++ b/chrome/browser/local_discovery/service_discovery_shared_client.cc |
@@ -6,14 +6,44 @@ |
#include "content/public/browser/browser_thread.h" |
+#if defined(OS_WIN) |
+#include "base/files/file_path.h" |
+#include "base/metrics/histogram.h" |
+#include "base/path_service.h" |
+#include "chrome/browser/local_discovery/service_discovery_client_utility.h" |
+#include "chrome/installer/util/browser_distribution.h" |
+#include "chrome/installer/util/firewall_manager_win.h" |
+#endif // OS_WIN |
+ |
#if defined(OS_MACOSX) |
#include "chrome/browser/local_discovery/service_discovery_client_mac_factory.h" |
#endif |
#if defined(ENABLE_MDNS) |
-#include "chrome/browser/local_discovery/service_discovery_client_utility.h" |
+#include "chrome/browser/local_discovery/service_discovery_client_mdns.h" |
#endif // ENABLE_MDNS |
+namespace { |
+ |
+#if defined(OS_WIN) |
+bool IsFirewallReady() { |
+ base::FilePath exe_path; |
+ if (PathService::Get(base::FILE_EXE, &exe_path)) |
+ return false; |
+ scoped_ptr<installer::FirewallManager> manager = |
+ installer::FirewallManager::Create(BrowserDistribution::GetDistribution(), |
+ exe_path); |
+ if (!manager) |
+ return false; |
+ bool is_ready = manager->CanUseLocalPorts(); |
+ UMA_HISTOGRAM_BOOLEAN("LocalDiscovery.IsFirewallReady", is_ready); |
+ return is_ready; |
+} |
+#endif // OS_WIN |
+ |
+} // namespace |
+ |
+ |
namespace local_discovery { |
using content::BrowserThread; |
@@ -44,7 +74,16 @@ scoped_refptr<ServiceDiscoverySharedClient> |
#if defined(OS_MACOSX) |
return ServiceDiscoveryClientMacFactory::CreateInstance(); |
#else |
- return new ServiceDiscoveryClientUtility(); |
+ |
+#if defined(OS_WIN) |
+ static bool is_firewall_ready = IsFirewallReady(); |
+ if (!is_firewall_ready) { |
+ // TODO(vitalybuka): Remove after we find what to do with firewall for |
+ // user-level installs. crbug.com/366408 |
+ return new ServiceDiscoveryClientUtility(); |
+ } |
+#endif // OS_WIN |
+ return new ServiceDiscoveryClientMdns(); |
#endif |
} |