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

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

Issue 2259553002: Make AppBannerInfoBar install WebAPK. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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_infobar_delegate_android.h" 5 #include "chrome/browser/android/banners/app_banner_infobar_delegate_android.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/guid.h" 9 #include "base/guid.h"
10 #include "base/location.h" 10 #include "base/location.h"
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/strings/string16.h" 12 #include "base/strings/string16.h"
13 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
14 #include "chrome/browser/android/shortcut_helper.h" 14 #include "chrome/browser/android/shortcut_helper.h"
15 #include "chrome/browser/android/shortcut_info.h" 15 #include "chrome/browser/android/shortcut_info.h"
16 #include "chrome/browser/android/tab_android.h" 16 #include "chrome/browser/android/tab_android.h"
17 #include "chrome/browser/banners/app_banner_manager.h" 17 #include "chrome/browser/banners/app_banner_manager.h"
18 #include "chrome/browser/banners/app_banner_metrics.h" 18 #include "chrome/browser/banners/app_banner_metrics.h"
19 #include "chrome/browser/banners/app_banner_settings_helper.h" 19 #include "chrome/browser/banners/app_banner_settings_helper.h"
20 #include "chrome/browser/browser_process.h" 20 #include "chrome/browser/browser_process.h"
21 #include "chrome/browser/infobars/infobar_service.h" 21 #include "chrome/browser/infobars/infobar_service.h"
22 #include "chrome/browser/ui/android/infobars/app_banner_infobar_android.h" 22 #include "chrome/browser/ui/android/infobars/app_banner_infobar_android.h"
23 #include "chrome/common/render_messages.h" 23 #include "chrome/common/render_messages.h"
24 #include "chrome/grit/generated_resources.h" 24 #include "chrome/grit/generated_resources.h"
25 #include "components/rappor/rappor_utils.h" 25 #include "components/rappor/rappor_utils.h"
26 #include "content/public/browser/browser_thread.h"
26 #include "content/public/browser/render_frame_host.h" 27 #include "content/public/browser/render_frame_host.h"
27 #include "content/public/browser/web_contents.h" 28 #include "content/public/browser/web_contents.h"
28 #include "content/public/common/manifest.h" 29 #include "content/public/common/manifest.h"
29 #include "jni/AppBannerInfoBarDelegateAndroid_jni.h" 30 #include "jni/AppBannerInfoBarDelegateAndroid_jni.h"
30 #include "ui/gfx/android/java_bitmap.h" 31 #include "ui/gfx/android/java_bitmap.h"
31 #include "url/gurl.h" 32 #include "url/gurl.h"
32 33
33 using base::android::ConvertJavaStringToUTF8; 34 using base::android::ConvertJavaStringToUTF8;
34 using base::android::ConvertJavaStringToUTF16; 35 using base::android::ConvertJavaStringToUTF16;
35 using base::android::ConvertUTF8ToJavaString; 36 using base::android::ConvertUTF8ToJavaString;
36 using base::android::ConvertUTF16ToJavaString; 37 using base::android::ConvertUTF16ToJavaString;
37 using base::android::JavaParamRef; 38 using base::android::JavaParamRef;
38 using base::android::ScopedJavaLocalRef; 39 using base::android::ScopedJavaLocalRef;
39 40
40 namespace banners { 41 namespace banners {
41 42
42 AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid( 43 AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid(
43 base::WeakPtr<AppBannerManager> weak_manager, 44 base::WeakPtr<AppBannerManager> weak_manager,
44 const base::string16& app_title, 45 const base::string16& app_title,
45 const GURL& manifest_url, 46 const GURL& manifest_url,
46 const content::Manifest& manifest, 47 const content::Manifest& manifest,
47 const GURL& icon_url, 48 const GURL& icon_url,
48 std::unique_ptr<SkBitmap> icon, 49 std::unique_ptr<SkBitmap> icon,
49 int event_request_id) 50 int event_request_id,
51 bool is_webapk)
50 : weak_manager_(weak_manager), 52 : weak_manager_(weak_manager),
51 app_title_(app_title), 53 app_title_(app_title),
52 manifest_url_(manifest_url), 54 manifest_url_(manifest_url),
53 manifest_(manifest), 55 manifest_(manifest),
54 icon_url_(icon_url), 56 icon_url_(icon_url),
55 icon_(std::move(icon)), 57 icon_(std::move(icon)),
56 event_request_id_(event_request_id), 58 event_request_id_(event_request_id),
57 has_user_interaction_(false) { 59 has_user_interaction_(false),
60 is_webapk_(is_webapk) {
58 DCHECK(!manifest.IsEmpty()); 61 DCHECK(!manifest.IsEmpty());
59 CreateJavaDelegate(); 62 CreateJavaDelegate();
60 } 63 }
61 64
62 AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid( 65 AppBannerInfoBarDelegateAndroid::AppBannerInfoBarDelegateAndroid(
63 const base::string16& app_title, 66 const base::string16& app_title,
64 const base::android::ScopedJavaGlobalRef<jobject>& native_app_data, 67 const base::android::ScopedJavaGlobalRef<jobject>& native_app_data,
65 std::unique_ptr<SkBitmap> icon, 68 std::unique_ptr<SkBitmap> icon,
66 const std::string& native_app_package, 69 const std::string& native_app_package,
67 const std::string& referrer, 70 const std::string& referrer,
68 int event_request_id) 71 int event_request_id)
69 : app_title_(app_title), 72 : app_title_(app_title),
70 native_app_data_(native_app_data), 73 native_app_data_(native_app_data),
71 icon_(std::move(icon)), 74 icon_(std::move(icon)),
72 native_app_package_(native_app_package), 75 native_app_package_(native_app_package),
73 referrer_(referrer), 76 referrer_(referrer),
74 event_request_id_(event_request_id), 77 event_request_id_(event_request_id),
75 has_user_interaction_(false) { 78 has_user_interaction_(false) {
76 DCHECK(!native_app_data_.is_null()); 79 DCHECK(!native_app_data_.is_null());
77 CreateJavaDelegate(); 80 CreateJavaDelegate();
78 } 81 }
79 82
80 AppBannerInfoBarDelegateAndroid::~AppBannerInfoBarDelegateAndroid() { 83 AppBannerInfoBarDelegateAndroid::~AppBannerInfoBarDelegateAndroid() {
81 if (!has_user_interaction_) { 84 if (!has_user_interaction_) {
82 if (!native_app_data_.is_null()) 85 if (!native_app_data_.is_null())
83 TrackUserResponse(USER_RESPONSE_NATIVE_APP_IGNORED); 86 TrackUserResponse(USER_RESPONSE_NATIVE_APP_IGNORED);
87 else if (is_webapk_)
88 TrackUserResponse(USER_RESPONSE_WEBAPK_IGNORED);
84 else if (!manifest_.IsEmpty()) 89 else if (!manifest_.IsEmpty())
85 TrackUserResponse(USER_RESPONSE_WEB_APP_IGNORED); 90 TrackUserResponse(USER_RESPONSE_WEB_APP_IGNORED);
86 } 91 }
87 92
88 TrackDismissEvent(DISMISS_EVENT_DISMISSED); 93 TrackDismissEvent(DISMISS_EVENT_DISMISSED);
89 JNIEnv* env = base::android::AttachCurrentThread(); 94 JNIEnv* env = base::android::AttachCurrentThread();
90 Java_AppBannerInfoBarDelegateAndroid_destroy(env, java_delegate_); 95 Java_AppBannerInfoBarDelegateAndroid_destroy(env, java_delegate_);
91 java_delegate_.Reset(); 96 java_delegate_.Reset();
92 } 97 }
93 98
94 void AppBannerInfoBarDelegateAndroid::UpdateInstallState( 99 void AppBannerInfoBarDelegateAndroid::UpdateInstallState(
95 JNIEnv* env, 100 JNIEnv* env,
96 const JavaParamRef<jobject>& obj) { 101 const JavaParamRef<jobject>& obj) {
97 if (native_app_data_.is_null()) 102 if (native_app_data_.is_null() && !is_webapk_)
98 return; 103 return;
99 104
100 int newState = Java_AppBannerInfoBarDelegateAndroid_determineInstallState( 105 int newState = Java_AppBannerInfoBarDelegateAndroid_determineInstallState(
101 env, java_delegate_, native_app_data_); 106 env, java_delegate_, native_app_data_);
102 static_cast<AppBannerInfoBarAndroid*>(infobar()) 107 static_cast<AppBannerInfoBarAndroid*>(infobar())
103 ->OnInstallStateChanged(newState); 108 ->OnInstallStateChanged(newState);
104 } 109 }
105 110
106 void AppBannerInfoBarDelegateAndroid::OnInstallIntentReturned( 111 void AppBannerInfoBarDelegateAndroid::OnInstallIntentReturned(
107 JNIEnv* env, 112 JNIEnv* env,
(...skipping 25 matching lines...) Expand all
133 } 138 }
134 139
135 void AppBannerInfoBarDelegateAndroid::OnInstallFinished( 140 void AppBannerInfoBarDelegateAndroid::OnInstallFinished(
136 JNIEnv* env, 141 JNIEnv* env,
137 const JavaParamRef<jobject>& obj, 142 const JavaParamRef<jobject>& obj,
138 jboolean success) { 143 jboolean success) {
139 if (!infobar()) 144 if (!infobar())
140 return; 145 return;
141 146
142 if (success) { 147 if (success) {
143 TrackInstallEvent(INSTALL_EVENT_NATIVE_APP_INSTALL_COMPLETED); 148 if (!is_webapk_) {
149 TrackInstallEvent(INSTALL_EVENT_NATIVE_APP_INSTALL_COMPLETED);
150 } else {
151 TrackInstallEvent(INSTALL_EVENT_WEBAPK_INSTALL_COMPLETED);
152 Java_AppBannerInfoBarDelegateAndroid_setWebApkInstallingState(
153 env, java_delegate_, false);
154 }
144 UpdateInstallState(env, obj); 155 UpdateInstallState(env, obj);
145 } else if (infobar()->owner()) { 156 } else if (infobar()->owner()) {
146 TrackDismissEvent(DISMISS_EVENT_INSTALL_TIMEOUT); 157 TrackDismissEvent(DISMISS_EVENT_INSTALL_TIMEOUT);
147 infobar()->owner()->RemoveInfoBar(infobar()); 158 infobar()->owner()->RemoveInfoBar(infobar());
148 } 159 }
149 } 160 }
150 161
162 bool AppBannerInfoBarDelegateAndroid::CloseAppBannerInfobarIfNeeded(
163 JNIEnv* env, const JavaParamRef<jobject>& obj) {
164 if (webapk_package_name_.empty())
165 return false;
166 ScopedJavaLocalRef<jstring> java_webapk_package_name =
167 base::android::ConvertUTF8ToJavaString(env, webapk_package_name_);
168 bool isInstalled =
169 Java_AppBannerInfoBarDelegateAndroid_isWebApkInstalled(
170 env, java_delegate_, java_webapk_package_name);
171 if (isInstalled)
172 return false;
173 LOG(WARNING) << "Infobar is removed.";
174 TrackUserResponse(USER_RESPONSE_WEBAPK_IGNORED);
175 static_cast<AppBannerInfoBarAndroid*>(infobar())->RemoveSelf();
176 return true;
177 }
178
151 void AppBannerInfoBarDelegateAndroid::CreateJavaDelegate() { 179 void AppBannerInfoBarDelegateAndroid::CreateJavaDelegate() {
152 JNIEnv* env = base::android::AttachCurrentThread(); 180 JNIEnv* env = base::android::AttachCurrentThread();
153 java_delegate_.Reset(Java_AppBannerInfoBarDelegateAndroid_create( 181 java_delegate_.Reset(Java_AppBannerInfoBarDelegateAndroid_create(
154 env, 182 env,
155 reinterpret_cast<intptr_t>(this))); 183 reinterpret_cast<intptr_t>(this)));
156 } 184 }
157 185
158 void AppBannerInfoBarDelegateAndroid::SendBannerAccepted( 186 void AppBannerInfoBarDelegateAndroid::SendBannerAccepted(
159 content::WebContents* web_contents, 187 content::WebContents* web_contents,
160 const std::string& platform) { 188 const std::string& platform) {
(...skipping 24 matching lines...) Expand all
185 web_contents->GetMainFrame()->Send( 213 web_contents->GetMainFrame()->Send(
186 new ChromeViewMsg_AppBannerDismissed( 214 new ChromeViewMsg_AppBannerDismissed(
187 web_contents->GetMainFrame()->GetRoutingID(), 215 web_contents->GetMainFrame()->GetRoutingID(),
188 event_request_id_)); 216 event_request_id_));
189 217
190 if (!native_app_data_.is_null()) { 218 if (!native_app_data_.is_null()) {
191 TrackUserResponse(USER_RESPONSE_NATIVE_APP_DISMISSED); 219 TrackUserResponse(USER_RESPONSE_NATIVE_APP_DISMISSED);
192 AppBannerSettingsHelper::RecordBannerDismissEvent( 220 AppBannerSettingsHelper::RecordBannerDismissEvent(
193 web_contents, native_app_package_, AppBannerSettingsHelper::NATIVE); 221 web_contents, native_app_package_, AppBannerSettingsHelper::NATIVE);
194 } else if (!manifest_.IsEmpty()) { 222 } else if (!manifest_.IsEmpty()) {
195 TrackUserResponse(USER_RESPONSE_WEB_APP_DISMISSED); 223 if (is_webapk_) {
196 AppBannerSettingsHelper::RecordBannerDismissEvent( 224 TrackUserResponse(USER_RESPONSE_WEBAPK_DISMISSED);
197 web_contents, manifest_.start_url.spec(), 225 AppBannerSettingsHelper::RecordBannerDismissEvent(
198 AppBannerSettingsHelper::WEB); 226 web_contents, manifest_.start_url.spec(),
227 AppBannerSettingsHelper::WEBAPK);
228 } else {
229 TrackUserResponse(USER_RESPONSE_WEB_APP_DISMISSED);
230 AppBannerSettingsHelper::RecordBannerDismissEvent(
231 web_contents, manifest_.start_url.spec(),
232 AppBannerSettingsHelper::WEB);
233 }
199 } 234 }
200 } 235 }
201 236
202 base::string16 AppBannerInfoBarDelegateAndroid::GetMessageText() const { 237 base::string16 AppBannerInfoBarDelegateAndroid::GetMessageText() const {
203 return app_title_; 238 return app_title_;
204 } 239 }
205 240
206 int AppBannerInfoBarDelegateAndroid::GetButtons() const { 241 int AppBannerInfoBarDelegateAndroid::GetButtons() const {
207 return BUTTON_OK; 242 return BUTTON_OK;
208 } 243 }
209 244
210 bool AppBannerInfoBarDelegateAndroid::Accept() { 245 bool AppBannerInfoBarDelegateAndroid::Accept() {
211 has_user_interaction_ = true; 246 has_user_interaction_ = true;
212 247
213 content::WebContents* web_contents = 248 content::WebContents* web_contents =
214 InfoBarService::WebContentsFromInfoBar(infobar()); 249 InfoBarService::WebContentsFromInfoBar(infobar());
215 if (!web_contents) { 250 if (!web_contents) {
216 TrackDismissEvent(DISMISS_EVENT_ERROR); 251 TrackDismissEvent(DISMISS_EVENT_ERROR);
217 return true; 252 return true;
218 } 253 }
219 254
220 if (!native_app_data_.is_null()) { 255 if (!native_app_data_.is_null()) {
221 TrackUserResponse(USER_RESPONSE_NATIVE_APP_ACCEPTED); 256 return AcceptNativeApp(web_contents);
222 JNIEnv* env = base::android::AttachCurrentThread(); 257 } else if (is_webapk_) {
258 return AcceptWebApk(web_contents);
259 }
260 return AcceptWebApp(web_contents);
261 }
223 262
224 TabAndroid* tab = TabAndroid::FromWebContents(web_contents); 263 bool AppBannerInfoBarDelegateAndroid::AcceptNativeApp(
225 if (tab == nullptr) { 264 content::WebContents* web_contents) {
226 TrackDismissEvent(DISMISS_EVENT_ERROR); 265 TrackUserResponse(USER_RESPONSE_NATIVE_APP_ACCEPTED);
227 return true; 266 JNIEnv* env = base::android::AttachCurrentThread();
228 }
229 ScopedJavaLocalRef<jstring> jreferrer(
230 ConvertUTF8ToJavaString(env, referrer_));
231 267
232 bool was_opened = 268 TabAndroid* tab = TabAndroid::FromWebContents(web_contents);
233 Java_AppBannerInfoBarDelegateAndroid_installOrOpenNativeApp( 269 if (tab == nullptr) {
234 env, java_delegate_, tab->GetJavaObject(), native_app_data_, 270 TrackDismissEvent(DISMISS_EVENT_ERROR);
235 jreferrer); 271 return true;
272 }
273 ScopedJavaLocalRef<jstring> jreferrer(
274 ConvertUTF8ToJavaString(env, referrer_));
236 275
237 if (was_opened) { 276 bool was_opened =
238 TrackDismissEvent(DISMISS_EVENT_APP_OPEN); 277 Java_AppBannerInfoBarDelegateAndroid_installOrOpenNativeApp(
239 } else { 278 env, java_delegate_, tab->GetJavaObject(),
240 TrackInstallEvent(INSTALL_EVENT_NATIVE_APP_INSTALL_TRIGGERED); 279 native_app_data_, jreferrer);
241 } 280
242 SendBannerAccepted(web_contents, "play"); 281 if (was_opened) {
243 return was_opened; 282 TrackDismissEvent(DISMISS_EVENT_APP_OPEN);
244 } else if (!manifest_.IsEmpty()) { 283 } else {
245 TrackUserResponse(USER_RESPONSE_WEB_APP_ACCEPTED); 284 TrackInstallEvent(INSTALL_EVENT_NATIVE_APP_INSTALL_TRIGGERED);
285 }
286 SendBannerAccepted(web_contents, "play");
287 return was_opened;
288 }
289
290 bool AppBannerInfoBarDelegateAndroid::AcceptWebApp(
291 content::WebContents* web_contents) {
292 if (manifest_.IsEmpty())
293 return true;
294 TrackUserResponse(USER_RESPONSE_WEB_APP_ACCEPTED);
295
296 AppBannerSettingsHelper::RecordBannerInstallEvent(
297 web_contents, manifest_.start_url.spec(),
298 AppBannerSettingsHelper::WEB);
299
300 if (weak_manager_) {
301 ShortcutInfo info(GURL::EmptyGURL());
302 info.UpdateFromManifest(manifest_);
303 info.manifest_url = manifest_url_;
304 info.icon_url = icon_url_;
305 info.UpdateSource(ShortcutInfo::SOURCE_APP_BANNER);
306
307 const std::string& uid = base::GenerateGUID();
308 ShortcutHelper::AddToLauncherWithSkBitmap(
309 web_contents->GetBrowserContext(), info, uid, *icon_.get(),
310 weak_manager_->FetchWebappSplashScreenImageCallback(uid));
311 }
312
313 SendBannerAccepted(web_contents, "web");
314 return true;
315 }
316
317 bool AppBannerInfoBarDelegateAndroid::AcceptWebApk(
318 content::WebContents* web_contents) {
319 if (manifest_.IsEmpty())
320 return true;
321
322 JNIEnv* env = base::android::AttachCurrentThread();
323 // Request install the WebAPK.
324 if (webapk_package_name_.empty()) {
325 TrackUserResponse(USER_RESPONSE_WEBAPK_ACCEPTED);
246 326
247 AppBannerSettingsHelper::RecordBannerInstallEvent( 327 AppBannerSettingsHelper::RecordBannerInstallEvent(
248 web_contents, manifest_.start_url.spec(), 328 web_contents, manifest_.start_url.spec(),
249 AppBannerSettingsHelper::WEB); 329 AppBannerSettingsHelper::WEBAPK);
250 330
251 if (weak_manager_) { 331 ShortcutInfo info(GURL::EmptyGURL());
252 ShortcutInfo info(GURL::EmptyGURL()); 332 info.UpdateFromManifest(manifest_);
253 info.UpdateFromManifest(manifest_); 333 info.manifest_url = manifest_url_;
254 info.manifest_url = manifest_url_; 334 info.icon_url = icon_url_;
255 info.icon_url = icon_url_; 335 info.UpdateSource(ShortcutInfo::SOURCE_APP_BANNER);
256 info.UpdateSource(ShortcutInfo::SOURCE_APP_BANNER);
257 336
258 const std::string& uid = base::GenerateGUID(); 337 Java_AppBannerInfoBarDelegateAndroid_setWebApkInstallingState(
259 ShortcutHelper::AddToLauncherWithSkBitmap( 338 env, java_delegate_, true);
260 web_contents->GetBrowserContext(), info, uid, *icon_.get(), 339 UpdateInstallState(env, nullptr);
261 weak_manager_->FetchWebappSplashScreenImageCallback(uid)); 340
262 } 341 ShortcutHelper::WebApkPackageNameAvailableCallback callback =
342 base::Bind(
343 &AppBannerInfoBarDelegateAndroid::OnWebApkPackageNameAvailable,
344 base::Unretained(this));
345 ShortcutHelper::InstallWebApkWithSkBitmap(
346 web_contents->GetBrowserContext(), info, *icon_.get(), callback);
347 TrackInstallEvent(INSTALL_EVENT_WEBAPK_INSTALL_TRIGGERED);
263 348
264 SendBannerAccepted(web_contents, "web"); 349 SendBannerAccepted(web_contents, "web");
265 return true; 350 return false;
266 } 351 }
267 352
353 // Open the WebAPK.
354 ScopedJavaLocalRef<jstring> java_webapk_package_name =
355 base::android::ConvertUTF8ToJavaString(env, webapk_package_name_);
356 Java_AppBannerInfoBarDelegateAndroid_installOrOpenWebApk(
357 env, java_delegate_, java_webapk_package_name);
358
359 SendBannerAccepted(web_contents, "webapk");
268 return true; 360 return true;
269 } 361 }
270 362
363 void AppBannerInfoBarDelegateAndroid::OnWebApkPackageNameAvailable(
364 const std::string& webapk_package_name) {
365 JNIEnv* env = base::android::AttachCurrentThread();
366 if (webapk_package_name.empty()) {
367 content::BrowserThread::PostTask(
368 content::BrowserThread::UI, FROM_HERE,
369 base::Bind(&AppBannerInfoBarDelegateAndroid::RemoveInfoBarOnUIThread,
370 base::Unretained(this)));
371 Java_AppBannerInfoBarDelegateAndroid_showWebApkInstallFailureToast(env);
372 TrackInstallEvent(INSTALL_EVENT_WEBAPK_INSTALL_FAILED);
373 return;
374 }
375 webapk_package_name_ = webapk_package_name;
376 ScopedJavaLocalRef<jstring> java_webapk_package_name =
377 base::android::ConvertUTF8ToJavaString(env, webapk_package_name);
378 Java_AppBannerInfoBarDelegateAndroid_installOrOpenWebApk(
379 env, java_delegate_, java_webapk_package_name);
380 TrackInstallEvent(INSTALL_EVENT_WEBAPK_INSTALL_STARTED);
381 }
382
383 void AppBannerInfoBarDelegateAndroid::RemoveInfoBarOnUIThread() {
384 static_cast<AppBannerInfoBarAndroid*>(infobar())
385 ->RemoveSelf();
386 }
387
271 bool AppBannerInfoBarDelegateAndroid::LinkClicked( 388 bool AppBannerInfoBarDelegateAndroid::LinkClicked(
272 WindowOpenDisposition disposition) { 389 WindowOpenDisposition disposition) {
273 if (native_app_data_.is_null()) 390 if (native_app_data_.is_null())
274 return false; 391 return false;
275 392
276 // Try to show the details for the native app. 393 // Try to show the details for the native app.
277 JNIEnv* env = base::android::AttachCurrentThread(); 394 JNIEnv* env = base::android::AttachCurrentThread();
278 395
279 content::WebContents* web_contents = 396 content::WebContents* web_contents =
280 InfoBarService::WebContentsFromInfoBar(infobar()); 397 InfoBarService::WebContentsFromInfoBar(infobar());
281 TabAndroid* tab = web_contents ? TabAndroid::FromWebContents(web_contents) 398 TabAndroid* tab = web_contents ? TabAndroid::FromWebContents(web_contents)
282 : nullptr; 399 : nullptr;
283 if (tab == nullptr) { 400 if (tab == nullptr) {
284 TrackDismissEvent(DISMISS_EVENT_ERROR); 401 TrackDismissEvent(DISMISS_EVENT_ERROR);
285 return true; 402 return true;
286 } 403 }
287 404
288 Java_AppBannerInfoBarDelegateAndroid_showAppDetails( 405 Java_AppBannerInfoBarDelegateAndroid_showAppDetails(
289 env, java_delegate_, tab->GetJavaObject(), native_app_data_); 406 env, java_delegate_, tab->GetJavaObject(), native_app_data_);
290 407
291 TrackDismissEvent(DISMISS_EVENT_BANNER_CLICK); 408 TrackDismissEvent(DISMISS_EVENT_BANNER_CLICK);
292 return true; 409 return true;
293 } 410 }
294 411
295 bool RegisterAppBannerInfoBarDelegateAndroid(JNIEnv* env) { 412 bool RegisterAppBannerInfoBarDelegateAndroid(JNIEnv* env) {
296 return RegisterNativesImpl(env); 413 return RegisterNativesImpl(env);
297 } 414 }
298 415
299 } // namespace banners 416 } // namespace banners
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698