OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // Implementation of the MalwareDetails class. | 5 // Implementation of the ThreatDetails class. |
6 | 6 |
7 #include "chrome/browser/safe_browsing/threat_details.h" | 7 #include "chrome/browser/safe_browsing/threat_details.h" |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
11 #include "chrome/browser/profiles/profile.h" | 11 #include "chrome/browser/profiles/profile.h" |
12 #include "chrome/browser/safe_browsing/report.pb.h" | |
13 #include "chrome/browser/safe_browsing/threat_details_cache.h" | 12 #include "chrome/browser/safe_browsing/threat_details_cache.h" |
14 #include "chrome/browser/safe_browsing/threat_details_history.h" | 13 #include "chrome/browser/safe_browsing/threat_details_history.h" |
15 #include "chrome/common/safe_browsing/safebrowsing_messages.h" | 14 #include "chrome/common/safe_browsing/safebrowsing_messages.h" |
16 #include "content/public/browser/browser_thread.h" | 15 #include "content/public/browser/browser_thread.h" |
17 #include "content/public/browser/navigation_controller.h" | 16 #include "content/public/browser/navigation_controller.h" |
18 #include "content/public/browser/navigation_entry.h" | 17 #include "content/public/browser/navigation_entry.h" |
19 #include "content/public/browser/render_view_host.h" | 18 #include "content/public/browser/render_view_host.h" |
20 #include "content/public/browser/web_contents.h" | 19 #include "content/public/browser/web_contents.h" |
21 #include "net/url_request/url_request_context_getter.h" | 20 #include "net/url_request/url_request_context_getter.h" |
22 | 21 |
23 using content::BrowserThread; | 22 using content::BrowserThread; |
24 using content::NavigationEntry; | 23 using content::NavigationEntry; |
25 using content::WebContents; | 24 using content::WebContents; |
26 using safe_browsing::ClientMalwareReportRequest; | 25 using safe_browsing::ClientSafeBrowsingReportRequest; |
27 | 26 |
28 // Keep in sync with KMaxNodes in renderer/safe_browsing/malware_dom_details | 27 // Keep in sync with KMaxNodes in renderer/safe_browsing/threat_dom_details |
29 static const uint32 kMaxDomNodes = 500; | 28 static const uint32 kMaxDomNodes = 500; |
30 | 29 |
31 // static | 30 // static |
32 ThreatDetailsFactory* ThreatDetails::factory_ = NULL; | 31 ThreatDetailsFactory* ThreatDetails::factory_ = NULL; |
33 | 32 |
| 33 namespace { |
| 34 |
| 35 // Helper function that converts SBThreatType to |
| 36 // ClientSafeBrowsingReportRequest::ReportType. |
| 37 ClientSafeBrowsingReportRequest::ReportType GetReportTypeFromSBThreatType( |
| 38 SBThreatType threat_type) { |
| 39 switch (threat_type) { |
| 40 case SB_THREAT_TYPE_URL_PHISHING: |
| 41 return ClientSafeBrowsingReportRequest::URL_PHISHING; |
| 42 case SB_THREAT_TYPE_URL_MALWARE: |
| 43 return ClientSafeBrowsingReportRequest::URL_MALWARE; |
| 44 case SB_THREAT_TYPE_URL_UNWANTED: |
| 45 return ClientSafeBrowsingReportRequest::URL_UNWANTED; |
| 46 case SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL: |
| 47 return ClientSafeBrowsingReportRequest::CLIENT_SIDE_PHISHING_URL; |
| 48 case SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL: |
| 49 return ClientSafeBrowsingReportRequest::CLIENT_SIDE_MALWARE_URL; |
| 50 default: // Gated by SafeBrowsingBlockingPage::ShouldReportThreatDetails. |
| 51 NOTREACHED() << "We should not send report for threat type " |
| 52 << threat_type; |
| 53 return ClientSafeBrowsingReportRequest::UNKNOWN; |
| 54 } |
| 55 } |
| 56 |
| 57 } // namespace |
| 58 |
34 // The default ThreatDetailsFactory. Global, made a singleton so we | 59 // The default ThreatDetailsFactory. Global, made a singleton so we |
35 // don't leak it. | 60 // don't leak it. |
36 class ThreatDetailsFactoryImpl : public ThreatDetailsFactory { | 61 class ThreatDetailsFactoryImpl : public ThreatDetailsFactory { |
37 public: | 62 public: |
38 ThreatDetails* CreateThreatDetails( | 63 ThreatDetails* CreateThreatDetails( |
39 SafeBrowsingUIManager* ui_manager, | 64 SafeBrowsingUIManager* ui_manager, |
40 WebContents* web_contents, | 65 WebContents* web_contents, |
41 const SafeBrowsingUIManager::UnsafeResource& unsafe_resource) override { | 66 const SafeBrowsingUIManager::UnsafeResource& unsafe_resource) override { |
42 return new ThreatDetails(ui_manager, web_contents, unsafe_resource); | 67 return new ThreatDetails(ui_manager, web_contents, unsafe_resource); |
43 } | 68 } |
44 | 69 |
45 private: | 70 private: |
46 friend struct base::DefaultLazyInstanceTraits<ThreatDetailsFactoryImpl>; | 71 friend struct base::DefaultLazyInstanceTraits<ThreatDetailsFactoryImpl>; |
47 | 72 |
48 ThreatDetailsFactoryImpl() {} | 73 ThreatDetailsFactoryImpl() {} |
49 | 74 |
50 DISALLOW_COPY_AND_ASSIGN(ThreatDetailsFactoryImpl); | 75 DISALLOW_COPY_AND_ASSIGN(ThreatDetailsFactoryImpl); |
51 }; | 76 }; |
52 | 77 |
53 static base::LazyInstance<ThreatDetailsFactoryImpl> | 78 static base::LazyInstance<ThreatDetailsFactoryImpl> |
54 g_malware_details_factory_impl = LAZY_INSTANCE_INITIALIZER; | 79 g_threat_details_factory_impl = LAZY_INSTANCE_INITIALIZER; |
55 | 80 |
56 // Create a ThreatDetails for the given tab. | 81 // Create a ThreatDetails for the given tab. |
57 /* static */ | 82 /* static */ |
58 ThreatDetails* ThreatDetails::NewThreatDetails( | 83 ThreatDetails* ThreatDetails::NewThreatDetails( |
59 SafeBrowsingUIManager* ui_manager, | 84 SafeBrowsingUIManager* ui_manager, |
60 WebContents* web_contents, | 85 WebContents* web_contents, |
61 const UnsafeResource& resource) { | 86 const UnsafeResource& resource) { |
62 // Set up the factory if this has not been done already (tests do that | 87 // Set up the factory if this has not been done already (tests do that |
63 // before this method is called). | 88 // before this method is called). |
64 if (!factory_) | 89 if (!factory_) |
65 factory_ = g_malware_details_factory_impl.Pointer(); | 90 factory_ = g_threat_details_factory_impl.Pointer(); |
66 return factory_->CreateThreatDetails(ui_manager, web_contents, resource); | 91 return factory_->CreateThreatDetails(ui_manager, web_contents, resource); |
67 } | 92 } |
68 | 93 |
69 // Create a ThreatDetails for the given tab. Runs in the UI thread. | 94 // Create a ThreatDetails for the given tab. Runs in the UI thread. |
70 ThreatDetails::ThreatDetails(SafeBrowsingUIManager* ui_manager, | 95 ThreatDetails::ThreatDetails(SafeBrowsingUIManager* ui_manager, |
71 content::WebContents* web_contents, | 96 content::WebContents* web_contents, |
72 const UnsafeResource& resource) | 97 const UnsafeResource& resource) |
73 : content::WebContentsObserver(web_contents), | 98 : content::WebContentsObserver(web_contents), |
74 profile_(Profile::FromBrowserContext(web_contents->GetBrowserContext())), | 99 profile_(Profile::FromBrowserContext(web_contents->GetBrowserContext())), |
75 request_context_getter_(profile_->GetRequestContext()), | 100 request_context_getter_(profile_->GetRequestContext()), |
76 ui_manager_(ui_manager), | 101 ui_manager_(ui_manager), |
77 resource_(resource), | 102 resource_(resource), |
78 cache_result_(false), | 103 cache_result_(false), |
79 cache_collector_(new ThreatDetailsCacheCollector), | 104 cache_collector_(new ThreatDetailsCacheCollector), |
80 redirects_collector_(new ThreatDetailsRedirectsCollector(profile_)) { | 105 redirects_collector_(new ThreatDetailsRedirectsCollector(profile_)) { |
81 StartCollection(); | 106 StartCollection(); |
82 } | 107 } |
83 | 108 |
84 ThreatDetails::~ThreatDetails() {} | 109 ThreatDetails::~ThreatDetails() {} |
85 | 110 |
86 bool ThreatDetails::OnMessageReceived(const IPC::Message& message) { | 111 bool ThreatDetails::OnMessageReceived(const IPC::Message& message) { |
87 bool handled = true; | 112 bool handled = true; |
88 IPC_BEGIN_MESSAGE_MAP(ThreatDetails, message) | 113 IPC_BEGIN_MESSAGE_MAP(ThreatDetails, message) |
89 IPC_MESSAGE_HANDLER(SafeBrowsingHostMsg_MalwareDOMDetails, | 114 IPC_MESSAGE_HANDLER(SafeBrowsingHostMsg_ThreatDOMDetails, |
90 OnReceivedThreatDOMDetails) | 115 OnReceivedThreatDOMDetails) |
91 IPC_MESSAGE_UNHANDLED(handled = false) | 116 IPC_MESSAGE_UNHANDLED(handled = false) |
92 IPC_END_MESSAGE_MAP() | 117 IPC_END_MESSAGE_MAP() |
93 return handled; | 118 return handled; |
94 } | 119 } |
95 | 120 |
96 bool ThreatDetails::IsReportableUrl(const GURL& url) const { | 121 bool ThreatDetails::IsReportableUrl(const GURL& url) const { |
97 // TODO(panayiotis): also skip internal urls. | 122 // TODO(panayiotis): also skip internal urls. |
98 return url.SchemeIs("http") || url.SchemeIs("https"); | 123 return url.SchemeIs("http") || url.SchemeIs("https"); |
99 } | 124 } |
100 | 125 |
101 // Looks for a Resource for the given url in resources_. If found, it | 126 // Looks for a Resource for the given url in resources_. If found, it |
102 // updates |resource|. Otherwise, it creates a new message, adds it to | 127 // updates |resource|. Otherwise, it creates a new message, adds it to |
103 // resources_ and updates |resource| to point to it. | 128 // resources_ and updates |resource| to point to it. |
104 // | 129 // |
105 ClientMalwareReportRequest::Resource* ThreatDetails::FindOrCreateResource( | 130 ClientSafeBrowsingReportRequest::Resource* ThreatDetails::FindOrCreateResource( |
106 const GURL& url) { | 131 const GURL& url) { |
107 safe_browsing::ResourceMap::iterator it = resources_.find(url.spec()); | 132 safe_browsing::ResourceMap::iterator it = resources_.find(url.spec()); |
108 if (it != resources_.end()) | 133 if (it != resources_.end()) |
109 return it->second.get(); | 134 return it->second.get(); |
110 | 135 |
111 // Create the resource for |url|. | 136 // Create the resource for |url|. |
112 int id = resources_.size(); | 137 int id = resources_.size(); |
113 linked_ptr<ClientMalwareReportRequest::Resource> new_resource( | 138 linked_ptr<ClientSafeBrowsingReportRequest::Resource> new_resource( |
114 new ClientMalwareReportRequest::Resource()); | 139 new ClientSafeBrowsingReportRequest::Resource()); |
115 new_resource->set_url(url.spec()); | 140 new_resource->set_url(url.spec()); |
116 new_resource->set_id(id); | 141 new_resource->set_id(id); |
117 resources_[url.spec()] = new_resource; | 142 resources_[url.spec()] = new_resource; |
118 return new_resource.get(); | 143 return new_resource.get(); |
119 } | 144 } |
120 | 145 |
121 void ThreatDetails::AddUrl(const GURL& url, | 146 void ThreatDetails::AddUrl(const GURL& url, |
122 const GURL& parent, | 147 const GURL& parent, |
123 const std::string& tagname, | 148 const std::string& tagname, |
124 const std::vector<GURL>* children) { | 149 const std::vector<GURL>* children) { |
125 if (!url.is_valid() || !IsReportableUrl(url)) | 150 if (!url.is_valid() || !IsReportableUrl(url)) |
126 return; | 151 return; |
127 | 152 |
128 // Find (or create) the resource for the url. | 153 // Find (or create) the resource for the url. |
129 ClientMalwareReportRequest::Resource* url_resource = | 154 ClientSafeBrowsingReportRequest::Resource* url_resource = |
130 FindOrCreateResource(url); | 155 FindOrCreateResource(url); |
131 if (!tagname.empty()) | 156 if (!tagname.empty()) |
132 url_resource->set_tag_name(tagname); | 157 url_resource->set_tag_name(tagname); |
133 if (!parent.is_empty() && IsReportableUrl(parent)) { | 158 if (!parent.is_empty() && IsReportableUrl(parent)) { |
134 // Add the resource for the parent. | 159 // Add the resource for the parent. |
135 ClientMalwareReportRequest::Resource* parent_resource = | 160 ClientSafeBrowsingReportRequest::Resource* parent_resource = |
136 FindOrCreateResource(parent); | 161 FindOrCreateResource(parent); |
137 // Update the parent-child relation | 162 // Update the parent-child relation |
138 url_resource->set_parent_id(parent_resource->id()); | 163 url_resource->set_parent_id(parent_resource->id()); |
139 } | 164 } |
140 if (children) { | 165 if (children) { |
141 for (std::vector<GURL>::const_iterator it = children->begin(); | 166 for (std::vector<GURL>::const_iterator it = children->begin(); |
142 it != children->end(); ++it) { | 167 it != children->end(); ++it) { |
143 ClientMalwareReportRequest::Resource* child_resource = | 168 ClientSafeBrowsingReportRequest::Resource* child_resource = |
144 FindOrCreateResource(*it); | 169 FindOrCreateResource(*it); |
145 url_resource->add_child_ids(child_resource->id()); | 170 url_resource->add_child_ids(child_resource->id()); |
146 } | 171 } |
147 } | 172 } |
148 } | 173 } |
149 | 174 |
150 void ThreatDetails::StartCollection() { | 175 void ThreatDetails::StartCollection() { |
151 DVLOG(1) << "Starting to compute malware details."; | 176 DVLOG(1) << "Starting to compute threat details."; |
152 report_.reset(new ClientMalwareReportRequest()); | 177 report_.reset(new ClientSafeBrowsingReportRequest()); |
153 | 178 |
154 if (IsReportableUrl(resource_.url)) | 179 if (IsReportableUrl(resource_.url)) { |
155 report_->set_malware_url(resource_.url.spec()); | 180 report_->set_url(resource_.url.spec()); |
| 181 report_->set_type(GetReportTypeFromSBThreatType(resource_.threat_type)); |
| 182 } |
156 | 183 |
157 GURL page_url = web_contents()->GetURL(); | 184 GURL page_url = web_contents()->GetURL(); |
158 if (IsReportableUrl(page_url)) | 185 if (IsReportableUrl(page_url)) |
159 report_->set_page_url(page_url.spec()); | 186 report_->set_page_url(page_url.spec()); |
160 | 187 |
161 GURL referrer_url; | 188 GURL referrer_url; |
162 NavigationEntry* nav_entry = web_contents()->GetController().GetActiveEntry(); | 189 NavigationEntry* nav_entry = web_contents()->GetController().GetActiveEntry(); |
163 if (nav_entry) { | 190 if (nav_entry) { |
164 referrer_url = nav_entry->GetReferrer().url; | 191 referrer_url = nav_entry->GetReferrer().url; |
165 if (IsReportableUrl(referrer_url)) { | 192 if (IsReportableUrl(referrer_url)) { |
(...skipping 29 matching lines...) Expand all Loading... |
195 parent_url = resource_.redirect_urls[i]; | 222 parent_url = resource_.redirect_urls[i]; |
196 } | 223 } |
197 | 224 |
198 // Add the referrer url. | 225 // Add the referrer url. |
199 if (nav_entry && !referrer_url.is_empty()) | 226 if (nav_entry && !referrer_url.is_empty()) |
200 AddUrl(referrer_url, GURL(), std::string(), NULL); | 227 AddUrl(referrer_url, GURL(), std::string(), NULL); |
201 | 228 |
202 // Get URLs of frames, scripts etc from the DOM. | 229 // Get URLs of frames, scripts etc from the DOM. |
203 // OnReceivedThreatDOMDetails will be called when the renderer replies. | 230 // OnReceivedThreatDOMDetails will be called when the renderer replies. |
204 content::RenderViewHost* view = web_contents()->GetRenderViewHost(); | 231 content::RenderViewHost* view = web_contents()->GetRenderViewHost(); |
205 view->Send(new SafeBrowsingMsg_GetMalwareDOMDetails(view->GetRoutingID())); | 232 view->Send(new SafeBrowsingMsg_GetThreatDOMDetails(view->GetRoutingID())); |
206 } | 233 } |
207 | 234 |
208 // When the renderer is done, this is called. | 235 // When the renderer is done, this is called. |
209 void ThreatDetails::OnReceivedThreatDOMDetails( | 236 void ThreatDetails::OnReceivedThreatDOMDetails( |
210 const std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node>& params) { | 237 const std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node>& params) { |
211 // Schedule this in IO thread, so it doesn't conflict with future users | 238 // Schedule this in IO thread, so it doesn't conflict with future users |
212 // of our data structures (eg GetSerializedReport). | 239 // of our data structures (eg GetSerializedReport). |
213 BrowserThread::PostTask( | 240 BrowserThread::PostTask( |
214 BrowserThread::IO, FROM_HERE, | 241 BrowserThread::IO, FROM_HERE, |
215 base::Bind(&ThreatDetails::AddDOMDetails, this, params)); | 242 base::Bind(&ThreatDetails::AddDOMDetails, this, params)); |
216 } | 243 } |
217 | 244 |
218 void ThreatDetails::AddDOMDetails( | 245 void ThreatDetails::AddDOMDetails( |
219 const std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node>& params) { | 246 const std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node>& params) { |
220 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 247 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
221 DVLOG(1) << "Nodes from the DOM: " << params.size(); | 248 DVLOG(1) << "Nodes from the DOM: " << params.size(); |
222 | 249 |
223 // If we have already started getting redirects from history service, | 250 // If we have already started getting redirects from history service, |
224 // don't modify state, otherwise will invalidate the iterators. | 251 // don't modify state, otherwise will invalidate the iterators. |
225 if (redirects_collector_->HasStarted()) | 252 if (redirects_collector_->HasStarted()) |
226 return; | 253 return; |
227 | 254 |
228 // If we have already started collecting data from the HTTP cache, don't | 255 // If we have already started collecting data from the HTTP cache, don't |
229 // modify our state. | 256 // modify our state. |
230 if (cache_collector_->HasStarted()) | 257 if (cache_collector_->HasStarted()) |
231 return; | 258 return; |
232 | 259 |
233 // Add the urls from the DOM to |resources_|. The renderer could be | 260 // Add the urls from the DOM to |resources_|. The renderer could be |
234 // sending bogus messages, so limit the number of nodes we accept. | 261 // sending bogus messages, so limit the number of nodes we accept. |
235 for (size_t i = 0; i < params.size() && i < kMaxDomNodes; ++i) { | 262 for (size_t i = 0; i < params.size() && i < kMaxDomNodes; ++i) { |
236 SafeBrowsingHostMsg_MalwareDOMDetails_Node node = params[i]; | 263 SafeBrowsingHostMsg_ThreatDOMDetails_Node node = params[i]; |
237 DVLOG(1) << node.url << ", " << node.tag_name << ", " << node.parent; | 264 DVLOG(1) << node.url << ", " << node.tag_name << ", " << node.parent; |
238 AddUrl(node.url, node.parent, node.tag_name, &(node.children)); | 265 AddUrl(node.url, node.parent, node.tag_name, &(node.children)); |
239 } | 266 } |
240 } | 267 } |
241 | 268 |
242 // Called from the SB Service on the IO thread, after the user has | 269 // Called from the SB Service on the IO thread, after the user has |
243 // closed the tab, or clicked proceed or goback. Since the user needs | 270 // closed the tab, or clicked proceed or goback. Since the user needs |
244 // to take an action, we expect this to be called after | 271 // to take an action, we expect this to be called after |
245 // OnReceivedThreatDOMDetails in most cases. If not, we don't include | 272 // OnReceivedThreatDOMDetails in most cases. If not, we don't include |
246 // the DOM data in our report. | 273 // the DOM data in our report. |
(...skipping 30 matching lines...) Expand all Loading... |
277 for (size_t i = 0; i < urls.size() - 1; ++i) { | 304 for (size_t i = 0; i < urls.size() - 1; ++i) { |
278 AddUrl(urls[i], urls[i + 1], std::string(), NULL); | 305 AddUrl(urls[i], urls[i + 1], std::string(), NULL); |
279 } | 306 } |
280 } | 307 } |
281 | 308 |
282 void ThreatDetails::OnCacheCollectionReady() { | 309 void ThreatDetails::OnCacheCollectionReady() { |
283 DVLOG(1) << "OnCacheCollectionReady."; | 310 DVLOG(1) << "OnCacheCollectionReady."; |
284 // Add all the urls in our |resources_| maps to the |report_| protocol buffer. | 311 // Add all the urls in our |resources_| maps to the |report_| protocol buffer. |
285 for (safe_browsing::ResourceMap::const_iterator it = resources_.begin(); | 312 for (safe_browsing::ResourceMap::const_iterator it = resources_.begin(); |
286 it != resources_.end(); ++it) { | 313 it != resources_.end(); ++it) { |
287 ClientMalwareReportRequest::Resource* pb_resource = | 314 ClientSafeBrowsingReportRequest::Resource* pb_resource = |
288 report_->add_resources(); | 315 report_->add_resources(); |
289 pb_resource->CopyFrom(*(it->second)); | 316 pb_resource->CopyFrom(*(it->second)); |
290 const GURL url(pb_resource->url()); | 317 const GURL url(pb_resource->url()); |
291 if (url.SchemeIs("https")) { | 318 if (url.SchemeIs("https")) { |
292 // Don't report headers of HTTPS requests since they may contain private | 319 // Don't report headers of HTTPS requests since they may contain private |
293 // cookies. We still retain the full URL. | 320 // cookies. We still retain the full URL. |
294 DVLOG(1) << "Clearing out HTTPS resource: " << pb_resource->url(); | 321 DVLOG(1) << "Clearing out HTTPS resource: " << pb_resource->url(); |
295 pb_resource->clear_request(); | 322 pb_resource->clear_request(); |
296 pb_resource->clear_response(); | 323 pb_resource->clear_response(); |
297 // Keep id, parent_id, child_ids, and tag_name. | 324 // Keep id, parent_id, child_ids, and tag_name. |
298 } | 325 } |
299 } | 326 } |
300 report_->set_did_proceed(did_proceed_); | 327 report_->set_did_proceed(did_proceed_); |
301 // Only sets repeat_visit if num_visits_ >= 0. | 328 // Only sets repeat_visit if num_visits_ >= 0. |
302 if (num_visits_ >= 0) { | 329 if (num_visits_ >= 0) { |
303 report_->set_repeat_visit(num_visits_ > 0); | 330 report_->set_repeat_visit(num_visits_ > 0); |
304 } | 331 } |
305 report_->set_complete(cache_result_); | 332 report_->set_complete(cache_result_); |
306 | 333 |
307 // Send the report, using the SafeBrowsingService. | 334 // Send the report, using the SafeBrowsingService. |
308 std::string serialized; | 335 std::string serialized; |
309 if (!report_->SerializeToString(&serialized)) { | 336 if (!report_->SerializeToString(&serialized)) { |
310 DLOG(ERROR) << "Unable to serialize the malware report."; | 337 DLOG(ERROR) << "Unable to serialize the threat report."; |
311 return; | 338 return; |
312 } | 339 } |
313 | |
314 ui_manager_->SendSerializedThreatDetails(serialized); | 340 ui_manager_->SendSerializedThreatDetails(serialized); |
315 } | 341 } |
OLD | NEW |