| OLD | NEW | 
|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #import "ios/web/net/request_tracker_impl.h" | 5 #import "ios/web/net/request_tracker_impl.h" | 
| 6 | 6 | 
| 7 #include <pthread.h> | 7 #include <pthread.h> | 
| 8 #include <stddef.h> | 8 #include <stddef.h> | 
| 9 #include <stdint.h> | 9 #include <stdint.h> | 
| 10 | 10 | 
| 11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" | 
| 12 #include "base/containers/hash_tables.h" | 12 #include "base/containers/hash_tables.h" | 
| 13 #include "base/location.h" | 13 #include "base/location.h" | 
| 14 #include "base/logging.h" | 14 #include "base/logging.h" | 
| 15 #import "base/mac/bind_objc_block.h" | 15 #import "base/mac/bind_objc_block.h" | 
| 16 #import "base/mac/scoped_nsobject.h" | 16 #import "base/mac/scoped_nsobject.h" | 
| 17 #include "base/macros.h" | 17 #include "base/macros.h" | 
|  | 18 #include "base/memory/ptr_util.h" | 
| 18 #include "base/strings/string_util.h" | 19 #include "base/strings/string_util.h" | 
| 19 #include "base/strings/sys_string_conversions.h" | 20 #include "base/strings/sys_string_conversions.h" | 
| 20 #include "base/synchronization/lock.h" | 21 #include "base/synchronization/lock.h" | 
| 21 #import "ios/net/clients/crn_forwarding_network_client.h" | 22 #import "ios/net/clients/crn_forwarding_network_client.h" | 
| 22 #import "ios/net/clients/crn_forwarding_network_client_factory.h" | 23 #import "ios/net/clients/crn_forwarding_network_client_factory.h" | 
| 23 #include "ios/web/history_state_util.h" | 24 #include "ios/web/history_state_util.h" | 
| 24 #import "ios/web/net/crw_request_tracker_delegate.h" | 25 #import "ios/web/net/crw_request_tracker_delegate.h" | 
| 25 #include "ios/web/public/browser_state.h" | 26 #include "ios/web/public/browser_state.h" | 
| 26 #include "ios/web/public/certificate_policy_cache.h" | 27 #include "ios/web/public/certificate_policy_cache.h" | 
| 27 #include "ios/web/public/ssl_status.h" | 28 #include "ios/web/public/ssl_status.h" | 
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 480   DCHECK_EQ(is_for_static_file_requests_, request->url().SchemeIsFile()); | 481   DCHECK_EQ(is_for_static_file_requests_, request->url().SchemeIsFile()); | 
| 481 | 482 | 
| 482   if (new_estimate_round_) { | 483   if (new_estimate_round_) { | 
| 483     // Starting a new estimate round. Ignore the previous requests for the | 484     // Starting a new estimate round. Ignore the previous requests for the | 
| 484     // calculation. | 485     // calculation. | 
| 485     counts_by_request_.clear(); | 486     counts_by_request_.clear(); | 
| 486     estimate_start_index_ = counts_.size(); | 487     estimate_start_index_ = counts_.size(); | 
| 487     new_estimate_round_ = false; | 488     new_estimate_round_ = false; | 
| 488   } | 489   } | 
| 489   const GURL& url = request->original_url(); | 490   const GURL& url = request->original_url(); | 
| 490   TrackerCounts* counts = new TrackerCounts( | 491   auto counts = | 
| 491       GURLByRemovingRefFromGURL(url), request); | 492       base::MakeUnique<TrackerCounts>(GURLByRemovingRefFromGURL(url), request); | 
| 492   counts_.push_back(counts); | 493   counts_by_request_[request] = counts.get(); | 
| 493   counts_by_request_[request] = counts; | 494   counts_.push_back(std::move(counts)); | 
| 494   if (page_url_.SchemeIsCryptographic() && !url.SchemeIsCryptographic()) | 495   if (page_url_.SchemeIsCryptographic() && !url.SchemeIsCryptographic()) | 
| 495     has_mixed_content_ = true; | 496     has_mixed_content_ = true; | 
| 496   Notify(); | 497   Notify(); | 
| 497 } | 498 } | 
| 498 | 499 | 
| 499 void RequestTrackerImpl::CaptureHeaders(net::URLRequest* request) { | 500 void RequestTrackerImpl::CaptureHeaders(net::URLRequest* request) { | 
| 500   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 501   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 
| 501   if (is_closing_) | 502   if (is_closing_) | 
| 502     return; | 503     return; | 
| 503 | 504 | 
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 780   if (is_closing_) | 781   if (is_closing_) | 
| 781     return; | 782     return; | 
| 782 | 783 | 
| 783   if (counts_.empty()) | 784   if (counts_.empty()) | 
| 784     return;  // Nothing yet to notify. | 785     return;  // Nothing yet to notify. | 
| 785 | 786 | 
| 786   if (!page_url_.SchemeIsCryptographic()) | 787   if (!page_url_.SchemeIsCryptographic()) | 
| 787     return; | 788     return; | 
| 788 | 789 | 
| 789   const GURL page_origin = page_url_.GetOrigin(); | 790   const GURL page_origin = page_url_.GetOrigin(); | 
| 790   ScopedVector<TrackerCounts>::iterator it; | 791   for (const auto& tracker_count : counts_) { | 
| 791   for (it = counts_.begin(); it != counts_.end(); ++it) { | 792     if (!tracker_count->ssl_info.is_valid()) | 
| 792     if (!(*it)->ssl_info.is_valid()) |  | 
| 793       continue;  // No SSL info at this point in time on this tracker. | 793       continue;  // No SSL info at this point in time on this tracker. | 
| 794 | 794 | 
| 795     GURL request_origin = (*it)->url.GetOrigin(); | 795     GURL request_origin = tracker_count->url.GetOrigin(); | 
| 796     if (request_origin != page_origin) | 796     if (request_origin != page_origin) | 
| 797       continue;  // Not interesting in the context of the page. | 797       continue;  // Not interesting in the context of the page. | 
| 798 | 798 | 
| 799     base::scoped_nsobject<CRWSSLCarrier> carrier( | 799     base::scoped_nsobject<CRWSSLCarrier> carrier([[CRWSSLCarrier alloc] | 
| 800         [[CRWSSLCarrier alloc] initWithTracker:this counts:*it]); | 800         initWithTracker:this | 
|  | 801                  counts:tracker_count.get()]); | 
| 801     web::WebThread::PostTask( | 802     web::WebThread::PostTask( | 
| 802         web::WebThread::UI, FROM_HERE, | 803         web::WebThread::UI, FROM_HERE, | 
| 803         base::Bind(&RequestTrackerImpl::NotifyUpdatedSSLStatus, this, carrier)); | 804         base::Bind(&RequestTrackerImpl::NotifyUpdatedSSLStatus, this, carrier)); | 
| 804     break; | 805     break; | 
| 805   } | 806   } | 
| 806 } | 807 } | 
| 807 | 808 | 
| 808 void RequestTrackerImpl::NotifyResponseHeaders( | 809 void RequestTrackerImpl::NotifyResponseHeaders( | 
| 809     net::HttpResponseHeaders* headers, | 810     net::HttpResponseHeaders* headers, | 
| 810     const GURL& request_url) { | 811     const GURL& request_url) { | 
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 920       CancelRequestForCounts(counts); | 921       CancelRequestForCounts(counts); | 
| 921       break; | 922       break; | 
| 922   } | 923   } | 
| 923 } | 924 } | 
| 924 | 925 | 
| 925 void RequestTrackerImpl::ReevaluateCallbacksForAllCounts() { | 926 void RequestTrackerImpl::ReevaluateCallbacksForAllCounts() { | 
| 926   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 927   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 
| 927   if (is_closing_) | 928   if (is_closing_) | 
| 928     return; | 929     return; | 
| 929 | 930 | 
| 930   ScopedVector<TrackerCounts>::iterator it; | 931   for (const auto& tracker_count : counts_) { | 
| 931   for (it = counts_.begin(); it != counts_.end(); ++it) { |  | 
| 932     // Check if the value hasn't changed via a user action. | 932     // Check if the value hasn't changed via a user action. | 
| 933     if ((*it)->ssl_judgment == CertPolicy::UNKNOWN) | 933     if (tracker_count->ssl_judgment == CertPolicy::UNKNOWN) | 
| 934       EvaluateSSLCallbackForCounts(*it); | 934       EvaluateSSLCallbackForCounts(tracker_count.get()); | 
| 935 | 935 | 
| 936     CertPolicy::Judgment judgment = (*it)->ssl_judgment; | 936     CertPolicy::Judgment judgment = tracker_count->ssl_judgment; | 
| 937     if (judgment == CertPolicy::ALLOWED) | 937     if (judgment == CertPolicy::ALLOWED) | 
| 938       continue; | 938       continue; | 
| 939 | 939 | 
| 940     // SSL errors on subrequests are simply ignored. The call to | 940     // SSL errors on subrequests are simply ignored. The call to | 
| 941     // EvaluateSSLCallbackForCounts() cancelled the request and nothing will | 941     // EvaluateSSLCallbackForCounts() cancelled the request and nothing will | 
| 942     // restart it. | 942     // restart it. | 
| 943     if ((*it)->is_subrequest) | 943     if (tracker_count->is_subrequest) | 
| 944       continue; | 944       continue; | 
| 945 | 945 | 
| 946     if (!current_ssl_error_) { | 946     if (!current_ssl_error_) { | 
| 947       // For the UNKNOWN and DENIED state the information should be pushed to | 947       // For the UNKNOWN and DENIED state the information should be pushed to | 
| 948       // the delegate. But only one at a time. | 948       // the delegate. But only one at a time. | 
| 949       current_ssl_error_ = (*it); | 949       current_ssl_error_ = tracker_count.get(); | 
| 950       base::scoped_nsobject<CRWSSLCarrier> carrier([[CRWSSLCarrier alloc] | 950       base::scoped_nsobject<CRWSSLCarrier> carrier([[CRWSSLCarrier alloc] | 
| 951           initWithTracker:this counts:current_ssl_error_]); | 951           initWithTracker:this counts:current_ssl_error_]); | 
| 952       web::WebThread::PostTask( | 952       web::WebThread::PostTask( | 
| 953           web::WebThread::UI, FROM_HERE, | 953           web::WebThread::UI, FROM_HERE, | 
| 954           base::Bind(&RequestTrackerImpl::NotifyPresentSSLError, this, carrier, | 954           base::Bind(&RequestTrackerImpl::NotifyPresentSSLError, this, carrier, | 
| 955                      judgment == CertPolicy::UNKNOWN)); | 955                      judgment == CertPolicy::UNKNOWN)); | 
| 956     } | 956     } | 
| 957   } | 957   } | 
| 958 } | 958 } | 
| 959 | 959 | 
| 960 void RequestTrackerImpl::CancelRequestForCounts(TrackerCounts* counts) { | 960 void RequestTrackerImpl::CancelRequestForCounts(TrackerCounts* counts) { | 
| 961   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 961   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 
| 962   // Cancel the request. | 962   // Cancel the request. | 
| 963   counts->done = true; | 963   counts->done = true; | 
| 964   counts_by_request_.erase(counts->request); | 964   counts_by_request_.erase(counts->request); | 
| 965   counts->ssl_callback.Run(NO); | 965   counts->ssl_callback.Run(NO); | 
| 966   counts->ssl_callback = base::Bind(&DoNothing); | 966   counts->ssl_callback = base::Bind(&DoNothing); | 
| 967   Notify(); | 967   Notify(); | 
| 968 } | 968 } | 
| 969 | 969 | 
| 970 PageCounts RequestTrackerImpl::pageCounts() { | 970 PageCounts RequestTrackerImpl::pageCounts() { | 
| 971   DCHECK_GE(counts_.size(), estimate_start_index_); | 971   DCHECK_GE(counts_.size(), estimate_start_index_); | 
| 972 | 972 | 
| 973   PageCounts page_counts; | 973   PageCounts page_counts; | 
| 974 | 974 | 
| 975   ScopedVector<TrackerCounts>::iterator it; | 975   for (const auto& tracker_count : counts_) { | 
| 976   for (it = counts_.begin() + estimate_start_index_; | 976     if (tracker_count->done) { | 
| 977        it != counts_.end(); ++it) { | 977       uint64_t size = tracker_count->processed; | 
| 978     if ((*it)->done) { |  | 
| 979       uint64_t size = (*it)->processed; |  | 
| 980       page_counts.finished += 1; | 978       page_counts.finished += 1; | 
| 981       page_counts.finished_bytes += size; | 979       page_counts.finished_bytes += size; | 
| 982       if (page_counts.largest_byte_size_known < size) { | 980       if (page_counts.largest_byte_size_known < size) { | 
| 983         page_counts.largest_byte_size_known = size; | 981         page_counts.largest_byte_size_known = size; | 
| 984       } | 982       } | 
| 985     } else { | 983     } else { | 
| 986       page_counts.unfinished += 1; | 984       page_counts.unfinished += 1; | 
| 987       if ((*it)->expected_length) { | 985       if (tracker_count->expected_length) { | 
| 988         uint64_t size = (*it)->expected_length; | 986         uint64_t size = tracker_count->expected_length; | 
| 989         page_counts.unfinished_estimate_bytes_done += (*it)->processed; | 987         page_counts.unfinished_estimate_bytes_done += tracker_count->processed; | 
| 990         page_counts.unfinished_estimated_bytes_left += size; | 988         page_counts.unfinished_estimated_bytes_left += size; | 
| 991         if (page_counts.largest_byte_size_known < size) { | 989         if (page_counts.largest_byte_size_known < size) { | 
| 992           page_counts.largest_byte_size_known = size; | 990           page_counts.largest_byte_size_known = size; | 
| 993         } | 991         } | 
| 994       } else { | 992       } else { | 
| 995         page_counts.unfinished_no_estimate += 1; | 993         page_counts.unfinished_no_estimate += 1; | 
| 996         page_counts.unfinished_no_estimate_bytes_done += (*it)->processed; | 994         page_counts.unfinished_no_estimate_bytes_done += | 
|  | 995             tracker_count->processed; | 
| 997       } | 996       } | 
| 998     } | 997     } | 
| 999   } | 998   } | 
| 1000 | 999 | 
| 1001   return page_counts; | 1000   return page_counts; | 
| 1002 } | 1001 } | 
| 1003 | 1002 | 
| 1004 float RequestTrackerImpl::EstimatedProgress() { | 1003 float RequestTrackerImpl::EstimatedProgress() { | 
| 1005   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 1004   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 
| 1006 | 1005 | 
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1074   return previous_estimate_; | 1073   return previous_estimate_; | 
| 1075 } | 1074 } | 
| 1076 | 1075 | 
| 1077 void RequestTrackerImpl::RecomputeMixedContent( | 1076 void RequestTrackerImpl::RecomputeMixedContent( | 
| 1078     const TrackerCounts* split_position) { | 1077     const TrackerCounts* split_position) { | 
| 1079   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 1078   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 
| 1080   // Check if the mixed content before trimming was correct. | 1079   // Check if the mixed content before trimming was correct. | 
| 1081   if (page_url_.SchemeIsCryptographic() && has_mixed_content_) { | 1080   if (page_url_.SchemeIsCryptographic() && has_mixed_content_) { | 
| 1082     bool old_url_has_mixed_content = false; | 1081     bool old_url_has_mixed_content = false; | 
| 1083     const GURL origin = page_url_.GetOrigin(); | 1082     const GURL origin = page_url_.GetOrigin(); | 
| 1084     ScopedVector<TrackerCounts>::iterator it = counts_.begin(); | 1083     auto it = counts_.begin(); | 
| 1085     while (it != counts_.end() && *it != split_position) { | 1084     while (it != counts_.end() && it->get() != split_position) { | 
| 1086       if (!(*it)->url.SchemeIsCryptographic() && | 1085       if (!(*it)->url.SchemeIsCryptographic() && | 
| 1087           origin == (*it)->first_party_for_cookies_origin) { | 1086           origin == (*it)->first_party_for_cookies_origin) { | 
| 1088         old_url_has_mixed_content = true; | 1087         old_url_has_mixed_content = true; | 
| 1089         break; | 1088         break; | 
| 1090       } | 1089       } | 
| 1091       ++it; | 1090       ++it; | 
| 1092     } | 1091     } | 
| 1093     if (!old_url_has_mixed_content) { | 1092     if (!old_url_has_mixed_content) { | 
| 1094       // We marked the previous page with incorrect data about its mixed | 1093       // We marked the previous page with incorrect data about its mixed | 
| 1095       // content. Turns out that the elements that triggered that condition | 1094       // content. Turns out that the elements that triggered that condition | 
| 1096       // where in fact in a subsequent page. Duh. | 1095       // where in fact in a subsequent page. Duh. | 
| 1097       // Resend a notification for the |page_url_| informing the upper layer | 1096       // Resend a notification for the |page_url_| informing the upper layer | 
| 1098       // that the mixed content was a red herring. | 1097       // that the mixed content was a red herring. | 
| 1099       has_mixed_content_ = false; | 1098       has_mixed_content_ = false; | 
| 1100       SSLNotify(); | 1099       SSLNotify(); | 
| 1101     } | 1100     } | 
| 1102   } | 1101   } | 
| 1103 } | 1102 } | 
| 1104 | 1103 | 
| 1105 void RequestTrackerImpl::RecomputeCertificatePolicy( | 1104 void RequestTrackerImpl::RecomputeCertificatePolicy( | 
| 1106     const TrackerCounts* splitPosition) { | 1105     const TrackerCounts* splitPosition) { | 
| 1107   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 1106   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 
| 1108   // Clear the judgments for the old URL. | 1107   // Clear the judgments for the old URL. | 
| 1109   web::WebThread::PostTask( | 1108   web::WebThread::PostTask( | 
| 1110       web::WebThread::UI, FROM_HERE, | 1109       web::WebThread::UI, FROM_HERE, | 
| 1111       base::Bind(&RequestTrackerImpl::NotifyClearCertificates, this)); | 1110       base::Bind(&RequestTrackerImpl::NotifyClearCertificates, this)); | 
| 1112   // Report judgements for the new URL. | 1111   // Report judgements for the new URL. | 
| 1113   ScopedVector<TrackerCounts>::const_reverse_iterator it; | 1112   for (auto it = counts_.rbegin(); it != counts_.rend(); ++it) { | 
| 1114   for (it = counts_.rbegin(); it != counts_.rend(); ++it) { | 1113     TrackerCounts* counts = it->get(); | 
| 1115     TrackerCounts* counts = *it; |  | 
| 1116     if (counts->allowed_by_user) { | 1114     if (counts->allowed_by_user) { | 
| 1117       std::string host = counts->url.host(); | 1115       std::string host = counts->url.host(); | 
| 1118       web::WebThread::PostTask( | 1116       web::WebThread::PostTask( | 
| 1119           web::WebThread::UI, FROM_HERE, | 1117           web::WebThread::UI, FROM_HERE, | 
| 1120           base::Bind(&RequestTrackerImpl::NotifyCertificateUsed, this, | 1118           base::Bind(&RequestTrackerImpl::NotifyCertificateUsed, this, | 
| 1121                      base::RetainedRef(counts->ssl_info.cert), host, | 1119                      base::RetainedRef(counts->ssl_info.cert), host, | 
| 1122                      counts->ssl_info.cert_status)); | 1120                      counts->ssl_info.cert_status)); | 
| 1123     } | 1121     } | 
| 1124     if (counts == splitPosition) | 1122     if (counts == splitPosition) | 
| 1125       break; | 1123       break; | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 1137 } | 1135 } | 
| 1138 | 1136 | 
| 1139 void RequestTrackerImpl::TrimToURL(const GURL& full_url, id user_info) { | 1137 void RequestTrackerImpl::TrimToURL(const GURL& full_url, id user_info) { | 
| 1140   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 1138   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 
| 1141 | 1139 | 
| 1142   GURL url = GURLByRemovingRefFromGURL(full_url); | 1140   GURL url = GURLByRemovingRefFromGURL(full_url); | 
| 1143 | 1141 | 
| 1144   // Locate the request with this url, if present. | 1142   // Locate the request with this url, if present. | 
| 1145   bool new_url_has_mixed_content = false; | 1143   bool new_url_has_mixed_content = false; | 
| 1146   bool url_scheme_is_secure = url.SchemeIsCryptographic(); | 1144   bool url_scheme_is_secure = url.SchemeIsCryptographic(); | 
| 1147   ScopedVector<TrackerCounts>::const_reverse_iterator rit = counts_.rbegin(); | 1145   auto rit = counts_.rbegin(); | 
| 1148   while (rit != counts_.rend() && (*rit)->url != url) { | 1146   while (rit != counts_.rend() && (*rit)->url != url) { | 
| 1149     if (url_scheme_is_secure && !(*rit)->url.SchemeIsCryptographic() && | 1147     if (url_scheme_is_secure && !(*rit)->url.SchemeIsCryptographic() && | 
| 1150         (*rit)->first_party_for_cookies_origin == url.GetOrigin()) { | 1148         (*rit)->first_party_for_cookies_origin == url.GetOrigin()) { | 
| 1151       new_url_has_mixed_content = true; | 1149       new_url_has_mixed_content = true; | 
| 1152     } | 1150     } | 
| 1153     ++rit; | 1151     ++rit; | 
| 1154   } | 1152   } | 
| 1155 | 1153 | 
| 1156   // |split_position| will be set to the count for the passed url if it exists. | 1154   // |split_position| will be set to the count for the passed url if it exists. | 
| 1157   TrackerCounts* split_position = NULL; | 1155   TrackerCounts* split_position = NULL; | 
| 1158   if (rit != counts_.rend()) { | 1156   if (rit != counts_.rend()) { | 
| 1159     split_position = (*rit); | 1157     split_position = rit->get(); | 
| 1160   } else { | 1158   } else { | 
| 1161     // The URL was not found, everything will be trimmed. The mixed content | 1159     // The URL was not found, everything will be trimmed. The mixed content | 
| 1162     // calculation is invalid. | 1160     // calculation is invalid. | 
| 1163     new_url_has_mixed_content = false; | 1161     new_url_has_mixed_content = false; | 
| 1164 | 1162 | 
| 1165     // In the case of a page loaded via a HTML5 manifest there is no page | 1163     // In the case of a page loaded via a HTML5 manifest there is no page | 
| 1166     // boundary to be found. However the latest count is a request for a | 1164     // boundary to be found. However the latest count is a request for a | 
| 1167     // manifest. This tries to detect this peculiar case. | 1165     // manifest. This tries to detect this peculiar case. | 
| 1168     // This is important as if this request for the manifest is on the same | 1166     // This is important as if this request for the manifest is on the same | 
| 1169     // domain as the page itself this will allow retrieval of the SSL | 1167     // domain as the page itself this will allow retrieval of the SSL | 
| 1170     // information. | 1168     // information. | 
| 1171     if (url_scheme_is_secure && counts_.size()) { | 1169     if (url_scheme_is_secure && counts_.size()) { | 
| 1172       TrackerCounts* back = counts_.back(); | 1170       TrackerCounts* back = counts_.back().get(); | 
| 1173       const GURL& back_url = back->url; | 1171       const GURL& back_url = back->url; | 
| 1174       if (back_url.SchemeIsCryptographic() && | 1172       if (back_url.SchemeIsCryptographic() && | 
| 1175           back_url.GetOrigin() == url.GetOrigin() && !back->is_subrequest) { | 1173           back_url.GetOrigin() == url.GetOrigin() && !back->is_subrequest) { | 
| 1176         split_position = back; | 1174         split_position = back; | 
| 1177       } | 1175       } | 
| 1178     } | 1176     } | 
| 1179   } | 1177   } | 
| 1180   RecomputeMixedContent(split_position); | 1178   RecomputeMixedContent(split_position); | 
| 1181   RecomputeCertificatePolicy(split_position); | 1179   RecomputeCertificatePolicy(split_position); | 
| 1182 | 1180 | 
| 1183   // Trim up to that element. | 1181   // Trim up to that element. | 
| 1184   ScopedVector<TrackerCounts>::iterator it = counts_.begin(); | 1182   auto it = counts_.begin(); | 
| 1185   while (it != counts_.end() && *it != split_position) { | 1183   while (it != counts_.end() && it->get() != split_position) { | 
| 1186     if (!(*it)->done) { | 1184     if (!(*it)->done) { | 
| 1187       // This is for an unfinished request on a previous page. We do not care | 1185       // This is for an unfinished request on a previous page. We do not care | 
| 1188       // about those anymore. Cancel the request. | 1186       // about those anymore. Cancel the request. | 
| 1189       if ((*it)->ssl_judgment == CertPolicy::UNKNOWN) | 1187       if ((*it)->ssl_judgment == CertPolicy::UNKNOWN) | 
| 1190         CancelRequestForCounts(*it); | 1188         CancelRequestForCounts(it->get()); | 
| 1191       counts_by_request_.erase((*it)->request); | 1189       counts_by_request_.erase((*it)->request); | 
| 1192     } | 1190     } | 
| 1193     it = counts_.erase(it); | 1191     it = counts_.erase(it); | 
| 1194   } | 1192   } | 
| 1195 | 1193 | 
| 1196   has_mixed_content_ = new_url_has_mixed_content; | 1194   has_mixed_content_ = new_url_has_mixed_content; | 
| 1197   page_url_ = url; | 1195   page_url_ = url; | 
| 1198   user_info_.reset(user_info); | 1196   user_info_.reset(user_info); | 
| 1199   estimate_start_index_ = 0; | 1197   estimate_start_index_ = 0; | 
| 1200   is_loading_ = true; | 1198   is_loading_ = true; | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 1226     return; | 1224     return; | 
| 1227   web::WebThread::PostTask(thread, FROM_HERE, task); | 1225   web::WebThread::PostTask(thread, FROM_HERE, task); | 
| 1228 } | 1226 } | 
| 1229 | 1227 | 
| 1230 #pragma mark Other internal methods. | 1228 #pragma mark Other internal methods. | 
| 1231 | 1229 | 
| 1232 NSString* RequestTrackerImpl::UnsafeDescription() { | 1230 NSString* RequestTrackerImpl::UnsafeDescription() { | 
| 1233   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 1231   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 
| 1234 | 1232 | 
| 1235   NSMutableArray* urls = [NSMutableArray array]; | 1233   NSMutableArray* urls = [NSMutableArray array]; | 
| 1236   ScopedVector<TrackerCounts>::iterator it; | 1234   for (const auto& tracker_count : counts_) | 
| 1237   for (it = counts_.begin(); it != counts_.end(); ++it) | 1235     [urls addObject:tracker_count->Description()]; | 
| 1238     [urls addObject:(*it)->Description()]; |  | 
| 1239 | 1236 | 
| 1240   return [NSString stringWithFormat:@"RequestGroupID %@\n%@\n%@", | 1237   return [NSString stringWithFormat:@"RequestGroupID %@\n%@\n%@", | 
| 1241                                     request_group_id_.get(), | 1238                                     request_group_id_.get(), | 
| 1242                                     net::NSURLWithGURL(page_url_), | 1239                                     net::NSURLWithGURL(page_url_), | 
| 1243                                     [urls componentsJoinedByString:@"\n"]]; | 1240                                     [urls componentsJoinedByString:@"\n"]]; | 
| 1244 } | 1241 } | 
| 1245 | 1242 | 
| 1246 void RequestTrackerImpl::CancelRequests() { | 1243 void RequestTrackerImpl::CancelRequests() { | 
| 1247   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 1244   DCHECK_CURRENTLY_ON(web::WebThread::IO); | 
| 1248   std::set<net::URLRequest*>::iterator it; | 1245   std::set<net::URLRequest*>::iterator it; | 
| 1249   // TODO(droger): When canceling the request, we should in theory make sure | 1246   // TODO(droger): When canceling the request, we should in theory make sure | 
| 1250   // that the NSURLProtocol client method |didFailWithError| is called, | 1247   // that the NSURLProtocol client method |didFailWithError| is called, | 
| 1251   // otherwise the iOS system may wait indefinitely for the request to complete. | 1248   // otherwise the iOS system may wait indefinitely for the request to complete. | 
| 1252   // However, as we currently only cancel the requests when closing a tab, the | 1249   // However, as we currently only cancel the requests when closing a tab, the | 
| 1253   // requests are all canceled by the system shortly after and nothing bad | 1250   // requests are all canceled by the system shortly after and nothing bad | 
| 1254   // happens. | 1251   // happens. | 
| 1255   for (it = live_requests_.begin(); it != live_requests_.end(); ++it) | 1252   for (it = live_requests_.begin(); it != live_requests_.end(); ++it) | 
| 1256     (*it)->Cancel(); | 1253     (*it)->Cancel(); | 
| 1257 | 1254 | 
| 1258   live_requests_.clear(); | 1255   live_requests_.clear(); | 
| 1259 } | 1256 } | 
| 1260 | 1257 | 
| 1261 void RequestTrackerImpl::SetCertificatePolicyCacheForTest( | 1258 void RequestTrackerImpl::SetCertificatePolicyCacheForTest( | 
| 1262     web::CertificatePolicyCache* cache) { | 1259     web::CertificatePolicyCache* cache) { | 
| 1263   policy_cache_ = cache; | 1260   policy_cache_ = cache; | 
| 1264 } | 1261 } | 
| 1265 | 1262 | 
| 1266 }  // namespace web | 1263 }  // namespace web | 
| OLD | NEW | 
|---|