• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 #include "content/browser/loader/offline_policy.h"
6 
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"
13 
14 namespace content {
15 
OfflinePolicy()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) {}
22 
~OfflinePolicy()23 OfflinePolicy::~OfflinePolicy() {
24   RecordAndResetStats();
25 }
26 
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_));
33   }
34   resource_loads_initiated_ = 0;
35   resource_loads_successfully_started_ = 0;
36 }
37 
GetAdditionalLoadFlags(int current_flags,bool reset_state)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;
43 
44   if (reset_state) {
45     RecordAndResetStats();
46     state_ = INIT;
47   }
48 
49   ++resource_loads_initiated_;
50 
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;
58   }
59 
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;
67   }
68   NOTREACHED();
69   return 0;
70 }
71 
UpdateStateForSuccessfullyStartedRequest(const net::HttpResponseInfo & response_info)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;
77 
78   // If we get here, we're going to be providing some amount of information
79   // to the renderer.
80   ++resource_loads_successfully_started_;
81 
82   if (state_ != INIT)
83     // We've already made the decision for the rest of this set
84     // of navigations.
85     return;
86 
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;
93   }
94 }
95 
96 }  // namespace content
97