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 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_SAFE_BROWSING_MALWARE_DETAILS_HISTORY_H_ 6 #define CHROME_BROWSER_SAFE_BROWSING_MALWARE_DETAILS_HISTORY_H_ 7 8 // This class gets redirect chain for urls from the history service. 9 10 #include <string> 11 #include <vector> 12 13 #include "base/callback.h" 14 #include "base/containers/hash_tables.h" 15 #include "base/memory/linked_ptr.h" 16 #include "base/memory/ref_counted.h" 17 #include "base/sequenced_task_runner_helpers.h" 18 #include "chrome/browser/history/history_service.h" 19 #include "content/public/browser/browser_thread.h" 20 #include "content/public/browser/notification_observer.h" 21 #include "content/public/browser/notification_registrar.h" 22 #include "net/base/completion_callback.h" 23 24 namespace safe_browsing { 25 typedef std::vector<GURL> RedirectChain; 26 } 27 28 class MalwareDetailsRedirectsCollector 29 : public base::RefCountedThreadSafe< 30 MalwareDetailsRedirectsCollector, 31 content::BrowserThread::DeleteOnUIThread>, 32 public content::NotificationObserver { 33 public: 34 explicit MalwareDetailsRedirectsCollector(Profile* profile); 35 36 // Collects urls' redirects chain information from the history service. 37 // We get access to history service via web_contents in UI thread. 38 // Notice the callback will be posted to the IO thread. 39 void StartHistoryCollection(const std::vector<GURL>& urls, 40 const base::Closure& callback); 41 42 // Returns whether or not StartCacheCollection has been called. 43 bool HasStarted() const; 44 45 // Returns the redirect urls we get from history service 46 const std::vector<safe_browsing::RedirectChain>& GetCollectedUrls() const; 47 48 // content::NotificationObserver 49 virtual void Observe(int type, 50 const content::NotificationSource& source, 51 const content::NotificationDetails& details) OVERRIDE; 52 53 private: 54 friend struct content::BrowserThread::DeleteOnThread< 55 content::BrowserThread::UI>; 56 friend class base::DeleteHelper<MalwareDetailsRedirectsCollector>; 57 58 virtual ~MalwareDetailsRedirectsCollector(); 59 60 void StartGetRedirects(const std::vector<GURL>& urls); 61 void GetRedirects(const GURL& url); 62 void OnGotQueryRedirectsTo(HistoryService::Handle handle, 63 GURL url, 64 bool success, 65 history::RedirectList* redirect_list); 66 67 // Posts the callback method back to IO thread when redirects collecting 68 // is all done. 69 void AllDone(); 70 71 Profile* profile_; 72 CancelableRequestConsumer request_consumer_; 73 74 // Method we call when we are done. The caller must be alive for the 75 // whole time, we are modifying its state (see above). 76 base::Closure callback_; 77 78 // Sets to true once StartHistoryCollection is called 79 bool has_started_; 80 81 // The urls we need to get redirects for 82 std::vector<GURL> urls_; 83 // The iterator goes over urls_ 84 std::vector<GURL>::iterator urls_it_; 85 // The collected directs from history service 86 std::vector<safe_browsing::RedirectChain> redirects_urls_; 87 88 content::NotificationRegistrar registrar_; 89 90 DISALLOW_COPY_AND_ASSIGN(MalwareDetailsRedirectsCollector); 91 }; 92 93 #endif // CHROME_BROWSER_SAFE_BROWSING_MALWARE_DETAILS_HISTORY_H_ 94