// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/ui/startup/session_crashed_infobar_delegate.h" #include "chrome/browser/infobars/infobar.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search/search.h" #include "chrome/browser/sessions/session_restore.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/common/url_constants.h" #include "content/public/browser/dom_storage_context.h" #include "content/public/browser/storage_partition.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" #include "ui/base/l10n/l10n_util.h" // static void SessionCrashedInfoBarDelegate::Create(Browser* browser) { // Assume that if the user is launching incognito they were previously running // incognito so that we have nothing to restore from. // Also, in ChromeBot tests, there might be a race. This code appears to be // called during shutdown when there is no active WebContents. Profile* profile = browser->profile(); content::WebContents* web_contents = browser->tab_strip_model()->GetActiveWebContents(); if (profile->IsOffTheRecord() || !web_contents) return; InfoBarService::FromWebContents(web_contents)->AddInfoBar( ConfirmInfoBarDelegate::CreateInfoBar(scoped_ptr<ConfirmInfoBarDelegate>( new SessionCrashedInfoBarDelegate(profile)))); } SessionCrashedInfoBarDelegate::SessionCrashedInfoBarDelegate(Profile* profile) : ConfirmInfoBarDelegate(), accepted_(false), profile_(profile) { } SessionCrashedInfoBarDelegate::~SessionCrashedInfoBarDelegate() { // If the info bar wasn't accepted, it was either dismissed or expired. In // that case, session restore won't happen. if (!accepted_) { content::BrowserContext::GetDefaultStoragePartition(profile_)-> GetDOMStorageContext()->StartScavengingUnusedSessionStorage(); } } int SessionCrashedInfoBarDelegate::GetIconID() const { return IDR_INFOBAR_RESTORE_SESSION; } base::string16 SessionCrashedInfoBarDelegate::GetMessageText() const { return l10n_util::GetStringUTF16(IDS_SESSION_CRASHED_VIEW_MESSAGE); } int SessionCrashedInfoBarDelegate::GetButtons() const { return BUTTON_OK; } base::string16 SessionCrashedInfoBarDelegate::GetButtonLabel( InfoBarButton button) const { DCHECK_EQ(BUTTON_OK, button); return l10n_util::GetStringUTF16(IDS_SESSION_CRASHED_VIEW_RESTORE_BUTTON); } bool SessionCrashedInfoBarDelegate::Accept() { uint32 behavior = 0; Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); if (browser->tab_strip_model()->count() == 1) { const content::WebContents* active_tab = browser->tab_strip_model()->GetWebContentsAt(0); if (active_tab->GetURL() == GURL(chrome::kChromeUINewTabURL) || chrome::IsInstantNTP(active_tab)) { // There is only one tab and its the new tab page, make session restore // clobber it. behavior = SessionRestore::CLOBBER_CURRENT_TAB; } } SessionRestore::RestoreSession(browser->profile(), browser, browser->host_desktop_type(), behavior, std::vector<GURL>()); accepted_ = true; return true; }