OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 #include "components/subresource_filter/content/browser/activation_state_computi
ng_navigation_throttle.h" | 5 #include "components/subresource_filter/content/browser/activation_state_computi
ng_navigation_throttle.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
12 #include "components/subresource_filter/content/browser/async_document_subresour
ce_filter.h" | 12 #include "components/subresource_filter/content/browser/async_document_subresour
ce_filter.h" |
13 #include "content/public/browser/navigation_handle.h" | 13 #include "content/public/browser/navigation_handle.h" |
14 #include "content/public/browser/render_frame_host.h" | 14 #include "content/public/browser/render_frame_host.h" |
15 | 15 |
16 namespace subresource_filter { | 16 namespace subresource_filter { |
17 | 17 |
18 // static | 18 // static |
19 std::unique_ptr<ActivationStateComputingNavigationThrottle> | 19 std::unique_ptr<ActivationStateComputingNavigationThrottle> |
20 ActivationStateComputingNavigationThrottle::CreateForMainFrame( | 20 ActivationStateComputingNavigationThrottle::CreateForMainFrame( |
21 content::NavigationHandle* navigation_handle) { | 21 content::NavigationHandle* navigation_handle) { |
22 DCHECK(navigation_handle->IsInMainFrame()); | 22 DCHECK(navigation_handle->IsInMainFrame()); |
23 return base::WrapUnique(new ActivationStateComputingNavigationThrottle( | 23 return base::WrapUnique(new ActivationStateComputingNavigationThrottle( |
24 navigation_handle, base::Optional<ActivationState>(), nullptr)); | 24 navigation_handle, base::Optional<ActivationState>(), nullptr, |
| 25 base::OnceClosure())); |
25 } | 26 } |
26 | 27 |
27 // static | 28 // static |
28 std::unique_ptr<ActivationStateComputingNavigationThrottle> | 29 std::unique_ptr<ActivationStateComputingNavigationThrottle> |
29 ActivationStateComputingNavigationThrottle::CreateForSubframe( | 30 ActivationStateComputingNavigationThrottle::CreateForSubframe( |
30 content::NavigationHandle* navigation_handle, | 31 content::NavigationHandle* navigation_handle, |
31 VerifiedRuleset::Handle* ruleset_handle, | 32 VerifiedRuleset::Handle* ruleset_handle, |
32 const ActivationState& parent_activation_state) { | 33 const ActivationState& parent_activation_state, |
| 34 base::OnceClosure first_disallowed_load_callback) { |
33 DCHECK(!navigation_handle->IsInMainFrame()); | 35 DCHECK(!navigation_handle->IsInMainFrame()); |
34 DCHECK_NE(ActivationLevel::DISABLED, | 36 DCHECK_NE(ActivationLevel::DISABLED, |
35 parent_activation_state.activation_level); | 37 parent_activation_state.activation_level); |
36 DCHECK(ruleset_handle); | 38 DCHECK(ruleset_handle); |
37 return base::WrapUnique(new ActivationStateComputingNavigationThrottle( | 39 return base::WrapUnique(new ActivationStateComputingNavigationThrottle( |
38 navigation_handle, parent_activation_state, ruleset_handle)); | 40 navigation_handle, parent_activation_state, ruleset_handle, |
| 41 std::move(first_disallowed_load_callback))); |
39 } | 42 } |
40 | 43 |
41 ActivationStateComputingNavigationThrottle:: | 44 ActivationStateComputingNavigationThrottle:: |
42 ActivationStateComputingNavigationThrottle( | 45 ActivationStateComputingNavigationThrottle( |
43 content::NavigationHandle* navigation_handle, | 46 content::NavigationHandle* navigation_handle, |
44 const base::Optional<ActivationState> parent_activation_state, | 47 const base::Optional<ActivationState> parent_activation_state, |
45 VerifiedRuleset::Handle* ruleset_handle) | 48 VerifiedRuleset::Handle* ruleset_handle, |
| 49 base::OnceClosure first_disallowed_load_callback) |
46 : content::NavigationThrottle(navigation_handle), | 50 : content::NavigationThrottle(navigation_handle), |
47 parent_activation_state_(parent_activation_state), | 51 parent_activation_state_(parent_activation_state), |
48 ruleset_handle_(ruleset_handle), | 52 ruleset_handle_(ruleset_handle), |
| 53 first_disallowed_load_callback_( |
| 54 std::move(first_disallowed_load_callback)), |
49 weak_ptr_factory_(this) {} | 55 weak_ptr_factory_(this) {} |
50 | 56 |
51 ActivationStateComputingNavigationThrottle:: | 57 ActivationStateComputingNavigationThrottle:: |
52 ~ActivationStateComputingNavigationThrottle() {} | 58 ~ActivationStateComputingNavigationThrottle() {} |
53 | 59 |
54 void ActivationStateComputingNavigationThrottle:: | 60 void ActivationStateComputingNavigationThrottle:: |
55 NotifyPageActivationWithRuleset( | 61 NotifyPageActivationWithRuleset( |
56 VerifiedRuleset::Handle* ruleset_handle, | 62 VerifiedRuleset::Handle* ruleset_handle, |
57 const ActivationState& page_activation_state) { | 63 const ActivationState& page_activation_state, |
| 64 base::OnceClosure first_disallowed_load_callback) { |
58 DCHECK(navigation_handle()->IsInMainFrame()); | 65 DCHECK(navigation_handle()->IsInMainFrame()); |
59 DCHECK(!parent_activation_state_); | 66 DCHECK(!parent_activation_state_); |
60 DCHECK(!activation_state_); | 67 DCHECK(!activation_state_); |
61 DCHECK(!ruleset_handle_); | 68 DCHECK(!ruleset_handle_); |
62 // DISABLED implies null ruleset. | 69 // DISABLED implies null ruleset. |
63 DCHECK(page_activation_state.activation_level != ActivationLevel::DISABLED || | 70 DCHECK(page_activation_state.activation_level != ActivationLevel::DISABLED || |
64 !ruleset_handle); | 71 !ruleset_handle); |
65 parent_activation_state_.emplace(page_activation_state); | 72 parent_activation_state_.emplace(page_activation_state); |
66 ruleset_handle_ = ruleset_handle; | 73 ruleset_handle_ = ruleset_handle; |
| 74 first_disallowed_load_callback_ = std::move(first_disallowed_load_callback); |
67 } | 75 } |
68 | 76 |
69 content::NavigationThrottle::ThrottleCheckResult | 77 content::NavigationThrottle::ThrottleCheckResult |
70 ActivationStateComputingNavigationThrottle::WillProcessResponse() { | 78 ActivationStateComputingNavigationThrottle::WillProcessResponse() { |
71 // Main frame navigations with disabled page-level activation become | 79 // Main frame navigations with disabled page-level activation become |
72 // pass-through throttles. | 80 // pass-through throttles. |
73 if (!parent_activation_state_ || | 81 if (!parent_activation_state_ || |
74 parent_activation_state_->activation_level == ActivationLevel::DISABLED) { | 82 parent_activation_state_->activation_level == ActivationLevel::DISABLED) { |
75 DCHECK(navigation_handle()->IsInMainFrame()); | 83 DCHECK(navigation_handle()->IsInMainFrame()); |
76 DCHECK(!ruleset_handle_); | 84 DCHECK(!ruleset_handle_); |
77 activation_state_.emplace(ActivationLevel::DISABLED); | 85 activation_state_.emplace(ActivationLevel::DISABLED); |
78 return content::NavigationThrottle::ThrottleCheckResult::PROCEED; | 86 return content::NavigationThrottle::ThrottleCheckResult::PROCEED; |
79 } | 87 } |
80 | 88 |
81 DCHECK(ruleset_handle_); | 89 DCHECK(ruleset_handle_); |
82 AsyncDocumentSubresourceFilter::InitializationParams params; | 90 AsyncDocumentSubresourceFilter::InitializationParams params; |
83 params.document_url = navigation_handle()->GetURL(); | 91 params.document_url = navigation_handle()->GetURL(); |
84 params.parent_activation_state = parent_activation_state_.value(); | 92 params.parent_activation_state = parent_activation_state_.value(); |
85 if (!navigation_handle()->IsInMainFrame()) { | 93 if (!navigation_handle()->IsInMainFrame()) { |
86 params.parent_document_origin = navigation_handle() | 94 params.parent_document_origin = navigation_handle() |
87 ->GetRenderFrameHost() | 95 ->GetRenderFrameHost() |
88 ->GetParent() | 96 ->GetParent() |
89 ->GetLastCommittedOrigin(); | 97 ->GetLastCommittedOrigin(); |
90 } | 98 } |
91 // TODO(csharrison): Replace the empty OnceClosure with a UI-triggering | |
92 // callback. | |
93 async_filter_ = base::MakeUnique<AsyncDocumentSubresourceFilter>( | 99 async_filter_ = base::MakeUnique<AsyncDocumentSubresourceFilter>( |
94 ruleset_handle_, std::move(params), | 100 ruleset_handle_, std::move(params), |
95 base::Bind(&ActivationStateComputingNavigationThrottle:: | 101 base::Bind(&ActivationStateComputingNavigationThrottle:: |
96 SetActivationStateAndResume, | 102 SetActivationStateAndResume, |
97 weak_ptr_factory_.GetWeakPtr()), | 103 weak_ptr_factory_.GetWeakPtr()), |
98 base::OnceClosure()); | 104 std::move(first_disallowed_load_callback_)); |
99 return content::NavigationThrottle::ThrottleCheckResult::DEFER; | 105 return content::NavigationThrottle::ThrottleCheckResult::DEFER; |
100 } | 106 } |
101 | 107 |
102 void ActivationStateComputingNavigationThrottle::SetActivationStateAndResume( | 108 void ActivationStateComputingNavigationThrottle::SetActivationStateAndResume( |
103 ActivationState state) { | 109 ActivationState state) { |
104 // Cannot send activation level to the renderer until ReadyToCommitNavigation, | 110 // Cannot send activation level to the renderer until ReadyToCommitNavigation, |
105 // the driver will pull the state out of |this| when that callback occurs. | 111 // the driver will pull the state out of |this| when that callback occurs. |
106 DCHECK(!activation_state_); | 112 DCHECK(!activation_state_); |
107 activation_state_.emplace(state); | 113 activation_state_.emplace(state); |
108 navigation_handle()->Resume(); | 114 navigation_handle()->Resume(); |
109 } | 115 } |
110 | 116 |
111 std::unique_ptr<AsyncDocumentSubresourceFilter> | 117 std::unique_ptr<AsyncDocumentSubresourceFilter> |
112 ActivationStateComputingNavigationThrottle::ReleaseFilter() { | 118 ActivationStateComputingNavigationThrottle::ReleaseFilter() { |
113 return std::move(async_filter_); | 119 return std::move(async_filter_); |
114 } | 120 } |
115 | 121 |
116 const ActivationState& | 122 const ActivationState& |
117 ActivationStateComputingNavigationThrottle::GetActivationState() const { | 123 ActivationStateComputingNavigationThrottle::GetActivationState() const { |
118 return activation_state_.value(); | 124 return activation_state_.value(); |
119 } | 125 } |
120 | 126 |
121 } // namespace subresource_filter | 127 } // namespace subresource_filter |
OLD | NEW |