| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_SAFE_BROWSING_MALWARE_DETAILS_H_ |
| #define CHROME_BROWSER_SAFE_BROWSING_MALWARE_DETAILS_H_ |
| #pragma once |
| |
| // A class that encapsulates the detailed malware reports sent when |
| // users opt-in to do so from the malware warning page. |
| |
| // An instance of this class is generated when a malware warning page |
| // is shown (SafeBrowsingBlockingPage). |
| |
| #include <string> |
| #include <vector> |
| |
| #include "base/hash_tables.h" |
| #include "base/memory/linked_ptr.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "chrome/browser/safe_browsing/report.pb.h" |
| #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
| #include "content/browser/tab_contents/tab_contents_observer.h" |
| #include "net/base/completion_callback.h" |
| |
| class TabContents; |
| struct SafeBrowsingHostMsg_MalwareDOMDetails_Node; |
| |
| class MalwareDetailsCacheCollector; |
| class MalwareDetailsFactory; |
| |
| namespace safe_browsing { |
| // Maps a URL to its Resource. |
| typedef base::hash_map< |
| std::string, |
| linked_ptr<safe_browsing::ClientMalwareReportRequest::Resource> > ResourceMap; |
| } |
| |
| class MalwareDetails : public base::RefCountedThreadSafe<MalwareDetails>, |
| public TabContentsObserver { |
| public: |
| // Constructs a new MalwareDetails instance, using the factory. |
| static MalwareDetails* NewMalwareDetails( |
| SafeBrowsingService* sb_service, |
| TabContents* tab_contents, |
| const SafeBrowsingService::UnsafeResource& resource); |
| |
| // Makes the passed |factory| the factory used to instanciate |
| // SafeBrowsingBlockingPage objects. Useful for tests. |
| static void RegisterFactory(MalwareDetailsFactory* factory) { |
| factory_ = factory; |
| } |
| |
| // The SafeBrowsingBlockingPage calls this from the IO thread when |
| // the user is leaving the blocking page and has opted-in to sending |
| // the report. We start the cache collection, and when we are done, |
| // we send the report. |
| void FinishCollection(); |
| |
| void OnCacheCollectionReady(); |
| |
| // TabContentsObserver implementation. |
| virtual bool OnMessageReceived(const IPC::Message& message); |
| |
| protected: |
| friend class MalwareDetailsFactoryImpl; |
| |
| MalwareDetails(SafeBrowsingService* sb_service, |
| TabContents* tab_contents, |
| const SafeBrowsingService::UnsafeResource& resource); |
| |
| virtual ~MalwareDetails(); |
| |
| // Called on the IO thread with the DOM details. |
| virtual void AddDOMDetails( |
| const std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node>& params); |
| |
| // The report protocol buffer. |
| scoped_ptr<safe_browsing::ClientMalwareReportRequest> report_; |
| |
| // Used to get a pointer to the HTTP cache. |
| scoped_refptr<net::URLRequestContextGetter> request_context_getter_; |
| |
| private: |
| friend class base::RefCountedThreadSafe<MalwareDetails>; |
| |
| // Starts the collection of the report. |
| void StartCollection(); |
| |
| // Whether the url is "public" so we can add it to the report. |
| bool IsPublicUrl(const GURL& url) const; |
| |
| // Finds an existing Resource for the given url, or creates a new |
| // one if not found, and adds it to |resources_|. Returns the |
| // found/created resource. |
| safe_browsing::ClientMalwareReportRequest::Resource* FindOrCreateResource( |
| const GURL& url); |
| |
| // Adds a Resource to resources_ with the given parent-child |
| // relationship. |parent| and |tagname| can be empty, |children| can be NULL. |
| void AddUrl(const GURL& url, |
| const GURL& parent, |
| const std::string& tagname, |
| const std::vector<GURL>* children); |
| |
| // Message handler. |
| void OnReceivedMalwareDOMDetails( |
| const std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node>& params); |
| |
| scoped_refptr<SafeBrowsingService> sb_service_; |
| |
| const SafeBrowsingService::UnsafeResource resource_; |
| |
| // For every Url we collect we create a Resource message. We keep |
| // them in a map so we can avoid duplicates. |
| safe_browsing::ResourceMap resources_; |
| |
| // Result from the cache extractor. |
| bool cache_result_; |
| |
| // The factory used to instanciate SafeBrowsingBlockingPage objects. |
| // Usefull for tests, so they can provide their own implementation of |
| // SafeBrowsingBlockingPage. |
| static MalwareDetailsFactory* factory_; |
| |
| // Used to collect details from the HTTP Cache. |
| scoped_refptr<MalwareDetailsCacheCollector> cache_collector_; |
| |
| FRIEND_TEST_ALL_PREFIXES(MalwareDetailsTest, MalwareDOMDetails); |
| FRIEND_TEST_ALL_PREFIXES(MalwareDetailsTest, HTTPCache); |
| FRIEND_TEST_ALL_PREFIXES(MalwareDetailsTest, HTTPCacheNoEntries); |
| |
| DISALLOW_COPY_AND_ASSIGN(MalwareDetails); |
| }; |
| |
| // Factory for creating MalwareDetails. Useful for tests. |
| class MalwareDetailsFactory { |
| public: |
| virtual ~MalwareDetailsFactory() { } |
| |
| virtual MalwareDetails* CreateMalwareDetails( |
| SafeBrowsingService* sb_service, |
| TabContents* tab_contents, |
| const SafeBrowsingService::UnsafeResource& unsafe_resource) = 0; |
| }; |
| |
| #endif // CHROME_BROWSER_SAFE_BROWSING_MALWARE_DETAILS_H_ |