1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 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) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/web_resource/resource_request_allowed_notifier.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ResourceRequestAllowedNotifier::ResourceRequestAllowedNotifier() 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : observer_requested_permission_(false), 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waiting_for_network_(false), 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waiting_for_user_to_accept_eula_(false), 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer_(NULL) { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ResourceRequestAllowedNotifier::~ResourceRequestAllowedNotifier() { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (observer_) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ResourceRequestAllowedNotifier::Init(Observer* observer) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!observer_ && observer); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer_ = observer; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkChangeNotifier::AddConnectionTypeObserver(this); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check this state during initialization. It is not expected to change until 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the corresponding notification is received. 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waiting_for_network_ = net::NetworkChangeNotifier::IsOffline(); 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) eula_notifier_.reset(CreateEulaNotifier()); 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (eula_notifier_) { 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) eula_notifier_->Init(this); 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waiting_for_user_to_accept_eula_ = !eula_notifier_->IsEulaAccepted(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ResourceRequestAllowedNotifier::State 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResourceRequestAllowedNotifier::GetResourceRequestsAllowedState() { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kDisableBackgroundNetworking)) { 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return DISALLOWED_COMMAND_LINE_DISABLED; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The observer requested permission. Return the current criteria state and 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // set a flag to remind this class to notify the observer once the criteria 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is met. 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) observer_requested_permission_ = waiting_for_user_to_accept_eula_ || 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) waiting_for_network_; 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!observer_requested_permission_) 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return ALLOWED; 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return waiting_for_user_to_accept_eula_ ? DISALLOWED_EULA_NOT_ACCEPTED : 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOWED_NETWORK_DOWN; 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ResourceRequestAllowedNotifier::ResourceRequestsAllowed() { 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetResourceRequestsAllowedState() == ALLOWED; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ResourceRequestAllowedNotifier::SetWaitingForNetworkForTesting( 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool waiting) { 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waiting_for_network_ = waiting; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ResourceRequestAllowedNotifier::SetWaitingForEulaForTesting( 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool waiting) { 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waiting_for_user_to_accept_eula_ = waiting; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ResourceRequestAllowedNotifier::SetObserverRequestedForTesting( 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool requested) { 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) observer_requested_permission_ = requested; 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ResourceRequestAllowedNotifier::MaybeNotifyObserver() { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Need to ensure that all criteria are met before notifying observers. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (observer_requested_permission_ && ResourceRequestsAllowed()) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Notifying observer of state change."; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer_->OnResourceRequestsAllowed(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset this so the observer is not informed again unless they check 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ResourceRequestsAllowed again. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer_requested_permission_ = false; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)EulaAcceptedNotifier* ResourceRequestAllowedNotifier::CreateEulaNotifier() { 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return EulaAcceptedNotifier::Create(); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ResourceRequestAllowedNotifier::OnEulaAccepted() { 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This flag should have been set if this was waiting on the EULA 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // notification. 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(waiting_for_user_to_accept_eula_); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DVLOG(1) << "EULA was accepted."; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waiting_for_user_to_accept_eula_ = false; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MaybeNotifyObserver(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ResourceRequestAllowedNotifier::OnConnectionTypeChanged( 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkChangeNotifier::ConnectionType type) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only attempt to notify observers if this was previously waiting for the 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // network to reconnect, and new network state is actually available. This 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prevents the notifier from notifying the observer if the notifier was never 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // waiting on the network, or if the network changes from one online state 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to another (for example, Wifi to 3G, or Wifi to Wifi, if the network were 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // flaky). 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (waiting_for_network_ && 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type != net::NetworkChangeNotifier::CONNECTION_NONE) { 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waiting_for_network_ = false; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Network came back online."; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaybeNotifyObserver(); 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } else if (!waiting_for_network_ && 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) type == net::NetworkChangeNotifier::CONNECTION_NONE) { 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) waiting_for_network_ = true; 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DVLOG(1) << "Network went offline."; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 119