1// Copyright 2014 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_EXTENSIONS_BOOKMARK_APP_HELPER_H_
6#define CHROME_BROWSER_EXTENSIONS_BOOKMARK_APP_HELPER_H_
7
8#include <map>
9#include <set>
10#include <vector>
11
12#include "base/callback.h"
13#include "base/memory/ref_counted.h"
14#include "base/memory/scoped_ptr.h"
15#include "chrome/common/web_application_info.h"
16#include "content/public/browser/notification_observer.h"
17#include "content/public/browser/notification_registrar.h"
18
19class ExtensionService;
20class FaviconDownloader;
21class SkBitmap;
22
23namespace content {
24class BrowserContext;
25class WebContents;
26}
27
28namespace extensions {
29class CrxInstaller;
30class Extension;
31
32// A helper class for creating bookmark apps from a WebContents.
33class BookmarkAppHelper : public content::NotificationObserver {
34 public:
35  typedef base::Callback<void(const Extension*, const WebApplicationInfo&)>
36      CreateBookmarkAppCallback;
37
38  // This helper class will create a bookmark app out of |web_app_info| and
39  // install it to |service|. Icons will be downloaded from the URLs in
40  // |web_app_info.icons| using |contents| if |contents| is not NULL.
41  // All existing icons from WebApplicationInfo will also be used.
42  BookmarkAppHelper(ExtensionService* service,
43                    WebApplicationInfo web_app_info,
44                    content::WebContents* contents);
45  virtual ~BookmarkAppHelper();
46
47  // This finds the closest not-smaller bitmap in |bitmaps| for each size in
48  // |sizes| and resizes it to that size. This returns a map of sizes to bitmaps
49  // which contains only bitmaps of a size in |sizes| and at most one bitmap of
50  // each size.
51  static std::map<int, SkBitmap> ConstrainBitmapsToSizes(
52      const std::vector<SkBitmap>& bitmaps,
53      const std::set<int>& sizes);
54
55  // Adds a square container icon of |output_size| pixels to |bitmaps| by
56  // drawing the given |letter| into a rounded background of |color|.
57  // Does nothing if an icon of |output_size| already exists in |bitmaps|.
58  static void GenerateIcon(std::map<int, SkBitmap>* bitmaps,
59                           int output_size,
60                           SkColor color,
61                           char letter);
62
63  // Begins the asynchronous bookmark app creation.
64  void Create(const CreateBookmarkAppCallback& callback);
65
66 private:
67  friend class TestBookmarkAppHelper;
68
69  // Performs post icon download tasks including installing the bookmark app.
70  void OnIconsDownloaded(bool success,
71                         const std::map<GURL, std::vector<SkBitmap> >& bitmaps);
72
73  // Overridden from content::NotificationObserver:
74  virtual void Observe(int type,
75                       const content::NotificationSource& source,
76                       const content::NotificationDetails& details) OVERRIDE;
77
78  // The WebApplicationInfo that the bookmark app is being created for.
79  WebApplicationInfo web_app_info_;
80
81  // Called on app creation or failure.
82  CreateBookmarkAppCallback callback_;
83
84  // Downloads icons from the given WebApplicationInfo using the given
85  // WebContents.
86  scoped_ptr<FaviconDownloader> favicon_downloader_;
87
88  // Used to install the created bookmark app.
89  scoped_refptr<extensions::CrxInstaller> crx_installer_;
90
91  content::NotificationRegistrar registrar_;
92};
93
94// Creates or updates a bookmark app from the given |web_app_info|. Icons will
95// not be downloaded so only supplied icon data will be used.
96void CreateOrUpdateBookmarkApp(ExtensionService* service,
97                               WebApplicationInfo& web_app_info);
98
99// Retrieves the WebApplicationInfo that represents a given bookmark app.
100// |callback| will be called with a WebApplicationInfo which is populated with
101// the extension's details and icons on success and an unpopulated
102// WebApplicationInfo on failure.
103void GetWebApplicationInfoFromApp(
104    content::BrowserContext* browser_context,
105    const extensions::Extension* extension,
106    const base::Callback<void(const WebApplicationInfo&)> callback);
107
108// Returns whether the given |url| is a valid bookmark app url.
109bool IsValidBookmarkAppUrl(const GURL& url);
110
111}  // namespace extensions
112
113#endif  // CHROME_BROWSER_EXTENSIONS_BOOKMARK_APP_HELPER_H_
114