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 #include "chrome/browser/supervised_user/supervised_user_navigation_observer.h" | 5 #include "chrome/browser/supervised_user/supervised_user_navigation_observer.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
10 #include "chrome/browser/history/history_service_factory.h" | 10 #include "chrome/browser/history/history_service_factory.h" |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 } | 42 } |
43 | 43 |
44 // static | 44 // static |
45 void SupervisedUserNavigationObserver::OnRequestBlocked( | 45 void SupervisedUserNavigationObserver::OnRequestBlocked( |
46 content::WebContents* web_contents, | 46 content::WebContents* web_contents, |
47 const GURL& url, | 47 const GURL& url, |
48 supervised_user_error_page::FilteringBehaviorReason reason, | 48 supervised_user_error_page::FilteringBehaviorReason reason, |
49 const base::Callback<void(bool)>& callback) { | 49 const base::Callback<void(bool)>& callback) { |
50 SupervisedUserNavigationObserver* navigation_observer = | 50 SupervisedUserNavigationObserver* navigation_observer = |
51 SupervisedUserNavigationObserver::FromWebContents(web_contents); | 51 SupervisedUserNavigationObserver::FromWebContents(web_contents); |
52 if (navigation_observer) | |
53 navigation_observer->OnRequestBlockedInternal(url); | |
54 | 52 |
55 // Show the interstitial. | 53 // Cancel the navigation if there is no navigation observer. |
56 const bool initial_page_load = true; | 54 if (!navigation_observer) { |
57 SupervisedUserInterstitial::Show(web_contents, url, reason, initial_page_load, | 55 callback.Run(false); |
58 callback); | 56 return; |
| 57 } |
| 58 |
| 59 navigation_observer->OnRequestBlockedInternal(url, reason, callback); |
59 } | 60 } |
60 | 61 |
61 void SupervisedUserNavigationObserver::DidFinishNavigation( | 62 void SupervisedUserNavigationObserver::DidFinishNavigation( |
62 content::NavigationHandle* navigation_handle) { | 63 content::NavigationHandle* navigation_handle) { |
63 // Only filter same page navigations (eg. pushState/popState); others will | 64 // Only filter same page navigations (eg. pushState/popState); others will |
64 // have been filtered by the ResourceThrottle. | 65 // have been filtered by the NavigationThrottle. |
65 if (!navigation_handle->IsSameDocument()) | 66 if (!navigation_handle->IsSameDocument()) |
66 return; | 67 return; |
67 | 68 |
68 if (!navigation_handle->IsInMainFrame()) | 69 if (!navigation_handle->IsInMainFrame()) |
69 return; | 70 return; |
70 | 71 |
71 url_filter_->GetFilteringBehaviorForURLWithAsyncChecks( | 72 url_filter_->GetFilteringBehaviorForURLWithAsyncChecks( |
72 web_contents()->GetLastCommittedURL(), | 73 web_contents()->GetLastCommittedURL(), |
73 base::Bind(&SupervisedUserNavigationObserver::URLFilterCheckCallback, | 74 base::Bind(&SupervisedUserNavigationObserver::URLFilterCheckCallback, |
74 weak_ptr_factory_.GetWeakPtr(), | 75 weak_ptr_factory_.GetWeakPtr(), |
75 navigation_handle->GetURL())); | 76 navigation_handle->GetURL())); |
76 } | 77 } |
77 | 78 |
78 void SupervisedUserNavigationObserver::OnURLFilterChanged() { | 79 void SupervisedUserNavigationObserver::OnURLFilterChanged() { |
79 url_filter_->GetFilteringBehaviorForURLWithAsyncChecks( | 80 url_filter_->GetFilteringBehaviorForURLWithAsyncChecks( |
80 web_contents()->GetLastCommittedURL(), | 81 web_contents()->GetLastCommittedURL(), |
81 base::Bind(&SupervisedUserNavigationObserver::URLFilterCheckCallback, | 82 base::Bind(&SupervisedUserNavigationObserver::URLFilterCheckCallback, |
82 weak_ptr_factory_.GetWeakPtr(), | 83 weak_ptr_factory_.GetWeakPtr(), |
83 web_contents()->GetLastCommittedURL())); | 84 web_contents()->GetLastCommittedURL())); |
84 } | 85 } |
85 | 86 |
86 void SupervisedUserNavigationObserver::OnRequestBlockedInternal( | 87 void SupervisedUserNavigationObserver::OnRequestBlockedInternal( |
87 const GURL& url) { | 88 const GURL& url, |
| 89 supervised_user_error_page::FilteringBehaviorReason reason, |
| 90 const base::Callback<void(bool)>& callback) { |
88 Time timestamp = Time::Now(); // TODO(bauerb): Use SaneTime when available. | 91 Time timestamp = Time::Now(); // TODO(bauerb): Use SaneTime when available. |
89 // Create a history entry for the attempt and mark it as such. | 92 // Create a history entry for the attempt and mark it as such. |
90 history::HistoryAddPageArgs add_page_args( | 93 history::HistoryAddPageArgs add_page_args( |
91 url, timestamp, history::ContextIDForWebContents(web_contents()), 0, url, | 94 url, timestamp, history::ContextIDForWebContents(web_contents()), 0, url, |
92 history::RedirectList(), ui::PAGE_TRANSITION_BLOCKED, | 95 history::RedirectList(), ui::PAGE_TRANSITION_BLOCKED, |
93 history::SOURCE_BROWSED, false, true); | 96 history::SOURCE_BROWSED, false, true); |
94 | 97 |
95 // Add the entry to the history database. | 98 // Add the entry to the history database. |
96 Profile* profile = | 99 Profile* profile = |
97 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); | 100 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); |
98 history::HistoryService* history_service = | 101 history::HistoryService* history_service = |
99 HistoryServiceFactory::GetForProfile(profile, | 102 HistoryServiceFactory::GetForProfile(profile, |
100 ServiceAccessType::IMPLICIT_ACCESS); | 103 ServiceAccessType::IMPLICIT_ACCESS); |
101 | 104 |
102 // |history_service| is null if saving history is disabled. | 105 // |history_service| is null if saving history is disabled. |
103 if (history_service) | 106 if (history_service) |
104 history_service->AddPage(add_page_args); | 107 history_service->AddPage(add_page_args); |
105 | 108 |
106 std::unique_ptr<NavigationEntry> entry = NavigationEntry::Create(); | 109 std::unique_ptr<NavigationEntry> entry = NavigationEntry::Create(); |
107 entry->SetVirtualURL(url); | 110 entry->SetVirtualURL(url); |
108 entry->SetTimestamp(timestamp); | 111 entry->SetTimestamp(timestamp); |
109 auto serialized_entry = base::MakeUnique<sessions::SerializedNavigationEntry>( | 112 auto serialized_entry = base::MakeUnique<sessions::SerializedNavigationEntry>( |
110 sessions::ContentSerializedNavigationBuilder::FromNavigationEntry( | 113 sessions::ContentSerializedNavigationBuilder::FromNavigationEntry( |
111 blocked_navigations_.size(), *entry)); | 114 blocked_navigations_.size(), *entry)); |
112 blocked_navigations_.push_back(std::move(serialized_entry)); | 115 blocked_navigations_.push_back(std::move(serialized_entry)); |
113 supervised_user_service_->DidBlockNavigation(web_contents()); | 116 supervised_user_service_->DidBlockNavigation(web_contents()); |
| 117 |
| 118 // Show the interstitial. |
| 119 const bool initial_page_load = true; |
| 120 MaybeShowInterstitial(url, reason, initial_page_load, callback); |
114 } | 121 } |
115 | 122 |
116 void SupervisedUserNavigationObserver::URLFilterCheckCallback( | 123 void SupervisedUserNavigationObserver::URLFilterCheckCallback( |
117 const GURL& url, | 124 const GURL& url, |
118 SupervisedUserURLFilter::FilteringBehavior behavior, | 125 SupervisedUserURLFilter::FilteringBehavior behavior, |
119 supervised_user_error_page::FilteringBehaviorReason reason, | 126 supervised_user_error_page::FilteringBehaviorReason reason, |
120 bool uncertain) { | 127 bool uncertain) { |
121 // If the page has been changed in the meantime, we can exit. | 128 // If the page has been changed in the meantime, we can exit. |
122 if (url != web_contents()->GetLastCommittedURL()) | 129 if (url != web_contents()->GetLastCommittedURL()) |
123 return; | 130 return; |
124 | 131 |
125 const bool initial_page_load = false; | |
126 if (behavior == SupervisedUserURLFilter::FilteringBehavior::BLOCK) { | 132 if (behavior == SupervisedUserURLFilter::FilteringBehavior::BLOCK) { |
127 SupervisedUserInterstitial::Show(web_contents(), url, reason, | 133 const bool initial_page_load = false; |
128 initial_page_load, | 134 MaybeShowInterstitial(url, reason, initial_page_load, |
129 base::Callback<void(bool)>()); | 135 base::Callback<void(bool)>()); |
130 } | 136 } |
131 } | 137 } |
| 138 |
| 139 void SupervisedUserNavigationObserver::MaybeShowInterstitial( |
| 140 const GURL& url, |
| 141 supervised_user_error_page::FilteringBehaviorReason reason, |
| 142 bool initial_page_load, |
| 143 const base::Callback<void(bool)>& callback) { |
| 144 if (is_showing_interstitial_) |
| 145 return; |
| 146 |
| 147 is_showing_interstitial_ = true; |
| 148 base::Callback<void(bool)> wrapped_callback = |
| 149 base::Bind(&SupervisedUserNavigationObserver::OnInterstitialResult, |
| 150 weak_ptr_factory_.GetWeakPtr(), callback); |
| 151 SupervisedUserInterstitial::Show(web_contents(), url, reason, |
| 152 initial_page_load, wrapped_callback); |
| 153 } |
| 154 |
| 155 void SupervisedUserNavigationObserver::OnInterstitialResult( |
| 156 const base::Callback<void(bool)>& callback, |
| 157 bool result) { |
| 158 is_showing_interstitial_ = false; |
| 159 if (callback) |
| 160 callback.Run(result); |
| 161 } |
OLD | NEW |