Index: chrome/browser/safe_browsing/malware_details.cc |
=================================================================== |
--- chrome/browser/safe_browsing/malware_details.cc (revision 71243) |
+++ chrome/browser/safe_browsing/malware_details.cc (working copy) |
@@ -11,6 +11,8 @@ |
#include "chrome/browser/tab_contents/tab_contents.h" |
#include "chrome/browser/safe_browsing/report.pb.h" |
+using safe_browsing::ClientMalwareReportRequest; |
+ |
// Create a MalwareDetails for the given tab. Runs in the UI thread. |
MalwareDetails::MalwareDetails( |
TabContents* tab_contents, |
@@ -26,21 +28,46 @@ |
return url.SchemeIs("http"); // TODO(panayiotis): also skip internal urls. |
} |
-void MalwareDetails::AddNode(const std::string& url, |
+// Looks for a Resource for the given url in resources_. If found, it |
+// updates |resource|. Otherwise, it creates a new message, adds it to |
+// resources_ and updates |resource| to point to it. |
+ClientMalwareReportRequest::Resource* MalwareDetails::FindOrCreateResource( |
+ const std::string& url) { |
+ ResourceMap::iterator it = resources_.find(url); |
+ if (it != resources_.end()) { |
+ return it->second.get(); |
+ } |
+ |
+ // Create the resource for |url|. |
+ int id = resources_.size(); |
+ linked_ptr<ClientMalwareReportRequest::Resource> new_resource( |
+ new ClientMalwareReportRequest::Resource()); |
+ new_resource->set_url(url); |
+ new_resource->set_id(id); |
+ resources_[url] = new_resource; |
+ return new_resource.get(); |
+} |
+ |
+void MalwareDetails::AddUrl(const std::string& url, |
const std::string& parent) { |
if (!IsPublicUrl(GURL(url))) |
return; |
- linked_ptr<safe_browsing::ClientMalwareReportRequest::Resource> resource( |
- new safe_browsing::ClientMalwareReportRequest::Resource()); |
- resource->set_url(url); |
- if (!parent.empty() && IsPublicUrl(GURL(parent))) |
- resource->set_parent(parent); |
- urls_[url] = resource; |
+ |
+ // Find (or create) the resource for the url. |
+ ClientMalwareReportRequest::Resource* url_resource = |
+ FindOrCreateResource(url); |
+ if (!parent.empty() && IsPublicUrl(GURL(parent))) { |
+ // Add the resource for the parent. |
+ ClientMalwareReportRequest::Resource* parent_resource = |
+ FindOrCreateResource(parent); |
+ // Update the parent-child relation |
+ url_resource->set_parent_id(parent_resource->id()); |
+ } |
} |
void MalwareDetails::StartCollection() { |
DVLOG(1) << "Starting to compute malware details."; |
- report_.reset(new safe_browsing::ClientMalwareReportRequest()); |
+ report_.reset(new ClientMalwareReportRequest()); |
if (IsPublicUrl(resource_.url)) { |
report_->set_malware_url(resource_.url.spec()); |
@@ -61,28 +88,29 @@ |
} |
// Add the nodes, starting from the page url. |
- AddNode(page_url.spec(), ""); |
+ AddUrl(page_url.spec(), ""); |
// Add the resource_url and its original url, if non-empty and different. |
if (!resource_.original_url.spec().empty() && |
resource_.url != resource_.original_url) { |
// Add original_url, as the parent of resource_url. |
- AddNode(resource_.original_url.spec(), ""); |
- AddNode(resource_.url.spec(), resource_.original_url.spec()); |
+ AddUrl(resource_.original_url.spec(), ""); |
+ AddUrl(resource_.url.spec(), resource_.original_url.spec()); |
} else { |
- AddNode(resource_.url.spec(), ""); |
+ AddUrl(resource_.url.spec(), ""); |
} |
// Add the referrer url. |
if (nav_entry && !referrer_url.spec().empty()) { |
- AddNode(referrer_url.spec(), ""); |
+ AddUrl(referrer_url.spec(), ""); |
} |
- // Add all the urls in our |urls_| map to the |report_| protobuf. |
- for (ResourceMap::const_iterator it = urls_.begin(); |
- it != urls_.end(); it++) { |
- safe_browsing::ClientMalwareReportRequest::Resource* pb_resource = |
- report_->add_nodes(); |
+ // The |report_| protocol buffer is now generated: We add all the |
+ // urls in our |resources_| maps. |
+ for (ResourceMap::const_iterator it = resources_.begin(); |
+ it != resources_.end(); it++) { |
+ ClientMalwareReportRequest::Resource* pb_resource = |
+ report_->add_resources(); |
pb_resource->CopyFrom(*(it->second)); |
} |
} |