1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/ui/startup/session_crashed_infobar_delegate.h" 6 7#include "chrome/browser/infobars/infobar_service.h" 8#include "chrome/browser/profiles/profile.h" 9#include "chrome/browser/search/search.h" 10#include "chrome/browser/sessions/session_restore.h" 11#include "chrome/browser/ui/browser.h" 12#include "chrome/browser/ui/browser_finder.h" 13#include "chrome/browser/ui/tabs/tab_strip_model.h" 14#include "chrome/common/url_constants.h" 15#include "chrome/grit/chromium_strings.h" 16#include "chrome/grit/generated_resources.h" 17#include "components/infobars/core/infobar.h" 18#include "content/public/browser/dom_storage_context.h" 19#include "content/public/browser/storage_partition.h" 20#include "grit/theme_resources.h" 21#include "ui/base/l10n/l10n_util.h" 22 23 24// static 25void SessionCrashedInfoBarDelegate::Create(Browser* browser) { 26 // Assume that if the user is launching incognito they were previously running 27 // incognito so that we have nothing to restore from. 28 // Also, in ChromeBot tests, there might be a race. This code appears to be 29 // called during shutdown when there is no active WebContents. 30 Profile* profile = browser->profile(); 31 content::WebContents* web_contents = 32 browser->tab_strip_model()->GetActiveWebContents(); 33 if (profile->IsOffTheRecord() || !web_contents) 34 return; 35 36 InfoBarService::FromWebContents(web_contents)->AddInfoBar( 37 ConfirmInfoBarDelegate::CreateInfoBar(scoped_ptr<ConfirmInfoBarDelegate>( 38 new SessionCrashedInfoBarDelegate(profile)))); 39} 40 41SessionCrashedInfoBarDelegate::SessionCrashedInfoBarDelegate(Profile* profile) 42 : ConfirmInfoBarDelegate(), 43 accepted_(false), 44 profile_(profile) { 45} 46 47SessionCrashedInfoBarDelegate::~SessionCrashedInfoBarDelegate() { 48 // If the info bar wasn't accepted, it was either dismissed or expired. In 49 // that case, session restore won't happen. 50 if (!accepted_) { 51 content::BrowserContext::GetDefaultStoragePartition(profile_)-> 52 GetDOMStorageContext()->StartScavengingUnusedSessionStorage(); 53 } 54} 55 56int SessionCrashedInfoBarDelegate::GetIconID() const { 57 return IDR_INFOBAR_RESTORE_SESSION; 58} 59 60base::string16 SessionCrashedInfoBarDelegate::GetMessageText() const { 61 return l10n_util::GetStringUTF16(IDS_SESSION_CRASHED_VIEW_MESSAGE); 62} 63 64int SessionCrashedInfoBarDelegate::GetButtons() const { 65 return BUTTON_OK; 66} 67 68base::string16 SessionCrashedInfoBarDelegate::GetButtonLabel( 69 InfoBarButton button) const { 70 DCHECK_EQ(BUTTON_OK, button); 71 return l10n_util::GetStringUTF16(IDS_SESSION_CRASHED_VIEW_RESTORE_BUTTON); 72} 73 74bool SessionCrashedInfoBarDelegate::Accept() { 75 Browser* browser = chrome::FindBrowserWithWebContents( 76 InfoBarService::WebContentsFromInfoBar(infobar())); 77 SessionRestore::RestoreSessionAfterCrash(browser); 78 accepted_ = true; 79 return true; 80} 81