blob: 43774af627da6323450b69470118a01c049305cc [file] [log] [blame]
// Copyright 2015 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 "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_client.h"
#include "base/bind.h"
#include "base/callback.h"
#include "components/sessions/ios/ios_live_tab.h"
#include "ios/chrome/browser/application_context.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state_manager.h"
#include "ios/chrome/browser/chrome_url_constants.h"
#include "ios/chrome/browser/sessions/tab_restore_service_delegate_impl_ios.h"
#include "ios/chrome/browser/sessions/tab_restore_service_delegate_impl_ios_factory.h"
#import "ios/chrome/browser/tabs/tab.h"
#import "ios/chrome/browser/tabs/tab_model.h"
#import "ios/chrome/browser/tabs/tab_model_list.h"
#include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
#include "url/gurl.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace {
sessions::LiveTabContext* FindLiveTabContextWithCondition(
const base::Callback<bool(TabModel*)>& condition) {
std::vector<ios::ChromeBrowserState*> browser_states =
GetApplicationContext()
->GetChromeBrowserStateManager()
->GetLoadedBrowserStates();
for (ios::ChromeBrowserState* browser_state : browser_states) {
DCHECK(!browser_state->IsOffTheRecord());
NSArray<TabModel*>* tab_models;
tab_models = GetTabModelsForChromeBrowserState(browser_state);
for (TabModel* tab_model : tab_models) {
if (condition.Run(tab_model)) {
return TabRestoreServiceDelegateImplIOSFactory::GetForBrowserState(
browser_state);
}
}
if (!browser_state->HasOffTheRecordChromeBrowserState())
continue;
ios::ChromeBrowserState* otr_browser_state =
browser_state->GetOffTheRecordChromeBrowserState();
tab_models = GetTabModelsForChromeBrowserState(otr_browser_state);
for (TabModel* tab_model : tab_models) {
if (condition.Run(tab_model)) {
return TabRestoreServiceDelegateImplIOSFactory::GetForBrowserState(
browser_state);
}
}
}
return nullptr;
}
} // namespace
IOSChromeTabRestoreServiceClient::IOSChromeTabRestoreServiceClient(
ios::ChromeBrowserState* browser_state)
: browser_state_(browser_state) {}
IOSChromeTabRestoreServiceClient::~IOSChromeTabRestoreServiceClient() {}
sessions::LiveTabContext*
IOSChromeTabRestoreServiceClient::CreateLiveTabContext(
const std::string& app_name) {
return TabRestoreServiceDelegateImplIOSFactory::GetForBrowserState(
browser_state_);
}
sessions::LiveTabContext*
IOSChromeTabRestoreServiceClient::FindLiveTabContextForTab(
const sessions::LiveTab* tab) {
const sessions::IOSLiveTab* requested_tab =
static_cast<const sessions::IOSLiveTab*>(tab);
return FindLiveTabContextWithCondition(base::Bind(
[](const web::WebState* web_state, TabModel* tab_model) {
for (Tab* current_tab in tab_model) {
if (current_tab.webState && current_tab.webState == web_state) {
return true;
}
}
return false;
},
requested_tab->web_state()));
}
sessions::LiveTabContext*
IOSChromeTabRestoreServiceClient::FindLiveTabContextWithID(
SessionID::id_type desired_id) {
return FindLiveTabContextWithCondition(base::Bind(
[](SessionID::id_type desired_id, TabModel* tab_model) {
return tab_model.sessionID.id() == desired_id;
},
desired_id));
}
bool IOSChromeTabRestoreServiceClient::ShouldTrackURLForRestore(
const GURL& url) {
// NOTE: In the //chrome client, chrome://quit and chrome://restart are
// blacklisted from being tracked to avoid entering infinite loops. However,
// iOS intentionally does not support those URLs, so there is no need to
// blacklist them here.
return url.is_valid();
}
std::string IOSChromeTabRestoreServiceClient::GetExtensionAppIDForTab(
sessions::LiveTab* tab) {
return std::string();
}
base::FilePath IOSChromeTabRestoreServiceClient::GetPathToSaveTo() {
// Note that this will return a different path in incognito from normal mode.
// In this case, that shouldn't be an issue because the tab restore service
// is not used in incognito mode.
return browser_state_->GetStatePath();
}
GURL IOSChromeTabRestoreServiceClient::GetNewTabURL() {
return GURL(kChromeUINewTabURL);
}
bool IOSChromeTabRestoreServiceClient::HasLastSession() {
return false;
}
void IOSChromeTabRestoreServiceClient::GetLastSession(
const sessions::GetLastSessionCallback& callback,
base::CancelableTaskTracker* tracker) {
NOTREACHED();
}