123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- // Copyright 2018 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 "android_webview/browser/network_service/net_helpers.h"
- #include "android_webview/browser/aw_contents_io_thread_client.h"
- #include "android_webview/common/url_constants.h"
- #include "base/check_op.h"
- #include "net/base/load_flags.h"
- #include "url/gurl.h"
- namespace android_webview {
- namespace {
- int UpdateCacheControlFlags(int load_flags, int cache_control_flags) {
- const int all_cache_control_flags =
- net::LOAD_BYPASS_CACHE | net::LOAD_VALIDATE_CACHE |
- net::LOAD_SKIP_CACHE_VALIDATION | net::LOAD_ONLY_FROM_CACHE;
- DCHECK_EQ((cache_control_flags & all_cache_control_flags),
- cache_control_flags);
- load_flags &= ~all_cache_control_flags;
- load_flags |= cache_control_flags;
- return load_flags;
- }
- // Gets the net-layer load_flags which reflect |client|'s cache mode.
- int GetCacheModeForClient(AwContentsIoThreadClient* client) {
- DCHECK(client);
- AwContentsIoThreadClient::CacheMode cache_mode = client->GetCacheMode();
- switch (cache_mode) {
- case AwContentsIoThreadClient::LOAD_CACHE_ELSE_NETWORK:
- // If the resource is in the cache (even if expired), load from cache.
- // Otherwise, fall back to network.
- return net::LOAD_SKIP_CACHE_VALIDATION;
- case AwContentsIoThreadClient::LOAD_NO_CACHE:
- // Always load from the network, don't use the cache.
- return net::LOAD_BYPASS_CACHE;
- case AwContentsIoThreadClient::LOAD_CACHE_ONLY:
- // If the resource is in the cache (even if expired), load from cache. Do
- // not fall back to the network.
- return net::LOAD_ONLY_FROM_CACHE | net::LOAD_SKIP_CACHE_VALIDATION;
- default:
- // If the resource is in the cache (and is valid), load from cache.
- // Otherwise, fall back to network. This is the usual (default) case.
- return 0;
- }
- }
- } // namespace
- int UpdateLoadFlags(int load_flags, AwContentsIoThreadClient* client) {
- if (!client)
- return load_flags;
- if (client->ShouldBlockNetworkLoads()) {
- return UpdateCacheControlFlags(
- load_flags,
- net::LOAD_ONLY_FROM_CACHE | net::LOAD_SKIP_CACHE_VALIDATION);
- }
- int cache_mode = GetCacheModeForClient(client);
- if (!cache_mode)
- return load_flags;
- return UpdateCacheControlFlags(load_flags, cache_mode);
- }
- bool ShouldBlockURL(const GURL& url, AwContentsIoThreadClient* client) {
- if (!client)
- return false;
- // Part of implementation of WebSettings.allowContentAccess.
- if (url.SchemeIs(url::kContentScheme) && client->ShouldBlockContentUrls())
- return true;
- // Part of implementation of WebSettings.allowFileAccess.
- if (url.SchemeIsFile() && client->ShouldBlockFileUrls()) {
- // Application's assets and resources are always available.
- return !IsAndroidSpecialFileUrl(url);
- }
- return client->ShouldBlockNetworkLoads() && url.SchemeIs(url::kFtpScheme);
- }
- int GetHttpCacheSize() {
- // This currently returns a constant value, but we may consider deciding cache
- // size dynamically, since Android provides better support on newer versions
- // (http://crbug.com/893318).
- return 20 * 1024 * 1024; // 20M
- }
- } // namespace android_webview
|