OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/renderer/safe_browsing/phishing_classifier.h" | 5 #include "chrome/renderer/safe_browsing/phishing_classifier.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 url_extractor_.reset(); | 70 url_extractor_.reset(); |
71 dom_extractor_.reset(); | 71 dom_extractor_.reset(); |
72 term_extractor_.reset(); | 72 term_extractor_.reset(); |
73 } | 73 } |
74 } | 74 } |
75 | 75 |
76 bool PhishingClassifier::is_ready() const { | 76 bool PhishingClassifier::is_ready() const { |
77 return scorer_ != NULL; | 77 return scorer_ != NULL; |
78 } | 78 } |
79 | 79 |
80 void PhishingClassifier::BeginClassification(const string16* page_text, | 80 void PhishingClassifier::BeginClassification( |
81 DoneCallback* done_callback) { | 81 const string16* page_text, |
| 82 const DoneCallback& done_callback) { |
82 DCHECK(is_ready()); | 83 DCHECK(is_ready()); |
83 | 84 |
84 // The RenderView should have called CancelPendingClassification() before | 85 // The RenderView should have called CancelPendingClassification() before |
85 // starting a new classification, so DCHECK this. | 86 // starting a new classification, so DCHECK this. |
86 CheckNoPendingClassification(); | 87 CheckNoPendingClassification(); |
87 // However, in an opt build, we will go ahead and clean up the pending | 88 // However, in an opt build, we will go ahead and clean up the pending |
88 // classification so that we can start in a known state. | 89 // classification so that we can start in a known state. |
89 CancelPendingClassification(); | 90 CancelPendingClassification(); |
90 | 91 |
91 page_text_ = page_text; | 92 page_text_ = page_text; |
92 done_callback_.reset(done_callback); | 93 done_callback_ = done_callback; |
93 | 94 |
94 // For consistency, we always want to invoke the DoneCallback | 95 // For consistency, we always want to invoke the DoneCallback |
95 // asynchronously, rather than directly from this method. To ensure that | 96 // asynchronously, rather than directly from this method. To ensure that |
96 // this is the case, post a task to begin feature extraction on the next | 97 // this is the case, post a task to begin feature extraction on the next |
97 // iteration of the message loop. | 98 // iteration of the message loop. |
98 MessageLoop::current()->PostTask( | 99 MessageLoop::current()->PostTask( |
99 FROM_HERE, | 100 FROM_HERE, |
100 base::Bind(&PhishingClassifier::BeginFeatureExtraction, | 101 base::Bind(&PhishingClassifier::BeginFeatureExtraction, |
101 weak_factory_.GetWeakPtr())); | 102 weak_factory_.GetWeakPtr())); |
102 } | 103 } |
(...skipping 28 matching lines...) Expand all Loading... |
131 features_.reset(new FeatureMap); | 132 features_.reset(new FeatureMap); |
132 if (!url_extractor_->ExtractFeatures(url, features_.get())) { | 133 if (!url_extractor_->ExtractFeatures(url, features_.get())) { |
133 RunFailureCallback(); | 134 RunFailureCallback(); |
134 return; | 135 return; |
135 } | 136 } |
136 | 137 |
137 // DOM feature extraction can take awhile, so it runs asynchronously | 138 // DOM feature extraction can take awhile, so it runs asynchronously |
138 // in several chunks of work and invokes the callback when finished. | 139 // in several chunks of work and invokes the callback when finished. |
139 dom_extractor_->ExtractFeatures( | 140 dom_extractor_->ExtractFeatures( |
140 features_.get(), | 141 features_.get(), |
141 NewCallback(this, &PhishingClassifier::DOMExtractionFinished)); | 142 base::Bind(&PhishingClassifier::DOMExtractionFinished, |
| 143 base::Unretained(this))); |
142 } | 144 } |
143 | 145 |
144 void PhishingClassifier::CancelPendingClassification() { | 146 void PhishingClassifier::CancelPendingClassification() { |
145 // Note that cancelling the feature extractors is simply a no-op if they | 147 // Note that cancelling the feature extractors is simply a no-op if they |
146 // were not running. | 148 // were not running. |
147 DCHECK(is_ready()); | 149 DCHECK(is_ready()); |
148 dom_extractor_->CancelPendingExtraction(); | 150 dom_extractor_->CancelPendingExtraction(); |
149 term_extractor_->CancelPendingExtraction(); | 151 term_extractor_->CancelPendingExtraction(); |
150 weak_factory_.InvalidateWeakPtrs(); | 152 weak_factory_.InvalidateWeakPtrs(); |
151 Clear(); | 153 Clear(); |
152 } | 154 } |
153 | 155 |
154 void PhishingClassifier::DOMExtractionFinished(bool success) { | 156 void PhishingClassifier::DOMExtractionFinished(bool success) { |
155 if (success) { | 157 if (success) { |
156 // Term feature extraction can take awhile, so it runs asynchronously | 158 // Term feature extraction can take awhile, so it runs asynchronously |
157 // in several chunks of work and invokes the callback when finished. | 159 // in several chunks of work and invokes the callback when finished. |
158 term_extractor_->ExtractFeatures( | 160 term_extractor_->ExtractFeatures( |
159 page_text_, | 161 page_text_, |
160 features_.get(), | 162 features_.get(), |
161 NewCallback(this, &PhishingClassifier::TermExtractionFinished)); | 163 base::Bind(&PhishingClassifier::TermExtractionFinished, |
| 164 base::Unretained(this))); |
162 } else { | 165 } else { |
163 RunFailureCallback(); | 166 RunFailureCallback(); |
164 } | 167 } |
165 } | 168 } |
166 | 169 |
167 void PhishingClassifier::TermExtractionFinished(bool success) { | 170 void PhishingClassifier::TermExtractionFinished(bool success) { |
168 if (success) { | 171 if (success) { |
169 WebKit::WebView* web_view = render_view_->GetWebView(); | 172 WebKit::WebView* web_view = render_view_->GetWebView(); |
170 if (!web_view) { | 173 if (!web_view) { |
171 RunFailureCallback(); | 174 RunFailureCallback(); |
(...skipping 25 matching lines...) Expand all Loading... |
197 float score = static_cast<float>(scorer_->ComputeScore(hashed_features)); | 200 float score = static_cast<float>(scorer_->ComputeScore(hashed_features)); |
198 verdict.set_client_score(score); | 201 verdict.set_client_score(score); |
199 verdict.set_is_phishing(score >= kPhishyThreshold); | 202 verdict.set_is_phishing(score >= kPhishyThreshold); |
200 RunCallback(verdict); | 203 RunCallback(verdict); |
201 } else { | 204 } else { |
202 RunFailureCallback(); | 205 RunFailureCallback(); |
203 } | 206 } |
204 } | 207 } |
205 | 208 |
206 void PhishingClassifier::CheckNoPendingClassification() { | 209 void PhishingClassifier::CheckNoPendingClassification() { |
207 DCHECK(!done_callback_.get()); | 210 DCHECK(done_callback_.is_null()); |
208 DCHECK(!page_text_); | 211 DCHECK(!page_text_); |
209 if (done_callback_.get() || page_text_) { | 212 if (done_callback_.is_null() || page_text_) { |
210 LOG(ERROR) << "Classification in progress, missing call to " | 213 LOG(ERROR) << "Classification in progress, missing call to " |
211 << "CancelPendingClassification"; | 214 << "CancelPendingClassification"; |
212 UMA_HISTOGRAM_COUNTS("SBClientPhishing.CheckNoPendingClassificationFailed", | 215 UMA_HISTOGRAM_COUNTS("SBClientPhishing.CheckNoPendingClassificationFailed", |
213 1); | 216 1); |
214 } | 217 } |
215 } | 218 } |
216 | 219 |
217 void PhishingClassifier::RunCallback(const ClientPhishingRequest& verdict) { | 220 void PhishingClassifier::RunCallback(const ClientPhishingRequest& verdict) { |
218 done_callback_->Run(verdict); | 221 done_callback_.Run(verdict); |
219 Clear(); | 222 Clear(); |
220 } | 223 } |
221 | 224 |
222 void PhishingClassifier::RunFailureCallback() { | 225 void PhishingClassifier::RunFailureCallback() { |
223 ClientPhishingRequest verdict; | 226 ClientPhishingRequest verdict; |
224 // In this case we're not guaranteed to have a valid URL. Just set it | 227 // In this case we're not guaranteed to have a valid URL. Just set it |
225 // to the empty string to make sure we have a valid protocol buffer. | 228 // to the empty string to make sure we have a valid protocol buffer. |
226 verdict.set_url(""); | 229 verdict.set_url(""); |
227 verdict.set_client_score(kInvalidScore); | 230 verdict.set_client_score(kInvalidScore); |
228 verdict.set_is_phishing(false); | 231 verdict.set_is_phishing(false); |
229 RunCallback(verdict); | 232 RunCallback(verdict); |
230 } | 233 } |
231 | 234 |
232 void PhishingClassifier::Clear() { | 235 void PhishingClassifier::Clear() { |
233 page_text_ = NULL; | 236 page_text_ = NULL; |
234 done_callback_.reset(NULL); | 237 done_callback_.Reset(); |
235 features_.reset(NULL); | 238 features_.reset(NULL); |
236 } | 239 } |
237 | 240 |
238 } // namespace safe_browsing | 241 } // namespace safe_browsing |
OLD | NEW |