12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef ANDROID_WEBVIEW_BROWSER_ICON_HELPER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define ANDROID_WEBVIEW_BROWSER_ICON_HELPER_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/containers/hash_tables.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "url/gurl.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SkBitmap;
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct FaviconURL;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace gfx {
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class Size;
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace android_webview {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A helper that observes favicon changes for Webview.
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class IconHelper : public content::WebContentsObserver {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class Listener {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    virtual bool ShouldDownloadFavicon(const GURL& icon_url) = 0;
31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    virtual void OnReceivedIcon(const GURL& icon_url,
32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                const SkBitmap& bitmap) = 0;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void OnReceivedTouchIconUrl(const std::string& url,
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        const bool precomposed) = 0;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   protected:
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~Listener() {}
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit IconHelper(content::WebContents* web_contents);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~IconHelper();
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetListener(Listener* listener);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // From WebContentsObserver
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void DidUpdateFaviconURL(
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::vector<content::FaviconURL>& candidates) OVERRIDE;
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void DidStartNavigationToPendingEntry(
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const GURL& url,
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      content::NavigationController::ReloadType reload_type) OVERRIDE;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void DownloadFaviconCallback(
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      int id,
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      int http_status_code,
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      const GURL& image_url,
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      const std::vector<SkBitmap>& bitmaps,
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      const std::vector<gfx::Size>& original_bitmap_sizes);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void MarkUnableToDownloadFavicon(const GURL& icon_url);
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool WasUnableToDownloadFavicon(const GURL& icon_url) const;
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void ClearUnableToDownloadFavicons();
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Listener* listener_;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  typedef uint32 MissingFaviconURLHash;
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::hash_set<MissingFaviconURLHash> missing_favicon_urls_;
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IconHelper);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace android_webview
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // ANDROID_WEBVIEW_BROWSER_ICON_HELPER_H_
74