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