Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/views/network_profile_bubble.h" | 5 #include "chrome/browser/ui/views/network_profile_bubble.h" |
| 6 | 6 |
| 7 #include <wtsapi32.h> | 7 #include <wtsapi32.h> |
| 8 // Make sure we link the wtsapi lib file in. | 8 // Make sure we link the wtsapi lib file in. |
| 9 #pragma comment(lib, "wtsapi32.lib") | 9 #pragma comment(lib, "wtsapi32.lib") |
| 10 | 10 |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 35 namespace { | 35 namespace { |
| 36 | 36 |
| 37 // The duration of the silent period before we start nagging the user again. | 37 // The duration of the silent period before we start nagging the user again. |
| 38 const int kSilenceDurationDays = 100; | 38 const int kSilenceDurationDays = 100; |
| 39 | 39 |
| 40 // Bubble layout constants. | 40 // Bubble layout constants. |
| 41 const int kAnchorVerticalInset = 5; | 41 const int kAnchorVerticalInset = 5; |
| 42 const int kInset = 2; | 42 const int kInset = 2; |
| 43 const int kNotificationBubbleWidth = 250; | 43 const int kNotificationBubbleWidth = 250; |
| 44 | 44 |
| 45 // The name of the UMA histogram collecting our stats. | |
| 46 const char kMetricNetworkedProfileCheck[] = "NetworkedProfile.Check"; | |
| 47 | |
| 48 enum MetricNetworkedProfileCheck { | |
| 49 // Check was suppressed by command line flag. | |
| 50 METRIC_CHECK_SUPPRESSED, | |
| 51 // WTSQuerySessionInformation call failed. | |
| 52 METRIC_CHECK_FAILED, | |
| 53 // File access in profile dir failed. | |
| 54 METRIC_CHECK_IO_FAILED, | |
| 55 | |
| 56 // Profile on a network share detected. | |
| 57 METRIC_PROFILE_ON_NETWORK, | |
| 58 // Profile not on a network share detected. | |
| 59 METRIC_PROFILE_NOT_ON_NETWORK, | |
| 60 | |
| 61 // Check was suppressed because of remote session. | |
| 62 METRIC_REMOTE_SESSION, | |
| 63 | |
| 64 // User has clicked learn more on the notification bubble. | |
| 65 METRIC_LEARN_MORE_CLICKED, | |
| 66 // User has clicked OK on the notification bubble. | |
| 67 METRIC_ACKNOWLEDGED, | |
| 68 | |
| 69 METRIC_NETWORKED_PROFILE_CHECK_SIZE // Must be the last. | |
| 70 }; | |
| 71 | |
| 45 // Implementation of BrowserList::Observer used to wait for a browser window. | 72 // Implementation of BrowserList::Observer used to wait for a browser window. |
| 46 class BrowserListObserver : public BrowserList::Observer { | 73 class BrowserListObserver : public BrowserList::Observer { |
| 47 private: | 74 private: |
| 48 virtual ~BrowserListObserver(); | 75 virtual ~BrowserListObserver(); |
| 49 | 76 |
| 50 // Overridden from BrowserList::Observer: | 77 // Overridden from BrowserList::Observer: |
| 51 virtual void OnBrowserAdded(const Browser* browser) OVERRIDE; | 78 virtual void OnBrowserAdded(const Browser* browser) OVERRIDE; |
| 52 virtual void OnBrowserRemoved(const Browser* browser) OVERRIDE; | 79 virtual void OnBrowserRemoved(const Browser* browser) OVERRIDE; |
| 53 virtual void OnBrowserSetLastActive(const Browser* browser) OVERRIDE; | 80 virtual void OnBrowserSetLastActive(const Browser* browser) OVERRIDE; |
| 54 }; | 81 }; |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 84 // share as we don't officially support this setup yet. | 111 // share as we don't officially support this setup yet. |
| 85 // However we don't want to bother users on Cytrix setups as those have no | 112 // However we don't want to bother users on Cytrix setups as those have no |
| 86 // real choice and their admins must be well aware of the risks associated. | 113 // real choice and their admins must be well aware of the risks associated. |
| 87 // Also the command line flag --no-network-profile-warning can stop this | 114 // Also the command line flag --no-network-profile-warning can stop this |
| 88 // warning from popping up. In this case we can skip the check to make the | 115 // warning from popping up. In this case we can skip the check to make the |
| 89 // start faster. | 116 // start faster. |
| 90 // Collect a lot of stats along the way to see which cases do occur in the | 117 // Collect a lot of stats along the way to see which cases do occur in the |
| 91 // wild often enough. | 118 // wild often enough. |
| 92 if (CommandLine::ForCurrentProcess()->HasSwitch( | 119 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 93 switches::kNoNetworkProfileWarning)) { | 120 switches::kNoNetworkProfileWarning)) { |
| 94 UMA_HISTOGRAM_COUNTS("NetworkedProfile.CheckSuppressed", 1); | 121 UMA_HISTOGRAM_ENUMERATION(kMetricNetworkedProfileCheck, |
|
jar (doing other things)
2012/05/16 16:57:43
nit: Not a big deal.... but when you have to repea
pastarmovj
2012/05/18 09:48:52
Done.
| |
| 122 METRIC_CHECK_SUPPRESSED, | |
| 123 METRIC_NETWORKED_PROFILE_CHECK_SIZE); | |
| 95 return; | 124 return; |
| 96 } | 125 } |
| 97 | 126 |
| 98 LPWSTR buffer = NULL; | 127 LPWSTR buffer = NULL; |
| 99 DWORD buffer_length = 0; | 128 DWORD buffer_length = 0; |
| 100 // Checking for RDP is cheaper than checking for a network drive so do this | 129 // Checking for RDP is cheaper than checking for a network drive so do this |
| 101 // one first. | 130 // one first. |
| 102 if (!WTSQuerySessionInformation(WTS_CURRENT_SERVER, WTS_CURRENT_SESSION, | 131 if (!WTSQuerySessionInformation(WTS_CURRENT_SERVER, WTS_CURRENT_SESSION, |
| 103 WTSClientProtocolType, | 132 WTSClientProtocolType, |
| 104 &buffer, &buffer_length)) { | 133 &buffer, &buffer_length)) { |
| 105 UMA_HISTOGRAM_COUNTS("NetworkedProfile.CheckFailed", 1); | 134 UMA_HISTOGRAM_ENUMERATION(kMetricNetworkedProfileCheck, |
| 135 METRIC_CHECK_FAILED, | |
| 136 METRIC_NETWORKED_PROFILE_CHECK_SIZE); | |
| 106 return; | 137 return; |
| 107 } | 138 } |
| 108 | 139 |
| 109 unsigned short* type = reinterpret_cast<unsigned short*>(buffer); | 140 unsigned short* type = reinterpret_cast<unsigned short*>(buffer); |
| 110 // Zero means local session and we should warn the users if they have | 141 // Zero means local session and we should warn the users if they have |
| 111 // their profile on a network share. | 142 // their profile on a network share. |
| 112 if (*type == 0) { | 143 if (*type == 0) { |
| 113 bool profile_on_network = false; | 144 bool profile_on_network = false; |
| 114 if (!profile_path.empty()) { | 145 if (!profile_path.empty()) { |
| 115 FilePath temp_file; | 146 FilePath temp_file; |
| 116 // Try to create some non-empty temp file in the profile dir and use | 147 // Try to create some non-empty temp file in the profile dir and use |
| 117 // it to check if there is a reparse-point free path to it. | 148 // it to check if there is a reparse-point free path to it. |
| 118 if (file_util::CreateTemporaryFileInDir(profile_path, &temp_file) && | 149 if (file_util::CreateTemporaryFileInDir(profile_path, &temp_file) && |
| 119 file_util::WriteFile(temp_file, ".", 1)) { | 150 file_util::WriteFile(temp_file, ".", 1)) { |
| 120 FilePath normalized_temp_file; | 151 FilePath normalized_temp_file; |
| 121 if (!file_util::NormalizeFilePath(temp_file, &normalized_temp_file)) | 152 if (!file_util::NormalizeFilePath(temp_file, &normalized_temp_file)) |
| 122 profile_on_network = true; | 153 profile_on_network = true; |
| 123 } else { | 154 } else { |
| 124 UMA_HISTOGRAM_COUNTS("NetworkedProfile.CheckIOFailed", 1); | 155 UMA_HISTOGRAM_ENUMERATION(kMetricNetworkedProfileCheck, |
| 156 METRIC_CHECK_IO_FAILED, | |
| 157 METRIC_NETWORKED_PROFILE_CHECK_SIZE); | |
| 125 } | 158 } |
| 126 file_util::Delete(temp_file, false); | 159 file_util::Delete(temp_file, false); |
| 127 } | 160 } |
| 128 if (profile_on_network) { | 161 if (profile_on_network) { |
| 129 UMA_HISTOGRAM_COUNTS("NetworkedProfile.ProfileOnNetwork", 1); | 162 UMA_HISTOGRAM_ENUMERATION(kMetricNetworkedProfileCheck, |
| 163 METRIC_PROFILE_ON_NETWORK, | |
| 164 METRIC_NETWORKED_PROFILE_CHECK_SIZE); | |
| 130 content::BrowserThread::PostTask( | 165 content::BrowserThread::PostTask( |
| 131 content::BrowserThread::UI, FROM_HERE, | 166 content::BrowserThread::UI, FROM_HERE, |
| 132 base::Bind(&NetworkProfileBubble::NotifyNetworkProfileDetected)); | 167 base::Bind(&NetworkProfileBubble::NotifyNetworkProfileDetected)); |
| 133 } else { | 168 } else { |
| 134 UMA_HISTOGRAM_COUNTS("NetworkedProfile.ProfileNotOnNetwork", 1); | 169 UMA_HISTOGRAM_ENUMERATION(kMetricNetworkedProfileCheck, |
| 170 METRIC_PROFILE_NOT_ON_NETWORK, | |
| 171 METRIC_NETWORKED_PROFILE_CHECK_SIZE); | |
| 135 } | 172 } |
| 136 } else { | 173 } else { |
| 137 UMA_HISTOGRAM_COUNTS("NetworkedProfile.RemoteSession", 1); | 174 UMA_HISTOGRAM_ENUMERATION(kMetricNetworkedProfileCheck, |
| 175 METRIC_REMOTE_SESSION, | |
| 176 METRIC_NETWORKED_PROFILE_CHECK_SIZE); | |
| 138 } | 177 } |
| 139 | 178 |
| 140 WTSFreeMemory(buffer); | 179 WTSFreeMemory(buffer); |
| 141 } | 180 } |
| 142 | 181 |
| 143 // static | 182 // static |
| 144 bool NetworkProfileBubble::ShouldCheckNetworkProfile(PrefService* prefs) { | 183 bool NetworkProfileBubble::ShouldCheckNetworkProfile(PrefService* prefs) { |
| 145 if (prefs->GetInteger(prefs::kNetworkProfileWarningsLeft)) | 184 if (prefs->GetInteger(prefs::kNetworkProfileWarningsLeft)) |
| 146 return !notification_shown_; | 185 return !notification_shown_; |
| 147 int64 last_check = prefs->GetInt64(prefs::kNetworkProfileLastWarningTime); | 186 int64 last_check = prefs->GetInt64(prefs::kNetworkProfileLastWarningTime); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 226 } | 265 } |
| 227 | 266 |
| 228 gfx::Rect NetworkProfileBubble::GetAnchorRect() { | 267 gfx::Rect NetworkProfileBubble::GetAnchorRect() { |
| 229 // Compensate for padding in anchor. | 268 // Compensate for padding in anchor. |
| 230 gfx::Rect rect(BubbleDelegateView::GetAnchorRect()); | 269 gfx::Rect rect(BubbleDelegateView::GetAnchorRect()); |
| 231 rect.Inset(0, anchor_view() ? kAnchorVerticalInset : 0); | 270 rect.Inset(0, anchor_view() ? kAnchorVerticalInset : 0); |
| 232 return rect; | 271 return rect; |
| 233 } | 272 } |
| 234 | 273 |
| 235 void NetworkProfileBubble::LinkClicked(views::Link* source, int event_flags) { | 274 void NetworkProfileBubble::LinkClicked(views::Link* source, int event_flags) { |
| 236 UMA_HISTOGRAM_COUNTS("NetworkedProfile.LearnMoreClicked", 1); | 275 UMA_HISTOGRAM_ENUMERATION(kMetricNetworkedProfileCheck, |
| 276 METRIC_LEARN_MORE_CLICKED, | |
| 277 METRIC_NETWORKED_PROFILE_CHECK_SIZE); | |
| 237 Browser* browser = BrowserList::GetLastActive(); | 278 Browser* browser = BrowserList::GetLastActive(); |
| 238 if (browser) { | 279 if (browser) { |
| 239 WindowOpenDisposition disposition = | 280 WindowOpenDisposition disposition = |
| 240 event_utils::DispositionFromEventFlags(event_flags); | 281 event_utils::DispositionFromEventFlags(event_flags); |
| 241 content::OpenURLParams params( | 282 content::OpenURLParams params( |
| 242 GURL("https://sites.google.com/a/chromium.org/dev/administrators/" | 283 GURL("https://sites.google.com/a/chromium.org/dev/administrators/" |
| 243 "common-problems-and-solutions#network_profile"), | 284 "common-problems-and-solutions#network_profile"), |
| 244 content::Referrer(), | 285 content::Referrer(), |
| 245 disposition == CURRENT_TAB ? NEW_FOREGROUND_TAB : disposition, | 286 disposition == CURRENT_TAB ? NEW_FOREGROUND_TAB : disposition, |
| 246 content::PAGE_TRANSITION_LINK, false); | 287 content::PAGE_TRANSITION_LINK, false); |
| 247 browser->OpenURL(params); | 288 browser->OpenURL(params); |
| 248 // If the user interacted with the bubble we don't reduce the number of | 289 // If the user interacted with the bubble we don't reduce the number of |
| 249 // warnings left. | 290 // warnings left. |
| 250 PrefService* prefs = browser->profile()->GetPrefs(); | 291 PrefService* prefs = browser->profile()->GetPrefs(); |
| 251 int left_warnings = prefs->GetInteger(prefs::kNetworkProfileWarningsLeft); | 292 int left_warnings = prefs->GetInteger(prefs::kNetworkProfileWarningsLeft); |
| 252 prefs->SetInteger(prefs::kNetworkProfileWarningsLeft, ++left_warnings); | 293 prefs->SetInteger(prefs::kNetworkProfileWarningsLeft, ++left_warnings); |
| 253 } | 294 } |
| 254 GetWidget()->Close(); | 295 GetWidget()->Close(); |
| 255 } | 296 } |
| 256 | 297 |
| 257 void NetworkProfileBubble::ButtonPressed(views::Button* sender, | 298 void NetworkProfileBubble::ButtonPressed(views::Button* sender, |
| 258 const views::Event& event) { | 299 const views::Event& event) { |
| 259 UMA_HISTOGRAM_COUNTS("NetworkedProfile.Acknowledged", 1); | 300 UMA_HISTOGRAM_ENUMERATION(kMetricNetworkedProfileCheck, |
| 301 METRIC_ACKNOWLEDGED, | |
| 302 METRIC_NETWORKED_PROFILE_CHECK_SIZE); | |
| 260 | 303 |
| 261 GetWidget()->Close(); | 304 GetWidget()->Close(); |
| 262 } | 305 } |
| 263 | 306 |
| 264 // static | 307 // static |
| 265 void NetworkProfileBubble::NotifyNetworkProfileDetected() { | 308 void NetworkProfileBubble::NotifyNetworkProfileDetected() { |
| 266 if (BrowserList::GetLastActive() != NULL) | 309 if (BrowserList::GetLastActive() != NULL) |
| 267 ShowNotification(BrowserList::GetLastActive()); | 310 ShowNotification(BrowserList::GetLastActive()); |
| 268 else | 311 else |
| 269 BrowserList::AddObserver(new BrowserListObserver()); | 312 BrowserList::AddObserver(new BrowserListObserver()); |
| 270 } | 313 } |
| OLD | NEW |