| Index: chrome/browser/sessions/tab_restore_service.cc
 | 
| diff --git a/chrome/browser/sessions/tab_restore_service.cc b/chrome/browser/sessions/tab_restore_service.cc
 | 
| index fa19cf5ebd2d91abc5a5d7f06e9396a5e3c1b58b..380f917e0e6c6c553d4f802c5b7f265d9fc957a9 100644
 | 
| --- a/chrome/browser/sessions/tab_restore_service.cc
 | 
| +++ b/chrome/browser/sessions/tab_restore_service.cc
 | 
| @@ -81,6 +81,7 @@ static const SessionCommand::id_type kCommandWindow = 3;
 | 
|  static const SessionCommand::id_type kCommandSelectedNavigationInTab = 4;
 | 
|  static const SessionCommand::id_type kCommandPinnedState = 5;
 | 
|  static const SessionCommand::id_type kCommandSetExtensionAppID = 6;
 | 
| +static const SessionCommand::id_type kCommandSetWindowAppName = 7;
 | 
|  
 | 
|  // Number of entries (not commands) before we clobber the file and write
 | 
|  // everything.
 | 
| @@ -240,6 +241,8 @@ void TabRestoreService::BrowserClosing(TabRestoreServiceDelegate* delegate) {
 | 
|    scoped_ptr<Window> window(new Window());
 | 
|    window->selected_tab_index = delegate->GetSelectedIndex();
 | 
|    window->timestamp = TimeNow();
 | 
| +  window->app_name = delegate->GetAppName();
 | 
| +
 | 
|    // Don't use std::vector::resize() because it will push copies of an empty tab
 | 
|    // into the vector, which will give all tabs in a window the same ID.
 | 
|    for (int i = 0; i < delegate->GetTabCount(); ++i) {
 | 
| @@ -258,7 +261,7 @@ void TabRestoreService::BrowserClosing(TabRestoreServiceDelegate* delegate) {
 | 
|        entry_index++;
 | 
|      }
 | 
|    }
 | 
| -  if (window->tabs.size() == 1) {
 | 
| +  if (window->tabs.size() == 1 && window->app_name.empty()) {
 | 
|      // Short-circuit creating a Window if only 1 tab was present. This fixes
 | 
|      // http://crbug.com/56744. Copy the Tab because it's owned by an object on
 | 
|      // the stack.
 | 
| @@ -349,7 +352,7 @@ void TabRestoreService::RestoreEntryById(TabRestoreServiceDelegate* delegate,
 | 
|      // single tab within it. If the entry's ID matches the one to restore, then
 | 
|      // the entire window will be restored.
 | 
|      if (!restoring_tab_in_window) {
 | 
| -      delegate = TabRestoreServiceDelegate::Create(profile());
 | 
| +      delegate = TabRestoreServiceDelegate::Create(profile(), window->app_name);
 | 
|        for (size_t tab_i = 0; tab_i < window->tabs.size(); ++tab_i) {
 | 
|          const Tab& tab = window->tabs[tab_i];
 | 
|          WebContents* restored_tab =
 | 
| @@ -612,6 +615,13 @@ void TabRestoreService::ScheduleCommandsForWindow(const Window& window) {
 | 
|                            valid_tab_count,
 | 
|                            window.timestamp));
 | 
|  
 | 
| +  if (!window.app_name.empty()) {
 | 
| +    ScheduleCommand(
 | 
| +        CreateSetWindowAppNameCommand(kCommandSetWindowAppName,
 | 
| +                                      window.id,
 | 
| +                                      window.app_name));
 | 
| +  }
 | 
| +
 | 
|    for (size_t i = 0; i < window.tabs.size(); ++i) {
 | 
|      int selected_index = GetSelectedNavigationIndexToPersist(window.tabs[i]);
 | 
|      if (selected_index != -1)
 | 
| @@ -886,6 +896,22 @@ void TabRestoreService::CreateEntriesFromCommands(
 | 
|          break;
 | 
|        }
 | 
|  
 | 
| +      case kCommandSetWindowAppName: {
 | 
| +        if (!current_window) {
 | 
| +          // We should have created a window already.
 | 
| +          NOTREACHED();
 | 
| +          return;
 | 
| +        }
 | 
| +
 | 
| +        SessionID::id_type window_id;
 | 
| +        std::string app_name;
 | 
| +        if (!RestoreSetWindowAppNameCommand(command, &window_id, &app_name))
 | 
| +          return;
 | 
| +
 | 
| +        current_window->app_name.swap(app_name);
 | 
| +        break;
 | 
| +      }
 | 
| +
 | 
|        case kCommandSetExtensionAppID: {
 | 
|          if (!current_tab) {
 | 
|            // Should be in a tab when we get this.
 | 
| @@ -936,7 +962,7 @@ TabRestoreServiceDelegate* TabRestoreService::RestoreTab(
 | 
|      if (delegate && disposition != NEW_WINDOW) {
 | 
|        tab_index = tab.tabstrip_index;
 | 
|      } else {
 | 
| -      delegate = TabRestoreServiceDelegate::Create(profile());
 | 
| +      delegate = TabRestoreServiceDelegate::Create(profile(), std::string());
 | 
|        if (tab.has_browser())
 | 
|          UpdateTabBrowserIDs(tab.browser_id, delegate->GetSessionID().id());
 | 
|      }
 | 
| 
 |