OLD | NEW |
---|---|
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "components/sessions/core/tab_restore_service_helper.h" | 5 #include "components/sessions/core/tab_restore_service_helper.h" |
6 | 6 |
7 #include <inttypes.h> | 7 #include <inttypes.h> |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
75 void TabRestoreServiceHelper::RemoveObserver( | 75 void TabRestoreServiceHelper::RemoveObserver( |
76 TabRestoreServiceObserver* observer) { | 76 TabRestoreServiceObserver* observer) { |
77 observer_list_.RemoveObserver(observer); | 77 observer_list_.RemoveObserver(observer); |
78 } | 78 } |
79 | 79 |
80 void TabRestoreServiceHelper::CreateHistoricalTab(LiveTab* live_tab, | 80 void TabRestoreServiceHelper::CreateHistoricalTab(LiveTab* live_tab, |
81 int index) { | 81 int index) { |
82 if (restoring_) | 82 if (restoring_) |
83 return; | 83 return; |
84 | 84 |
85 // If an entire window is being closed than all of the tabs have already | |
86 // been persisted via "BrowserClosing". Ignore the subsequent tab closing | |
87 // notifications. | |
85 LiveTabContext* context = client_->FindLiveTabContextForTab(live_tab); | 88 LiveTabContext* context = client_->FindLiveTabContextForTab(live_tab); |
86 if (closing_contexts_.find(context) != closing_contexts_.end()) | 89 if (closing_contexts_.find(context) != closing_contexts_.end()) |
87 return; | 90 return; |
88 | 91 |
89 auto local_tab = base::MakeUnique<Tab>(); | 92 auto local_tab = base::MakeUnique<Tab>(); |
90 PopulateTab(local_tab.get(), index, context, live_tab); | 93 PopulateTab(local_tab.get(), index, context, live_tab); |
91 if (local_tab->navigations.empty()) | 94 if (local_tab->navigations.empty()) |
92 return; | 95 return; |
93 | 96 |
94 AddEntry(std::move(local_tab), true, true); | 97 AddEntry(std::move(local_tab), true, true); |
95 } | 98 } |
96 | 99 |
97 void TabRestoreServiceHelper::BrowserClosing(LiveTabContext* context) { | 100 void TabRestoreServiceHelper::BrowserClosing(LiveTabContext* context) { |
98 closing_contexts_.insert(context); | 101 closing_contexts_.insert(context); |
99 | 102 |
100 auto window = base::MakeUnique<Window>(); | 103 auto window = base::MakeUnique<Window>(); |
101 window->selected_tab_index = context->GetSelectedIndex(); | 104 window->selected_tab_index = context->GetSelectedIndex(); |
102 window->timestamp = TimeNow(); | 105 window->timestamp = TimeNow(); |
103 window->app_name = context->GetAppName(); | 106 window->app_name = context->GetAppName(); |
107 window->bounds = context->GetBounds(); | |
108 window->show_state = context->GetShowState(); | |
109 window->workspace = context->GetWorkspace(); | |
104 | 110 |
105 for (int tab_index = 0; tab_index < context->GetTabCount(); ++tab_index) { | 111 for (int tab_index = 0; tab_index < context->GetTabCount(); ++tab_index) { |
106 auto tab = base::MakeUnique<Tab>(); | 112 auto tab = base::MakeUnique<Tab>(); |
107 PopulateTab(tab.get(), tab_index, context, | 113 PopulateTab(tab.get(), tab_index, context, |
108 context->GetLiveTabAt(tab_index)); | 114 context->GetLiveTabAt(tab_index)); |
109 if (!tab->navigations.empty()) { | 115 if (!tab->navigations.empty()) { |
110 tab->browser_id = context->GetSessionID().id(); | 116 tab->browser_id = context->GetSessionID().id(); |
111 window->tabs.push_back(std::move(tab)); | 117 window->tabs.push_back(std::move(tab)); |
112 } | 118 } |
113 } | 119 } |
120 | |
114 if (window->tabs.size() == 1 && window->app_name.empty()) { | 121 if (window->tabs.size() == 1 && window->app_name.empty()) { |
115 // Short-circuit creating a Window if only 1 tab was present. This fixes | 122 // Short-circuit creating a Window if only 1 tab was present. This fixes |
116 // http://crbug.com/56744. | 123 // http://crbug.com/56744. |
117 AddEntry(std::move(window->tabs[0]), true, true); | 124 AddEntry(std::move(window->tabs[0]), true, true); |
118 } else if (!window->tabs.empty()) { | 125 } else if (!window->tabs.empty()) { |
119 window->selected_tab_index = std::min( | 126 window->selected_tab_index = std::min( |
120 static_cast<int>(window->tabs.size() - 1), window->selected_tab_index); | 127 static_cast<int>(window->tabs.size() - 1), window->selected_tab_index); |
121 AddEntry(std::move(window), true, true); | 128 AddEntry(std::move(window), true, true); |
122 } | 129 } |
123 } | 130 } |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
192 break; | 199 break; |
193 } | 200 } |
194 case TabRestoreService::WINDOW: { | 201 case TabRestoreService::WINDOW: { |
195 LiveTabContext* current_context = context; | 202 LiveTabContext* current_context = context; |
196 auto& window = static_cast<Window&>(entry); | 203 auto& window = static_cast<Window&>(entry); |
197 | 204 |
198 // When restoring a window, either the entire window can be restored, or a | 205 // When restoring a window, either the entire window can be restored, or a |
199 // single tab within it. If the entry's ID matches the one to restore, | 206 // single tab within it. If the entry's ID matches the one to restore, |
200 // then the entire window will be restored. | 207 // then the entire window will be restored. |
201 if (!restoring_tab_in_window) { | 208 if (!restoring_tab_in_window) { |
202 context = client_->CreateLiveTabContext(window.app_name); | 209 context = |
210 client_->CreateLiveTabContext(window.app_name, window.bounds, | |
211 window.show_state, window.workspace); | |
203 for (size_t tab_i = 0; tab_i < window.tabs.size(); ++tab_i) { | 212 for (size_t tab_i = 0; tab_i < window.tabs.size(); ++tab_i) { |
204 const Tab& tab = *window.tabs[tab_i]; | 213 const Tab& tab = *window.tabs[tab_i]; |
205 LiveTab* restored_tab = context->AddRestoredTab( | 214 LiveTab* restored_tab = context->AddRestoredTab( |
206 tab.navigations, context->GetTabCount(), | 215 tab.navigations, context->GetTabCount(), |
207 tab.current_navigation_index, tab.extension_app_id, | 216 tab.current_navigation_index, tab.extension_app_id, |
208 static_cast<int>(tab_i) == window.selected_tab_index, tab.pinned, | 217 static_cast<int>(tab_i) == window.selected_tab_index, tab.pinned, |
209 tab.from_last_session, tab.platform_data.get(), | 218 tab.from_last_session, tab.platform_data.get(), |
210 tab.user_agent_override); | 219 tab.user_agent_override); |
211 if (restored_tab) { | 220 if (restored_tab) { |
212 client_->OnTabRestored( | 221 client_->OnTabRestored( |
213 tab.navigations.at(tab.current_navigation_index).virtual_url()); | 222 tab.navigations.at(tab.current_navigation_index).virtual_url()); |
214 live_tabs.push_back(restored_tab); | 223 live_tabs.push_back(restored_tab); |
215 } | 224 } |
216 } | 225 } |
217 // All the window's tabs had the same former browser_id. | 226 // All the window's tabs had the same former browser_id. |
218 if (auto browser_id = window.tabs[0]->browser_id) { | 227 if (auto browser_id = window.tabs[0]->browser_id) { |
219 UpdateTabBrowserIDs(browser_id, context->GetSessionID().id()); | 228 UpdateTabBrowserIDs(browser_id, context->GetSessionID().id()); |
220 } | 229 } |
221 } else { | 230 } else { |
222 // Restore a single tab from the window. Find the tab that matches the | 231 // Restore a single tab from the window. Find the tab that matches the |
223 // ID | 232 // ID in the window and restore it. |
224 // in the window and restore it. | |
225 for (auto tab_i = window.tabs.begin(); tab_i != window.tabs.end(); | 233 for (auto tab_i = window.tabs.begin(); tab_i != window.tabs.end(); |
226 ++tab_i) { | 234 ++tab_i) { |
227 SessionID::id_type restored_tab_browser_id; | 235 SessionID::id_type restored_tab_browser_id; |
228 { | 236 { |
229 const Tab& tab = **tab_i; | 237 const Tab& tab = **tab_i; |
230 if (tab.id != id) | 238 if (tab.id != id) |
231 continue; | 239 continue; |
232 | 240 |
233 restored_tab_browser_id = tab.browser_id; | 241 restored_tab_browser_id = tab.browser_id; |
234 LiveTab* restored_tab = nullptr; | 242 LiveTab* restored_tab = nullptr; |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
438 const Tab& tab, | 446 const Tab& tab, |
439 LiveTabContext* context, | 447 LiveTabContext* context, |
440 WindowOpenDisposition disposition, | 448 WindowOpenDisposition disposition, |
441 LiveTab** live_tab) { | 449 LiveTab** live_tab) { |
442 LiveTab* restored_tab; | 450 LiveTab* restored_tab; |
443 if (disposition == WindowOpenDisposition::CURRENT_TAB && context) { | 451 if (disposition == WindowOpenDisposition::CURRENT_TAB && context) { |
444 restored_tab = context->ReplaceRestoredTab( | 452 restored_tab = context->ReplaceRestoredTab( |
445 tab.navigations, tab.current_navigation_index, tab.from_last_session, | 453 tab.navigations, tab.current_navigation_index, tab.from_last_session, |
446 tab.extension_app_id, tab.platform_data.get(), tab.user_agent_override); | 454 tab.extension_app_id, tab.platform_data.get(), tab.user_agent_override); |
447 } else { | 455 } else { |
448 // We only respsect the tab's original browser if there's no disposition. | 456 // We only respect the tab's original browser if there's no disposition. |
449 if (disposition == WindowOpenDisposition::UNKNOWN && tab.browser_id) { | 457 if (disposition == WindowOpenDisposition::UNKNOWN && tab.browser_id) { |
450 context = client_->FindLiveTabContextWithID(tab.browser_id); | 458 context = client_->FindLiveTabContextWithID(tab.browser_id); |
451 } | 459 } |
452 | 460 |
453 int tab_index = -1; | 461 int tab_index = -1; |
454 | 462 |
455 // |context| will be NULL in cases where one isn't already available (eg, | 463 // |context| will be NULL in cases where one isn't already available (eg, |
456 // when invoked on Mac OS X with no windows open). In this case, create a | 464 // when invoked on Mac OS X with no windows open). In this case, create a |
457 // new browser into which we restore the tabs. | 465 // new browser into which we restore the tabs. |
458 if (context && disposition != WindowOpenDisposition::NEW_WINDOW) { | 466 if (context && disposition != WindowOpenDisposition::NEW_WINDOW) { |
459 tab_index = tab.tabstrip_index; | 467 tab_index = tab.tabstrip_index; |
460 } else { | 468 } else { |
461 context = client_->CreateLiveTabContext(std::string()); | 469 context = client_->CreateLiveTabContext(std::string(), gfx::Rect(), |
470 ui::SHOW_STATE_NORMAL, ""); | |
sky
2017/05/12 02:42:06
std::string()
| |
462 if (tab.browser_id) | 471 if (tab.browser_id) |
463 UpdateTabBrowserIDs(tab.browser_id, context->GetSessionID().id()); | 472 UpdateTabBrowserIDs(tab.browser_id, context->GetSessionID().id()); |
464 } | 473 } |
465 | 474 |
466 // Place the tab at the end if the tab index is no longer valid or | 475 // Place the tab at the end if the tab index is no longer valid or |
467 // we were passed a specific disposition. | 476 // we were passed a specific disposition. |
468 if (tab_index < 0 || tab_index > context->GetTabCount() || | 477 if (tab_index < 0 || tab_index > context->GetTabCount() || |
469 disposition != WindowOpenDisposition::UNKNOWN) { | 478 disposition != WindowOpenDisposition::UNKNOWN) { |
470 tab_index = context->GetTabCount(); | 479 tab_index = context->GetTabCount(); |
471 } | 480 } |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
549 tab.browser_id = new_id; | 558 tab.browser_id = new_id; |
550 } | 559 } |
551 } | 560 } |
552 } | 561 } |
553 | 562 |
554 base::Time TabRestoreServiceHelper::TimeNow() const { | 563 base::Time TabRestoreServiceHelper::TimeNow() const { |
555 return time_factory_ ? time_factory_->TimeNow() : base::Time::Now(); | 564 return time_factory_ ? time_factory_->TimeNow() : base::Time::Now(); |
556 } | 565 } |
557 | 566 |
558 } // namespace sessions | 567 } // namespace sessions |
OLD | NEW |