OLD | NEW |
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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 namespace { | 60 namespace { |
61 | 61 |
62 class SessionRestoreImpl; | 62 class SessionRestoreImpl; |
63 class TabLoader; | 63 class TabLoader; |
64 | 64 |
65 TabLoader* shared_tab_loader = NULL; | 65 TabLoader* shared_tab_loader = NULL; |
66 | 66 |
67 // Pointers to SessionRestoreImpls which are currently restoring the session. | 67 // Pointers to SessionRestoreImpls which are currently restoring the session. |
68 std::set<SessionRestoreImpl*>* active_session_restorers = NULL; | 68 std::set<SessionRestoreImpl*>* active_session_restorers = NULL; |
69 | 69 |
| 70 // Helper to use with BrowserContext::ForEachStoragePartition(). |
| 71 void StartScavengingUnusedSessionStorage(const std::string& id, |
| 72 content::StoragePartition* storage_part
ition) { |
| 73 storage_partition->GetDOMStorageContext()-> |
| 74 StartScavengingUnusedSessionStorage(); |
| 75 } |
| 76 |
70 // TabLoader ------------------------------------------------------------------ | 77 // TabLoader ------------------------------------------------------------------ |
71 | 78 |
72 // Initial delay (see class decription for details). | 79 // Initial delay (see class decription for details). |
73 static const int kInitialDelayTimerMS = 100; | 80 static const int kInitialDelayTimerMS = 100; |
74 | 81 |
75 // TabLoader is responsible for loading tabs after session restore creates | 82 // TabLoader is responsible for loading tabs after session restore creates |
76 // tabs. New tabs are loaded after the current tab finishes loading, or a delay | 83 // tabs. New tabs are loaded after the current tab finishes loading, or a delay |
77 // is reached (initially kInitialDelayTimerMS). If the delay is reached before | 84 // is reached (initially kInitialDelayTimerMS). If the delay is reached before |
78 // a tab finishes loading a new tab is loaded and the time of the delay | 85 // a tab finishes loading a new tab is loaded and the time of the delay |
79 // doubled. | 86 // doubled. |
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
587 | 594 |
588 RecordAppLaunchForTab(browser, tab, selected_index); | 595 RecordAppLaunchForTab(browser, tab, selected_index); |
589 | 596 |
590 if (disposition == CURRENT_TAB) { | 597 if (disposition == CURRENT_TAB) { |
591 DCHECK(!use_new_window); | 598 DCHECK(!use_new_window); |
592 chrome::ReplaceRestoredTab(browser, | 599 chrome::ReplaceRestoredTab(browser, |
593 tab.navigations, | 600 tab.navigations, |
594 selected_index, | 601 selected_index, |
595 true, | 602 true, |
596 tab.extension_app_id, | 603 tab.extension_app_id, |
597 NULL, | 604 content::SessionStorageNamespaceMap(), |
598 tab.user_agent_override); | 605 tab.user_agent_override); |
599 } else { | 606 } else { |
600 int tab_index = use_new_window ? 0 : browser->active_index() + 1; | 607 int tab_index = use_new_window ? 0 : browser->active_index() + 1; |
601 WebContents* web_contents = chrome::AddRestoredTab( | 608 WebContents* web_contents = chrome::AddRestoredTab( |
602 browser, | 609 browser, |
603 tab.navigations, | 610 tab.navigations, |
604 tab_index, | 611 tab_index, |
605 selected_index, | 612 selected_index, |
606 tab.extension_app_id, | 613 tab.extension_app_id, |
607 false, // selected | 614 false, // selected |
608 tab.pinned, | 615 tab.pinned, |
609 true, | 616 true, |
610 NULL, | 617 content::SessionStorageNamespaceMap(), |
611 tab.user_agent_override); | 618 tab.user_agent_override); |
612 // Start loading the tab immediately. | 619 // Start loading the tab immediately. |
613 web_contents->GetController().LoadIfNecessary(); | 620 web_contents->GetController().LoadIfNecessary(); |
614 } | 621 } |
615 | 622 |
616 if (use_new_window) { | 623 if (use_new_window) { |
617 chrome::ActivateTabAt(browser, 0, true); | 624 chrome::ActivateTabAt(browser, 0, true); |
618 browser->window()->Show(); | 625 browser->window()->Show(); |
619 } | 626 } |
620 NotifySessionServiceOfRestoredTabs(browser, browser->tab_count()); | 627 NotifySessionServiceOfRestoredTabs(browser, browser->tab_count()); |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
734 UMA_HISTOGRAM_CUSTOM_TIMES( | 741 UMA_HISTOGRAM_CUSTOM_TIMES( |
735 "SessionRestore.TimeToProcessSessions", | 742 "SessionRestore.TimeToProcessSessions", |
736 time_to_process_sessions, | 743 time_to_process_sessions, |
737 base::TimeDelta::FromMilliseconds(10), | 744 base::TimeDelta::FromMilliseconds(10), |
738 base::TimeDelta::FromSeconds(1000), | 745 base::TimeDelta::FromSeconds(1000), |
739 100); | 746 100); |
740 | 747 |
741 if (windows->empty()) { | 748 if (windows->empty()) { |
742 // Restore was unsuccessful. The DOM storage system can also delete its | 749 // Restore was unsuccessful. The DOM storage system can also delete its |
743 // data, since no session restore will happen at a later point in time. | 750 // data, since no session restore will happen at a later point in time. |
744 content::BrowserContext::GetDefaultStoragePartition(profile_)-> | 751 content::BrowserContext::ForEachStoragePartition( |
745 GetDOMStorageContext()->StartScavengingUnusedSessionStorage(); | 752 profile_, |
| 753 base::Bind(&StartScavengingUnusedSessionStorage)); |
746 return FinishedTabCreation(false, false); | 754 return FinishedTabCreation(false, false); |
747 } | 755 } |
748 | 756 |
749 #if defined(OS_CHROMEOS) | 757 #if defined(OS_CHROMEOS) |
750 chromeos::BootTimesLoader::Get()->AddLoginTimeMarker( | 758 chromeos::BootTimesLoader::Get()->AddLoginTimeMarker( |
751 "SessionRestore-CreatingTabs-Start", false); | 759 "SessionRestore-CreatingTabs-Start", false); |
752 #endif | 760 #endif |
753 StartTabCreation(); | 761 StartTabCreation(); |
754 | 762 |
755 // After the for loop this contains the last TABBED_BROWSER. Is null if no | 763 // After the for loop this contains the last TABBED_BROWSER. Is null if no |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
828 // If last_browser is NULL and urls_to_open_ is non-empty, | 836 // If last_browser is NULL and urls_to_open_ is non-empty, |
829 // FinishedTabCreation will create a new TabbedBrowser and add the urls to | 837 // FinishedTabCreation will create a new TabbedBrowser and add the urls to |
830 // it. | 838 // it. |
831 Browser* finished_browser = FinishedTabCreation(true, has_tabbed_browser); | 839 Browser* finished_browser = FinishedTabCreation(true, has_tabbed_browser); |
832 if (finished_browser) | 840 if (finished_browser) |
833 last_browser = finished_browser; | 841 last_browser = finished_browser; |
834 | 842 |
835 // sessionStorages needed for the session restore have now been recreated | 843 // sessionStorages needed for the session restore have now been recreated |
836 // by RestoreTab. Now it's safe for the DOM storage system to start | 844 // by RestoreTab. Now it's safe for the DOM storage system to start |
837 // deleting leftover data. | 845 // deleting leftover data. |
838 content::BrowserContext::GetDefaultStoragePartition(profile_)-> | 846 content::BrowserContext::ForEachStoragePartition( |
839 GetDOMStorageContext()->StartScavengingUnusedSessionStorage(); | 847 profile_, |
| 848 base::Bind(&StartScavengingUnusedSessionStorage)); |
840 return last_browser; | 849 return last_browser; |
841 } | 850 } |
842 | 851 |
843 // Record an app launch event (if appropriate) for a tab which is about to | 852 // Record an app launch event (if appropriate) for a tab which is about to |
844 // be restored. Callers should ensure that selected_index is within the | 853 // be restored. Callers should ensure that selected_index is within the |
845 // bounds of tab.navigations before calling. | 854 // bounds of tab.navigations before calling. |
846 void RecordAppLaunchForTab(Browser* browser, | 855 void RecordAppLaunchForTab(Browser* browser, |
847 const SessionTab& tab, | 856 const SessionTab& tab, |
848 int selected_index) { | 857 int selected_index) { |
849 DCHECK(selected_index >= 0 && | 858 DCHECK(selected_index >= 0 && |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
884 DCHECK(!tab.navigations.empty()); | 893 DCHECK(!tab.navigations.empty()); |
885 int selected_index = tab.current_navigation_index; | 894 int selected_index = tab.current_navigation_index; |
886 selected_index = std::max( | 895 selected_index = std::max( |
887 0, | 896 0, |
888 std::min(selected_index, | 897 std::min(selected_index, |
889 static_cast<int>(tab.navigations.size() - 1))); | 898 static_cast<int>(tab.navigations.size() - 1))); |
890 | 899 |
891 RecordAppLaunchForTab(browser, tab, selected_index); | 900 RecordAppLaunchForTab(browser, tab, selected_index); |
892 | 901 |
893 // Associate sessionStorage (if any) to the restored tab. | 902 // Associate sessionStorage (if any) to the restored tab. |
894 scoped_refptr<content::SessionStorageNamespace> session_storage_namespace; | 903 content::SessionStorageNamespaceMap restored_session_storage_namespaces; |
895 if (!tab.session_storage_persistent_id.empty()) { | 904 for (std::map<std::string, std::string>::const_iterator it = |
896 session_storage_namespace = | 905 tab.session_storage_persistent_id_map.begin(); |
897 content::BrowserContext::GetDefaultStoragePartition(profile_)-> | 906 it != tab.session_storage_persistent_id_map.end(); |
898 GetDOMStorageContext()->RecreateSessionStorage( | 907 ++it) { |
899 tab.session_storage_persistent_id); | 908 using content::BrowserContext; |
| 909 if (BrowserContext::IsValidPartitionId(profile_, it->first)) { |
| 910 content::StoragePartition* partition = |
| 911 BrowserContext::GetStoragePartitionById(profile_, it->first); |
| 912 restored_session_storage_namespaces[it->first] = |
| 913 partition->GetDOMStorageContext()-> |
| 914 RecreateSessionStorage(it->second); |
| 915 } |
900 } | 916 } |
901 | 917 |
902 WebContents* web_contents = | 918 WebContents* web_contents = |
903 chrome::AddRestoredTab(browser, | 919 chrome::AddRestoredTab(browser, |
904 tab.navigations, | 920 tab.navigations, |
905 tab_index, | 921 tab_index, |
906 selected_index, | 922 selected_index, |
907 tab.extension_app_id, | 923 tab.extension_app_id, |
908 false, // select | 924 false, // select |
909 tab.pinned, | 925 tab.pinned, |
910 true, | 926 true, |
911 session_storage_namespace.get(), | 927 restored_session_storage_namespaces, |
912 tab.user_agent_override); | 928 tab.user_agent_override); |
913 // Regression check: check that the tab didn't start loading right away. The | 929 // Regression check: check that the tab didn't start loading right away. The |
914 // focused tab will be loaded by Browser, and TabLoader will load the rest. | 930 // focused tab will be loaded by Browser, and TabLoader will load the rest. |
915 DCHECK(web_contents->GetController().NeedsReload()); | 931 DCHECK(web_contents->GetController().NeedsReload()); |
916 | 932 |
917 // Set up the file access rights for the selected navigation entry. | 933 // Set up the file access rights for the selected navigation entry. |
918 const int id = web_contents->GetRenderProcessHost()->GetID(); | 934 const int id = web_contents->GetRenderProcessHost()->GetID(); |
919 const int read_file_permissions = | 935 const int read_file_permissions = |
920 base::PLATFORM_FILE_OPEN | | 936 base::PLATFORM_FILE_OPEN | |
921 base::PLATFORM_FILE_READ | | 937 base::PLATFORM_FILE_READ | |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1107 if (active_session_restorers == NULL) | 1123 if (active_session_restorers == NULL) |
1108 return false; | 1124 return false; |
1109 for (std::set<SessionRestoreImpl*>::const_iterator it = | 1125 for (std::set<SessionRestoreImpl*>::const_iterator it = |
1110 active_session_restorers->begin(); | 1126 active_session_restorers->begin(); |
1111 it != active_session_restorers->end(); ++it) { | 1127 it != active_session_restorers->end(); ++it) { |
1112 if ((*it)->profile() == profile) | 1128 if ((*it)->profile() == profile) |
1113 return true; | 1129 return true; |
1114 } | 1130 } |
1115 return false; | 1131 return false; |
1116 } | 1132 } |
OLD | NEW |