IndexedDBFactory now ForceCloses databases.
[chromium-blink-merge.git] / content / browser / loader / offline_policy.cc
blob9c9361f5258c1282e36ef9d80d4d03761b588b03
1 // Copyright (c) 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 "content/browser/loader/offline_policy.h"
7 #include "base/command_line.h"
8 #include "base/metrics/histogram.h"
9 #include "content/public/common/content_switches.h"
10 #include "net/base/load_flags.h"
11 #include "net/http/http_response_info.h"
12 #include "net/url_request/url_request.h"
14 namespace content {
16 OfflinePolicy::OfflinePolicy()
17 : enabled_(CommandLine::ForCurrentProcess()->HasSwitch(
18 switches::kEnableOfflineCacheAccess)),
19 state_(INIT),
20 resource_loads_initiated_(0),
21 resource_loads_successfully_started_(0) {}
23 OfflinePolicy::~OfflinePolicy() {
24 RecordAndResetStats();
27 void OfflinePolicy::RecordAndResetStats() {
28 if (enabled_ && OFFLINE == state_ && 0 != resource_loads_initiated_) {
29 UMA_HISTOGRAM_PERCENTAGE(
30 "OfflinePolicy.SuccessfulResourceLoadPercentage",
31 (resource_loads_successfully_started_ * 100 /
32 resource_loads_initiated_));
34 resource_loads_initiated_ = 0;
35 resource_loads_successfully_started_ = 0;
38 int OfflinePolicy::GetAdditionalLoadFlags(int current_flags,
39 bool reset_state) {
40 // Don't do anything if offline mode is disabled.
41 if (!enabled_)
42 return 0;
44 if (reset_state) {
45 RecordAndResetStats();
46 state_ = INIT;
49 ++resource_loads_initiated_;
51 // If a consumer has requested something contradictory, it wins; we
52 // don't modify the load flags.
53 if (current_flags &
54 (net::LOAD_BYPASS_CACHE | net::LOAD_PREFERRING_CACHE |
55 net::LOAD_ONLY_FROM_CACHE | net::LOAD_FROM_CACHE_IF_OFFLINE |
56 net::LOAD_DISABLE_CACHE)) {
57 return 0;
60 switch(state_) {
61 case INIT:
62 return net::LOAD_FROM_CACHE_IF_OFFLINE;
63 case ONLINE:
64 return 0;
65 case OFFLINE:
66 return net::LOAD_ONLY_FROM_CACHE;
68 NOTREACHED();
69 return 0;
72 void OfflinePolicy::UpdateStateForSuccessfullyStartedRequest(
73 const net::HttpResponseInfo& response_info) {
74 // Don't do anything if offline mode is disabled.
75 if (!enabled_)
76 return;
78 // If we get here, we're going to be providing some amount of information
79 // to the renderer.
80 ++resource_loads_successfully_started_;
82 if (state_ != INIT)
83 // We've already made the decision for the rest of this set
84 // of navigations.
85 return;
87 if (response_info.server_data_unavailable) {
88 state_ = OFFLINE;
89 } else if (response_info.network_accessed) {
90 // If we got the response from the network or validated it as part
91 // of this request, that means our connection to the host is working.
92 state_ = ONLINE;
96 } // namespace content