Home | History | Annotate | Download | only in bookmarks
      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