1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/web_resource/resource_request_allowed_notifier.h"
7 #include "base/command_line.h"
8 #include "chrome/common/chrome_switches.h"
10 ResourceRequestAllowedNotifier::ResourceRequestAllowedNotifier()
11 : observer_requested_permission_(false),
12 waiting_for_network_(false),
13 waiting_for_user_to_accept_eula_(false),
17 ResourceRequestAllowedNotifier::~ResourceRequestAllowedNotifier() {
19 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
22 void ResourceRequestAllowedNotifier::Init(Observer* observer) {
23 DCHECK(!observer_ && observer);
26 net::NetworkChangeNotifier::AddConnectionTypeObserver(this);
28 // Check this state during initialization. It is not expected to change until
29 // the corresponding notification is received.
30 waiting_for_network_ = net::NetworkChangeNotifier::IsOffline();
32 eula_notifier_.reset(CreateEulaNotifier());
34 eula_notifier_->Init(this);
35 waiting_for_user_to_accept_eula_ = !eula_notifier_->IsEulaAccepted();
39 bool ResourceRequestAllowedNotifier::ResourceRequestsAllowed() {
40 if (CommandLine::ForCurrentProcess()->HasSwitch(
41 switches::kDisableBackgroundNetworking)) {
45 // The observer requested permission. Return the current criteria state and
46 // set a flag to remind this class to notify the observer once the criteria
48 observer_requested_permission_ = waiting_for_user_to_accept_eula_ ||
50 return !observer_requested_permission_;
53 void ResourceRequestAllowedNotifier::SetWaitingForNetworkForTesting(
55 waiting_for_network_ = waiting;
58 void ResourceRequestAllowedNotifier::SetWaitingForEulaForTesting(
60 waiting_for_user_to_accept_eula_ = waiting;
63 void ResourceRequestAllowedNotifier::SetObserverRequestedForTesting(
65 observer_requested_permission_ = requested;
68 void ResourceRequestAllowedNotifier::MaybeNotifyObserver() {
69 // Need to ensure that all criteria are met before notifying observers.
70 if (observer_requested_permission_ && ResourceRequestsAllowed()) {
71 DVLOG(1) << "Notifying observer of state change.";
72 observer_->OnResourceRequestsAllowed();
73 // Reset this so the observer is not informed again unless they check
74 // ResourceRequestsAllowed again.
75 observer_requested_permission_ = false;
79 EulaAcceptedNotifier* ResourceRequestAllowedNotifier::CreateEulaNotifier() {
80 return EulaAcceptedNotifier::Create();
83 void ResourceRequestAllowedNotifier::OnEulaAccepted() {
84 // This flag should have been set if this was waiting on the EULA
86 DCHECK(waiting_for_user_to_accept_eula_);
87 DVLOG(1) << "EULA was accepted.";
88 waiting_for_user_to_accept_eula_ = false;
89 MaybeNotifyObserver();
92 void ResourceRequestAllowedNotifier::OnConnectionTypeChanged(
93 net::NetworkChangeNotifier::ConnectionType type) {
94 // Only attempt to notify observers if this was previously waiting for the
95 // network to reconnect, and new network state is actually available. This
96 // prevents the notifier from notifying the observer if the notifier was never
97 // waiting on the network, or if the network changes from one online state
98 // to another (for example, Wifi to 3G, or Wifi to Wifi, if the network were
100 if (waiting_for_network_ &&
101 type != net::NetworkChangeNotifier::CONNECTION_NONE) {
102 waiting_for_network_ = false;
103 DVLOG(1) << "Network came back online.";
104 MaybeNotifyObserver();
105 } else if (!waiting_for_network_ &&
106 type == net::NetworkChangeNotifier::CONNECTION_NONE) {
107 waiting_for_network_ = true;
108 DVLOG(1) << "Network went offline.";