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 |