| Index: chrome/browser/app_menu_model.cc
 | 
| diff --git a/chrome/browser/app_menu_model.cc b/chrome/browser/app_menu_model.cc
 | 
| index 38aca1511d404f4287ddcfa9e32c60e2c1bd1e77..f42c92089d1d2f21705220990a17c60335bd90ac 100644
 | 
| --- a/chrome/browser/app_menu_model.cc
 | 
| +++ b/chrome/browser/app_menu_model.cc
 | 
| @@ -15,16 +15,33 @@
 | 
|  #include "grit/chromium_strings.h"
 | 
|  #include "grit/generated_resources.h"
 | 
|  
 | 
| +// TODO(akalin): Now that AppMenuModel handles the sync item
 | 
| +// dynamically, we don't need to refresh the menu on Windows/Linux.
 | 
| +// Remove that code and make sure it works.
 | 
| +
 | 
|  AppMenuModel::AppMenuModel(menus::SimpleMenuModel::Delegate* delegate,
 | 
|                             Browser* browser)
 | 
|      : menus::SimpleMenuModel(delegate),
 | 
| -      browser_(browser) {
 | 
| +      browser_(browser),
 | 
| +      // For now, we assume that sync cannot be enabled/disabled after
 | 
| +      // launch.
 | 
| +      sync_item_enabled_(ProfileSyncService::IsSyncEnabled()),
 | 
| +      sync_item_index_(-1) {
 | 
|    Build();
 | 
|  }
 | 
|  
 | 
|  AppMenuModel::~AppMenuModel() {
 | 
|  }
 | 
|  
 | 
| +bool AppMenuModel::IsLabelDynamicAt(int index) const {
 | 
| +  return IsSyncItem(index) || SimpleMenuModel::IsLabelDynamicAt(index);
 | 
| +}
 | 
| +
 | 
| +string16 AppMenuModel::GetLabelAt(int index) const {
 | 
| +  return IsSyncItem(index) ?
 | 
| +      GetSyncMenuLabel() : SimpleMenuModel::GetLabelAt(index);
 | 
| +}
 | 
| +
 | 
|  void AppMenuModel::Build() {
 | 
|    AddItemWithStringId(IDC_NEW_TAB, IDS_NEW_TAB);
 | 
|    AddItemWithStringId(IDC_NEW_WINDOW, IDS_NEW_WINDOW);
 | 
| @@ -56,10 +73,11 @@ void AppMenuModel::Build() {
 | 
|    AddItemWithStringId(IDC_MANAGE_EXTENSIONS, IDS_SHOW_EXTENSIONS);
 | 
|  
 | 
|    AddSeparator();
 | 
| -  if (ProfileSyncService::IsSyncEnabled()) {
 | 
| -    string16 label = sync_ui_util::GetSyncMenuLabel(
 | 
| -        browser_->profile()->GetOriginalProfile()->GetProfileSyncService());
 | 
| -    AddItem(IDC_SYNC_BOOKMARKS, label);
 | 
| +  if (sync_item_enabled_) {
 | 
| +    AddItem(IDC_SYNC_BOOKMARKS, GetSyncMenuLabel());
 | 
| +    // TODO(akalin): Make it possible to get the index in a less
 | 
| +    // hackish way.
 | 
| +    sync_item_index_ = GetItemCount() - 1;
 | 
|      AddSeparator();
 | 
|    }
 | 
|  #if defined(OS_MACOSX)
 | 
| @@ -109,3 +127,14 @@ void AppMenuModel::BuildProfileSubMenu() {
 | 
|        IDC_NEW_PROFILE,
 | 
|        IDS_SELECT_PROFILE_DIALOG_NEW_PROFILE_ENTRY);
 | 
|  }
 | 
| +
 | 
| +string16 AppMenuModel::GetSyncMenuLabel() const {
 | 
| +  DCHECK(sync_item_enabled_);
 | 
| +  return sync_ui_util::GetSyncMenuLabel(
 | 
| +      browser_->profile()->GetOriginalProfile()->GetProfileSyncService());
 | 
| +}
 | 
| +
 | 
| +bool AppMenuModel::IsSyncItem(int index) const {
 | 
| +  return sync_item_enabled_ && (index == sync_item_index_);
 | 
| +}
 | 
| +
 | 
| 
 |