浏览器研究-chromium修改源码禁用图片加载

禁用图片是为了加速和节省资源,搞并发需要把图片加载禁用掉,便于提升速度。实现这个功能的思路是在网络层加载资源url的时候进行判断,如果url的后缀有png等图片后缀就不进行加载,相当于把网络层请求给拦截下来,代码位于src\net\http\http_network_transaction.cc,代码中的Start方法就是发起请求的启动函数。

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
74
75
76
77
78
int HttpNetworkTransaction::Start(const HttpRequestInfo* request_info,
CompletionOnceCallback callback,
const NetLogWithSource& net_log) {
if (request_info->load_flags & LOAD_ONLY_FROM_CACHE)
return ERR_CACHE_MISS;

DCHECK(request_info->traffic_annotation.is_valid());
DCHECK(request_info->IsConsistent());
net_log_ = net_log;
request_ = request_info;
url_ = request_->url;
// jack
const base::CommandLine* jack_command_line =
base::CommandLine::ForCurrentProcess();
if (jack_command_line->HasSwitch("jack")) {
const std::string jack_fp = jack_command_line->GetSwitchValueASCII("jack");
absl::optional<base::Value> json_reader = base::JSONReader::Read(jack_fp);
const std::string* enableimg =
json_reader->GetDict().FindString("disableimg");
if (enableimg != nullptr) {
std::string img_value = *enableimg;
if (img_value == "yes") {
std::string path = url_.possibly_invalid_spec();
if (path.find("jpg") != std::string::npos ||
path.find("jpeg") != std::string::npos ||
path.find("png") != std::string::npos ||
path.find("gif") != std::string::npos ||
path.find("bmp") != std::string::npos ||
path.find("JPEG") != std::string::npos) {
return ERR_BLOCKED_BY_CLIENT;
}
}
}
}
// jack end
network_anonymization_key_ = request_->network_anonymization_key;
#if BUILDFLAG(ENABLE_REPORTING)
// Store values for later use in NEL report generation.
request_method_ = request_->method;
request_->extra_headers.GetHeader(HttpRequestHeaders::kReferer,
&request_referrer_);
request_->extra_headers.GetHeader(HttpRequestHeaders::kUserAgent,
&request_user_agent_);
request_reporting_upload_depth_ = request_->reporting_upload_depth;
#endif // BUILDFLAG(ENABLE_REPORTING)
start_timeticks_ = base::TimeTicks::Now();

if (request_->load_flags & LOAD_DISABLE_CERT_NETWORK_FETCHES) {
server_ssl_config_.disable_cert_verification_network_fetches = true;
proxy_ssl_config_.disable_cert_verification_network_fetches = true;
}

if (request_->idempotency == IDEMPOTENT ||
(request_->idempotency == DEFAULT_IDEMPOTENCY &&
HttpUtil::IsMethodSafe(request_info->method))) {
can_send_early_data_ = true;
}

if (request_->load_flags & LOAD_PREFETCH) {
response_.unused_since_prefetch = true;
}

if (request_->load_flags & LOAD_RESTRICTED_PREFETCH) {
DCHECK(response_.unused_since_prefetch);
response_.restricted_prefetch = true;
}

next_state_ = STATE_NOTIFY_BEFORE_CREATE_STREAM;
int rv = DoLoop(OK);
if (rv == ERR_IO_PENDING)
callback_ = std::move(callback);

// This always returns ERR_IO_PENDING because DoCreateStream() does, but
// GenerateNetworkErrorLoggingReportIfError() should be called here if any
// other net::Error can be returned.
DCHECK_EQ(rv, ERR_IO_PENDING);
return rv;
}