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

Side by Side Diff: chrome/browser/android/shortcut_helper.cc

Issue 899543003: Break out more manifest parsing logic from ShortcutHelper (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebasing Created 5 years, 10 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/shortcut_helper.h" 5 #include "chrome/browser/android/shortcut_helper.h"
6 6
7 #include <jni.h> 7 #include <jni.h>
8 #include <limits> 8 #include <limits>
9 9
10 #include "base/android/jni_android.h" 10 #include "base/android/jni_android.h"
(...skipping 12 matching lines...) Expand all
23 #include "chrome/common/render_messages.h" 23 #include "chrome/common/render_messages.h"
24 #include "chrome/common/web_application_info.h" 24 #include "chrome/common/web_application_info.h"
25 #include "components/dom_distiller/core/url_utils.h" 25 #include "components/dom_distiller/core/url_utils.h"
26 #include "content/public/browser/user_metrics.h" 26 #include "content/public/browser/user_metrics.h"
27 #include "content/public/browser/web_contents.h" 27 #include "content/public/browser/web_contents.h"
28 #include "content/public/browser/web_contents_observer.h" 28 #include "content/public/browser/web_contents_observer.h"
29 #include "content/public/common/frame_navigate_params.h" 29 #include "content/public/common/frame_navigate_params.h"
30 #include "content/public/common/manifest.h" 30 #include "content/public/common/manifest.h"
31 #include "jni/ShortcutHelper_jni.h" 31 #include "jni/ShortcutHelper_jni.h"
32 #include "net/base/mime_util.h" 32 #include "net/base/mime_util.h"
33 #include "third_party/WebKit/public/platform/WebScreenOrientationLockType.h"
33 #include "ui/gfx/android/java_bitmap.h" 34 #include "ui/gfx/android/java_bitmap.h"
34 #include "ui/gfx/codec/png_codec.h" 35 #include "ui/gfx/codec/png_codec.h"
35 #include "ui/gfx/color_analysis.h" 36 #include "ui/gfx/color_analysis.h"
36 #include "ui/gfx/favicon_size.h" 37 #include "ui/gfx/favicon_size.h"
37 #include "ui/gfx/screen.h" 38 #include "ui/gfx/screen.h"
38 #include "url/gurl.h" 39 #include "url/gurl.h"
39 40
40 using content::Manifest; 41 using content::Manifest;
41 42
42 // Android's preferred icon size in DP is 48, as defined in 43 // Android's preferred icon size in DP is 48, as defined in
43 // http://developer.android.com/design/style/iconography.html 44 // http://developer.android.com/design/style/iconography.html
44 const int ShortcutHelper::kPreferredIconSizeInDp = 48; 45 const int ShortcutHelper::kPreferredIconSizeInDp = 48;
45 46
46 jlong Initialize(JNIEnv* env, jobject obj, jlong tab_android_ptr) { 47 jlong Initialize(JNIEnv* env, jobject obj, jlong tab_android_ptr) {
47 TabAndroid* tab = reinterpret_cast<TabAndroid*>(tab_android_ptr); 48 TabAndroid* tab = reinterpret_cast<TabAndroid*>(tab_android_ptr);
48 49
49 ShortcutHelper* shortcut_helper = 50 ShortcutHelper* shortcut_helper =
50 new ShortcutHelper(env, obj, tab->web_contents()); 51 new ShortcutHelper(env, obj, tab->web_contents());
51 shortcut_helper->Initialize(); 52 shortcut_helper->Initialize();
52 53
53 return reinterpret_cast<intptr_t>(shortcut_helper); 54 return reinterpret_cast<intptr_t>(shortcut_helper);
54 } 55 }
55 56
56 ShortcutHelper::ShortcutHelper(JNIEnv* env, 57 ShortcutHelper::ShortcutHelper(JNIEnv* env,
57 jobject obj, 58 jobject obj,
58 content::WebContents* web_contents) 59 content::WebContents* web_contents)
59 : WebContentsObserver(web_contents), 60 : WebContentsObserver(web_contents),
60 java_ref_(env, obj), 61 java_ref_(env, obj),
61 url_(dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl( 62 shortcut_info_(dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl(
62 web_contents->GetURL())), 63 web_contents->GetURL())),
63 display_(content::Manifest::DISPLAY_MODE_BROWSER),
64 orientation_(blink::WebScreenOrientationLockDefault),
65 add_shortcut_requested_(false), 64 add_shortcut_requested_(false),
66 manifest_icon_status_(MANIFEST_ICON_STATUS_NONE), 65 manifest_icon_status_(MANIFEST_ICON_STATUS_NONE),
67 preferred_icon_size_in_px_(kPreferredIconSizeInDp * 66 preferred_icon_size_in_px_(kPreferredIconSizeInDp *
68 gfx::Screen::GetScreenFor(web_contents->GetNativeView())-> 67 gfx::Screen::GetScreenFor(web_contents->GetNativeView())->
69 GetPrimaryDisplay().device_scale_factor()), 68 GetPrimaryDisplay().device_scale_factor()),
70 weak_ptr_factory_(this) { 69 weak_ptr_factory_(this) {
71 } 70 }
72 71
73 void ShortcutHelper::Initialize() { 72 void ShortcutHelper::Initialize() {
74 // Send a message to the renderer to retrieve information about the page. 73 // Send a message to the renderer to retrieve information about the page.
75 Send(new ChromeViewMsg_GetWebApplicationInfo(routing_id())); 74 Send(new ChromeViewMsg_GetWebApplicationInfo(routing_id()));
76 } 75 }
77 76
78 ShortcutHelper::~ShortcutHelper() { 77 ShortcutHelper::~ShortcutHelper() {
79 } 78 }
80 79
81 void ShortcutHelper::OnDidGetWebApplicationInfo( 80 void ShortcutHelper::OnDidGetWebApplicationInfo(
82 const WebApplicationInfo& received_web_app_info) { 81 const WebApplicationInfo& received_web_app_info) {
83 // Sanitize received_web_app_info. 82 // Sanitize received_web_app_info.
84 WebApplicationInfo web_app_info = received_web_app_info; 83 WebApplicationInfo web_app_info = received_web_app_info;
85 web_app_info.title = 84 web_app_info.title =
86 web_app_info.title.substr(0, chrome::kMaxMetaTagAttributeLength); 85 web_app_info.title.substr(0, chrome::kMaxMetaTagAttributeLength);
87 web_app_info.description = 86 web_app_info.description =
88 web_app_info.description.substr(0, chrome::kMaxMetaTagAttributeLength); 87 web_app_info.description.substr(0, chrome::kMaxMetaTagAttributeLength);
89 88
90 title_ = web_app_info.title.empty() ? web_contents()->GetTitle() 89 shortcut_info_.title = web_app_info.title.empty() ? web_contents()->GetTitle()
91 : web_app_info.title; 90 : web_app_info.title;
92 91
93 if (web_app_info.mobile_capable == WebApplicationInfo::MOBILE_CAPABLE || 92 if (web_app_info.mobile_capable == WebApplicationInfo::MOBILE_CAPABLE ||
94 web_app_info.mobile_capable == WebApplicationInfo::MOBILE_CAPABLE_APPLE) { 93 web_app_info.mobile_capable == WebApplicationInfo::MOBILE_CAPABLE_APPLE) {
95 display_ = content::Manifest::DISPLAY_MODE_STANDALONE; 94 shortcut_info_.display = content::Manifest::DISPLAY_MODE_STANDALONE;
96 } 95 }
97 96
98 // Record what type of shortcut was added by the user. 97 // Record what type of shortcut was added by the user.
99 switch (web_app_info.mobile_capable) { 98 switch (web_app_info.mobile_capable) {
100 case WebApplicationInfo::MOBILE_CAPABLE: 99 case WebApplicationInfo::MOBILE_CAPABLE:
101 content::RecordAction( 100 content::RecordAction(
102 base::UserMetricsAction("webapps.AddShortcut.AppShortcut")); 101 base::UserMetricsAction("webapps.AddShortcut.AppShortcut"));
103 break; 102 break;
104 case WebApplicationInfo::MOBILE_CAPABLE_APPLE: 103 case WebApplicationInfo::MOBILE_CAPABLE_APPLE:
105 content::RecordAction( 104 content::RecordAction(
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 231
233 return url; 232 return url;
234 } 233 }
235 234
236 void ShortcutHelper::OnDidGetManifest(const content::Manifest& manifest) { 235 void ShortcutHelper::OnDidGetManifest(const content::Manifest& manifest) {
237 if (!manifest.IsEmpty()) { 236 if (!manifest.IsEmpty()) {
238 content::RecordAction( 237 content::RecordAction(
239 base::UserMetricsAction("webapps.AddShortcut.Manifest")); 238 base::UserMetricsAction("webapps.AddShortcut.Manifest"));
240 } 239 }
241 240
242 // Set the title based on the manifest value, if any. 241 shortcut_info_.UpdateFromManifest(manifest);
243 if (!manifest.short_name.is_null())
244 title_ = manifest.short_name.string();
245 else if (!manifest.name.is_null())
246 title_ = manifest.name.string();
247
248 // Set the url based on the manifest value, if any.
249 if (manifest.start_url.is_valid())
250 url_ = manifest.start_url;
251
252 // Set the display based on the manifest value, if any.
253 if (manifest.display != content::Manifest::DISPLAY_MODE_UNSPECIFIED)
254 display_ = manifest.display;
255
256 // 'fullscreen' and 'minimal-ui' are not yet supported, fallback to the right
257 // mode in those cases.
258 if (manifest.display == content::Manifest::DISPLAY_MODE_FULLSCREEN)
259 display_ = content::Manifest::DISPLAY_MODE_STANDALONE;
260 if (manifest.display == content::Manifest::DISPLAY_MODE_MINIMAL_UI)
261 display_ = content::Manifest::DISPLAY_MODE_BROWSER;
262
263 // Set the orientation based on the manifest value, if any.
264 if (manifest.orientation != blink::WebScreenOrientationLockDefault) {
265 // Ignore the orientation if the display mode is different from
266 // 'standalone'.
267 // TODO(mlamouri): send a message to the developer console about this.
268 if (display_ == content::Manifest::DISPLAY_MODE_STANDALONE)
269 orientation_ = manifest.orientation;
270 }
271 242
272 GURL icon_src = FindBestMatchingIcon(manifest.icons); 243 GURL icon_src = FindBestMatchingIcon(manifest.icons);
273 if (icon_src.is_valid()) { 244 if (icon_src.is_valid()) {
274 web_contents()->DownloadImage(icon_src, 245 web_contents()->DownloadImage(icon_src,
275 false, 246 false,
276 preferred_icon_size_in_px_, 247 preferred_icon_size_in_px_,
277 base::Bind(&ShortcutHelper::OnDidDownloadIcon, 248 base::Bind(&ShortcutHelper::OnDidDownloadIcon,
278 weak_ptr_factory_.GetWeakPtr())); 249 weak_ptr_factory_.GetWeakPtr()));
279 manifest_icon_status_ = MANIFEST_ICON_STATUS_FETCHING; 250 manifest_icon_status_ = MANIFEST_ICON_STATUS_FETCHING;
280 } 251 }
281 252
282 // The ShortcutHelper is now able to notify its Java counterpart that it is 253 // The ShortcutHelper is now able to notify its Java counterpart that it is
283 // initialized. OnInitialized method is not conceptually part of getting the 254 // initialized. OnInitialized method is not conceptually part of getting the
284 // manifest data but it happens that the initialization is finalized when 255 // manifest data but it happens that the initialization is finalized when
285 // these data are available. 256 // these data are available.
286 JNIEnv* env = base::android::AttachCurrentThread(); 257 JNIEnv* env = base::android::AttachCurrentThread();
287 ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env); 258 ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
288 ScopedJavaLocalRef<jstring> j_title = 259 ScopedJavaLocalRef<jstring> j_title =
289 base::android::ConvertUTF16ToJavaString(env, title_); 260 base::android::ConvertUTF16ToJavaString(env, shortcut_info_.title);
290 261
291 Java_ShortcutHelper_onInitialized(env, j_obj.obj(), j_title.obj()); 262 Java_ShortcutHelper_onInitialized(env, j_obj.obj(), j_title.obj());
292 } 263 }
293 264
294 void ShortcutHelper::OnDidDownloadIcon(int id, 265 void ShortcutHelper::OnDidDownloadIcon(int id,
295 int http_status_code, 266 int http_status_code,
296 const GURL& url, 267 const GURL& url,
297 const std::vector<SkBitmap>& bitmaps, 268 const std::vector<SkBitmap>& bitmaps,
298 const std::vector<gfx::Size>& sizes) { 269 const std::vector<gfx::Size>& sizes) {
299 // If getting the candidate manifest icon failed, the ShortcutHelper should 270 // If getting the candidate manifest icon failed, the ShortcutHelper should
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 306
336 void ShortcutHelper::AddShortcut( 307 void ShortcutHelper::AddShortcut(
337 JNIEnv* env, 308 JNIEnv* env,
338 jobject obj, 309 jobject obj,
339 jstring jtitle, 310 jstring jtitle,
340 jint launcher_large_icon_size) { 311 jint launcher_large_icon_size) {
341 add_shortcut_requested_ = true; 312 add_shortcut_requested_ = true;
342 313
343 base::string16 title = base::android::ConvertJavaStringToUTF16(env, jtitle); 314 base::string16 title = base::android::ConvertJavaStringToUTF16(env, jtitle);
344 if (!title.empty()) 315 if (!title.empty())
345 title_ = title; 316 shortcut_info_.title = title;
346 317
347 switch (manifest_icon_status_) { 318 switch (manifest_icon_status_) {
348 case MANIFEST_ICON_STATUS_NONE: 319 case MANIFEST_ICON_STATUS_NONE:
349 AddShortcutUsingFavicon(); 320 AddShortcutUsingFavicon();
350 break; 321 break;
351 case MANIFEST_ICON_STATUS_FETCHING: 322 case MANIFEST_ICON_STATUS_FETCHING:
352 // ::OnDidDownloadIcon() will call AddShortcutUsingManifestIcon(). 323 // ::OnDidDownloadIcon() will call AddShortcutUsingManifestIcon().
353 break; 324 break;
354 case MANIFEST_ICON_STATUS_DONE: 325 case MANIFEST_ICON_STATUS_DONE:
355 AddShortcutUsingManifestIcon(); 326 AddShortcutUsingManifestIcon();
356 break; 327 break;
357 } 328 }
358 } 329 }
359 330
360 void ShortcutHelper::AddShortcutUsingManifestIcon() { 331 void ShortcutHelper::AddShortcutUsingManifestIcon() {
361 // Stop observing so we don't get destroyed while doing the last steps. 332 // Stop observing so we don't get destroyed while doing the last steps.
362 Observe(NULL); 333 Observe(NULL);
363 334
364 base::WorkerPool::PostTask( 335 base::WorkerPool::PostTask(
365 FROM_HERE, 336 FROM_HERE,
366 base::Bind(&ShortcutHelper::AddShortcutInBackgroundWithSkBitmap, 337 base::Bind(&ShortcutHelper::AddShortcutInBackgroundWithSkBitmap,
367 url_, 338 shortcut_info_,
368 title_, 339 manifest_icon_),
369 display_,
370 manifest_icon_,
371 orientation_),
372 true); 340 true);
373 341
374 Destroy(); 342 Destroy();
375 } 343 }
376 344
377 void ShortcutHelper::AddShortcutUsingFavicon() { 345 void ShortcutHelper::AddShortcutUsingFavicon() {
378 Profile* profile = 346 Profile* profile =
379 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 347 Profile::FromBrowserContext(web_contents()->GetBrowserContext());
380 348
381 // Grab the best, largest icon we can find to represent this bookmark. 349 // Grab the best, largest icon we can find to represent this bookmark.
382 // TODO(dfalcantara): Try combining with the new BookmarksHandler once its 350 // TODO(dfalcantara): Try combining with the new BookmarksHandler once its
383 // rewrite is further along. 351 // rewrite is further along.
384 std::vector<int> icon_types; 352 std::vector<int> icon_types;
385 icon_types.push_back(favicon_base::FAVICON); 353 icon_types.push_back(favicon_base::FAVICON);
386 icon_types.push_back(favicon_base::TOUCH_PRECOMPOSED_ICON | 354 icon_types.push_back(favicon_base::TOUCH_PRECOMPOSED_ICON |
387 favicon_base::TOUCH_ICON); 355 favicon_base::TOUCH_ICON);
388 FaviconService* favicon_service = FaviconServiceFactory::GetForProfile( 356 FaviconService* favicon_service = FaviconServiceFactory::GetForProfile(
389 profile, ServiceAccessType::EXPLICIT_ACCESS); 357 profile, ServiceAccessType::EXPLICIT_ACCESS);
390 358
391 // Using favicon if its size is not smaller than platform required size, 359 // Using favicon if its size is not smaller than platform required size,
392 // otherwise using the largest icon among all avaliable icons. 360 // otherwise using the largest icon among all avaliable icons.
393 int threshold_to_get_any_largest_icon = preferred_icon_size_in_px_ - 1; 361 int threshold_to_get_any_largest_icon = preferred_icon_size_in_px_ - 1;
394 favicon_service->GetLargestRawFaviconForPageURL(url_, icon_types, 362 favicon_service->GetLargestRawFaviconForPageURL(
363 shortcut_info_.url,
364 icon_types,
395 threshold_to_get_any_largest_icon, 365 threshold_to_get_any_largest_icon,
396 base::Bind(&ShortcutHelper::OnDidGetFavicon, 366 base::Bind(&ShortcutHelper::OnDidGetFavicon,
397 base::Unretained(this)), 367 base::Unretained(this)),
398 &cancelable_task_tracker_); 368 &cancelable_task_tracker_);
399 } 369 }
400 370
401 void ShortcutHelper::OnDidGetFavicon( 371 void ShortcutHelper::OnDidGetFavicon(
402 const favicon_base::FaviconRawBitmapResult& bitmap_result) { 372 const favicon_base::FaviconRawBitmapResult& bitmap_result) {
403 // Stop observing so we don't get destroyed while doing the last steps. 373 // Stop observing so we don't get destroyed while doing the last steps.
404 Observe(NULL); 374 Observe(NULL);
405 375
406 base::WorkerPool::PostTask( 376 base::WorkerPool::PostTask(
407 FROM_HERE, 377 FROM_HERE,
408 base::Bind(&ShortcutHelper::AddShortcutInBackgroundWithRawBitmap, 378 base::Bind(&ShortcutHelper::AddShortcutInBackgroundWithRawBitmap,
409 url_, 379 shortcut_info_,
410 title_, 380 bitmap_result),
411 display_,
412 bitmap_result,
413 orientation_),
414 true); 381 true);
415 382
416 Destroy(); 383 Destroy();
417 } 384 }
418 385
419 bool ShortcutHelper::OnMessageReceived(const IPC::Message& message) { 386 bool ShortcutHelper::OnMessageReceived(const IPC::Message& message) {
420 bool handled = true; 387 bool handled = true;
421 388
422 IPC_BEGIN_MESSAGE_MAP(ShortcutHelper, message) 389 IPC_BEGIN_MESSAGE_MAP(ShortcutHelper, message)
423 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidGetWebApplicationInfo, 390 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidGetWebApplicationInfo,
424 OnDidGetWebApplicationInfo) 391 OnDidGetWebApplicationInfo)
425 IPC_MESSAGE_UNHANDLED(handled = false) 392 IPC_MESSAGE_UNHANDLED(handled = false)
426 IPC_END_MESSAGE_MAP() 393 IPC_END_MESSAGE_MAP()
427 394
428 return handled; 395 return handled;
429 } 396 }
430 397
431 void ShortcutHelper::WebContentsDestroyed() { 398 void ShortcutHelper::WebContentsDestroyed() {
432 Destroy(); 399 Destroy();
433 } 400 }
434 401
435 bool ShortcutHelper::RegisterShortcutHelper(JNIEnv* env) { 402 bool ShortcutHelper::RegisterShortcutHelper(JNIEnv* env) {
436 return RegisterNativesImpl(env); 403 return RegisterNativesImpl(env);
437 } 404 }
438 405
439 void ShortcutHelper::AddShortcutInBackgroundWithRawBitmap( 406 void ShortcutHelper::AddShortcutInBackgroundWithRawBitmap(
440 const GURL& url, 407 const ShortcutInfo& info,
441 const base::string16& title, 408 const favicon_base::FaviconRawBitmapResult& bitmap_result) {
442 content::Manifest::DisplayMode display,
443 const favicon_base::FaviconRawBitmapResult& bitmap_result,
444 blink::WebScreenOrientationLockType orientation) {
445 DCHECK(base::WorkerPool::RunsTasksOnCurrentThread()); 409 DCHECK(base::WorkerPool::RunsTasksOnCurrentThread());
446 410
447 SkBitmap icon_bitmap; 411 SkBitmap icon_bitmap;
448 if (bitmap_result.is_valid()) { 412 if (bitmap_result.is_valid()) {
449 gfx::PNGCodec::Decode(bitmap_result.bitmap_data->front(), 413 gfx::PNGCodec::Decode(bitmap_result.bitmap_data->front(),
450 bitmap_result.bitmap_data->size(), 414 bitmap_result.bitmap_data->size(),
451 &icon_bitmap); 415 &icon_bitmap);
452 } 416 }
453 417
454 AddShortcutInBackgroundWithSkBitmap( 418 AddShortcutInBackgroundWithSkBitmap(info, icon_bitmap);
455 url, title, display, icon_bitmap, orientation);
456 } 419 }
457 420
458 void ShortcutHelper::AddShortcutInBackgroundWithSkBitmap( 421 void ShortcutHelper::AddShortcutInBackgroundWithSkBitmap(
459 const GURL& url, 422 const ShortcutInfo& info,
460 const base::string16& title, 423 const SkBitmap& icon_bitmap) {
461 content::Manifest::DisplayMode display,
462 const SkBitmap& icon_bitmap,
463 blink::WebScreenOrientationLockType orientation) {
464 DCHECK(base::WorkerPool::RunsTasksOnCurrentThread()); 424 DCHECK(base::WorkerPool::RunsTasksOnCurrentThread());
465 425
466 SkColor color = color_utils::CalculateKMeanColorOfBitmap(icon_bitmap); 426 SkColor color = color_utils::CalculateKMeanColorOfBitmap(icon_bitmap);
467 int r_value = SkColorGetR(color); 427 int r_value = SkColorGetR(color);
468 int g_value = SkColorGetG(color); 428 int g_value = SkColorGetG(color);
469 int b_value = SkColorGetB(color); 429 int b_value = SkColorGetB(color);
470 430
471 // Send the data to the Java side to create the shortcut. 431 // Send the data to the Java side to create the shortcut.
472 JNIEnv* env = base::android::AttachCurrentThread(); 432 JNIEnv* env = base::android::AttachCurrentThread();
473 ScopedJavaLocalRef<jstring> java_url = 433 ScopedJavaLocalRef<jstring> java_url =
474 base::android::ConvertUTF8ToJavaString(env, url.spec()); 434 base::android::ConvertUTF8ToJavaString(env, info.url.spec());
475 ScopedJavaLocalRef<jstring> java_title = 435 ScopedJavaLocalRef<jstring> java_title =
476 base::android::ConvertUTF16ToJavaString(env, title); 436 base::android::ConvertUTF16ToJavaString(env, info.title);
477 ScopedJavaLocalRef<jobject> java_bitmap; 437 ScopedJavaLocalRef<jobject> java_bitmap;
478 if (icon_bitmap.getSize()) 438 if (icon_bitmap.getSize())
479 java_bitmap = gfx::ConvertToJavaBitmap(&icon_bitmap); 439 java_bitmap = gfx::ConvertToJavaBitmap(&icon_bitmap);
480 440
481 Java_ShortcutHelper_addShortcut( 441 Java_ShortcutHelper_addShortcut(
482 env, 442 env,
483 base::android::GetApplicationContext(), 443 base::android::GetApplicationContext(),
484 java_url.obj(), 444 java_url.obj(),
485 java_title.obj(), 445 java_title.obj(),
486 java_bitmap.obj(), 446 java_bitmap.obj(),
487 r_value, 447 r_value,
488 g_value, 448 g_value,
489 b_value, 449 b_value,
490 display == content::Manifest::DISPLAY_MODE_STANDALONE, 450 info.display == content::Manifest::DISPLAY_MODE_STANDALONE,
491 orientation); 451 info.orientation);
492 } 452 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698