blob: 6a7241e479a52dfa18cf05ae8592a3a558f96b0c [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_METRICS_VARIATIONS_RESOURCE_REQUEST_ALLOWED_NOTIFIER_H_
#define CHROME_BROWSER_METRICS_VARIATIONS_RESOURCE_REQUEST_ALLOWED_NOTIFIER_H_
#include "base/observer_list.h"
#include "net/base/network_change_notifier.h"
#if defined(OS_CHROMEOS)
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#endif
// This class informs an interested observer when resource requests over the
// network are permitted.
//
// Currently, the criteria for allowing resource requests include:
// 1. The network is currently available.
// 2. The EULA was accepted by the user (ChromeOS only).
//
// Interested services should add themselves as an observer of
// ResourceRequestAllowedNotifier and check ResourceRequestsAllowed() to see if
// requests are permitted. If it returns true, they can go ahead and make their
// request. If it returns false, ResourceRequestAllowedNotifier will notify the
// service when the criteria is met.
//
// If ResourceRequestsAllowed returns true the first time,
// ResourceRequestAllowedNotifier will not notify the service in the future.
//
// Note that this class handles the criteria state for a single service, so
// services should keep their own instance of this class rather than sharing a
// global instance.
class ResourceRequestAllowedNotifier :
#if defined(OS_CHROMEOS)
public content::NotificationObserver,
#endif
public net::NetworkChangeNotifier::ConnectionTypeObserver {
public:
// Observes resource request allowed state changes.
class Observer {
public:
virtual void OnResourceRequestsAllowed() = 0;
};
ResourceRequestAllowedNotifier();
virtual ~ResourceRequestAllowedNotifier();
// Sets |observer| as the service to be notified by this instance, and
// performs initial checks on the criteria. |observer| may not be NULL.
// This is to be called immediately after construction of an instance of
// ResourceRequestAllowedNotifier to pass it the interested service.
void Init(Observer* observer);
// Returns true iff all resource request criteria are met. If not, this call
// will set some flags so it knows to notify the observer if the criteria
// changes. Note that the observer will never be notified unless it calls this
// method first. This is virtual so it can be overriden for tests.
virtual bool ResourceRequestsAllowed();
void SetWasWaitingForNetworkForTesting(bool waiting);
#if defined(OS_CHROMEOS)
void SetWasWaitingForEulaForTesting(bool waiting);
#endif
protected:
// Notifies the observer if all criteria needed for resource requests are met.
// This is protected so it can be called from subclasses for testing.
void MaybeNotifyObserver();
#if defined(OS_CHROMEOS)
// On official builds, returns true iff the EULA needs to be accepted. This
// always returns false on unofficial builds since there is no notion of a
// EULA.
//
// This is virtual so it can be overriden by test classes to avoid making them
// aware of the ChromeOS details. This is protected so it call be overriden in
// subclasses for testing.
virtual bool NeedsEulaAcceptance();
#endif
private:
// net::NetworkChangeNotifier::ConnectionTypeObserver overrides:
virtual void OnConnectionTypeChanged(
net::NetworkChangeNotifier::ConnectionType type) OVERRIDE;
#if defined(OS_CHROMEOS)
// content::NotificationObserver overrides:
virtual void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE;
#endif
// Tracks whether or not the observer/service depending on this class actually
// requested permission to make a request or not. If it did not, then this
// class should not notify it even if the criteria is met.
bool observer_requested_permission_;
// Tracks network connectivity criteria.
bool was_waiting_for_network_;
#if defined(OS_CHROMEOS)
// Tracks EULA acceptance criteria.
bool was_waiting_for_user_to_accept_eula_;
// Used to listen for the EULA accepted notification.
content::NotificationRegistrar registrar_;
#endif
// Observing service interested in request permissions.
Observer* observer_;
DISALLOW_COPY_AND_ASSIGN(ResourceRequestAllowedNotifier);
};
#endif // CHROME_BROWSER_METRICS_VARIATIONS_RESOURCE_REQUEST_ALLOWED_NOTIFIER_H_