Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(111)

Side by Side Diff: chrome/browser/android/banners/app_banner_manager.cc

Issue 884623003: Suppress native app install banner if the site has a manifest. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698