| OLD | NEW | 
|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/views/toolbar_view.h" | 5 #include "chrome/browser/views/toolbar_view.h" | 
| 6 | 6 | 
| 7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" | 
| 8 #include "app/resource_bundle.h" | 8 #include "app/resource_bundle.h" | 
| 9 #include "chrome/app/chrome_dll_resource.h" | 9 #include "chrome/app/chrome_dll_resource.h" | 
| 10 #include "chrome/browser/accessibility/browser_accessibility_state.h" | 10 #include "chrome/browser/accessibility/browser_accessibility_state.h" | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
| 34 #include "views/window/window.h" | 34 #include "views/window/window.h" | 
| 35 | 35 | 
| 36 #if defined(OS_CHROMEOS) | 36 #if defined(OS_CHROMEOS) | 
| 37 #include "chrome/browser/chromeos/cros/cros_library.h" | 37 #include "chrome/browser/chromeos/cros/cros_library.h" | 
| 38 #include "chrome/browser/chromeos/cros/update_library.h" | 38 #include "chrome/browser/chromeos/cros/update_library.h" | 
| 39 #include "chrome/browser/chromeos/dom_ui/wrench_menu_ui.h" | 39 #include "chrome/browser/chromeos/dom_ui/wrench_menu_ui.h" | 
| 40 #include "views/controls/menu/menu_2.h" | 40 #include "views/controls/menu/menu_2.h" | 
| 41 #endif | 41 #endif | 
| 42 #include "chrome/browser/views/wrench_menu.h" | 42 #include "chrome/browser/views/wrench_menu.h" | 
| 43 | 43 | 
|  | 44 #if defined(OS_WIN) | 
|  | 45 #include "chrome/browser/enumerate_modules_model_win.h" | 
|  | 46 #endif | 
|  | 47 | 
| 44 // The space between items is 4 px in general. | 48 // The space between items is 4 px in general. | 
| 45 const int ToolbarView::kStandardSpacing = 4; | 49 const int ToolbarView::kStandardSpacing = 4; | 
| 46 // The top of the toolbar has an edge we have to skip over in addition to the 4 | 50 // The top of the toolbar has an edge we have to skip over in addition to the 4 | 
| 47 // px of spacing. | 51 // px of spacing. | 
| 48 const int ToolbarView::kVertSpacing = kStandardSpacing + 1; | 52 const int ToolbarView::kVertSpacing = kStandardSpacing + 1; | 
| 49 // The edge graphics have some built-in spacing/shadowing, so we have to adjust | 53 // The edge graphics have some built-in spacing/shadowing, so we have to adjust | 
| 50 // our spacing to make it still appear to be 4 px. | 54 // our spacing to make it still appear to be 4 px. | 
| 51 static const int kEdgeSpacing = ToolbarView::kStandardSpacing - 1; | 55 static const int kEdgeSpacing = ToolbarView::kStandardSpacing - 1; | 
| 52 // The buttons to the left of the omnibox are close together. | 56 // The buttons to the left of the omnibox are close together. | 
| 53 static const int kButtonSpacing = 1; | 57 static const int kButtonSpacing = 1; | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 95 | 99 | 
| 96   if (!kPopupBackgroundEdge) { | 100   if (!kPopupBackgroundEdge) { | 
| 97     kPopupBackgroundEdge = ResourceBundle::GetSharedInstance().GetBitmapNamed( | 101     kPopupBackgroundEdge = ResourceBundle::GetSharedInstance().GetBitmapNamed( | 
| 98         IDR_LOCATIONBG_POPUPMODE_EDGE); | 102         IDR_LOCATIONBG_POPUPMODE_EDGE); | 
| 99   } | 103   } | 
| 100 | 104 | 
| 101   if (!IsUpgradeRecommended()) { | 105   if (!IsUpgradeRecommended()) { | 
| 102     registrar_.Add(this, NotificationType::UPGRADE_RECOMMENDED, | 106     registrar_.Add(this, NotificationType::UPGRADE_RECOMMENDED, | 
| 103                    NotificationService::AllSources()); | 107                    NotificationService::AllSources()); | 
| 104   } | 108   } | 
|  | 109   registrar_.Add(this, NotificationType::MODULE_INCOMPATIBILITY_DETECTED, | 
|  | 110                  NotificationService::AllSources()); | 
| 105 } | 111 } | 
| 106 | 112 | 
| 107 ToolbarView::~ToolbarView() { | 113 ToolbarView::~ToolbarView() { | 
| 108   if (destroyed_flag_) | 114   if (destroyed_flag_) | 
| 109     *destroyed_flag_ = true; | 115     *destroyed_flag_ = true; | 
| 110 | 116 | 
| 111   // NOTE: Don't remove the command observers here.  This object gets destroyed | 117   // NOTE: Don't remove the command observers here.  This object gets destroyed | 
| 112   // after the Browser (which owns the CommandUpdater), so the CommandUpdater is | 118   // after the Browser (which owns the CommandUpdater), so the CommandUpdater is | 
| 113   // already gone. | 119   // already gone. | 
| 114 } | 120 } | 
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 168 | 174 | 
| 169   app_menu_ = new views::MenuButton(NULL, std::wstring(), this, false); | 175   app_menu_ = new views::MenuButton(NULL, std::wstring(), this, false); | 
| 170   app_menu_->set_border(NULL); | 176   app_menu_->set_border(NULL); | 
| 171   app_menu_->EnableCanvasFlippingForRTLUI(true); | 177   app_menu_->EnableCanvasFlippingForRTLUI(true); | 
| 172   app_menu_->SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_APP)); | 178   app_menu_->SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_APP)); | 
| 173   app_menu_->SetTooltipText(l10n_util::GetStringF(IDS_APPMENU_TOOLTIP, | 179   app_menu_->SetTooltipText(l10n_util::GetStringF(IDS_APPMENU_TOOLTIP, | 
| 174       l10n_util::GetString(IDS_PRODUCT_NAME))); | 180       l10n_util::GetString(IDS_PRODUCT_NAME))); | 
| 175   app_menu_->SetID(VIEW_ID_APP_MENU); | 181   app_menu_->SetID(VIEW_ID_APP_MENU); | 
| 176 | 182 | 
| 177   // Catch the case where the window is created after we detect a new version. | 183   // Catch the case where the window is created after we detect a new version. | 
| 178   if (IsUpgradeRecommended()) | 184   if (IsUpgradeRecommended() || ShouldShowIncompatibilityWarning()) | 
| 179     ShowUpgradeReminder(); | 185     ShowNotificationDot(); | 
| 180 | 186 | 
| 181   LoadImages(); | 187   LoadImages(); | 
| 182 | 188 | 
| 183   // Always add children in order from left to right, for accessibility. | 189   // Always add children in order from left to right, for accessibility. | 
| 184   AddChildView(back_); | 190   AddChildView(back_); | 
| 185   AddChildView(forward_); | 191   AddChildView(forward_); | 
| 186   AddChildView(reload_); | 192   AddChildView(reload_); | 
| 187   AddChildView(home_); | 193   AddChildView(home_); | 
| 188   AddChildView(location_bar_); | 194   AddChildView(location_bar_); | 
| 189   AddChildView(browser_actions_); | 195   AddChildView(browser_actions_); | 
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 310 | 316 | 
| 311   wrench_menu_->RunMenu(app_menu_); | 317   wrench_menu_->RunMenu(app_menu_); | 
| 312 | 318 | 
| 313 #if defined(OS_CHROMEOS) | 319 #if defined(OS_CHROMEOS) | 
| 314 cleanup: | 320 cleanup: | 
| 315 #endif | 321 #endif | 
| 316   if (destroyed_flag) | 322   if (destroyed_flag) | 
| 317     return; | 323     return; | 
| 318   destroyed_flag_ = NULL; | 324   destroyed_flag_ = NULL; | 
| 319 | 325 | 
| 320   // Stop pulsating the upgrade reminder on the app menu, if active. | 326   // Stop pulsating the notification dot on the app menu (if active). | 
| 321   upgrade_reminder_pulse_timer_.Stop(); | 327   notification_dot_pulse_timer_.Stop(); | 
| 322 } | 328 } | 
| 323 | 329 | 
| 324 //////////////////////////////////////////////////////////////////////////////// | 330 //////////////////////////////////////////////////////////////////////////////// | 
| 325 // ToolbarView, LocationBarView::Delegate implementation: | 331 // ToolbarView, LocationBarView::Delegate implementation: | 
| 326 | 332 | 
| 327 TabContents* ToolbarView::GetTabContents() { | 333 TabContents* ToolbarView::GetTabContents() { | 
| 328   return browser_->GetSelectedTabContents(); | 334   return browser_->GetSelectedTabContents(); | 
| 329 } | 335 } | 
| 330 | 336 | 
| 331 InstantController* ToolbarView::GetInstant() { | 337 InstantController* ToolbarView::GetInstant() { | 
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 394 void ToolbarView::Observe(NotificationType type, | 400 void ToolbarView::Observe(NotificationType type, | 
| 395                           const NotificationSource& source, | 401                           const NotificationSource& source, | 
| 396                           const NotificationDetails& details) { | 402                           const NotificationDetails& details) { | 
| 397   if (type == NotificationType::PREF_CHANGED) { | 403   if (type == NotificationType::PREF_CHANGED) { | 
| 398     std::string* pref_name = Details<std::string>(details).ptr(); | 404     std::string* pref_name = Details<std::string>(details).ptr(); | 
| 399     if (*pref_name == prefs::kShowHomeButton) { | 405     if (*pref_name == prefs::kShowHomeButton) { | 
| 400       Layout(); | 406       Layout(); | 
| 401       SchedulePaint(); | 407       SchedulePaint(); | 
| 402     } | 408     } | 
| 403   } else if (type == NotificationType::UPGRADE_RECOMMENDED) { | 409   } else if (type == NotificationType::UPGRADE_RECOMMENDED) { | 
| 404     ShowUpgradeReminder(); | 410     ShowNotificationDot(); | 
|  | 411   } else if (type == NotificationType::MODULE_INCOMPATIBILITY_DETECTED) { | 
|  | 412     bool confirmed_bad = *Details<bool>(details).ptr(); | 
|  | 413     if (confirmed_bad) | 
|  | 414       ShowNotificationDot(); | 
| 405   } | 415   } | 
| 406 } | 416 } | 
| 407 | 417 | 
| 408 //////////////////////////////////////////////////////////////////////////////// | 418 //////////////////////////////////////////////////////////////////////////////// | 
| 409 // ToolbarView, menus::AcceleratorProvider implementation: | 419 // ToolbarView, menus::AcceleratorProvider implementation: | 
| 410 | 420 | 
| 411 bool ToolbarView::GetAcceleratorForCommandId(int command_id, | 421 bool ToolbarView::GetAcceleratorForCommandId(int command_id, | 
| 412     menus::Accelerator* accelerator) { | 422     menus::Accelerator* accelerator) { | 
| 413   // The standard Ctrl-X, Ctrl-V and Ctrl-C are not defined as accelerators | 423   // The standard Ctrl-X, Ctrl-V and Ctrl-C are not defined as accelerators | 
| 414   // anywhere so we need to check for them explicitly here. | 424   // anywhere so we need to check for them explicitly here. | 
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 573 | 583 | 
| 574 bool ToolbarView::IsUpgradeRecommended() { | 584 bool ToolbarView::IsUpgradeRecommended() { | 
| 575 #if defined(OS_CHROMEOS) | 585 #if defined(OS_CHROMEOS) | 
| 576   return (chromeos::CrosLibrary::Get()->GetUpdateLibrary()->status().status == | 586   return (chromeos::CrosLibrary::Get()->GetUpdateLibrary()->status().status == | 
| 577           chromeos::UPDATE_STATUS_UPDATED_NEED_REBOOT); | 587           chromeos::UPDATE_STATUS_UPDATED_NEED_REBOOT); | 
| 578 #else | 588 #else | 
| 579   return (Singleton<UpgradeDetector>::get()->notify_upgrade()); | 589   return (Singleton<UpgradeDetector>::get()->notify_upgrade()); | 
| 580 #endif | 590 #endif | 
| 581 } | 591 } | 
| 582 | 592 | 
|  | 593 bool ToolbarView::ShouldShowIncompatibilityWarning() { | 
|  | 594 #if defined(OS_WIN) | 
|  | 595   EnumerateModulesModel* loaded_modules = EnumerateModulesModel::GetSingleton(); | 
|  | 596   return loaded_modules->confirmed_bad_modules_detected() > 0; | 
|  | 597 #else | 
|  | 598   return false; | 
|  | 599 #endif | 
|  | 600 } | 
|  | 601 | 
| 583 int ToolbarView::PopupTopSpacing() const { | 602 int ToolbarView::PopupTopSpacing() const { | 
| 584   return GetWindow()->GetNonClientView()->UseNativeFrame() ? | 603   return GetWindow()->GetNonClientView()->UseNativeFrame() ? | 
| 585       0 : kPopupTopSpacingNonGlass; | 604       0 : kPopupTopSpacingNonGlass; | 
| 586 } | 605 } | 
| 587 | 606 | 
| 588 void ToolbarView::LoadImages() { | 607 void ToolbarView::LoadImages() { | 
| 589   ThemeProvider* tp = GetThemeProvider(); | 608   ThemeProvider* tp = GetThemeProvider(); | 
| 590 | 609 | 
| 591   back_->SetImage(views::CustomButton::BS_NORMAL, tp->GetBitmapNamed(IDR_BACK)); | 610   back_->SetImage(views::CustomButton::BS_NORMAL, tp->GetBitmapNamed(IDR_BACK)); | 
| 592   back_->SetImage(views::CustomButton::BS_HOT, tp->GetBitmapNamed(IDR_BACK_H)); | 611   back_->SetImage(views::CustomButton::BS_HOT, tp->GetBitmapNamed(IDR_BACK_H)); | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
| 622   home_->SetImage(views::CustomButton::BS_NORMAL, tp->GetBitmapNamed(IDR_HOME)); | 641   home_->SetImage(views::CustomButton::BS_NORMAL, tp->GetBitmapNamed(IDR_HOME)); | 
| 623   home_->SetImage(views::CustomButton::BS_HOT, tp->GetBitmapNamed(IDR_HOME_H)); | 642   home_->SetImage(views::CustomButton::BS_HOT, tp->GetBitmapNamed(IDR_HOME_H)); | 
| 624   home_->SetImage(views::CustomButton::BS_PUSHED, | 643   home_->SetImage(views::CustomButton::BS_PUSHED, | 
| 625       tp->GetBitmapNamed(IDR_HOME_P)); | 644       tp->GetBitmapNamed(IDR_HOME_P)); | 
| 626 | 645 | 
| 627   app_menu_->SetIcon(GetAppMenuIcon(views::CustomButton::BS_NORMAL)); | 646   app_menu_->SetIcon(GetAppMenuIcon(views::CustomButton::BS_NORMAL)); | 
| 628   app_menu_->SetHoverIcon(GetAppMenuIcon(views::CustomButton::BS_HOT)); | 647   app_menu_->SetHoverIcon(GetAppMenuIcon(views::CustomButton::BS_HOT)); | 
| 629   app_menu_->SetPushedIcon(GetAppMenuIcon(views::CustomButton::BS_PUSHED)); | 648   app_menu_->SetPushedIcon(GetAppMenuIcon(views::CustomButton::BS_PUSHED)); | 
| 630 } | 649 } | 
| 631 | 650 | 
| 632 void ToolbarView::ShowUpgradeReminder() { | 651 void ToolbarView::ShowNotificationDot() { | 
| 633   update_reminder_animation_.reset(new SlideAnimation(this)); | 652   notification_dot_animation_.reset(new SlideAnimation(this)); | 
| 634   update_reminder_animation_->SetSlideDuration(kPulseDuration); | 653   notification_dot_animation_->SetSlideDuration(kPulseDuration); | 
| 635 | 654 | 
| 636   // Then start the recurring timer for pulsating it. | 655   // Then start the recurring timer for pulsating it. | 
| 637   upgrade_reminder_pulse_timer_.Start( | 656   notification_dot_pulse_timer_.Stop(); | 
|  | 657   notification_dot_pulse_timer_.Start( | 
| 638       base::TimeDelta::FromMilliseconds(kPulsateEveryMs), | 658       base::TimeDelta::FromMilliseconds(kPulsateEveryMs), | 
| 639       this, &ToolbarView::PulsateUpgradeNotifier); | 659       this, &ToolbarView::PulsateNotificationDot); | 
| 640 } | 660 } | 
| 641 | 661 | 
| 642 void ToolbarView::PulsateUpgradeNotifier() { | 662 void ToolbarView::PulsateNotificationDot() { | 
| 643   // Start the pulsating animation. | 663   // Start the pulsating animation. | 
| 644   update_reminder_animation_->Reset(0.0); | 664   notification_dot_animation_->Reset(0.0); | 
| 645   update_reminder_animation_->Show(); | 665   notification_dot_animation_->Show(); | 
| 646 } | 666 } | 
| 647 | 667 | 
| 648 SkBitmap ToolbarView::GetAppMenuIcon(views::CustomButton::ButtonState state) { | 668 SkBitmap ToolbarView::GetAppMenuIcon(views::CustomButton::ButtonState state) { | 
| 649   ThemeProvider* tp = GetThemeProvider(); | 669   ThemeProvider* tp = GetThemeProvider(); | 
| 650 | 670 | 
| 651   int id = 0; | 671   int id = 0; | 
| 652   switch (state) { | 672   switch (state) { | 
| 653     case views::CustomButton::BS_NORMAL: id = IDR_TOOLS;   break; | 673     case views::CustomButton::BS_NORMAL: id = IDR_TOOLS;   break; | 
| 654     case views::CustomButton::BS_HOT:    id = IDR_TOOLS_H; break; | 674     case views::CustomButton::BS_HOT:    id = IDR_TOOLS_H; break; | 
| 655     case views::CustomButton::BS_PUSHED: id = IDR_TOOLS_P; break; | 675     case views::CustomButton::BS_PUSHED: id = IDR_TOOLS_P; break; | 
| 656     default:                             NOTREACHED();     break; | 676     default:                             NOTREACHED();     break; | 
| 657   } | 677   } | 
| 658   SkBitmap icon = *tp->GetBitmapNamed(id); | 678   SkBitmap icon = *tp->GetBitmapNamed(id); | 
| 659 | 679 | 
| 660   if (!IsUpgradeRecommended()) | 680   bool add_badge = IsUpgradeRecommended() || ShouldShowIncompatibilityWarning(); | 
|  | 681   if (!add_badge) | 
| 661     return icon; | 682     return icon; | 
| 662 | 683 | 
| 663   // Draw the chrome app menu icon onto the canvas. | 684   // Draw the chrome app menu icon onto the canvas. | 
| 664   scoped_ptr<gfx::CanvasSkia> canvas( | 685   scoped_ptr<gfx::CanvasSkia> canvas( | 
| 665       new gfx::CanvasSkia(icon.width(), icon.height(), false)); | 686       new gfx::CanvasSkia(icon.width(), icon.height(), false)); | 
| 666   canvas->DrawBitmapInt(icon, 0, 0); | 687   canvas->DrawBitmapInt(icon, 0, 0); | 
| 667 | 688 | 
| 668   SkBitmap badge; | 689   SkBitmap badge; | 
| 669   static bool has_faded_in = false; | 690   static bool has_faded_in = false; | 
| 670   if (!has_faded_in) { | 691   if (!has_faded_in) { | 
| 671     SkBitmap* dot = tp->GetBitmapNamed(IDR_UPGRADE_DOT_INACTIVE); | 692     SkBitmap* dot = NULL; | 
|  | 693     if (ShouldShowIncompatibilityWarning()) { | 
|  | 694 #if defined(OS_WIN) | 
|  | 695       dot = tp->GetBitmapNamed(IDR_INCOMPATIBILITY_DOT_INACTIVE); | 
|  | 696 #else | 
|  | 697       NOTREACHED(); | 
|  | 698 #endif | 
|  | 699     } else { | 
|  | 700       dot = tp->GetBitmapNamed(IDR_UPGRADE_DOT_INACTIVE); | 
|  | 701     } | 
| 672     SkBitmap transparent; | 702     SkBitmap transparent; | 
| 673     transparent.setConfig(dot->getConfig(), dot->width(), dot->height()); | 703     transparent.setConfig(dot->getConfig(), dot->width(), dot->height()); | 
| 674     transparent.allocPixels(); | 704     transparent.allocPixels(); | 
| 675     transparent.eraseARGB(0, 0, 0, 0); | 705     transparent.eraseARGB(0, 0, 0, 0); | 
| 676     badge = SkBitmapOperations::CreateBlendedBitmap( | 706     badge = SkBitmapOperations::CreateBlendedBitmap( | 
| 677         *dot, transparent, 1.0 - update_reminder_animation_->GetCurrentValue()); | 707         *dot, transparent, | 
| 678     if (update_reminder_animation_->GetCurrentValue() == 1.0) | 708         1.0 - notification_dot_animation_->GetCurrentValue()); | 
|  | 709     if (notification_dot_animation_->GetCurrentValue() == 1.0) | 
| 679       has_faded_in = true; | 710       has_faded_in = true; | 
| 680   } else { | 711   } else { | 
| 681     // Convert animation values that start from 0.0 and incrementally go | 712     // Convert animation values that start from 0.0 and incrementally go | 
| 682     // up to 1.0 into values that start in 0.0, go to 1.0 and then back | 713     // up to 1.0 into values that start in 0.0, go to 1.0 and then back | 
| 683     // to 0.0 (to create a pulsing effect). | 714     // to 0.0 (to create a pulsing effect). | 
| 684     double value = | 715     double value = | 
| 685         1.0 - abs(2.0 * update_reminder_animation_->GetCurrentValue() - 1.0); | 716         1.0 - abs(2.0 * notification_dot_animation_->GetCurrentValue() - 1.0); | 
| 686 | 717 | 
| 687     // Add the badge to it. | 718     // Add the badge to it. | 
| 688     badge = SkBitmapOperations::CreateBlendedBitmap( | 719     if (ShouldShowIncompatibilityWarning()) { | 
| 689         *tp->GetBitmapNamed(IDR_UPGRADE_DOT_INACTIVE), | 720 #if defined(OS_WIN) | 
| 690         *tp->GetBitmapNamed(IDR_UPGRADE_DOT_ACTIVE), | 721       badge = SkBitmapOperations::CreateBlendedBitmap( | 
| 691         value); | 722           *tp->GetBitmapNamed(IDR_INCOMPATIBILITY_DOT_INACTIVE), | 
|  | 723           *tp->GetBitmapNamed(IDR_INCOMPATIBILITY_DOT_ACTIVE), | 
|  | 724           value); | 
|  | 725 #else | 
|  | 726       NOTREACHED(); | 
|  | 727 #endif | 
|  | 728     } else { | 
|  | 729       badge = SkBitmapOperations::CreateBlendedBitmap( | 
|  | 730           *tp->GetBitmapNamed(IDR_UPGRADE_DOT_INACTIVE), | 
|  | 731           *tp->GetBitmapNamed(IDR_UPGRADE_DOT_ACTIVE), | 
|  | 732           value); | 
|  | 733     } | 
| 692   } | 734   } | 
| 693 | 735 | 
| 694   static const int kBadgeLeftSpacing = 8; | 736   static const int kBadgeLeftSpacing = 8; | 
| 695   static const int kBadgeTopSpacing = 18; | 737   static const int kBadgeTopSpacing = 18; | 
| 696   canvas->DrawBitmapInt(badge, kBadgeLeftSpacing, kBadgeTopSpacing); | 738   canvas->DrawBitmapInt(badge, kBadgeLeftSpacing, kBadgeTopSpacing); | 
| 697 | 739 | 
| 698   return canvas->ExtractBitmap(); | 740   return canvas->ExtractBitmap(); | 
| 699 } | 741 } | 
| OLD | NEW | 
|---|