summaryrefslogtreecommitdiffstats
path: root/chrome/browser/devtools/devtools_network_controller.cc
blob: b83ac970f59e01774b749db76266c30c89310f59 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Copyright 2014 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.

#include "chrome/browser/devtools/devtools_network_controller.h"

#include <utility>

#include "chrome/browser/devtools/devtools_network_conditions.h"
#include "chrome/browser/devtools/devtools_network_interceptor.h"
#include "net/http/http_request_info.h"

DevToolsNetworkController::DevToolsNetworkController()
    : appcache_interceptor_(new DevToolsNetworkInterceptor()) {}

DevToolsNetworkController::~DevToolsNetworkController() {
  DCHECK(thread_checker_.CalledOnValidThread());
}

DevToolsNetworkInterceptor* DevToolsNetworkController::GetInterceptor(
    const std::string& client_id) {
  DCHECK(thread_checker_.CalledOnValidThread());
  if (!interceptors_.size() || client_id.empty())
    return nullptr;

  DevToolsNetworkInterceptor* interceptor = interceptors_.get(client_id);
  if (!interceptor)
    return nullptr;

  return interceptor;
}

void DevToolsNetworkController::SetNetworkState(
    const std::string& client_id,
    scoped_ptr<DevToolsNetworkConditions> conditions) {
  DCHECK(thread_checker_.CalledOnValidThread());

  DevToolsNetworkInterceptor* interceptor = interceptors_.get(client_id);
  if (!interceptor) {
    DCHECK(conditions);
    if (!conditions)
      return;
    scoped_ptr<DevToolsNetworkInterceptor> new_interceptor(
        new DevToolsNetworkInterceptor());
    new_interceptor->UpdateConditions(std::move(conditions));
    interceptors_.set(client_id, std::move(new_interceptor));
  } else {
    if (!conditions) {
      scoped_ptr<DevToolsNetworkConditions> online_conditions(
          new DevToolsNetworkConditions());
      interceptor->UpdateConditions(std::move(online_conditions));
      interceptors_.erase(client_id);
    } else {
      interceptor->UpdateConditions(std::move(conditions));
    }
  }

  bool has_offline_interceptors = false;
  InterceptorMap::iterator it = interceptors_.begin();
  for (; it != interceptors_.end(); ++it) {
    if (it->second->IsOffline()) {
      has_offline_interceptors = true;
      break;
    }
  }

  bool is_appcache_offline = appcache_interceptor_->IsOffline();
  if (is_appcache_offline != has_offline_interceptors) {
    scoped_ptr<DevToolsNetworkConditions> appcache_conditions(
        new DevToolsNetworkConditions(has_offline_interceptors));
    appcache_interceptor_->UpdateConditions(std::move(appcache_conditions));
  }
}