15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_NETWORK_PROFILE_BUBBLE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_NETWORK_PROFILE_BUBBLE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath;
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs {
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySyncable;
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class will try to detect if the profile is on a network share and if
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this is the case notify the user with an info bubble.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkProfileBubble {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum MetricNetworkedProfileCheck {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // Check was suppressed by command line flag.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   METRIC_CHECK_SUPPRESSED,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // WTSQuerySessionInformation call failed.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   METRIC_CHECK_FAILED,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // File access in profile dir failed.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   METRIC_CHECK_IO_FAILED,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // Profile on a network share detected.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   METRIC_PROFILE_ON_NETWORK,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // Profile not on a network share detected.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   METRIC_PROFILE_NOT_ON_NETWORK,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // Check was suppressed because of remote session.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   METRIC_REMOTE_SESSION,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // User has clicked learn more on the notification bubble.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   METRIC_LEARN_MORE_CLICKED,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // User has clicked OK on the notification bubble.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   METRIC_ACKNOWLEDGED,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   METRIC_NETWORKED_PROFILE_CHECK_SIZE  // Must be the last.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the check for network located profile should be done. This
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test is only performed up to |kMaxWarnings| times in a row and then
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // repeated after a period of silence that lasts |kSilenceDurationDays| days.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool ShouldCheckNetworkProfile(Profile* profile);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verifies that the profile folder is not located on a network share, and if
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it is shows the warning bubble to the user.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void CheckNetworkProfile(const base::FilePath& profile_folder);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shows the notification bubble using the provided |browser|.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void ShowNotification(Browser* browser);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void SetNotificationShown(bool shown);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register the pref that controls whether the bubble should be shown anymore.
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function wrapping the UMA_HISTOGRAM_ENUMERATION macro.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RecordUmaEvent(MetricNetworkedProfileCheck event);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function creates the notification bubble, attaches it to the
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |anchor| View and then shows it to the user.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void NotifyNetworkProfileDetected();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set to true once the notification check has been performed to avoid showing
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the notification more than once per browser run.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This flag is not thread-safe and should only be accessed on the UI thread!
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool notification_shown_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_IMPLICIT_CONSTRUCTORS(NetworkProfileBubble);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_NETWORK_PROFILE_BUBBLE_H_
83