Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/android/banners/app_banner_manager.h" | 5 #include "chrome/browser/android/banners/app_banner_manager.h" |
| 6 | 6 |
| 7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
| 8 #include "base/android/jni_string.h" | 8 #include "base/android/jni_string.h" |
| 9 #include "base/bind.h" | |
| 9 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 10 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
| 11 #include "chrome/browser/android/banners/app_banner_metrics_ids.h" | 12 #include "chrome/browser/android/banners/app_banner_metrics_ids.h" |
| 12 #include "chrome/browser/android/banners/app_banner_settings_helper.h" | 13 #include "chrome/browser/android/banners/app_banner_settings_helper.h" |
| 13 #include "chrome/browser/android/banners/app_banner_utilities.h" | 14 #include "chrome/browser/android/banners/app_banner_utilities.h" |
| 14 #include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h" | 15 #include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h" |
| 15 #include "chrome/browser/profiles/profile.h" | 16 #include "chrome/browser/profiles/profile.h" |
| 17 #include "chrome/common/chrome_constants.h" | |
| 16 #include "chrome/common/chrome_switches.h" | 18 #include "chrome/common/chrome_switches.h" |
| 19 #include "chrome/common/render_messages.h" | |
| 17 #include "content/public/browser/android/content_view_core.h" | 20 #include "content/public/browser/android/content_view_core.h" |
| 18 #include "content/public/browser/navigation_details.h" | 21 #include "content/public/browser/navigation_details.h" |
| 22 #include "content/public/browser/render_frame_host.h" | |
| 19 #include "content/public/browser/web_contents.h" | 23 #include "content/public/browser/web_contents.h" |
| 20 #include "content/public/common/frame_navigate_params.h" | 24 #include "content/public/common/frame_navigate_params.h" |
| 25 #include "content/public/common/manifest.h" | |
| 21 #include "jni/AppBannerManager_jni.h" | 26 #include "jni/AppBannerManager_jni.h" |
| 22 #include "net/base/load_flags.h" | 27 #include "net/base/load_flags.h" |
| 23 #include "ui/gfx/android/java_bitmap.h" | 28 #include "ui/gfx/android/java_bitmap.h" |
| 24 | 29 |
| 25 using base::android::ConvertJavaStringToUTF8; | 30 using base::android::ConvertJavaStringToUTF8; |
| 26 using base::android::ConvertUTF8ToJavaString; | 31 using base::android::ConvertUTF8ToJavaString; |
| 27 | 32 |
| 28 namespace { | 33 namespace { |
| 29 const char kBannerTag[] = "google-play-id"; | 34 const char kBannerTag[] = "google-play-id"; |
| 30 } | 35 } |
| 31 | 36 |
| 32 namespace banners { | 37 namespace banners { |
| 33 | 38 |
| 34 AppBannerManager::AppBannerManager(JNIEnv* env, jobject obj) | 39 AppBannerManager::AppBannerManager(JNIEnv* env, jobject obj) |
| 35 : MetaTagObserver(kBannerTag), | 40 : weak_java_banner_view_manager_(env, obj) {} |
| 36 weak_java_banner_view_manager_(env, obj) {} | |
| 37 | 41 |
| 38 AppBannerManager::~AppBannerManager() { | 42 AppBannerManager::~AppBannerManager() { |
| 39 } | 43 } |
| 40 | 44 |
| 41 void AppBannerManager::Destroy(JNIEnv* env, jobject obj) { | 45 void AppBannerManager::Destroy(JNIEnv* env, jobject obj) { |
| 42 delete this; | 46 delete this; |
| 43 } | 47 } |
| 44 | 48 |
| 45 void AppBannerManager::BlockBanner(JNIEnv* env, | 49 void AppBannerManager::BlockBanner(JNIEnv* env, |
| 46 jobject obj, | 50 jobject obj, |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 66 const content::LoadCommittedDetails& details, | 70 const content::LoadCommittedDetails& details, |
| 67 const content::FrameNavigateParams& params) { | 71 const content::FrameNavigateParams& params) { |
| 68 // Get rid of the current banner. | 72 // Get rid of the current banner. |
| 69 JNIEnv* env = base::android::AttachCurrentThread(); | 73 JNIEnv* env = base::android::AttachCurrentThread(); |
| 70 ScopedJavaLocalRef<jobject> jobj = weak_java_banner_view_manager_.get(env); | 74 ScopedJavaLocalRef<jobject> jobj = weak_java_banner_view_manager_.get(env); |
| 71 if (jobj.is_null()) | 75 if (jobj.is_null()) |
| 72 return; | 76 return; |
| 73 Java_AppBannerManager_dismissCurrentBanner(env, jobj.obj(), DISMISS_NAVIGATE); | 77 Java_AppBannerManager_dismissCurrentBanner(env, jobj.obj(), DISMISS_NAVIGATE); |
| 74 } | 78 } |
| 75 | 79 |
| 80 void AppBannerManager::DidFinishLoad( | |
| 81 content::RenderFrameHost* render_frame_host, | |
| 82 const GURL& validated_url) { | |
| 83 if (render_frame_host->GetParent()) | |
| 84 return; | |
| 85 validated_url_ = validated_url; | |
| 86 | |
| 87 // See if the page has a manifest. Using Unretained(this) here is safe as the | |
| 88 // lifetime of this object extends beyond the lifetime of the web_contents(), | |
|
benwells
2015/01/28 09:24:23
I'm not absolutely sure of this and didn't get aro
gone
2015/01/28 18:44:13
Yeah, should be fine. The native AppBannerManager
| |
| 89 // and when web_contents() is destroyed it will call OnDidGetManifest. | |
| 90 web_contents()->GetManifest(base::Bind(&AppBannerManager::OnDidGetManifest, | |
| 91 base::Unretained(this))); | |
| 92 } | |
| 93 | |
| 94 void AppBannerManager::OnDidGetManifest(const content::Manifest& manifest) { | |
| 95 if (web_contents()->IsBeingDestroyed()) | |
| 96 return; | |
| 97 | |
| 98 if (manifest.IsEmpty()) { | |
| 99 // No manifest, see if there is a play store meta tag. | |
| 100 Send(new ChromeViewMsg_RetrieveMetaTagContent(routing_id(), | |
| 101 validated_url_, | |
| 102 kBannerTag)); | |
| 103 return; | |
| 104 } | |
| 105 | |
| 106 // TODO(benwells): Check triggering parameters here and if there is a meta | |
| 107 // tag. | |
| 108 // TODO(dfalcantara): Show banner for web site with manifest. | |
|
benwells
2015/01/28 09:24:23
I expect this TODO to move around.
| |
| 109 } | |
| 110 | |
| 111 bool AppBannerManager::OnMessageReceived(const IPC::Message& message) { | |
| 112 bool handled = true; | |
| 113 IPC_BEGIN_MESSAGE_MAP(AppBannerManager, message) | |
| 114 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidRetrieveMetaTagContent, | |
| 115 OnDidRetrieveMetaTagContent) | |
| 116 IPC_MESSAGE_UNHANDLED(handled = false) | |
| 117 IPC_END_MESSAGE_MAP() | |
| 118 return handled; | |
| 119 } | |
| 120 | |
| 76 void AppBannerManager::OnFetchComplete(const GURL url, const SkBitmap* bitmap) { | 121 void AppBannerManager::OnFetchComplete(const GURL url, const SkBitmap* bitmap) { |
| 77 if (bitmap) { | 122 if (bitmap) { |
| 78 JNIEnv* env = base::android::AttachCurrentThread(); | 123 JNIEnv* env = base::android::AttachCurrentThread(); |
| 79 | 124 |
| 80 ScopedJavaLocalRef<jobject> jobj = weak_java_banner_view_manager_.get(env); | 125 ScopedJavaLocalRef<jobject> jobj = weak_java_banner_view_manager_.get(env); |
| 81 if (jobj.is_null()) | 126 if (jobj.is_null()) |
| 82 return; | 127 return; |
| 83 | 128 |
| 84 ScopedJavaLocalRef<jstring> jimage_url( | 129 ScopedJavaLocalRef<jstring> jimage_url( |
| 85 ConvertUTF8ToJavaString(env, url.spec())); | 130 ConvertUTF8ToJavaString(env, url.spec())); |
| 86 ScopedJavaLocalRef<jobject> jimage = gfx::ConvertToJavaBitmap(bitmap); | 131 ScopedJavaLocalRef<jobject> jimage = gfx::ConvertToJavaBitmap(bitmap); |
| 87 bool displayed = Java_AppBannerManager_createBanner(env, | 132 bool displayed = Java_AppBannerManager_createBanner(env, |
| 88 jobj.obj(), | 133 jobj.obj(), |
| 89 jimage_url.obj(), | 134 jimage_url.obj(), |
| 90 jimage.obj()); | 135 jimage.obj()); |
| 91 if (displayed) | 136 if (displayed) |
| 92 banners::TrackDisplayEvent(DISPLAY_CREATED); | 137 banners::TrackDisplayEvent(DISPLAY_CREATED); |
| 93 } else { | 138 } else { |
| 94 DVLOG(1) << "Failed to retrieve image: " << url; | 139 DVLOG(1) << "Failed to retrieve image: " << url; |
| 95 } | 140 } |
| 96 | 141 |
| 97 fetcher_.reset(); | 142 fetcher_.reset(); |
| 98 } | 143 } |
| 99 | 144 |
| 100 void AppBannerManager::HandleMetaTagContent(const std::string& tag_content, | 145 void AppBannerManager::OnDidRetrieveMetaTagContent( |
| 101 const GURL& expected_url) { | 146 bool success, |
| 147 const std::string& tag_name, | |
| 148 const std::string& tag_content, | |
| 149 const GURL& expected_url) { | |
| 102 DCHECK(web_contents()); | 150 DCHECK(web_contents()); |
| 151 if (!success || tag_name != kBannerTag || validated_url_ != expected_url || | |
| 152 tag_content.size() >= chrome::kMaxMetaTagAttributeLength) { | |
| 153 return; | |
| 154 } | |
| 155 | |
| 103 banners::TrackDisplayEvent(DISPLAY_BANNER_REQUESTED); | 156 banners::TrackDisplayEvent(DISPLAY_BANNER_REQUESTED); |
| 104 | 157 |
| 105 if (!AppBannerSettingsHelper::IsAllowed(web_contents(), | 158 if (!AppBannerSettingsHelper::IsAllowed(web_contents(), |
| 106 expected_url, | 159 expected_url, |
| 107 tag_content)) { | 160 tag_content)) { |
| 108 return; | 161 return; |
| 109 } | 162 } |
| 110 | 163 |
| 111 // Send the info to the Java side to get info about the app. | 164 // Send the info to the Java side to get info about the app. |
| 112 JNIEnv* env = base::android::AttachCurrentThread(); | 165 JNIEnv* env = base::android::AttachCurrentThread(); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 160 return base::CommandLine::ForCurrentProcess()->HasSwitch( | 213 return base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 161 switches::kEnableAppInstallAlerts); | 214 switches::kEnableAppInstallAlerts); |
| 162 } | 215 } |
| 163 | 216 |
| 164 // Register native methods | 217 // Register native methods |
| 165 bool RegisterAppBannerManager(JNIEnv* env) { | 218 bool RegisterAppBannerManager(JNIEnv* env) { |
| 166 return RegisterNativesImpl(env); | 219 return RegisterNativesImpl(env); |
| 167 } | 220 } |
| 168 | 221 |
| 169 } // namespace banners | 222 } // namespace banners |
| OLD | NEW |