禁用图片是为了加速和节省资源,搞并发需要把图片加载禁用掉,便于提升速度。实现这个功能的思路是在网络层加载资源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; 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; } } } } network_anonymization_key_ = request_->network_anonymization_key; #if BUILDFLAG(ENABLE_REPORTING) 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 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); DCHECK_EQ (rv, ERR_IO_PENDING); return rv; }