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. 4 5 #include "chrome/browser/web_resource/resource_request_allowed_notifier.h" 6 7 #include "base/command_line.h" 8 #include "chrome/common/chrome_switches.h" 9 10 ResourceRequestAllowedNotifier::ResourceRequestAllowedNotifier() 11 : observer_requested_permission_(false), 12 waiting_for_network_(false), 13 waiting_for_user_to_accept_eula_(false), 14 observer_(NULL) { 15 } 16 17 ResourceRequestAllowedNotifier::~ResourceRequestAllowedNotifier() { 18 if (observer_) 19 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); 20 } 21 22 void ResourceRequestAllowedNotifier::Init(Observer* observer) { 23 DCHECK(!observer_ && observer); 24 observer_ = observer; 25 26 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); 27 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(); 31 32 eula_notifier_.reset(CreateEulaNotifier()); 33 if (eula_notifier_) { 34 eula_notifier_->Init(this); 35 waiting_for_user_to_accept_eula_ = !eula_notifier_->IsEulaAccepted(); 36 } 37 } 38 39 ResourceRequestAllowedNotifier::State 40 ResourceRequestAllowedNotifier::GetResourceRequestsAllowedState() { 41 if (CommandLine::ForCurrentProcess()->HasSwitch( 42 switches::kDisableBackgroundNetworking)) { 43 return DISALLOWED_COMMAND_LINE_DISABLED; 44 } 45 46 // The observer requested permission. Return the current criteria state and 47 // set a flag to remind this class to notify the observer once the criteria 48 // is met. 49 observer_requested_permission_ = waiting_for_user_to_accept_eula_ || 50 waiting_for_network_; 51 if (!observer_requested_permission_) 52 return ALLOWED; 53 return waiting_for_user_to_accept_eula_ ? DISALLOWED_EULA_NOT_ACCEPTED : 54 DISALLOWED_NETWORK_DOWN; 55 } 56 57 bool ResourceRequestAllowedNotifier::ResourceRequestsAllowed() { 58 return GetResourceRequestsAllowedState() == ALLOWED; 59 } 60 61 void ResourceRequestAllowedNotifier::SetWaitingForNetworkForTesting( 62 bool waiting) { 63 waiting_for_network_ = waiting; 64 } 65 66 void ResourceRequestAllowedNotifier::SetWaitingForEulaForTesting( 67 bool waiting) { 68 waiting_for_user_to_accept_eula_ = waiting; 69 } 70 71 void ResourceRequestAllowedNotifier::SetObserverRequestedForTesting( 72 bool requested) { 73 observer_requested_permission_ = requested; 74 } 75 76 void ResourceRequestAllowedNotifier::MaybeNotifyObserver() { 77 // Need to ensure that all criteria are met before notifying observers. 78 if (observer_requested_permission_ && ResourceRequestsAllowed()) { 79 DVLOG(1) << "Notifying observer of state change."; 80 observer_->OnResourceRequestsAllowed(); 81 // Reset this so the observer is not informed again unless they check 82 // ResourceRequestsAllowed again. 83 observer_requested_permission_ = false; 84 } 85 } 86 87 EulaAcceptedNotifier* ResourceRequestAllowedNotifier::CreateEulaNotifier() { 88 return EulaAcceptedNotifier::Create(); 89 } 90 91 void ResourceRequestAllowedNotifier::OnEulaAccepted() { 92 // This flag should have been set if this was waiting on the EULA 93 // notification. 94 DCHECK(waiting_for_user_to_accept_eula_); 95 DVLOG(1) << "EULA was accepted."; 96 waiting_for_user_to_accept_eula_ = false; 97 MaybeNotifyObserver(); 98 } 99 100 void ResourceRequestAllowedNotifier::OnConnectionTypeChanged( 101 net::NetworkChangeNotifier::ConnectionType type) { 102 // Only attempt to notify observers if this was previously waiting for the 103 // network to reconnect, and new network state is actually available. This 104 // prevents the notifier from notifying the observer if the notifier was never 105 // waiting on the network, or if the network changes from one online state 106 // to another (for example, Wifi to 3G, or Wifi to Wifi, if the network were 107 // flaky). 108 if (waiting_for_network_ && 109 type != net::NetworkChangeNotifier::CONNECTION_NONE) { 110 waiting_for_network_ = false; 111 DVLOG(1) << "Network came back online."; 112 MaybeNotifyObserver(); 113 } else if (!waiting_for_network_ && 114 type == net::NetworkChangeNotifier::CONNECTION_NONE) { 115 waiting_for_network_ = true; 116 DVLOG(1) << "Network went offline."; 117 } 118 } 119