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