Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / bookmarks / bookmark_html_writer.h
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   ~BookmarkFaviconFetcher() override;
50
51   // Executes bookmark export process.
52   void ExportBookmarks();
53
54   // content::NotificationObserver implementation.
55   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_