blob: 7ad0b1faa3ecfa9ddcc32a4ebd4bcfc90279da09 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_PROTECTOR_PROTECTOR_SERVICE_H_
#define CHROME_BROWSER_PROTECTOR_PROTECTOR_SERVICE_H_
#include <vector>
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/linked_ptr.h"
#include "base/memory/scoped_ptr.h"
#include "base/sequenced_task_runner_helpers.h"
#include "chrome/browser/profiles/profile_keyed_service.h"
#include "chrome/browser/protector/base_setting_change.h"
#include "chrome/browser/protector/settings_change_global_error_delegate.h"
class GURL;
class PrefService;
class Profile;
class TemplateURLService;
namespace protector {
class ProtectedPrefsWatcher;
class SettingsChangeGlobalError;
// Presents a SettingChange to user and handles possible user actions.
class ProtectorService : public ProfileKeyedService,
public SettingsChangeGlobalErrorDelegate {
public:
explicit ProtectorService(Profile* profile);
virtual ~ProtectorService();
// Shows global error about the specified change. Owns |change|. May be called
// multiple times in which case subsequent bubbles will be displayed.
virtual void ShowChange(BaseSettingChange* change);
// Returns |true| if a change is currently active (shown by a ShowChange call
// and not yet applied or discarded).
virtual bool IsShowingChange() const;
// Removes corresponding global error (including the bubbble if one is shown)
// and deletes the change instance (without calling Apply or Discard on it).
virtual void DismissChange(BaseSettingChange* change);
// Persists |change| and removes corresponding global error. |browser| is the
// Browser instance from which the user action originates.
virtual void ApplyChange(BaseSettingChange* change, Browser* browser);
// Discards |change| and removes corresponding global error. |browser| is the
// Browser instance from which the user action originates.
virtual void DiscardChange(BaseSettingChange* change, Browser* browser);
// Opens a tab with specified URL in the browser window we've shown error
// bubble for.
virtual void OpenTab(const GURL& url, Browser* browser);
// Returns the ProtectedPrefsWatcher instance for access to protected prefs
// backup.
ProtectedPrefsWatcher* GetPrefsWatcher();
// Stops observing pref changes and updating the backup. Should be used in
// tests only.
void StopWatchingPrefsForTesting();
// Returns the most recent change instance or NULL if there are no changes.
BaseSettingChange* GetLastChange();
// Returns the Profile instance for this service.
Profile* profile() { return profile_; }
private:
friend class ProtectorServiceTest;
// Each item consists of an error and corresponding change instance.
// linked_ptr is used because Item instances are stored in a std::vector and
// must be copyable.
struct Item {
Item();
~Item();
linked_ptr<BaseSettingChange> change;
linked_ptr<SettingsChangeGlobalError> error;
// When true, this means |change| was merged with another instance and
// |error| is in process of being removed from GlobalErrorService.
bool was_merged;
// Meaningful only when |was_merged| is true. In that case, true means that
// the new merged GlobalError instance will be immediately shown.
bool show_when_merged;
};
typedef std::vector<Item> Items;
// Matches Item by |change| field.
class MatchItemByChange {
public:
explicit MatchItemByChange(const BaseSettingChange* other);
bool operator()(const Item& item);
private:
const BaseSettingChange* other_;
};
// Matches Item by |error| field.
class MatchItemByError {
public:
explicit MatchItemByError(const SettingsChangeGlobalError* other);
bool operator()(const Item& item);
private:
const SettingsChangeGlobalError* other_;
};
// Returns an Item instance whose change can be merged with |change|, if any.
// Otherwise returns |NULL|. Provided that the merge strategy is transitive,
// there can be only one such instance.
Item* FindItemToMergeWith(const BaseSettingChange* change);
// ProfileKeyedService implementation.
virtual void Shutdown() OVERRIDE;
// SettingsChangeGlobalErrorDelegate implementation.
virtual void OnApplyChange(SettingsChangeGlobalError* error,
Browser* browser) OVERRIDE;
virtual void OnDiscardChange(SettingsChangeGlobalError* error,
Browser* browser) OVERRIDE;
virtual void OnDecisionTimeout(SettingsChangeGlobalError* error) OVERRIDE;
virtual void OnRemovedFromProfile(SettingsChangeGlobalError* error) OVERRIDE;
// Pointers to error bubble controllers and corresponding changes in the order
// added.
Items items_;
// Profile which settings we are protecting.
Profile* profile_;
// True if there is a change that has been shown and not yet accepted or
// discarded by user.
bool has_active_change_;
// Observes changes to protected prefs and updates the backup.
scoped_ptr<ProtectedPrefsWatcher> prefs_watcher_;
DISALLOW_COPY_AND_ASSIGN(ProtectorService);
};
} // namespace protector
#endif // CHROME_BROWSER_PROTECTOR_PROTECTOR_SERVICE_H_