1// Copyright (c) 2013 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 ANDROID_WEBVIEW_BROWSER_ICON_HELPER_H_
6#define ANDROID_WEBVIEW_BROWSER_ICON_HELPER_H_
7
8#include <string>
9#include "base/containers/hash_tables.h"
10#include "content/public/browser/web_contents_observer.h"
11#include "url/gurl.h"
12
13class SkBitmap;
14
15namespace content {
16struct FaviconURL;
17}
18
19namespace gfx {
20class Size;
21}
22
23namespace android_webview {
24
25// A helper that observes favicon changes for Webview.
26class IconHelper : public content::WebContentsObserver {
27 public:
28  class Listener {
29   public:
30    virtual bool ShouldDownloadFavicon(const GURL& icon_url) = 0;
31    virtual void OnReceivedIcon(const GURL& icon_url,
32                                const SkBitmap& bitmap) = 0;
33    virtual void OnReceivedTouchIconUrl(const std::string& url,
34                                        const bool precomposed) = 0;
35   protected:
36    virtual ~Listener() {}
37  };
38
39  explicit IconHelper(content::WebContents* web_contents);
40  virtual ~IconHelper();
41
42  void SetListener(Listener* listener);
43
44  // From WebContentsObserver
45  virtual void DidUpdateFaviconURL(
46      const std::vector<content::FaviconURL>& candidates) OVERRIDE;
47  virtual void DidStartNavigationToPendingEntry(
48      const GURL& url,
49      content::NavigationController::ReloadType reload_type) OVERRIDE;
50
51  void DownloadFaviconCallback(
52      int id,
53      int http_status_code,
54      const GURL& image_url,
55      const std::vector<SkBitmap>& bitmaps,
56      const std::vector<gfx::Size>& original_bitmap_sizes);
57
58 private:
59  void MarkUnableToDownloadFavicon(const GURL& icon_url);
60  bool WasUnableToDownloadFavicon(const GURL& icon_url) const;
61  void ClearUnableToDownloadFavicons();
62
63  Listener* listener_;
64
65  typedef uint32 MissingFaviconURLHash;
66  base::hash_set<MissingFaviconURLHash> missing_favicon_urls_;
67
68  DISALLOW_COPY_AND_ASSIGN(IconHelper);
69};
70
71}  // namespace android_webview
72
73#endif  // ANDROID_WEBVIEW_BROWSER_ICON_HELPER_H_
74