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 "components/infobars/core/infobar.h" 16 #include "content/public/browser/dom_storage_context.h" 17 #include "content/public/browser/storage_partition.h" 18 #include "grit/chromium_strings.h" 19 #include "grit/generated_resources.h" 20 #include "grit/theme_resources.h" 21 #include "ui/base/l10n/l10n_util.h" 22 23 24 // static Create(Browser * browser)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 SessionCrashedInfoBarDelegate(Profile * profile)41SessionCrashedInfoBarDelegate::SessionCrashedInfoBarDelegate(Profile* profile) 42 : ConfirmInfoBarDelegate(), 43 accepted_(false), 44 profile_(profile) { 45 } 46 ~SessionCrashedInfoBarDelegate()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 GetIconID() const56int SessionCrashedInfoBarDelegate::GetIconID() const { 57 return IDR_INFOBAR_RESTORE_SESSION; 58 } 59 GetMessageText() const60base::string16 SessionCrashedInfoBarDelegate::GetMessageText() const { 61 return l10n_util::GetStringUTF16(IDS_SESSION_CRASHED_VIEW_MESSAGE); 62 } 63 GetButtons() const64int SessionCrashedInfoBarDelegate::GetButtons() const { 65 return BUTTON_OK; 66 } 67 GetButtonLabel(InfoBarButton button) const68base::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 Accept()74bool SessionCrashedInfoBarDelegate::Accept() { 75 Browser* browser = chrome::FindBrowserWithWebContents( 76 InfoBarService::WebContentsFromInfoBar(infobar())); 77 SessionRestore::RestoreSessionAfterCrash(browser); 78 accepted_ = true; 79 return true; 80 } 81