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_BOOKMARKS_BOOKMARK_HTML_WRITER_H_ 6 #define CHROME_BROWSER_BOOKMARKS_BOOKMARK_HTML_WRITER_H_ 7 8 #include <list> 9 #include <map> 10 #include <string> 11 12 #include "base/files/file_path.h" 13 #include "base/memory/ref_counted.h" 14 #include "base/memory/ref_counted_memory.h" 15 #include "base/task/cancelable_task_tracker.h" 16 #include "components/favicon_base/favicon_types.h" 17 #include "content/public/browser/notification_observer.h" 18 #include "content/public/browser/notification_registrar.h" 19 20 class BookmarkNode; 21 class Profile; 22 23 namespace chrome { 24 struct FaviconRawBitmapResult; 25 } 26 27 // Observer for bookmark html output. Used only in tests. 28 class BookmarksExportObserver { 29 public: 30 // Is invoked on the IO thread. 31 virtual void OnExportFinished() = 0; 32 33 protected: 34 virtual ~BookmarksExportObserver() {} 35 }; 36 37 // Class that fetches favicons for list of bookmarks and 38 // then starts Writer which outputs bookmarks and favicons to html file. 39 // Should be used only by WriteBookmarks function. 40 class BookmarkFaviconFetcher: public content::NotificationObserver { 41 public: 42 // Map of URL and corresponding favicons. 43 typedef std::map<std::string, scoped_refptr<base::RefCountedMemory> > 44 URLFaviconMap; 45 46 BookmarkFaviconFetcher(Profile* profile, 47 const base::FilePath& path, 48 BookmarksExportObserver* observer); 49 virtual ~BookmarkFaviconFetcher(); 50 51 // Executes bookmark export process. 52 void ExportBookmarks(); 53 54 // content::NotificationObserver implementation. 55 virtual void Observe(int type, 56 const content::NotificationSource& source, 57 const content::NotificationDetails& details) OVERRIDE; 58 59 private: 60 // Recursively extracts URLs from bookmarks. 61 void ExtractUrls(const BookmarkNode* node); 62 63 // Executes Writer task that writes bookmarks data to html file. 64 void ExecuteWriter(); 65 66 // Starts async fetch for the next bookmark favicon. 67 // Takes single url from bookmark_urls_ and removes it from the list. 68 // Returns true if there are more favicons to extract. 69 bool FetchNextFavicon(); 70 71 // Favicon fetch callback. After all favicons are fetched executes 72 // html output on the file thread. 73 void OnFaviconDataAvailable( 74 const favicon_base::FaviconRawBitmapResult& bitmap_result); 75 76 // The Profile object used for accessing FaviconService, bookmarks model. 77 Profile* profile_; 78 79 // All URLs that are extracted from bookmarks. Used to fetch favicons 80 // for each of them. After favicon is fetched top url is removed from list. 81 std::list<std::string> bookmark_urls_; 82 83 // Tracks favicon tasks. 84 base::CancelableTaskTracker cancelable_task_tracker_; 85 86 // Map that stores favicon per URL. 87 scoped_ptr<URLFaviconMap> favicons_map_; 88 89 // Path where html output is stored. 90 base::FilePath path_; 91 92 BookmarksExportObserver* observer_; 93 94 content::NotificationRegistrar registrar_; 95 96 DISALLOW_COPY_AND_ASSIGN(BookmarkFaviconFetcher); 97 }; 98 99 namespace bookmark_html_writer { 100 101 // Writes the bookmarks out in the 'bookmarks.html' format understood by 102 // Firefox and IE. The results are written to the file at |path|. The file 103 // thread is used. 104 // Before writing to the file favicons are fetched on the main thread. 105 // TODO(sky): need a callback on failure. 106 void WriteBookmarks(Profile* profile, 107 const base::FilePath& path, 108 BookmarksExportObserver* observer); 109 110 } // namespace bookmark_html_writer 111 112 #endif // CHROME_BROWSER_BOOKMARKS_BOOKMARK_HTML_WRITER_H_ 113