1 // Copyright 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 CHROME_BROWSER_ANDROID_FAVICON_HELPER_H_
6 #define CHROME_BROWSER_ANDROID_FAVICON_HELPER_H_
7 
8 #include <jni.h>
9 
10 #include <memory>
11 
12 #include "base/android/scoped_java_ref.h"
13 #include "base/gtest_prod_util.h"
14 #include "base/macros.h"
15 #include "base/memory/weak_ptr.h"
16 #include "base/task/cancelable_task_tracker.h"
17 #include "components/favicon/core/favicon_service.h"
18 #include "components/favicon_base/favicon_types.h"
19 #include "url/gurl.h"
20 
21 namespace content {
22 class  WebContents;
23 }
24 
25 class Profile;
26 
27 class FaviconHelper {
28  public:
29   FaviconHelper();
30   void Destroy(JNIEnv* env);
31   jboolean GetComposedFaviconImage(
32       JNIEnv* env,
33       const base::android::JavaParamRef<jobject>& j_profile,
34       const base::android::JavaParamRef<jobjectArray>& j_urls,
35       jint j_desired_size_in_pixel,
36       const base::android::JavaParamRef<jobject>& j_favicon_image_callback);
37   jboolean GetLocalFaviconImageForURL(
38       JNIEnv* env,
39       const base::android::JavaParamRef<jobject>& j_profile,
40       const base::android::JavaParamRef<jstring>& j_page_url,
41       jint j_desired_size_in_pixel,
42       const base::android::JavaParamRef<jobject>& j_favicon_image_callback);
43   jboolean GetForeignFaviconImageForURL(
44       JNIEnv* env,
45       const base::android::JavaParamRef<jobject>& jprofile,
46       const base::android::JavaParamRef<jstring>& j_page_url,
47       jint j_desired_size_in_pixel,
48       const base::android::JavaParamRef<jobject>& j_favicon_image_callback);
49 
50   void EnsureIconIsAvailable(
51       JNIEnv* env,
52       const base::android::JavaParamRef<jobject>& j_profile,
53       const base::android::JavaParamRef<jobject>& j_web_contents,
54       const base::android::JavaParamRef<jstring>& j_page_url,
55       const base::android::JavaParamRef<jstring>& j_icon_url,
56       jboolean j_is_large_icon,
57       const base::android::JavaParamRef<jobject>& j_availability_callback);
58   void TouchOnDemandFavicon(
59       JNIEnv* env,
60       const base::android::JavaParamRef<jobject>& j_profile,
61       const base::android::JavaParamRef<jstring>& j_icon_url);
62   void GetLocalFaviconImageForURLInternal(
63       favicon::FaviconService* favicon_service,
64       GURL url,
65       int desired_size_in_pixel,
66       favicon_base::FaviconRawBitmapCallback callback_runner);
67   void GetComposedFaviconImageInternal(
68       favicon::FaviconService* favicon_service,
69       std::vector<std::string> urls,
70       int desired_size_in_pixel,
71       favicon_base::FaviconResultsCallback callback_runner);
72   void OnJobFinished(int job_id);
73 
74  private:
75   FRIEND_TEST_ALL_PREFIXES(FaviconHelperTest, GetLargestSizeIndex);
76 
77   virtual ~FaviconHelper();
78 
79   class Job;
80 
81   static void OnFaviconImageResultAvailable(
82       const base::android::ScopedJavaGlobalRef<jobject>&
83           j_availability_callback,
84       Profile* profile,
85       content::WebContents* web_contents,
86       const GURL& page_url,
87       const GURL& icon_url,
88       favicon_base::IconType icon_type,
89       const favicon_base::FaviconImageResult& result);
90 
91   static void OnFaviconDownloaded(
92       const base::android::ScopedJavaGlobalRef<jobject>&
93           j_availability_callback,
94       Profile* profile,
95       const GURL& page_url,
96       favicon_base::IconType icon_type,
97       int download_request_id,
98       int http_status_code,
99       const GURL& image_url,
100       const std::vector<SkBitmap>& bitmaps,
101       const std::vector<gfx::Size>& original_sizes);
102 
103   static size_t GetLargestSizeIndex(const std::vector<gfx::Size>& sizes);
104 
105   // This function is expected to be bound to a WeakPtr<FaviconHelper>, so that
106   // it won't be run if the FaviconHelper is deleted and
107   // |j_favicon_image_callback| isn't executed in that case.
108   void OnFaviconBitmapResultAvailable(
109       const base::android::JavaRef<jobject>& j_favicon_image_callback,
110       const favicon_base::FaviconRawBitmapResult& result);
111 
112   void OnFaviconBitmapResultsAvailable(
113       const base::android::JavaRef<jobject>& j_favicon_image_callback,
114       const int desired_size_in_pixel,
115       const std::vector<favicon_base::FaviconRawBitmapResult>& result);
116 
117   std::unique_ptr<base::CancelableTaskTracker> cancelable_task_tracker_;
118 
119   std::map<int, std::unique_ptr<Job>> id_to_job_;
120   int last_used_job_id_;
121 
122   base::WeakPtrFactory<FaviconHelper> weak_ptr_factory_{this};
123 
124   DISALLOW_COPY_AND_ASSIGN(FaviconHelper);
125 };
126 
127 #endif  // CHROME_BROWSER_ANDROID_FAVICON_HELPER_H_
128