Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(511)

Side by Side Diff: chrome/browser/sessions/session_restore.cc

Issue 21022018: Sessions API - previously Session Restore API. Supports restoring currently open foreign windows an… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added assert true to test Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/sessions/session_restore.h" 5 #include "chrome/browser/sessions/session_restore.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <list> 8 #include <list>
9 #include <set> 9 #include <set>
10 #include <string> 10 #include <string>
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 } 560 }
561 561
562 if (browser_) { 562 if (browser_) {
563 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_CLOSED, 563 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_CLOSED,
564 content::Source<Browser>(browser_)); 564 content::Source<Browser>(browser_));
565 } 565 }
566 566
567 return browser_; 567 return browser_;
568 } 568 }
569 569
570 // Restore window(s) from a foreign session. 570 // Restore window(s) from a foreign session. Return corresponding created
sky 2013/08/01 00:05:43 Returns newly created Browsers.
Kristen Dwan 2013/08/02 20:54:19 Done.
571 void RestoreForeignSession( 571 // Browsers to identify restored Windows.
572 std::vector<Browser*> RestoreForeignSession(
572 std::vector<const SessionWindow*>::const_iterator begin, 573 std::vector<const SessionWindow*>::const_iterator begin,
573 std::vector<const SessionWindow*>::const_iterator end) { 574 std::vector<const SessionWindow*>::const_iterator end) {
574 StartTabCreation(); 575 StartTabCreation();
576 std::vector<Browser*> browsers;
575 // Create a browser instance to put the restored tabs in. 577 // Create a browser instance to put the restored tabs in.
576 for (std::vector<const SessionWindow*>::const_iterator i = begin; 578 for (std::vector<const SessionWindow*>::const_iterator i = begin;
577 i != end; ++i) { 579 i != end; ++i) {
578 Browser* browser = CreateRestoredBrowser( 580 Browser* browser = CreateRestoredBrowser(
579 static_cast<Browser::Type>((*i)->type), 581 static_cast<Browser::Type>((*i)->type),
580 (*i)->bounds, 582 (*i)->bounds,
581 (*i)->show_state, 583 (*i)->show_state,
582 (*i)->app_name); 584 (*i)->app_name);
585 browsers.push_back(browser);
583 586
584 // Restore and show the browser. 587 // Restore and show the browser.
585 const int initial_tab_count = 0; 588 const int initial_tab_count = 0;
586 int selected_tab_index = std::max( 589 int selected_tab_index = std::max(
587 0, 590 0,
588 std::min((*i)->selected_tab_index, 591 std::min((*i)->selected_tab_index,
589 static_cast<int>((*i)->tabs.size()) - 1)); 592 static_cast<int>((*i)->tabs.size()) - 1));
590 RestoreTabsToBrowser(*(*i), browser, initial_tab_count, 593 RestoreTabsToBrowser(*(*i), browser, initial_tab_count,
591 selected_tab_index); 594 selected_tab_index);
592 NotifySessionServiceOfRestoredTabs(browser, initial_tab_count); 595 NotifySessionServiceOfRestoredTabs(browser, initial_tab_count);
593 } 596 }
594 597
595 // Always create in a new window 598 // Always create in a new window
596 FinishedTabCreation(true, true); 599 FinishedTabCreation(true, true);
600 return browsers;
597 } 601 }
598 602
599 // Restore a single tab from a foreign session. 603 // Restore a single tab from a foreign session.
600 // Opens in the tab in the last active browser, unless disposition is 604 // Opens in the tab in the last active browser, unless disposition is
601 // NEW_WINDOW, in which case the tab will be opened in a new browser. 605 // NEW_WINDOW, in which case the tab will be opened in a new browser. Returns
602 void RestoreForeignTab(const SessionTab& tab, 606 // the WebContents of the restored tab.
607 WebContents* RestoreForeignTab(const SessionTab& tab,
603 WindowOpenDisposition disposition) { 608 WindowOpenDisposition disposition) {
sky 2013/08/01 00:05:43 nit: fix indentation.
Kristen Dwan 2013/08/02 20:54:19 Done.
604 DCHECK(!tab.navigations.empty()); 609 DCHECK(!tab.navigations.empty());
605 int selected_index = tab.current_navigation_index; 610 int selected_index = tab.current_navigation_index;
606 selected_index = std::max( 611 selected_index = std::max(
607 0, 612 0,
608 std::min(selected_index, 613 std::min(selected_index,
609 static_cast<int>(tab.navigations.size() - 1))); 614 static_cast<int>(tab.navigations.size() - 1)));
610 615
611 bool use_new_window = disposition == NEW_WINDOW; 616 bool use_new_window = disposition == NEW_WINDOW;
612 617
613 Browser* browser = use_new_window ? 618 Browser* browser = use_new_window ?
614 new Browser(Browser::CreateParams(profile_, host_desktop_type_)) : 619 new Browser(Browser::CreateParams(profile_, host_desktop_type_)) :
615 browser_; 620 browser_;
616 621
617 RecordAppLaunchForTab(browser, tab, selected_index); 622 RecordAppLaunchForTab(browser, tab, selected_index);
618 623
624 WebContents* web_contents;
619 if (disposition == CURRENT_TAB) { 625 if (disposition == CURRENT_TAB) {
620 DCHECK(!use_new_window); 626 DCHECK(!use_new_window);
621 chrome::ReplaceRestoredTab(browser, 627 web_contents = chrome::ReplaceRestoredTab(browser,
622 tab.navigations, 628 tab.navigations,
623 selected_index, 629 selected_index,
624 true, 630 true,
625 tab.extension_app_id, 631 tab.extension_app_id,
626 NULL, 632 NULL,
627 tab.user_agent_override); 633 tab.user_agent_override);
628 } else { 634 } else {
629 int tab_index = 635 int tab_index =
630 use_new_window ? 0 : browser->tab_strip_model()->active_index() + 1; 636 use_new_window ? 0 : browser->tab_strip_model()->active_index() + 1;
631 WebContents* web_contents = chrome::AddRestoredTab( 637 web_contents = chrome::AddRestoredTab(
632 browser, 638 browser,
633 tab.navigations, 639 tab.navigations,
634 tab_index, 640 tab_index,
635 selected_index, 641 selected_index,
636 tab.extension_app_id, 642 tab.extension_app_id,
637 disposition == NEW_FOREGROUND_TAB, // selected 643 disposition == NEW_FOREGROUND_TAB, // selected
638 tab.pinned, 644 tab.pinned,
639 true, 645 true,
640 NULL, 646 NULL,
641 tab.user_agent_override); 647 tab.user_agent_override);
642 // Start loading the tab immediately. 648 // Start loading the tab immediately.
643 web_contents->GetController().LoadIfNecessary(); 649 web_contents->GetController().LoadIfNecessary();
644 } 650 }
645 651
646 if (use_new_window) { 652 if (use_new_window) {
647 browser->tab_strip_model()->ActivateTabAt(0, true); 653 browser->tab_strip_model()->ActivateTabAt(0, true);
648 browser->window()->Show(); 654 browser->window()->Show();
649 } 655 }
650 NotifySessionServiceOfRestoredTabs(browser, 656 NotifySessionServiceOfRestoredTabs(browser,
651 browser->tab_strip_model()->count()); 657 browser->tab_strip_model()->count());
652 658
653 // Since FinishedTabCreation() is not called here, |this| will leak if we 659 // Since FinishedTabCreation() is not called here, |this| will leak if we
654 // are not in sychronous mode. 660 // are not in sychronous mode.
655 DCHECK(synchronous_); 661 DCHECK(synchronous_);
662 return web_contents;
656 } 663 }
657 664
658 virtual ~SessionRestoreImpl() { 665 virtual ~SessionRestoreImpl() {
659 STLDeleteElements(&windows_); 666 STLDeleteElements(&windows_);
660 667
661 active_session_restorers->erase(this); 668 active_session_restorers->erase(this);
662 if (active_session_restorers->empty()) { 669 if (active_session_restorers->empty()) {
663 delete active_session_restorers; 670 delete active_session_restorers;
664 active_session_restorers = NULL; 671 active_session_restorers = NULL;
665 } 672 }
(...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after
1212 // SessionRestoreImpl takes care of deleting itself when done. 1219 // SessionRestoreImpl takes care of deleting itself when done.
1213 SessionRestoreImpl* restorer = new SessionRestoreImpl( 1220 SessionRestoreImpl* restorer = new SessionRestoreImpl(
1214 profile, browser, host_desktop_type, (behavior & SYNCHRONOUS) != 0, 1221 profile, browser, host_desktop_type, (behavior & SYNCHRONOUS) != 0,
1215 (behavior & CLOBBER_CURRENT_TAB) != 0, 1222 (behavior & CLOBBER_CURRENT_TAB) != 0,
1216 (behavior & ALWAYS_CREATE_TABBED_BROWSER) != 0, 1223 (behavior & ALWAYS_CREATE_TABBED_BROWSER) != 0,
1217 urls_to_open); 1224 urls_to_open);
1218 return restorer->Restore(); 1225 return restorer->Restore();
1219 } 1226 }
1220 1227
1221 // static 1228 // static
1222 void SessionRestore::RestoreForeignSessionWindows( 1229 std::vector<Browser*> SessionRestore::RestoreForeignSessionWindows(
1223 Profile* profile, 1230 Profile* profile,
1224 chrome::HostDesktopType host_desktop_type, 1231 chrome::HostDesktopType host_desktop_type,
1225 std::vector<const SessionWindow*>::const_iterator begin, 1232 std::vector<const SessionWindow*>::const_iterator begin,
1226 std::vector<const SessionWindow*>::const_iterator end) { 1233 std::vector<const SessionWindow*>::const_iterator end) {
1227 std::vector<GURL> gurls; 1234 std::vector<GURL> gurls;
1228 SessionRestoreImpl restorer(profile, 1235 SessionRestoreImpl restorer(profile,
1229 static_cast<Browser*>(NULL), host_desktop_type, true, false, true, gurls); 1236 static_cast<Browser*>(NULL), host_desktop_type, true, false, true, gurls);
1230 restorer.RestoreForeignSession(begin, end); 1237 return restorer.RestoreForeignSession(begin, end);
1231 } 1238 }
1232 1239
1233 // static 1240 // static
1234 void SessionRestore::RestoreForeignSessionTab( 1241 WebContents* SessionRestore::RestoreForeignSessionTab(
1235 content::WebContents* source_web_contents, 1242 content::WebContents* source_web_contents,
1236 const SessionTab& tab, 1243 const SessionTab& tab,
1237 WindowOpenDisposition disposition) { 1244 WindowOpenDisposition disposition) {
1238 Browser* browser = chrome::FindBrowserWithWebContents(source_web_contents); 1245 Browser* browser = chrome::FindBrowserWithWebContents(source_web_contents);
1239 Profile* profile = browser->profile(); 1246 Profile* profile = browser->profile();
1240 std::vector<GURL> gurls; 1247 std::vector<GURL> gurls;
1241 SessionRestoreImpl restorer(profile, browser, browser->host_desktop_type(), 1248 SessionRestoreImpl restorer(profile, browser, browser->host_desktop_type(),
1242 true, false, false, gurls); 1249 true, false, false, gurls);
1243 restorer.RestoreForeignTab(tab, disposition); 1250 return restorer.RestoreForeignTab(tab, disposition);
1244 } 1251 }
1245 1252
1246 // static 1253 // static
1247 bool SessionRestore::IsRestoring(const Profile* profile) { 1254 bool SessionRestore::IsRestoring(const Profile* profile) {
1248 if (active_session_restorers == NULL) 1255 if (active_session_restorers == NULL)
1249 return false; 1256 return false;
1250 for (std::set<SessionRestoreImpl*>::const_iterator it = 1257 for (std::set<SessionRestoreImpl*>::const_iterator it =
1251 active_session_restorers->begin(); 1258 active_session_restorers->begin();
1252 it != active_session_restorers->end(); ++it) { 1259 it != active_session_restorers->end(); ++it) {
1253 if ((*it)->profile() == profile) 1260 if ((*it)->profile() == profile)
1254 return true; 1261 return true;
1255 } 1262 }
1256 return false; 1263 return false;
1257 } 1264 }
1258 1265
1259 // static 1266 // static
1260 bool SessionRestore::IsRestoringSynchronously() { 1267 bool SessionRestore::IsRestoringSynchronously() {
1261 if (!active_session_restorers) 1268 if (!active_session_restorers)
1262 return false; 1269 return false;
1263 for (std::set<SessionRestoreImpl*>::const_iterator it = 1270 for (std::set<SessionRestoreImpl*>::const_iterator it =
1264 active_session_restorers->begin(); 1271 active_session_restorers->begin();
1265 it != active_session_restorers->end(); ++it) { 1272 it != active_session_restorers->end(); ++it) {
1266 if ((*it)->synchronous()) 1273 if ((*it)->synchronous())
1267 return true; 1274 return true;
1268 } 1275 }
1269 return false; 1276 return false;
1270 } 1277 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698