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

Side by Side Diff: components/sessions/core/tab_restore_service_helper.cc

Issue 1697183003: Remove HostDesktopType from sessions and tab restore (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@metro-mode-19
Patch Set: mac Created 4 years, 10 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
OLDNEW
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 <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <iterator> 10 #include <iterator>
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 observer_->OnClearEntries(); 128 observer_->OnClearEntries();
129 STLDeleteElements(&entries_); 129 STLDeleteElements(&entries_);
130 NotifyTabsChanged(); 130 NotifyTabsChanged();
131 } 131 }
132 132
133 const TabRestoreService::Entries& TabRestoreServiceHelper::entries() const { 133 const TabRestoreService::Entries& TabRestoreServiceHelper::entries() const {
134 return entries_; 134 return entries_;
135 } 135 }
136 136
137 std::vector<LiveTab*> TabRestoreServiceHelper::RestoreMostRecentEntry( 137 std::vector<LiveTab*> TabRestoreServiceHelper::RestoreMostRecentEntry(
138 LiveTabContext* context, 138 LiveTabContext* context) {
139 int host_desktop_type) {
140 if (entries_.empty()) 139 if (entries_.empty())
141 return std::vector<LiveTab*>(); 140 return std::vector<LiveTab*>();
142 141
143 return RestoreEntryById(context, entries_.front()->id, host_desktop_type, 142 return RestoreEntryById(context, entries_.front()->id, UNKNOWN);
144 UNKNOWN);
145 } 143 }
146 144
147 TabRestoreService::Tab* TabRestoreServiceHelper::RemoveTabEntryById( 145 TabRestoreService::Tab* TabRestoreServiceHelper::RemoveTabEntryById(
148 SessionID::id_type id) { 146 SessionID::id_type id) {
149 Entries::iterator i = GetEntryIteratorById(id); 147 Entries::iterator i = GetEntryIteratorById(id);
150 if (i == entries_.end()) 148 if (i == entries_.end())
151 return NULL; 149 return NULL;
152 150
153 Entry* entry = *i; 151 Entry* entry = *i;
154 if (entry->type != TabRestoreService::TAB) 152 if (entry->type != TabRestoreService::TAB)
155 return NULL; 153 return NULL;
156 154
157 Tab* tab = static_cast<Tab*>(entry); 155 Tab* tab = static_cast<Tab*>(entry);
158 entries_.erase(i); 156 entries_.erase(i);
159 return tab; 157 return tab;
160 } 158 }
161 159
162 std::vector<LiveTab*> TabRestoreServiceHelper::RestoreEntryById( 160 std::vector<LiveTab*> TabRestoreServiceHelper::RestoreEntryById(
163 LiveTabContext* context, 161 LiveTabContext* context,
164 SessionID::id_type id, 162 SessionID::id_type id,
165 int host_desktop_type,
166 WindowOpenDisposition disposition) { 163 WindowOpenDisposition disposition) {
167 Entries::iterator entry_iterator = GetEntryIteratorById(id); 164 Entries::iterator entry_iterator = GetEntryIteratorById(id);
168 if (entry_iterator == entries_.end()) 165 if (entry_iterator == entries_.end())
169 // Don't hoark here, we allow an invalid id. 166 // Don't hoark here, we allow an invalid id.
170 return std::vector<LiveTab*>(); 167 return std::vector<LiveTab*>();
171 168
172 if (observer_) 169 if (observer_)
173 observer_->OnRestoreEntryById(id, entry_iterator); 170 observer_->OnRestoreEntryById(id, entry_iterator);
174 restoring_ = true; 171 restoring_ = true;
175 Entry* entry = *entry_iterator; 172 Entry* entry = *entry_iterator;
176 173
177 // If the entry's ID does not match the ID that is being restored, then the 174 // If the entry's ID does not match the ID that is being restored, then the
178 // entry is a window from which a single tab will be restored. 175 // entry is a window from which a single tab will be restored.
179 bool restoring_tab_in_window = entry->id != id; 176 bool restoring_tab_in_window = entry->id != id;
180 177
181 if (!restoring_tab_in_window) { 178 if (!restoring_tab_in_window) {
182 entries_.erase(entry_iterator); 179 entries_.erase(entry_iterator);
183 entry_iterator = entries_.end(); 180 entry_iterator = entries_.end();
184 } 181 }
185 182
186 // |context| will be NULL in cases where one isn't already available (eg, 183 // |context| will be NULL in cases where one isn't already available (eg,
187 // when invoked on Mac OS X with no windows open). In this case, create a 184 // when invoked on Mac OS X with no windows open). In this case, create a
188 // new browser into which we restore the tabs. 185 // new browser into which we restore the tabs.
189 std::vector<LiveTab*> live_tabs; 186 std::vector<LiveTab*> live_tabs;
190 if (entry->type == TabRestoreService::TAB) { 187 if (entry->type == TabRestoreService::TAB) {
191 Tab* tab = static_cast<Tab*>(entry); 188 Tab* tab = static_cast<Tab*>(entry);
192 LiveTab* restored_tab = NULL; 189 LiveTab* restored_tab = NULL;
193 context = RestoreTab(*tab, context, host_desktop_type, disposition, 190 context = RestoreTab(*tab, context, disposition, &restored_tab);
194 &restored_tab);
195 live_tabs.push_back(restored_tab); 191 live_tabs.push_back(restored_tab);
196 context->ShowBrowserWindow(); 192 context->ShowBrowserWindow();
197 } else if (entry->type == TabRestoreService::WINDOW) { 193 } else if (entry->type == TabRestoreService::WINDOW) {
198 LiveTabContext* current_context = context; 194 LiveTabContext* current_context = context;
199 Window* window = static_cast<Window*>(entry); 195 Window* window = static_cast<Window*>(entry);
200 196
201 // When restoring a window, either the entire window can be restored, or a 197 // When restoring a window, either the entire window can be restored, or a
202 // single tab within it. If the entry's ID matches the one to restore, then 198 // single tab within it. If the entry's ID matches the one to restore, then
203 // the entire window will be restored. 199 // the entire window will be restored.
204 if (!restoring_tab_in_window) { 200 if (!restoring_tab_in_window) {
205 context = 201 context = client_->CreateLiveTabContext(window->app_name);
206 client_->CreateLiveTabContext(host_desktop_type, window->app_name);
207 for (size_t tab_i = 0; tab_i < window->tabs.size(); ++tab_i) { 202 for (size_t tab_i = 0; tab_i < window->tabs.size(); ++tab_i) {
208 const Tab& tab = window->tabs[tab_i]; 203 const Tab& tab = window->tabs[tab_i];
209 LiveTab* restored_tab = context->AddRestoredTab( 204 LiveTab* restored_tab = context->AddRestoredTab(
210 tab.navigations, context->GetTabCount(), 205 tab.navigations, context->GetTabCount(),
211 tab.current_navigation_index, tab.extension_app_id, 206 tab.current_navigation_index, tab.extension_app_id,
212 static_cast<int>(tab_i) == window->selected_tab_index, tab.pinned, 207 static_cast<int>(tab_i) == window->selected_tab_index, tab.pinned,
213 tab.from_last_session, tab.platform_data.get(), 208 tab.from_last_session, tab.platform_data.get(),
214 tab.user_agent_override); 209 tab.user_agent_override);
215 if (restored_tab) { 210 if (restored_tab) {
216 restored_tab->LoadIfNecessary(); 211 restored_tab->LoadIfNecessary();
217 client_->OnTabRestored( 212 client_->OnTabRestored(
218 tab.navigations.at(tab.current_navigation_index).virtual_url()); 213 tab.navigations.at(tab.current_navigation_index).virtual_url());
219 live_tabs.push_back(restored_tab); 214 live_tabs.push_back(restored_tab);
220 } 215 }
221 } 216 }
222 // All the window's tabs had the same former browser_id. 217 // All the window's tabs had the same former browser_id.
223 if (window->tabs[0].has_browser()) { 218 if (window->tabs[0].has_browser()) {
224 UpdateTabBrowserIDs(window->tabs[0].browser_id, 219 UpdateTabBrowserIDs(window->tabs[0].browser_id,
225 context->GetSessionID().id()); 220 context->GetSessionID().id());
226 } 221 }
227 } else { 222 } else {
228 // Restore a single tab from the window. Find the tab that matches the ID 223 // Restore a single tab from the window. Find the tab that matches the ID
229 // in the window and restore it. 224 // in the window and restore it.
230 for (std::vector<Tab>::iterator tab_i = window->tabs.begin(); 225 for (std::vector<Tab>::iterator tab_i = window->tabs.begin();
231 tab_i != window->tabs.end(); ++tab_i) { 226 tab_i != window->tabs.end(); ++tab_i) {
232 const Tab& tab = *tab_i; 227 const Tab& tab = *tab_i;
233 if (tab.id == id) { 228 if (tab.id == id) {
234 LiveTab* restored_tab = NULL; 229 LiveTab* restored_tab = NULL;
235 context = RestoreTab(tab, context, host_desktop_type, disposition, 230 context = RestoreTab(tab, context, disposition, &restored_tab);
236 &restored_tab);
237 live_tabs.push_back(restored_tab); 231 live_tabs.push_back(restored_tab);
238 window->tabs.erase(tab_i); 232 window->tabs.erase(tab_i);
239 // If restoring the tab leaves the window with nothing else, delete it 233 // If restoring the tab leaves the window with nothing else, delete it
240 // as well. 234 // as well.
241 if (!window->tabs.size()) { 235 if (!window->tabs.size()) {
242 entries_.erase(entry_iterator); 236 entries_.erase(entry_iterator);
243 delete entry; 237 delete entry;
244 } else { 238 } else {
245 // Update the browser ID of the rest of the tabs in the window so if 239 // Update the browser ID of the rest of the tabs in the window so if
246 // any one is restored, it goes into the same window as the tab 240 // any one is restored, it goes into the same window as the tab
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 // Delegate may be NULL during unit tests. 382 // Delegate may be NULL during unit tests.
389 if (context) { 383 if (context) {
390 tab->browser_id = context->GetSessionID().id(); 384 tab->browser_id = context->GetSessionID().id();
391 tab->pinned = context->IsTabPinned(tab->tabstrip_index); 385 tab->pinned = context->IsTabPinned(tab->tabstrip_index);
392 } 386 }
393 } 387 }
394 388
395 LiveTabContext* TabRestoreServiceHelper::RestoreTab( 389 LiveTabContext* TabRestoreServiceHelper::RestoreTab(
396 const Tab& tab, 390 const Tab& tab,
397 LiveTabContext* context, 391 LiveTabContext* context,
398 int host_desktop_type,
399 WindowOpenDisposition disposition, 392 WindowOpenDisposition disposition,
400 LiveTab** live_tab) { 393 LiveTab** live_tab) {
401 LiveTab* restored_tab; 394 LiveTab* restored_tab;
402 if (disposition == CURRENT_TAB && context) { 395 if (disposition == CURRENT_TAB && context) {
403 restored_tab = context->ReplaceRestoredTab( 396 restored_tab = context->ReplaceRestoredTab(
404 tab.navigations, tab.current_navigation_index, tab.from_last_session, 397 tab.navigations, tab.current_navigation_index, tab.from_last_session,
405 tab.extension_app_id, tab.platform_data.get(), tab.user_agent_override); 398 tab.extension_app_id, tab.platform_data.get(), tab.user_agent_override);
406 } else { 399 } else {
407 // We only respsect the tab's original browser if there's no disposition. 400 // We only respsect the tab's original browser if there's no disposition.
408 if (disposition == UNKNOWN && tab.has_browser()) { 401 if (disposition == UNKNOWN && tab.has_browser()) {
409 context = 402 context = client_->FindLiveTabContextWithID(tab.browser_id);
410 client_->FindLiveTabContextWithID(tab.browser_id, host_desktop_type);
411 } 403 }
412 404
413 int tab_index = -1; 405 int tab_index = -1;
414 406
415 // |context| will be NULL in cases where one isn't already available (eg, 407 // |context| will be NULL in cases where one isn't already available (eg,
416 // when invoked on Mac OS X with no windows open). In this case, create a 408 // when invoked on Mac OS X with no windows open). In this case, create a
417 // new browser into which we restore the tabs. 409 // new browser into which we restore the tabs.
418 if (context && disposition != NEW_WINDOW) { 410 if (context && disposition != NEW_WINDOW) {
419 tab_index = tab.tabstrip_index; 411 tab_index = tab.tabstrip_index;
420 } else { 412 } else {
421 context = client_->CreateLiveTabContext(host_desktop_type, std::string()); 413 context = client_->CreateLiveTabContext(std::string());
422 if (tab.has_browser()) 414 if (tab.has_browser())
423 UpdateTabBrowserIDs(tab.browser_id, context->GetSessionID().id()); 415 UpdateTabBrowserIDs(tab.browser_id, context->GetSessionID().id());
424 } 416 }
425 417
426 // Place the tab at the end if the tab index is no longer valid or 418 // Place the tab at the end if the tab index is no longer valid or
427 // we were passed a specific disposition. 419 // we were passed a specific disposition.
428 if (tab_index < 0 || tab_index > context->GetTabCount() || 420 if (tab_index < 0 || tab_index > context->GetTabCount() ||
429 disposition != UNKNOWN) { 421 disposition != UNKNOWN) {
430 tab_index = context->GetTabCount(); 422 tab_index = context->GetTabCount();
431 } 423 }
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 tab->browser_id = new_id; 519 tab->browser_id = new_id;
528 } 520 }
529 } 521 }
530 } 522 }
531 523
532 base::Time TabRestoreServiceHelper::TimeNow() const { 524 base::Time TabRestoreServiceHelper::TimeNow() const {
533 return time_factory_ ? time_factory_->TimeNow() : base::Time::Now(); 525 return time_factory_ ? time_factory_->TimeNow() : base::Time::Now();
534 } 526 }
535 527
536 } // namespace sessions 528 } // namespace sessions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698