| Index: components/subresource_filter/content/renderer/subresource_filter_agent.cc | 
| diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent.cc b/components/subresource_filter/content/renderer/subresource_filter_agent.cc | 
| index 6b08edca9c6d3d7c397d9026151e30498d774702..fae3ab8ce152e9d836e0a92c6fb05e7c38c827fa 100644 | 
| --- a/components/subresource_filter/content/renderer/subresource_filter_agent.cc | 
| +++ b/components/subresource_filter/content/renderer/subresource_filter_agent.cc | 
| @@ -28,8 +28,7 @@ SubresourceFilterAgent::SubresourceFilterAgent( | 
| content::RenderFrame* render_frame, | 
| UnverifiedRulesetDealer* ruleset_dealer) | 
| : content::RenderFrameObserver(render_frame), | 
| -      ruleset_dealer_(ruleset_dealer), | 
| -      activation_level_for_provisional_load_(ActivationLevel::DISABLED) { | 
| +      ruleset_dealer_(ruleset_dealer) { | 
| DCHECK(ruleset_dealer); | 
| } | 
|  | 
| @@ -67,24 +66,21 @@ void SubresourceFilterAgent::SendDocumentLoadStatistics( | 
| render_frame()->GetRoutingID(), statistics)); | 
| } | 
|  | 
| -void SubresourceFilterAgent::OnActivateForProvisionalLoad( | 
| +void SubresourceFilterAgent::OnActivateForNextCommittedLoad( | 
| ActivationLevel activation_level, | 
| -    const GURL& url, | 
| bool measure_performance) { | 
| -  activation_level_for_provisional_load_ = activation_level; | 
| -  url_for_provisional_load_ = url; | 
| -  measure_performance_ = measure_performance; | 
| +  activation_level_for_next_commit_ = activation_level; | 
| +  measure_performance_for_next_commit_ = measure_performance; | 
| } | 
|  | 
| void SubresourceFilterAgent::RecordHistogramsOnLoadCommitted() { | 
| // Note: ActivationLevel used to be called ActivationState, the legacy name is | 
| // kept for the histogram. | 
| -  UMA_HISTOGRAM_ENUMERATION( | 
| -      "SubresourceFilter.DocumentLoad.ActivationState", | 
| -      static_cast<int>(activation_level_for_provisional_load_), | 
| -      static_cast<int>(ActivationLevel::LAST) + 1); | 
| +  UMA_HISTOGRAM_ENUMERATION("SubresourceFilter.DocumentLoad.ActivationState", | 
| +                            static_cast<int>(activation_level_for_next_commit_), | 
| +                            static_cast<int>(ActivationLevel::LAST) + 1); | 
|  | 
| -  if (activation_level_for_provisional_load_ != ActivationLevel::DISABLED) { | 
| +  if (activation_level_for_next_commit_ != ActivationLevel::DISABLED) { | 
| UMA_HISTOGRAM_BOOLEAN("SubresourceFilter.DocumentLoad.RulesetIsAvailable", | 
| ruleset_dealer_->IsRulesetFileAvailable()); | 
| } | 
| @@ -109,7 +105,8 @@ void SubresourceFilterAgent::RecordHistogramsOnLoadFinished() { | 
|  | 
| // If ThreadTicks is not supported or performance measuring is switched off, | 
| // then no time measurements have been collected. | 
| -  if (measure_performance_ && ScopedThreadTimers::IsSupported()) { | 
| +  if (ScopedThreadTimers::IsSupported() && | 
| +      filter_for_last_committed_load_->is_performance_measuring_enabled()) { | 
| UMA_HISTOGRAM_CUSTOM_MICRO_TIMES( | 
| "SubresourceFilter.DocumentLoad.SubresourceEvaluation." | 
| "TotalWallDuration", | 
| @@ -129,27 +126,13 @@ void SubresourceFilterAgent::RecordHistogramsOnLoadFinished() { | 
| SendDocumentLoadStatistics(statistics); | 
| } | 
|  | 
| -void SubresourceFilterAgent::OnDestruct() { | 
| -  delete this; | 
| +void SubresourceFilterAgent::ResetActivatonStateForNextCommit() { | 
| +  activation_level_for_next_commit_ = ActivationLevel::DISABLED; | 
| +  measure_performance_for_next_commit_ = false; | 
| } | 
|  | 
| -void SubresourceFilterAgent::DidStartProvisionalLoad( | 
| -    blink::WebDataSource* data_source) { | 
| -  // With PlzNavigate, DidStartProvisionalLoad and DidCommitProvisionalLoad will | 
| -  // both be called in response to the one commit IPC from the browser. That | 
| -  // means that they will come after OnActivateForProvisionalLoad. So we have to | 
| -  // have extra logic to check that the response to OnActivateForProvisionalLoad | 
| -  // isn't removed in that case. | 
| -  if (!content::IsBrowserSideNavigationEnabled() || | 
| -      (!data_source || | 
| -       static_cast<GURL>(data_source->getRequest().url()) != | 
| -           url_for_provisional_load_)) { | 
| -    activation_level_for_provisional_load_ = ActivationLevel::DISABLED; | 
| -    measure_performance_ = false; | 
| -  } else { | 
| -    url_for_provisional_load_ = GURL(); | 
| -  } | 
| -  filter_for_last_committed_load_.reset(); | 
| +void SubresourceFilterAgent::OnDestruct() { | 
| +  delete this; | 
| } | 
|  | 
| void SubresourceFilterAgent::DidCommitProvisionalLoad( | 
| @@ -158,11 +141,13 @@ void SubresourceFilterAgent::DidCommitProvisionalLoad( | 
| if (is_same_page_navigation) | 
| return; | 
|  | 
| +  filter_for_last_committed_load_.reset(); | 
| + | 
| std::vector<GURL> ancestor_document_urls = GetAncestorDocumentURLs(); | 
| if (ancestor_document_urls.front().SchemeIsHTTPOrHTTPS() || | 
| ancestor_document_urls.front().SchemeIsFile()) { | 
| RecordHistogramsOnLoadCommitted(); | 
| -    if (activation_level_for_provisional_load_ != ActivationLevel::DISABLED && | 
| +    if (activation_level_for_next_commit_ != ActivationLevel::DISABLED && | 
| ruleset_dealer_->IsRulesetFileAvailable()) { | 
| base::OnceClosure first_disallowed_load_callback( | 
| base::BindOnce(&SubresourceFilterAgent:: | 
| @@ -171,9 +156,10 @@ void SubresourceFilterAgent::DidCommitProvisionalLoad( | 
|  | 
| auto ruleset = ruleset_dealer_->GetRuleset(); | 
| DCHECK(ruleset); | 
| -      ActivationState activation_state = ComputeActivationState( | 
| -          activation_level_for_provisional_load_, measure_performance_, | 
| -          ancestor_document_urls, ruleset.get()); | 
| +      ActivationState activation_state = | 
| +          ComputeActivationState(activation_level_for_next_commit_, | 
| +                                 measure_performance_for_next_commit_, | 
| +                                 ancestor_document_urls, ruleset.get()); | 
| DCHECK(!ancestor_document_urls.empty()); | 
| std::unique_ptr<DocumentSubresourceFilter> filter( | 
| new DocumentSubresourceFilter( | 
| @@ -184,7 +170,14 @@ void SubresourceFilterAgent::DidCommitProvisionalLoad( | 
| SetSubresourceFilterForCommittedLoad(std::move(filter)); | 
| } | 
| } | 
| -  activation_level_for_provisional_load_ = ActivationLevel::DISABLED; | 
| + | 
| +  ResetActivatonStateForNextCommit(); | 
| +} | 
| + | 
| +void SubresourceFilterAgent::DidFailProvisionalLoad( | 
| +    const blink::WebURLError& error) { | 
| +  // TODO(engedy): Add a test with `frame-ancestor` violation to exercise this. | 
| +  ResetActivatonStateForNextCommit(); | 
| } | 
|  | 
| void SubresourceFilterAgent::DidFinishLoad() { | 
| @@ -197,8 +190,8 @@ void SubresourceFilterAgent::DidFinishLoad() { | 
| bool SubresourceFilterAgent::OnMessageReceived(const IPC::Message& message) { | 
| bool handled = true; | 
| IPC_BEGIN_MESSAGE_MAP(SubresourceFilterAgent, message) | 
| -    IPC_MESSAGE_HANDLER(SubresourceFilterMsg_ActivateForProvisionalLoad, | 
| -                        OnActivateForProvisionalLoad) | 
| +    IPC_MESSAGE_HANDLER(SubresourceFilterMsg_ActivateForNextCommittedLoad, | 
| +                        OnActivateForNextCommittedLoad) | 
| IPC_MESSAGE_UNHANDLED(handled = false) | 
| IPC_END_MESSAGE_MAP() | 
| return handled; | 
|  |