Commit 02851554 authored by edchin's avatar edchin Committed by Commit Bot

[ios] Hook up open remote tabs in tab grid

This CL enables the user to open all tabs in a remote session.

Bug: 850240
Cq-Include-Trybots: luci.chromium.try:ios-simulator-full-configs;master.tryserver.chromium.mac:ios-simulator-cronet
Change-Id: I5add63048d9bbe93fb7d7e574d2f072f9f6e9a21
Reviewed-on: https://chromium-review.googlesource.com/1091874
Commit-Queue: edchin <edchin@chromium.org>
Reviewed-by: default avatarMark Cogan <marq@chromium.org>
Reviewed-by: default avataredchin <edchin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#565507}
parent 67f3f0ce
......@@ -801,7 +801,6 @@ const int kRelativeTimeMaxHours = 4;
ProfileSyncServiceFactory::GetForBrowserState(self.browserState)
->GetOpenTabsUIDelegate();
const sessions::SessionTab* toLoad = nullptr;
[self dismissRecentTabsModal];
if (openTabs->GetForeignTab(distantTab->session_tag, distantTab->tab_id,
&toLoad)) {
base::RecordAction(base::UserMetricsAction(
......@@ -810,6 +809,7 @@ const int kRelativeTimeMaxHours = 4;
self.browserState, new_tab_page_uma::ACTION_OPENED_FOREIGN_SESSION);
[self.loader loadSessionTab:toLoad];
}
[self dismissRecentTabsModal];
}
- (void)openTabWithTabRestoreEntry:
......@@ -980,13 +980,13 @@ const int kRelativeTimeMaxHours = 4;
[self.tableViewModel sectionForSectionIdentifier:sectionIdentifier];
synced_sessions::DistantSession const* session =
[self sessionForSection:section];
[self dismissRecentTabsModal];
for (auto const& tab : session->tabs) {
[self.loader webPageOrderedOpen:tab->virtual_url
referrer:web::Referrer()
inBackground:YES
appendTo:kLastTab];
}
[self dismissRecentTabsModal];
}
- (void)removeSessionAtSessionSectionIdentifier:(NSInteger)sectionIdentifier {
......
......@@ -4,14 +4,13 @@
#import "ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.h"
#include "components/sessions/core/session_types.h"
#include "ios/chrome/browser/chrome_url_constants.h"
#include "ios/chrome/browser/sessions/session_util.h"
#import "ios/chrome/browser/tabs/tab_model.h"
#import "ios/chrome/browser/ui/commands/browser_commands.h"
#import "ios/chrome/browser/ui/commands/command_dispatcher.h"
#import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
#import "ios/chrome/browser/ui/main/bvc_container_view_controller.h"
#import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_view_controller.h"
#import "ios/chrome/browser/ui/recent_tabs/recent_tabs_mediator.h"
#import "ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.h"
#import "ios/chrome/browser/ui/tab_grid/tab_grid_adaptor.h"
......@@ -19,16 +18,13 @@
#import "ios/chrome/browser/ui/tab_grid/tab_grid_paging.h"
#import "ios/chrome/browser/ui/tab_grid/tab_grid_transition_handler.h"
#import "ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h"
#import "ios/chrome/browser/ui/url_loader.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#import "ios/chrome/browser/web_state_list/web_state_opener.h"
#import "ios/web/public/web_state/web_state.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@interface TabGridCoordinator ()<TabPresentationDelegate, UrlLoader>
@interface TabGridCoordinator ()<TabPresentationDelegate,
RecentTabsHandsetViewControllerCommand>
// Superclass property specialized for the class that this coordinator uses.
@property(nonatomic, weak) TabGridViewController* mainViewController;
// Commad dispatcher used while this coordinator's view controller is active.
......@@ -173,7 +169,8 @@
self.remoteTabsMediator;
mainViewController.remoteTabsViewController.dispatcher =
static_cast<id<ApplicationCommands>>(self.dispatcher);
mainViewController.remoteTabsViewController.loader = self;
mainViewController.remoteTabsViewController.loader = self.regularTabsMediator;
mainViewController.remoteTabsViewController.handsetCommandHandler = self;
// TODO(crbug.com/850387) : Currently, consumer calls from the mediator
// prematurely loads the view in |RecentTabsTableViewController|. Fix this so
......@@ -324,57 +321,15 @@
- (void)closeAllIncognitoTabs {
}
#pragma mark - UrlLoader
#pragma mark - RecentTabsHandsetViewControllerCommand
- (void)loadSessionTab:(const sessions::SessionTab*)sessionTab {
WebStateList* webStateList = self.regularTabModel.webStateList;
std::unique_ptr<web::WebState> webState =
session_util::CreateWebStateWithNavigationEntries(
self.regularTabModel.browserState,
sessionTab->current_navigation_index, sessionTab->navigations);
webStateList->InsertWebState(webStateList->count(), std::move(webState),
WebStateList::INSERT_ACTIVATE, WebStateOpener());
// Normally, recent tabs is dismissed to reveal the tab view beneath it. In tab
// grid, the tab view is presented above the recent tabs panel.
- (void)dismissRecentTabsWithCompletion:(void (^)())completion {
// Trigger the transition through the TabSwitcher delegate. This will in turn
// call back into this coordinator via the ViewControllerSwapping protocol.
[self.tabSwitcher.delegate tabSwitcher:self.tabSwitcher
shouldFinishWithActiveModel:self.regularTabModel];
}
- (void)webPageOrderedOpen:(const GURL&)url
referrer:(const web::Referrer&)referrer
inBackground:(BOOL)inBackground
appendTo:(OpenPosition)appendTo {
// TODO(crbug.com/850240) : Hook up open all tabs in session.
UIAlertController* alertController = [UIAlertController
alertControllerWithTitle:@"Not Yet Implemented"
message:
@"We are still working on this feature. In the "
@"meantime, you can access this feature through the "
@"overflow menu and the new tab page."
preferredStyle:UIAlertControllerStyleAlert];
[alertController
addAction:[UIAlertAction actionWithTitle:@"OK"
style:UIAlertActionStyleCancel
handler:nil]];
[self.mainViewController presentViewController:alertController
animated:YES
completion:nil];
}
- (void)webPageOrderedOpen:(const GURL&)url
referrer:(const web::Referrer&)referrer
inIncognito:(BOOL)inIncognito
inBackground:(BOOL)inBackground
appendTo:(OpenPosition)appendTo {
// This is intentionally NO-OP.
}
- (void)loadURLWithParams:(const web::NavigationManager::WebLoadParams&)params {
// This is intentionally NO-OP.
}
- (void)loadJavaScriptFromLocationBar:(NSString*)script {
// This is intentionally NO-OP.
}
@end
......@@ -9,12 +9,14 @@
#import "ios/chrome/browser/ui/tab_grid/grid/grid_commands.h"
#import "ios/chrome/browser/ui/tab_grid/grid/grid_image_data_source.h"
#import "ios/chrome/browser/ui/url_loader.h"
@protocol GridConsumer;
@class TabModel;
// Mediates between model layer and tab grid UI layer.
@interface TabGridMediator : NSObject<GridCommands, GridImageDataSource>
@interface TabGridMediator
: NSObject<GridCommands, GridImageDataSource, UrlLoader>
// The source tab model.
@property(nonatomic, weak) TabModel* tabModel;
......
......@@ -9,8 +9,10 @@
#include "base/scoped_observer.h"
#include "base/strings/sys_string_conversions.h"
#include "components/favicon/ios/web_favicon_driver.h"
#include "components/sessions/core/session_types.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/chrome_url_constants.h"
#include "ios/chrome/browser/sessions/session_util.h"
#import "ios/chrome/browser/snapshots/snapshot_cache.h"
#import "ios/chrome/browser/snapshots/snapshot_cache_factory.h"
#import "ios/chrome/browser/snapshots/snapshot_tab_helper.h"
......@@ -31,42 +33,67 @@
#endif
namespace {
// Constructs a GridItem from a |webState|.
GridItem* CreateItem(web::WebState* webState) {
TabIdTabHelper* tabHelper = TabIdTabHelper::FromWebState(webState);
GridItem* item = [[GridItem alloc] initWithIdentifier:tabHelper->tab_id()];
item.title = base::SysUTF16ToNSString(webState->GetTitle());
// Constructs a GridItem from a |web_state|.
GridItem* CreateItem(web::WebState* web_state) {
TabIdTabHelper* tab_helper = TabIdTabHelper::FromWebState(web_state);
GridItem* item = [[GridItem alloc] initWithIdentifier:tab_helper->tab_id()];
item.title = base::SysUTF16ToNSString(web_state->GetTitle());
return item;
}
// Constructs an array of GridItems from a |webStateList|.
NSArray* CreateItems(WebStateList* webStateList) {
// Constructs an array of GridItems from a |web_state_list|.
NSArray* CreateItems(WebStateList* web_state_list) {
NSMutableArray* items = [[NSMutableArray alloc] init];
for (int i = 0; i < webStateList->count(); i++) {
web::WebState* webState = webStateList->GetWebStateAt(i);
[items addObject:CreateItem(webState)];
for (int i = 0; i < web_state_list->count(); i++) {
web::WebState* web_state = web_state_list->GetWebStateAt(i);
[items addObject:CreateItem(web_state)];
}
return [items copy];
}
NSString* GetActiveTabId(WebStateList* webStateList) {
web::WebState* webState = webStateList->GetActiveWebState();
if (!webState)
// Returns the ID of the active tab in |web_state_list|.
NSString* GetActiveTabId(WebStateList* web_state_list) {
web::WebState* web_state = web_state_list->GetActiveWebState();
if (!web_state)
return nil;
TabIdTabHelper* tabHelper = TabIdTabHelper::FromWebState(webState);
return tabHelper->tab_id();
TabIdTabHelper* tab_helper = TabIdTabHelper::FromWebState(web_state);
return tab_helper->tab_id();
}
int GetIndexOfTabWithId(WebStateList* webStateList, NSString* identifier) {
for (int i = 0; i < webStateList->count(); i++) {
web::WebState* webState = webStateList->GetWebStateAt(i);
TabIdTabHelper* tabHelper = TabIdTabHelper::FromWebState(webState);
if ([tabHelper->tab_id() isEqualToString:identifier])
// Returns the index of the tab with |identifier| in |web_state_list|. Returns
// -1 if not found.
int GetIndexOfTabWithId(WebStateList* web_state_list, NSString* identifier) {
for (int i = 0; i < web_state_list->count(); i++) {
web::WebState* web_state = web_state_list->GetWebStateAt(i);
TabIdTabHelper* tab_helper = TabIdTabHelper::FromWebState(web_state);
if ([identifier isEqualToString:tab_helper->tab_id()])
return i;
}
return -1;
}
// Returns the WebState with |identifier| in |web_state_list|. Returns |nullptr|
// if not found.
web::WebState* GetWebStateWithId(WebStateList* web_state_list,
NSString* identifier) {
for (int i = 0; i < web_state_list->count(); i++) {
web::WebState* web_state = web_state_list->GetWebStateAt(i);
TabIdTabHelper* tab_helper = TabIdTabHelper::FromWebState(web_state);
if ([identifier isEqualToString:tab_helper->tab_id()])
return web_state;
}
return nullptr;
}
// Appends and activates |web_state| to the end of |web_state_list|.
void AppendAndActivateWebState(WebStateList* web_state_list,
std::unique_ptr<web::WebState> web_state) {
web_state_list->InsertWebState(
web_state_list->count(), std::move(web_state),
(WebStateList::INSERT_FORCE_INDEX | WebStateList::INSERT_ACTIVATE),
WebStateOpener());
}
} // namespace
@interface TabGridMediator ()<CRWWebStateObserver, WebStateListObserving>
......@@ -281,11 +308,59 @@ int GetIndexOfTabWithId(WebStateList* webStateList, NSString* identifier) {
[SnapshotCacheFactory::GetForBrowserState(browserState) removeMarkedImages];
}
#pragma mark - UrlLoader
// Loading a |sessionTab| normally means navigating on the currently visible tab
// view. This is not the case while in the tab grid. A new WebState is appended
// and activated instead of replacing the current active WebState.
- (void)loadSessionTab:(const sessions::SessionTab*)sessionTab {
DCHECK(self.tabModel.browserState);
std::unique_ptr<web::WebState> webState =
session_util::CreateWebStateWithNavigationEntries(
self.tabModel.browserState, sessionTab->current_navigation_index,
sessionTab->navigations);
AppendAndActivateWebState(self.webStateList, std::move(webState));
}
// In tab grid, |inBackground| is ignored, which means that the new WebState is
// activated. |appendTo| is also ignored, so the new WebState is always appended
// at the end of the list. The page transition type is explicit rather than
// linked.
- (void)webPageOrderedOpen:(const GURL&)URL
referrer:(const web::Referrer&)referrer
inBackground:(BOOL)inBackground
appendTo:(OpenPosition)appendTo {
DCHECK(self.tabModel.browserState);
web::WebState::CreateParams params(self.tabModel.browserState);
std::unique_ptr<web::WebState> webState = web::WebState::Create(params);
web::NavigationManager::WebLoadParams loadParams(URL);
loadParams.referrer = referrer;
loadParams.transition_type = ui::PAGE_TRANSITION_TYPED;
webState->GetNavigationManager()->LoadURLWithParams(loadParams);
AppendAndActivateWebState(self.webStateList, std::move(webState));
}
- (void)webPageOrderedOpen:(const GURL&)URL
referrer:(const web::Referrer&)referrer
inIncognito:(BOOL)inIncognito
inBackground:(BOOL)inBackground
appendTo:(OpenPosition)appendTo {
NOTREACHED() << "This is intentionally NO-OP in TabGridMediator.";
}
- (void)loadURLWithParams:(const web::NavigationManager::WebLoadParams&)params {
NOTREACHED() << "This is intentionally NO-OP in TabGridMediator.";
}
- (void)loadJavaScriptFromLocationBar:(NSString*)script {
NOTREACHED() << "This is intentionally NO-OP in TabGridMediator.";
}
#pragma mark - GridImageDataSource
- (void)snapshotForIdentifier:(NSString*)identifier
completion:(void (^)(UIImage*))completion {
web::WebState* webState = [self webStateForIdentifier:identifier];
web::WebState* webState = GetWebStateWithId(self.webStateList, identifier);
if (webState) {
SnapshotTabHelper::FromWebState(webState)->RetrieveColorSnapshot(
^(UIImage* image) {
......@@ -297,7 +372,7 @@ int GetIndexOfTabWithId(WebStateList* webStateList, NSString* identifier) {
- (void)faviconForIdentifier:(NSString*)identifier
completion:(void (^)(UIImage*))completion {
web::WebState* webState = [self webStateForIdentifier:identifier];
web::WebState* webState = GetWebStateWithId(self.webStateList, identifier);
if (webState) {
favicon::FaviconDriver* faviconDriver =
favicon::WebFaviconDriver::FromWebState(webState);
......@@ -311,17 +386,7 @@ int GetIndexOfTabWithId(WebStateList* webStateList, NSString* identifier) {
#pragma mark - Private
- (web::WebState*)webStateForIdentifier:(NSString*)identifier {
for (int i = 0; i < self.webStateList->count(); i++) {
web::WebState* webState = self.webStateList->GetWebStateAt(i);
TabIdTabHelper* tabHelper = TabIdTabHelper::FromWebState(webState);
if ([identifier isEqualToString:tabHelper->tab_id()]) {
return webState;
}
}
return nullptr;
}
// Calls |-populateItems:selectedItemID:| on the consumer.
- (void)populateConsumerItems {
if (self.webStateList->count() > 0) {
[self.consumer populateItems:CreateItems(self.webStateList)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment