Index: chrome/browser/android/banners/app_banner_manager.h |
diff --git a/chrome/browser/android/banners/app_banner_manager.h b/chrome/browser/android/banners/app_banner_manager.h |
index 1218cce5ca18c0ad33f15c349b9ddf2a611e7c4c..648db94869f806a86cb532899ab8f1994bc7512c 100644 |
--- a/chrome/browser/android/banners/app_banner_manager.h |
+++ b/chrome/browser/android/banners/app_banner_manager.h |
@@ -9,6 +9,7 @@ |
#include "base/android/jni_helper.h" |
#include "base/memory/scoped_ptr.h" |
#include "chrome/browser/android/meta_tag_observer.h" |
+#include "chrome/browser/bitmap_fetcher.h" |
namespace content { |
struct FrameNavigateParams; |
@@ -22,8 +23,38 @@ struct LoadCommittedDetails; |
* Monitors at most one package at a time, and tracks the info for the |
* most recent app that was requested. Any work in progress for other apps is |
* discarded. |
+ * |
+ * The procedure for creating a banner spans multiple asynchronous calls across |
+ * the JNI boundary, as well as querying a Service to get info about the app. |
+ * |
+ * 0) A navigation of the main frame is triggered. Upon completion of the load, |
+ * the page is parsed for the correct meta tag. If it doesn't exist, abort. |
+ * |
+ * 1) The AppBannerManager is alerted about the tag's contents, which should |
+ * be the Play Store package name. This is sent to the Java side |
+ * AppBannerManager. |
+ * |
+ * 2) The AppBannerManager's ServiceDelegate is asynchronously queried about the |
+ * package name. |
+ * |
+ * 3) At some point, the Java-side AppBannerManager is alerted of the completed |
+ * query and is given back data about the requested package, which includes a |
+ * URL for the app's icon. This URL is sent to native code for retrieval. |
+ * |
+ * 4) The process of fetching the icon begins by invoking the BitmapFetcher, |
+ * which works asynchonously. |
+ * |
+ * 5) Once the icon has been downloaded, the icon is sent to the Java-side |
+ * AppBannerManager to (finally) create a AppBannerView, assuming that the |
+ * app we retrieved the details for is still for the page that requested it. |
+ * |
+ * Because of the asynchronous nature of this pipeline, it's entirely possible |
+ * that a request to show a banner is interrupted by another request. The |
+ * Java side manages what happens in these situations, which will usually result |
+ * in dropping the old banner request on the floor. |
*/ |
-class AppBannerManager : public MetaTagObserver { |
+class AppBannerManager : public chrome::BitmapFetcherDelegate, |
+ public MetaTagObserver { |
public: |
AppBannerManager(JNIEnv* env, jobject obj); |
virtual ~AppBannerManager(); |
@@ -31,22 +62,38 @@ class AppBannerManager : public MetaTagObserver { |
// Destroys the AppBannerManager. |
void Destroy(JNIEnv* env, jobject obj); |
+ // Blocks a banner for |package_name| from appearing on the domain for |url|. |
+ void BlockBanner(JNIEnv* env, jobject obj, jstring jurl, jstring jpackage); |
+ |
// Observes a new WebContents, if necessary. |
void ReplaceWebContents(JNIEnv* env, |
jobject obj, |
jobject jweb_contents); |
+ // Fetches the given icon for the package. |
+ void FetchIcon(JNIEnv* env, |
+ jobject obj, |
+ jstring jpage_url, |
+ jstring jimage_url); |
+ |
// WebContentsObserver overrides. |
virtual void DidNavigateMainFrame( |
const content::LoadCommittedDetails& details, |
const content::FrameNavigateParams& params) OVERRIDE; |
+ // BitmapFetcherDelegate overrides. |
+ virtual void OnFetchComplete(const GURL url, const SkBitmap* bitmap) OVERRIDE; |
+ |
private: |
// Kicks off the process of showing a banner for the package designated by |
// |tag_content| on the page at the |expected_url|. |
virtual void HandleMetaTagContent(const std::string& tag_content, |
const GURL& expected_url) OVERRIDE; |
+ // Fetches the icon for an app. |
+ scoped_ptr<chrome::BitmapFetcher> fetcher_; |
+ |
+ // AppBannerManager on the Java side. |
JavaObjectWeakGlobalRef weak_java_banner_view_manager_; |
DISALLOW_COPY_AND_ASSIGN(AppBannerManager); |