OLD | NEW |
1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2009 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/jumplist.h" | 5 #include "chrome/browser/jumplist.h" |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 #include <shobjidl.h> | 8 #include <shobjidl.h> |
9 #include <propkey.h> | 9 #include <propkey.h> |
10 #include <propvarutil.h> | 10 #include <propvarutil.h> |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 result = property_store->Commit(); | 232 result = property_store->Commit(); |
233 if (FAILED(result)) | 233 if (FAILED(result)) |
234 return result; | 234 return result; |
235 | 235 |
236 // Add this IShellLink object to the given collection. | 236 // Add this IShellLink object to the given collection. |
237 return collection->AddObject(link); | 237 return collection->AddObject(link); |
238 } | 238 } |
239 | 239 |
240 // Creates a temporary icon file to be shown in JumpList. | 240 // Creates a temporary icon file to be shown in JumpList. |
241 bool CreateIconFile(const SkBitmap& bitmap, | 241 bool CreateIconFile(const SkBitmap& bitmap, |
242 const std::wstring& icon_dir, | 242 const FilePath& icon_dir, |
243 std::wstring* icon_path) { | 243 FilePath* icon_path) { |
244 // Retrieve the path to a temporary file. | 244 // Retrieve the path to a temporary file. |
245 // We don't have to care about the extension of this temporary file because | 245 // We don't have to care about the extension of this temporary file because |
246 // JumpList does not care about it. | 246 // JumpList does not care about it. |
247 FilePath path; | 247 FilePath path; |
248 if (!file_util::CreateTemporaryFileInDir(FilePath(icon_dir), &path)) | 248 if (!file_util::CreateTemporaryFileInDir(icon_dir, &path)) |
249 return false; | 249 return false; |
250 | 250 |
251 // Create an icon file from the favicon attached to the given |page|, and | 251 // Create an icon file from the favicon attached to the given |page|, and |
252 // save it as the temporary file. | 252 // save it as the temporary file. |
253 if (!IconUtil::CreateIconFileFromSkBitmap(bitmap, path.value())) | 253 if (!IconUtil::CreateIconFileFromSkBitmap(bitmap, path.value())) |
254 return false; | 254 return false; |
255 | 255 |
256 // Add this icon file to the list and return its absolute path. | 256 // Add this icon file to the list and return its absolute path. |
257 // The IShellLink::SetIcon() function needs the absolute path to an icon. | 257 // The IShellLink::SetIcon() function needs the absolute path to an icon. |
258 icon_path->assign(path.value()); | 258 *icon_path = path; |
259 return true; | 259 return true; |
260 } | 260 } |
261 | 261 |
262 // Updates a specified category of an application JumpList. | 262 // Updates a specified category of an application JumpList. |
263 // This function cannot update registered categories (such as "Tasks") because | 263 // This function cannot update registered categories (such as "Tasks") because |
264 // special steps are required for updating them. | 264 // special steps are required for updating them. |
265 // So, this function can be used only for adding an unregistered category. | 265 // So, this function can be used only for adding an unregistered category. |
266 // Parameters: | 266 // Parameters: |
267 // * category_id (int) | 267 // * category_id (int) |
268 // A string ID which contains the category name. | 268 // A string ID which contains the category name. |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 // 1. Prepare objects required by this task: | 451 // 1. Prepare objects required by this task: |
452 // * a std::wstring that contains a temporary icons; | 452 // * a std::wstring that contains a temporary icons; |
453 // * a ShellLinkItemList that contains the items of the "Most Visited" | 453 // * a ShellLinkItemList that contains the items of the "Most Visited" |
454 // category, and; | 454 // category, and; |
455 // * a ShellLinkItemList that contains the items of the "Recently Closed" | 455 // * a ShellLinkItemList that contains the items of the "Recently Closed" |
456 // category. | 456 // category. |
457 // 2. Create a JumpListUpdateTask instance, and; | 457 // 2. Create a JumpListUpdateTask instance, and; |
458 // 3. Post this task to the file thread. | 458 // 3. Post this task to the file thread. |
459 class JumpListUpdateTask : public Task { | 459 class JumpListUpdateTask : public Task { |
460 public: | 460 public: |
461 JumpListUpdateTask(const std::wstring& icon_dir, | 461 JumpListUpdateTask(const FilePath& icon_dir, |
462 const ShellLinkItemList& most_visited_pages, | 462 const ShellLinkItemList& most_visited_pages, |
463 const ShellLinkItemList& recently_closed_pages) | 463 const ShellLinkItemList& recently_closed_pages) |
464 : icon_dir_(icon_dir), | 464 : icon_dir_(icon_dir), |
465 most_visited_pages_(most_visited_pages), | 465 most_visited_pages_(most_visited_pages), |
466 recently_closed_pages_(recently_closed_pages) { | 466 recently_closed_pages_(recently_closed_pages) { |
467 } | 467 } |
468 | 468 |
469 private: | 469 private: |
470 // Represents an entry point of this task. | 470 // Represents an entry point of this task. |
471 // When we post this task to a file thread, the thread calls this function. | 471 // When we post this task to a file thread, the thread calls this function. |
472 void Run(); | 472 void Run(); |
473 | 473 |
474 // The directory which contains JumpList icons. | 474 // The directory which contains JumpList icons. |
475 std::wstring icon_dir_; | 475 FilePath icon_dir_; |
476 | 476 |
477 // Items in the "Most Visited" category of the application JumpList. | 477 // Items in the "Most Visited" category of the application JumpList. |
478 ShellLinkItemList most_visited_pages_; | 478 ShellLinkItemList most_visited_pages_; |
479 | 479 |
480 // Items in the "Recently Closed" category of the application JumpList. | 480 // Items in the "Recently Closed" category of the application JumpList. |
481 ShellLinkItemList recently_closed_pages_; | 481 ShellLinkItemList recently_closed_pages_; |
482 }; | 482 }; |
483 | 483 |
484 void JumpListUpdateTask::Run() { | 484 void JumpListUpdateTask::Run() { |
485 // Delete the directory which contains old icon files, rename the current | 485 // Delete the directory which contains old icon files, rename the current |
486 // icon directory, and create a new directory which contains new JumpList | 486 // icon directory, and create a new directory which contains new JumpList |
487 // icon files. | 487 // icon files. |
488 std::wstring icon_dir_old(icon_dir_ + L"Old"); | 488 FilePath icon_dir_old(icon_dir_.value() + L"Old"); |
489 if (file_util::PathExists(FilePath::FromWStringHack(icon_dir_old))) | 489 if (file_util::PathExists(icon_dir_old)) |
490 file_util::Delete(icon_dir_old, true); | 490 file_util::Delete(icon_dir_old, true); |
491 file_util::Move(FilePath::FromWStringHack(icon_dir_), | 491 file_util::Move(icon_dir_, icon_dir_old); |
492 FilePath::FromWStringHack(icon_dir_old)); | |
493 file_util::CreateDirectory(icon_dir_); | 492 file_util::CreateDirectory(icon_dir_); |
494 | 493 |
495 // Create temporary icon files for shortcuts in the "Most Visited" category. | 494 // Create temporary icon files for shortcuts in the "Most Visited" category. |
496 for (ShellLinkItemList::const_iterator item = most_visited_pages_.begin(); | 495 for (ShellLinkItemList::const_iterator item = most_visited_pages_.begin(); |
497 item != most_visited_pages_.end(); ++item) { | 496 item != most_visited_pages_.end(); ++item) { |
498 SkBitmap icon_bitmap; | 497 SkBitmap icon_bitmap; |
499 if ((*item)->data().get() && | 498 if ((*item)->data().get() && |
500 gfx::PNGCodec::Decode((*item)->data()->front(), | 499 gfx::PNGCodec::Decode((*item)->data()->front(), |
501 (*item)->data()->size(), | 500 (*item)->data()->size(), |
502 &icon_bitmap)) { | 501 &icon_bitmap)) { |
503 std::wstring icon_path; | 502 FilePath icon_path; |
504 if (CreateIconFile(icon_bitmap, icon_dir_, &icon_path)) | 503 if (CreateIconFile(icon_bitmap, icon_dir_, &icon_path)) |
505 (*item)->SetIcon(icon_path, 0, true); | 504 (*item)->SetIcon(icon_path.value(), 0, true); |
506 } | 505 } |
507 } | 506 } |
508 | 507 |
509 // Create temporary icon files for shortcuts in the "Recently Closed" | 508 // Create temporary icon files for shortcuts in the "Recently Closed" |
510 // category. | 509 // category. |
511 for (ShellLinkItemList::const_iterator item = recently_closed_pages_.begin(); | 510 for (ShellLinkItemList::const_iterator item = recently_closed_pages_.begin(); |
512 item != recently_closed_pages_.end(); ++item) { | 511 item != recently_closed_pages_.end(); ++item) { |
513 SkBitmap icon_bitmap; | 512 SkBitmap icon_bitmap; |
514 if ((*item)->data().get() && | 513 if ((*item)->data().get() && |
515 gfx::PNGCodec::Decode((*item)->data()->front(), | 514 gfx::PNGCodec::Decode((*item)->data()->front(), |
516 (*item)->data()->size(), | 515 (*item)->data()->size(), |
517 &icon_bitmap)) { | 516 &icon_bitmap)) { |
518 std::wstring icon_path; | 517 FilePath icon_path; |
519 if (CreateIconFile(icon_bitmap, icon_dir_, &icon_path)) | 518 if (CreateIconFile(icon_bitmap, icon_dir_, &icon_path)) |
520 (*item)->SetIcon(icon_path, 0, true); | 519 (*item)->SetIcon(icon_path.value(), 0, true); |
521 } | 520 } |
522 } | 521 } |
523 | 522 |
524 // We finished collecting all resources needed for updating an appliation | 523 // We finished collecting all resources needed for updating an appliation |
525 // JumpList. So, create a new JumpList and replace the current JumpList | 524 // JumpList. So, create a new JumpList and replace the current JumpList |
526 // with it. | 525 // with it. |
527 UpdateJumpList(most_visited_pages_, recently_closed_pages_); | 526 UpdateJumpList(most_visited_pages_, recently_closed_pages_); |
528 | 527 |
529 // Delete all items in these lists now since we don't need the ShellLinkItem | 528 // Delete all items in these lists now since we don't need the ShellLinkItem |
530 // objects in these lists. | 529 // objects in these lists. |
(...skipping 23 matching lines...) Expand all Loading... |
554 // When we add this object to the observer list, we save the pointer to this | 553 // When we add this object to the observer list, we save the pointer to this |
555 // TabRestoreService object. This pointer is used when we remove this object | 554 // TabRestoreService object. This pointer is used when we remove this object |
556 // from the observer list. | 555 // from the observer list. |
557 if (win_util::GetWinVersion() < win_util::WINVERSION_WIN7 || !profile) | 556 if (win_util::GetWinVersion() < win_util::WINVERSION_WIN7 || !profile) |
558 return false; | 557 return false; |
559 | 558 |
560 TabRestoreService* tab_restore_service = profile->GetTabRestoreService(); | 559 TabRestoreService* tab_restore_service = profile->GetTabRestoreService(); |
561 if (!tab_restore_service) | 560 if (!tab_restore_service) |
562 return false; | 561 return false; |
563 | 562 |
564 icon_dir_ = profile->GetPath().Append(chrome::kJumpListIconDirname).value(); | 563 icon_dir_ = profile->GetPath().Append(chrome::kJumpListIconDirname); |
565 profile_ = profile; | 564 profile_ = profile; |
566 tab_restore_service->AddObserver(this); | 565 tab_restore_service->AddObserver(this); |
567 return true; | 566 return true; |
568 } | 567 } |
569 | 568 |
570 void JumpList::RemoveObserver() { | 569 void JumpList::RemoveObserver() { |
571 if (profile_ && profile_->GetTabRestoreService()) | 570 if (profile_ && profile_->GetTabRestoreService()) |
572 profile_->GetTabRestoreService()->RemoveObserver(this); | 571 profile_->GetTabRestoreService()->RemoveObserver(this); |
573 profile_ = NULL; | 572 profile_ = NULL; |
574 } | 573 } |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
736 most_visited_pages_, | 735 most_visited_pages_, |
737 recently_closed_pages_); | 736 recently_closed_pages_); |
738 MessageLoop* file_loop = g_browser_process->file_thread()->message_loop(); | 737 MessageLoop* file_loop = g_browser_process->file_thread()->message_loop(); |
739 if (file_loop) | 738 if (file_loop) |
740 file_loop->PostTask(FROM_HERE, icon_task); | 739 file_loop->PostTask(FROM_HERE, icon_task); |
741 | 740 |
742 // Delete all items in these lists since we don't need these lists any longer. | 741 // Delete all items in these lists since we don't need these lists any longer. |
743 most_visited_pages_.clear(); | 742 most_visited_pages_.clear(); |
744 recently_closed_pages_.clear(); | 743 recently_closed_pages_.clear(); |
745 } | 744 } |
OLD | NEW |