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

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

Issue 685133004: Handling |SessionCommand|s as scoped_ptr's (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed Created 6 years, 1 month 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 (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_service.h" 5 #include "chrome/browser/sessions/session_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 RunTaskOnBackendThread( 147 RunTaskOnBackendThread(
148 FROM_HERE, base::Bind(&SessionBackend::MoveCurrentSessionToLastSession, 148 FROM_HERE, base::Bind(&SessionBackend::MoveCurrentSessionToLastSession,
149 backend())); 149 backend()));
150 } 150 }
151 151
152 void SessionService::SetTabWindow(const SessionID& window_id, 152 void SessionService::SetTabWindow(const SessionID& window_id,
153 const SessionID& tab_id) { 153 const SessionID& tab_id) {
154 if (!ShouldTrackChangesToWindow(window_id)) 154 if (!ShouldTrackChangesToWindow(window_id))
155 return; 155 return;
156 156
157 ScheduleCommand(CreateSetTabWindowCommand(window_id, tab_id)); 157 ScheduleCommand(CreateSetTabWindowCommand(window_id, tab_id).Pass());
158 } 158 }
159 159
160 void SessionService::SetWindowBounds(const SessionID& window_id, 160 void SessionService::SetWindowBounds(const SessionID& window_id,
161 const gfx::Rect& bounds, 161 const gfx::Rect& bounds,
162 ui::WindowShowState show_state) { 162 ui::WindowShowState show_state) {
163 if (!ShouldTrackChangesToWindow(window_id)) 163 if (!ShouldTrackChangesToWindow(window_id))
164 return; 164 return;
165 165
166 ScheduleCommand(CreateSetWindowBoundsCommand(window_id, bounds, show_state)); 166 ScheduleCommand(
167 CreateSetWindowBoundsCommand(window_id, bounds, show_state).Pass());
167 } 168 }
168 169
169 void SessionService::SetTabIndexInWindow(const SessionID& window_id, 170 void SessionService::SetTabIndexInWindow(const SessionID& window_id,
170 const SessionID& tab_id, 171 const SessionID& tab_id,
171 int new_index) { 172 int new_index) {
172 if (!ShouldTrackChangesToWindow(window_id)) 173 if (!ShouldTrackChangesToWindow(window_id))
173 return; 174 return;
174 175
175 ScheduleCommand(CreateSetTabIndexInWindowCommand(tab_id, new_index)); 176 ScheduleCommand(CreateSetTabIndexInWindowCommand(tab_id, new_index).Pass());
176 } 177 }
177 178
178 void SessionService::SetPinnedState(const SessionID& window_id, 179 void SessionService::SetPinnedState(const SessionID& window_id,
179 const SessionID& tab_id, 180 const SessionID& tab_id,
180 bool is_pinned) { 181 bool is_pinned) {
181 if (!ShouldTrackChangesToWindow(window_id)) 182 if (!ShouldTrackChangesToWindow(window_id))
182 return; 183 return;
183 184
184 ScheduleCommand(CreatePinnedStateCommand(tab_id, is_pinned)); 185 ScheduleCommand(CreatePinnedStateCommand(tab_id, is_pinned).Pass());
185 } 186 }
186 187
187 void SessionService::TabClosed(const SessionID& window_id, 188 void SessionService::TabClosed(const SessionID& window_id,
188 const SessionID& tab_id, 189 const SessionID& tab_id,
189 bool closed_by_user_gesture) { 190 bool closed_by_user_gesture) {
190 if (!tab_id.id()) 191 if (!tab_id.id())
191 return; // Hapens when the tab is replaced. 192 return; // Hapens when the tab is replaced.
192 193
193 if (!ShouldTrackChangesToWindow(window_id)) 194 if (!ShouldTrackChangesToWindow(window_id))
194 return; 195 return;
(...skipping 10 matching lines...) Expand all
205 pending_tab_close_ids_.insert(tab_id.id()); 206 pending_tab_close_ids_.insert(tab_id.id());
206 } else if (find(window_closing_ids_.begin(), window_closing_ids_.end(), 207 } else if (find(window_closing_ids_.begin(), window_closing_ids_.end(),
207 window_id.id()) != window_closing_ids_.end() || 208 window_id.id()) != window_closing_ids_.end() ||
208 !IsOnlyOneTabLeft() || 209 !IsOnlyOneTabLeft() ||
209 closed_by_user_gesture) { 210 closed_by_user_gesture) {
210 // Close is the result of one of the following: 211 // Close is the result of one of the following:
211 // . window close (and it isn't the last window). 212 // . window close (and it isn't the last window).
212 // . closing a tab and there are other windows/tabs open. 213 // . closing a tab and there are other windows/tabs open.
213 // . closed by a user gesture. 214 // . closed by a user gesture.
214 // In all cases we need to mark the tab as explicitly closed. 215 // In all cases we need to mark the tab as explicitly closed.
215 ScheduleCommand(CreateTabClosedCommand(tab_id.id())); 216 ScheduleCommand(CreateTabClosedCommand(tab_id.id()).Pass());
216 } else { 217 } else {
217 // User closed the last tab in the last tabbed browser. Don't mark the 218 // User closed the last tab in the last tabbed browser. Don't mark the
218 // tab closed. 219 // tab closed.
219 pending_tab_close_ids_.insert(tab_id.id()); 220 pending_tab_close_ids_.insert(tab_id.id());
220 has_open_trackable_browsers_ = false; 221 has_open_trackable_browsers_ = false;
221 } 222 }
222 } 223 }
223 224
224 void SessionService::WindowOpened(Browser* browser) { 225 void SessionService::WindowOpened(Browser* browser) {
225 if (!ShouldTrackBrowser(browser)) 226 if (!ShouldTrackBrowser(browser))
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 if (!ShouldTrackChangesToWindow(window_id)) { 280 if (!ShouldTrackChangesToWindow(window_id)) {
280 // The last window may be one that is not tracked. 281 // The last window may be one that is not tracked.
281 MaybeDeleteSessionOnlyData(); 282 MaybeDeleteSessionOnlyData();
282 return; 283 return;
283 } 284 }
284 285
285 windows_tracking_.erase(window_id.id()); 286 windows_tracking_.erase(window_id.id());
286 287
287 if (window_closing_ids_.find(window_id.id()) != window_closing_ids_.end()) { 288 if (window_closing_ids_.find(window_id.id()) != window_closing_ids_.end()) {
288 window_closing_ids_.erase(window_id.id()); 289 window_closing_ids_.erase(window_id.id());
289 ScheduleCommand(CreateWindowClosedCommand(window_id.id())); 290 ScheduleCommand(CreateWindowClosedCommand(window_id.id()).Pass());
290 } else if (pending_window_close_ids_.find(window_id.id()) == 291 } else if (pending_window_close_ids_.find(window_id.id()) ==
291 pending_window_close_ids_.end()) { 292 pending_window_close_ids_.end()) {
292 // We'll hit this if user closed the last tab in a window. 293 // We'll hit this if user closed the last tab in a window.
293 has_open_trackable_browsers_ = HasOpenTrackableBrowsers(window_id); 294 has_open_trackable_browsers_ = HasOpenTrackableBrowsers(window_id);
294 if (!has_open_trackable_browsers_) 295 if (!has_open_trackable_browsers_)
295 pending_window_close_ids_.insert(window_id.id()); 296 pending_window_close_ids_.insert(window_id.id());
296 else 297 else
297 ScheduleCommand(CreateWindowClosedCommand(window_id.id())); 298 ScheduleCommand(CreateWindowClosedCommand(window_id.id()).Pass());
298 } 299 }
299 MaybeDeleteSessionOnlyData(); 300 MaybeDeleteSessionOnlyData();
300 } 301 }
301 302
302 void SessionService::TabInserted(WebContents* contents) { 303 void SessionService::TabInserted(WebContents* contents) {
303 SessionTabHelper* session_tab_helper = 304 SessionTabHelper* session_tab_helper =
304 SessionTabHelper::FromWebContents(contents); 305 SessionTabHelper::FromWebContents(contents);
305 if (!ShouldTrackChangesToWindow(session_tab_helper->window_id())) 306 if (!ShouldTrackChangesToWindow(session_tab_helper->window_id()))
306 return; 307 return;
307 SetTabWindow(session_tab_helper->window_id(), 308 SetTabWindow(session_tab_helper->window_id(),
(...skipping 11 matching lines...) Expand all
319 // Record the association between the SessionStorageNamespace and the 320 // Record the association between the SessionStorageNamespace and the
320 // tab. 321 // tab.
321 // 322 //
322 // TODO(ajwong): This should be processing the whole map rather than 323 // TODO(ajwong): This should be processing the whole map rather than
323 // just the default. This in particular will not work for tabs with only 324 // just the default. This in particular will not work for tabs with only
324 // isolated apps which won't have a default partition. 325 // isolated apps which won't have a default partition.
325 content::SessionStorageNamespace* session_storage_namespace = 326 content::SessionStorageNamespace* session_storage_namespace =
326 contents->GetController().GetDefaultSessionStorageNamespace(); 327 contents->GetController().GetDefaultSessionStorageNamespace();
327 ScheduleCommand(CreateSessionStorageAssociatedCommand( 328 ScheduleCommand(CreateSessionStorageAssociatedCommand(
328 session_tab_helper->session_id(), 329 session_tab_helper->session_id(),
329 session_storage_namespace->persistent_id())); 330 session_storage_namespace->persistent_id()).Pass());
330 session_storage_namespace->SetShouldPersist(true); 331 session_storage_namespace->SetShouldPersist(true);
331 } 332 }
332 333
333 void SessionService::TabClosing(WebContents* contents) { 334 void SessionService::TabClosing(WebContents* contents) {
334 // Allow the associated sessionStorage to get deleted; it won't be needed 335 // Allow the associated sessionStorage to get deleted; it won't be needed
335 // in the session restore. 336 // in the session restore.
336 content::SessionStorageNamespace* session_storage_namespace = 337 content::SessionStorageNamespace* session_storage_namespace =
337 contents->GetController().GetDefaultSessionStorageNamespace(); 338 contents->GetController().GetDefaultSessionStorageNamespace();
338 session_storage_namespace->SetShouldPersist(false); 339 session_storage_namespace->SetShouldPersist(false);
339 SessionTabHelper* session_tab_helper = 340 SessionTabHelper* session_tab_helper =
(...skipping 14 matching lines...) Expand all
354 355
355 windows_tracking_.insert(window_id.id()); 356 windows_tracking_.insert(window_id.id());
356 357
357 // The user created a new tabbed browser with our profile. Commit any 358 // The user created a new tabbed browser with our profile. Commit any
358 // pending closes. 359 // pending closes.
359 CommitPendingCloses(); 360 CommitPendingCloses();
360 361
361 has_open_trackable_browsers_ = true; 362 has_open_trackable_browsers_ = true;
362 move_on_new_browser_ = true; 363 move_on_new_browser_ = true;
363 364
364 ScheduleCommand(CreateSetWindowTypeCommand(window_id, window_type)); 365 ScheduleCommand(CreateSetWindowTypeCommand(window_id, window_type).Pass());
365 } 366 }
366 367
367 void SessionService::SetWindowAppName( 368 void SessionService::SetWindowAppName(
368 const SessionID& window_id, 369 const SessionID& window_id,
369 const std::string& app_name) { 370 const std::string& app_name) {
370 if (!ShouldTrackChangesToWindow(window_id)) 371 if (!ShouldTrackChangesToWindow(window_id))
371 return; 372 return;
372 373
373 ScheduleCommand(CreateSetWindowAppNameCommand(window_id, app_name)); 374 ScheduleCommand(CreateSetWindowAppNameCommand(window_id, app_name).Pass());
374 } 375 }
375 376
376 void SessionService::TabNavigationPathPrunedFromBack(const SessionID& window_id, 377 void SessionService::TabNavigationPathPrunedFromBack(const SessionID& window_id,
377 const SessionID& tab_id, 378 const SessionID& tab_id,
378 int count) { 379 int count) {
379 if (!ShouldTrackChangesToWindow(window_id)) 380 if (!ShouldTrackChangesToWindow(window_id))
380 return; 381 return;
381 382
382 ScheduleCommand(CreateTabNavigationPathPrunedFromBackCommand(tab_id, count)); 383 ScheduleCommand(
384 CreateTabNavigationPathPrunedFromBackCommand(tab_id, count).Pass());
383 } 385 }
384 386
385 void SessionService::TabNavigationPathPrunedFromFront( 387 void SessionService::TabNavigationPathPrunedFromFront(
386 const SessionID& window_id, 388 const SessionID& window_id,
387 const SessionID& tab_id, 389 const SessionID& tab_id,
388 int count) { 390 int count) {
389 if (!ShouldTrackChangesToWindow(window_id)) 391 if (!ShouldTrackChangesToWindow(window_id))
390 return; 392 return;
391 393
392 // Update the range of indices. 394 // Update the range of indices.
393 if (tab_to_available_range_.find(tab_id.id()) != 395 if (tab_to_available_range_.find(tab_id.id()) !=
394 tab_to_available_range_.end()) { 396 tab_to_available_range_.end()) {
395 std::pair<int, int>& range = tab_to_available_range_[tab_id.id()]; 397 std::pair<int, int>& range = tab_to_available_range_[tab_id.id()];
396 range.first = std::max(0, range.first - count); 398 range.first = std::max(0, range.first - count);
397 range.second = std::max(0, range.second - count); 399 range.second = std::max(0, range.second - count);
398 } 400 }
399 401
400 ScheduleCommand(CreateTabNavigationPathPrunedFromFrontCommand(tab_id, count)); 402 ScheduleCommand(
403 CreateTabNavigationPathPrunedFromFrontCommand(tab_id, count).Pass());
401 } 404 }
402 405
403 void SessionService::UpdateTabNavigation( 406 void SessionService::UpdateTabNavigation(
404 const SessionID& window_id, 407 const SessionID& window_id,
405 const SessionID& tab_id, 408 const SessionID& tab_id,
406 const SerializedNavigationEntry& navigation) { 409 const SerializedNavigationEntry& navigation) {
407 if (!ShouldTrackEntry(navigation.virtual_url()) || 410 if (!ShouldTrackEntry(navigation.virtual_url()) ||
408 !ShouldTrackChangesToWindow(window_id)) { 411 !ShouldTrackChangesToWindow(window_id)) {
409 return; 412 return;
410 } 413 }
411 414
412 if (tab_to_available_range_.find(tab_id.id()) != 415 if (tab_to_available_range_.find(tab_id.id()) !=
413 tab_to_available_range_.end()) { 416 tab_to_available_range_.end()) {
414 std::pair<int, int>& range = tab_to_available_range_[tab_id.id()]; 417 std::pair<int, int>& range = tab_to_available_range_[tab_id.id()];
415 range.first = std::min(navigation.index(), range.first); 418 range.first = std::min(navigation.index(), range.first);
416 range.second = std::max(navigation.index(), range.second); 419 range.second = std::max(navigation.index(), range.second);
417 } 420 }
418 ScheduleCommand(CreateUpdateTabNavigationCommand(tab_id, navigation)); 421 ScheduleCommand(CreateUpdateTabNavigationCommand(tab_id, navigation).Pass());
419 } 422 }
420 423
421 void SessionService::TabRestored(WebContents* tab, bool pinned) { 424 void SessionService::TabRestored(WebContents* tab, bool pinned) {
422 SessionTabHelper* session_tab_helper = SessionTabHelper::FromWebContents(tab); 425 SessionTabHelper* session_tab_helper = SessionTabHelper::FromWebContents(tab);
423 if (!ShouldTrackChangesToWindow(session_tab_helper->window_id())) 426 if (!ShouldTrackChangesToWindow(session_tab_helper->window_id()))
424 return; 427 return;
425 428
426 BuildCommandsForTab(session_tab_helper->window_id(), tab, -1, 429 BuildCommandsForTab(session_tab_helper->window_id(),
427 pinned, &pending_commands(), NULL); 430 tab,
431 -1,
432 pinned,
433 &pending_commands(),
434 NULL);
428 StartSaveTimer(); 435 StartSaveTimer();
429 } 436 }
430 437
431 void SessionService::SetSelectedNavigationIndex(const SessionID& window_id, 438 void SessionService::SetSelectedNavigationIndex(const SessionID& window_id,
432 const SessionID& tab_id, 439 const SessionID& tab_id,
433 int index) { 440 int index) {
434 if (!ShouldTrackChangesToWindow(window_id)) 441 if (!ShouldTrackChangesToWindow(window_id))
435 return; 442 return;
436 443
437 if (tab_to_available_range_.find(tab_id.id()) != 444 if (tab_to_available_range_.find(tab_id.id()) !=
438 tab_to_available_range_.end()) { 445 tab_to_available_range_.end()) {
439 if (index < tab_to_available_range_[tab_id.id()].first || 446 if (index < tab_to_available_range_[tab_id.id()].first ||
440 index > tab_to_available_range_[tab_id.id()].second) { 447 index > tab_to_available_range_[tab_id.id()].second) {
441 // The new index is outside the range of what we've archived, schedule 448 // The new index is outside the range of what we've archived, schedule
442 // a reset. 449 // a reset.
443 ResetFromCurrentBrowsers(); 450 ResetFromCurrentBrowsers();
444 return; 451 return;
445 } 452 }
446 } 453 }
447 ScheduleCommand(CreateSetSelectedNavigationIndexCommand(tab_id, index)); 454 ScheduleCommand(
455 CreateSetSelectedNavigationIndexCommand(tab_id, index).Pass());
448 } 456 }
449 457
450 void SessionService::SetSelectedTabInWindow(const SessionID& window_id, 458 void SessionService::SetSelectedTabInWindow(const SessionID& window_id,
451 int index) { 459 int index) {
452 if (!ShouldTrackChangesToWindow(window_id)) 460 if (!ShouldTrackChangesToWindow(window_id))
453 return; 461 return;
454 462
455 ScheduleCommand(CreateSetSelectedTabInWindowCommand(window_id, index)); 463 ScheduleCommand(CreateSetSelectedTabInWindowCommand(window_id, index).Pass());
456 } 464 }
457 465
458 void SessionService::SetTabUserAgentOverride( 466 void SessionService::SetTabUserAgentOverride(
459 const SessionID& window_id, 467 const SessionID& window_id,
460 const SessionID& tab_id, 468 const SessionID& tab_id,
461 const std::string& user_agent_override) { 469 const std::string& user_agent_override) {
462 if (!ShouldTrackChangesToWindow(window_id)) 470 if (!ShouldTrackChangesToWindow(window_id))
463 return; 471 return;
464 472
465 ScheduleCommand(CreateSetTabUserAgentOverrideCommand(tab_id, 473 ScheduleCommand(
466 user_agent_override)); 474 CreateSetTabUserAgentOverrideCommand(tab_id, user_agent_override).Pass());
467 } 475 }
468 476
469 void SessionService::SetTabExtensionAppID( 477 void SessionService::SetTabExtensionAppID(
470 const SessionID& window_id, 478 const SessionID& window_id,
471 const SessionID& tab_id, 479 const SessionID& tab_id,
472 const std::string& extension_app_id) { 480 const std::string& extension_app_id) {
473 if (!ShouldTrackChangesToWindow(window_id)) 481 if (!ShouldTrackChangesToWindow(window_id))
474 return; 482 return;
475 483
476 ScheduleCommand(CreateSetTabExtensionAppIDCommand(tab_id, extension_app_id)); 484 ScheduleCommand(
485 CreateSetTabExtensionAppIDCommand(tab_id, extension_app_id).Pass());
477 } 486 }
478 487
479 base::CancelableTaskTracker::TaskId SessionService::GetLastSession( 488 base::CancelableTaskTracker::TaskId SessionService::GetLastSession(
480 const SessionCallback& callback, 489 const SessionCallback& callback,
481 base::CancelableTaskTracker* tracker) { 490 base::CancelableTaskTracker* tracker) {
482 // OnGotSessionCommands maps the SessionCommands to browser state, then run 491 // OnGotSessionCommands maps the SessionCommands to browser state, then run
483 // the callback. 492 // the callback.
484 return ScheduleGetLastSessionCommands( 493 return ScheduleGetLastSessionCommands(
485 base::Bind(&SessionService::OnGotSessionCommands, 494 base::Bind(&SessionService::OnGotSessionCommands,
486 weak_factory_.GetWeakPtr(), callback), 495 weak_factory_.GetWeakPtr(),
496 callback),
487 tracker); 497 tracker);
488 } 498 }
489 499
490 void SessionService::Save() { 500 void SessionService::Save() {
491 bool had_commands = !pending_commands().empty(); 501 bool had_commands = !pending_commands().empty();
492 BaseSessionService::Save(); 502 BaseSessionService::Save();
493 if (had_commands) { 503 if (had_commands) {
494 RecordSessionUpdateHistogramData(chrome::NOTIFICATION_SESSION_SERVICE_SAVED, 504 RecordSessionUpdateHistogramData(chrome::NOTIFICATION_SESSION_SERVICE_SAVED,
495 &last_updated_save_time_); 505 &last_updated_save_time_);
496 content::NotificationService::current()->Notify( 506 content::NotificationService::current()->Notify(
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
669 break; 679 break;
670 } 680 }
671 681
672 default: 682 default:
673 NOTREACHED(); 683 NOTREACHED();
674 } 684 }
675 } 685 }
676 686
677 void SessionService::OnBrowserSetLastActive(Browser* browser) { 687 void SessionService::OnBrowserSetLastActive(Browser* browser) {
678 if (ShouldTrackBrowser(browser)) 688 if (ShouldTrackBrowser(browser))
679 ScheduleCommand(CreateSetActiveWindowCommand(browser->session_id())); 689 ScheduleCommand(CreateSetActiveWindowCommand(browser->session_id()).Pass());
680 } 690 }
681 691
682 void SessionService::OnGotSessionCommands( 692 void SessionService::OnGotSessionCommands(
683 const SessionCallback& callback, 693 const SessionCallback& callback,
684 ScopedVector<SessionCommand> commands) { 694 ScopedVector<SessionCommand> commands) {
685 ScopedVector<SessionWindow> valid_windows; 695 ScopedVector<SessionWindow> valid_windows;
686 SessionID::id_type active_window_id = 0; 696 SessionID::id_type active_window_id = 0;
687 697
688 startup_metric_utils::ScopedSlowStartupUMA 698 startup_metric_utils::ScopedSlowStartupUMA
689 scoped_timer("Startup.SlowStartupSessionServiceCreateTabsAndWindows"); 699 scoped_timer("Startup.SlowStartupSessionServiceCreateTabsAndWindows");
690 700
691 RestoreSessionFromCommands( 701 RestoreSessionFromCommands(commands, &valid_windows.get(), &active_window_id);
692 commands.get(), &valid_windows.get(), &active_window_id);
693 RemoveUnusedRestoreWindows(&valid_windows.get()); 702 RemoveUnusedRestoreWindows(&valid_windows.get());
694 703
695 callback.Run(valid_windows.Pass(), active_window_id); 704 callback.Run(valid_windows.Pass(), active_window_id);
696 } 705 }
697 706
698 void SessionService::BuildCommandsForTab(const SessionID& window_id, 707 void SessionService::BuildCommandsForTab(const SessionID& window_id,
699 WebContents* tab, 708 WebContents* tab,
700 int index_in_window, 709 int index_in_window,
701 bool is_pinned, 710 bool is_pinned,
702 std::vector<SessionCommand*>* commands, 711 ScopedVector<SessionCommand>* commands,
703 IdToRange* tab_to_available_range) { 712 IdToRange* tab_to_available_range) {
704 DCHECK(tab && commands && window_id.id()); 713 DCHECK(tab && commands && window_id.id());
705 SessionTabHelper* session_tab_helper = SessionTabHelper::FromWebContents(tab); 714 SessionTabHelper* session_tab_helper = SessionTabHelper::FromWebContents(tab);
706 const SessionID& session_id(session_tab_helper->session_id()); 715 const SessionID& session_id(session_tab_helper->session_id());
707 commands->push_back(CreateSetTabWindowCommand(window_id, session_id)); 716 commands->push_back(
717 CreateSetTabWindowCommand(window_id, session_id).release());
708 718
709 const int current_index = tab->GetController().GetCurrentEntryIndex(); 719 const int current_index = tab->GetController().GetCurrentEntryIndex();
710 const int min_index = std::max(0, 720 const int min_index = std::max(0,
711 current_index - max_persist_navigation_count); 721 current_index - max_persist_navigation_count);
712 const int max_index = 722 const int max_index =
713 std::min(current_index + max_persist_navigation_count, 723 std::min(current_index + max_persist_navigation_count,
714 tab->GetController().GetEntryCount()); 724 tab->GetController().GetEntryCount());
715 const int pending_index = tab->GetController().GetPendingEntryIndex(); 725 const int pending_index = tab->GetController().GetPendingEntryIndex();
716 if (tab_to_available_range) { 726 if (tab_to_available_range) {
717 (*tab_to_available_range)[session_id.id()] = 727 (*tab_to_available_range)[session_id.id()] =
718 std::pair<int, int>(min_index, max_index); 728 std::pair<int, int>(min_index, max_index);
719 } 729 }
720 730
721 if (is_pinned) 731 if (is_pinned)
722 commands->push_back(CreatePinnedStateCommand(session_id, true)); 732 commands->push_back(CreatePinnedStateCommand(session_id, true).release());
723 733
724 extensions::TabHelper* extensions_tab_helper = 734 extensions::TabHelper* extensions_tab_helper =
725 extensions::TabHelper::FromWebContents(tab); 735 extensions::TabHelper::FromWebContents(tab);
726 if (extensions_tab_helper->extension_app()) { 736 if (extensions_tab_helper->extension_app()) {
727 commands->push_back(CreateSetTabExtensionAppIDCommand( 737 commands->push_back(CreateSetTabExtensionAppIDCommand(
728 session_id, 738 session_id,
729 extensions_tab_helper->extension_app()->id())); 739 extensions_tab_helper->extension_app()->id()).release());
730 } 740 }
731 741
732 const std::string& ua_override = tab->GetUserAgentOverride(); 742 const std::string& ua_override = tab->GetUserAgentOverride();
733 if (!ua_override.empty()) { 743 if (!ua_override.empty()) {
734 commands->push_back(CreateSetTabUserAgentOverrideCommand(session_id, 744 commands->push_back(
735 ua_override)); 745 CreateSetTabUserAgentOverrideCommand(session_id, ua_override).release());
736 } 746 }
737 747
738 for (int i = min_index; i < max_index; ++i) { 748 for (int i = min_index; i < max_index; ++i) {
739 const NavigationEntry* entry = (i == pending_index) ? 749 const NavigationEntry* entry = (i == pending_index) ?
740 tab->GetController().GetPendingEntry() : 750 tab->GetController().GetPendingEntry() :
741 tab->GetController().GetEntryAtIndex(i); 751 tab->GetController().GetEntryAtIndex(i);
742 DCHECK(entry); 752 DCHECK(entry);
743 if (ShouldTrackEntry(entry->GetVirtualURL())) { 753 if (ShouldTrackEntry(entry->GetVirtualURL())) {
744 const SerializedNavigationEntry navigation = 754 const SerializedNavigationEntry navigation =
745 ContentSerializedNavigationBuilder::FromNavigationEntry(i, *entry); 755 ContentSerializedNavigationBuilder::FromNavigationEntry(i, *entry);
746 commands->push_back( 756 commands->push_back(
747 CreateUpdateTabNavigationCommand(session_id, navigation)); 757 CreateUpdateTabNavigationCommand(session_id, navigation).release());
748 } 758 }
749 } 759 }
750 commands->push_back( 760 commands->push_back(
751 CreateSetSelectedNavigationIndexCommand(session_id, current_index)); 761 CreateSetSelectedNavigationIndexCommand(session_id,
762 current_index).release());
752 763
753 if (index_in_window != -1) { 764 if (index_in_window != -1) {
754 commands->push_back( 765 commands->push_back(CreateSetTabIndexInWindowCommand(
755 CreateSetTabIndexInWindowCommand(session_id, index_in_window)); 766 session_id,
767 index_in_window).release());
756 } 768 }
757 769
758 // Record the association between the sessionStorage namespace and the tab. 770 // Record the association between the sessionStorage namespace and the tab.
759 content::SessionStorageNamespace* session_storage_namespace = 771 content::SessionStorageNamespace* session_storage_namespace =
760 tab->GetController().GetDefaultSessionStorageNamespace(); 772 tab->GetController().GetDefaultSessionStorageNamespace();
761 ScheduleCommand(CreateSessionStorageAssociatedCommand( 773 ScheduleCommand(CreateSessionStorageAssociatedCommand(
762 session_tab_helper->session_id(), 774 session_tab_helper->session_id(),
763 session_storage_namespace->persistent_id())); 775 session_storage_namespace->persistent_id()).Pass());
764 } 776 }
765 777
766 void SessionService::BuildCommandsForBrowser( 778 void SessionService::BuildCommandsForBrowser(
767 Browser* browser, 779 Browser* browser,
768 std::vector<SessionCommand*>* commands, 780 ScopedVector<SessionCommand>* commands,
769 IdToRange* tab_to_available_range, 781 IdToRange* tab_to_available_range,
770 std::set<SessionID::id_type>* windows_to_track) { 782 std::set<SessionID::id_type>* windows_to_track) {
771 DCHECK(browser && commands); 783 DCHECK(browser && commands);
772 DCHECK(browser->session_id().id()); 784 DCHECK(browser->session_id().id());
773 785
774 commands->push_back( 786 commands->push_back(CreateSetWindowBoundsCommand(
775 CreateSetWindowBoundsCommand(browser->session_id(), 787 browser->session_id(),
776 browser->window()->GetRestoredBounds(), 788 browser->window()->GetRestoredBounds(),
777 browser->window()->GetRestoredState())); 789 browser->window()->GetRestoredState()).release());
778 790
779 commands->push_back(CreateSetWindowTypeCommand( 791 commands->push_back(CreateSetWindowTypeCommand(
780 browser->session_id(), 792 browser->session_id(),
781 WindowTypeForBrowserType(browser->type()))); 793 WindowTypeForBrowserType(browser->type())).release());
782 794
783 if (!browser->app_name().empty()) { 795 if (!browser->app_name().empty()) {
784 commands->push_back(CreateSetWindowAppNameCommand(browser->session_id(), 796 commands->push_back(CreateSetWindowAppNameCommand(
785 browser->app_name())); 797 browser->session_id(),
798 browser->app_name()).release());
786 } 799 }
787 800
788 windows_to_track->insert(browser->session_id().id()); 801 windows_to_track->insert(browser->session_id().id());
789 TabStripModel* tab_strip = browser->tab_strip_model(); 802 TabStripModel* tab_strip = browser->tab_strip_model();
790 for (int i = 0; i < tab_strip->count(); ++i) { 803 for (int i = 0; i < tab_strip->count(); ++i) {
791 WebContents* tab = tab_strip->GetWebContentsAt(i); 804 WebContents* tab = tab_strip->GetWebContentsAt(i);
792 DCHECK(tab); 805 DCHECK(tab);
793 BuildCommandsForTab(browser->session_id(), tab, i, 806 BuildCommandsForTab(browser->session_id(), tab, i,
794 tab_strip->IsTabPinned(i), 807 tab_strip->IsTabPinned(i),
795 commands, tab_to_available_range); 808 commands, tab_to_available_range);
796 } 809 }
797 810
798 commands->push_back(CreateSetSelectedTabInWindowCommand( 811 commands->push_back(CreateSetSelectedTabInWindowCommand(
799 browser->session_id(), 812 browser->session_id(),
800 browser->tab_strip_model()->active_index())); 813 browser->tab_strip_model()->active_index()).release());
801 } 814 }
802 815
803 void SessionService::BuildCommandsFromBrowsers( 816 void SessionService::BuildCommandsFromBrowsers(
804 std::vector<SessionCommand*>* commands, 817 ScopedVector<SessionCommand>* commands,
805 IdToRange* tab_to_available_range, 818 IdToRange* tab_to_available_range,
806 std::set<SessionID::id_type>* windows_to_track) { 819 std::set<SessionID::id_type>* windows_to_track) {
807 DCHECK(commands); 820 DCHECK(commands);
808 for (chrome::BrowserIterator it; !it.done(); it.Next()) { 821 for (chrome::BrowserIterator it; !it.done(); it.Next()) {
809 Browser* browser = *it; 822 Browser* browser = *it;
810 // Make sure the browser has tabs and a window. Browser's destructor 823 // Make sure the browser has tabs and a window. Browser's destructor
811 // removes itself from the BrowserList. When a browser is closed the 824 // removes itself from the BrowserList. When a browser is closed the
812 // destructor is not necessarily run immediately. This means it's possible 825 // destructor is not necessarily run immediately. This means it's possible
813 // for us to get a handle to a browser that is about to be removed. If 826 // for us to get a handle to a browser that is about to be removed. If
814 // the tab count is 0 or the window is NULL, the browser is about to be 827 // the tab count is 0 or the window is NULL, the browser is about to be
815 // deleted, so we ignore it. 828 // deleted, so we ignore it.
816 if (ShouldTrackBrowser(browser) && browser->tab_strip_model()->count() && 829 if (ShouldTrackBrowser(browser) && browser->tab_strip_model()->count() &&
817 browser->window()) { 830 browser->window()) {
818 BuildCommandsForBrowser(browser, commands, tab_to_available_range, 831 BuildCommandsForBrowser(browser, commands, tab_to_available_range,
819 windows_to_track); 832 windows_to_track);
820 } 833 }
821 } 834 }
822 } 835 }
823 836
824 void SessionService::ScheduleResetCommands() { 837 void SessionService::ScheduleResetCommands() {
825 set_pending_reset(true); 838 set_pending_reset(true);
826 STLDeleteElements(&pending_commands()); 839 pending_commands().clear();
827 tab_to_available_range_.clear(); 840 tab_to_available_range_.clear();
828 windows_tracking_.clear(); 841 windows_tracking_.clear();
829 BuildCommandsFromBrowsers(&pending_commands(), &tab_to_available_range_, 842 BuildCommandsFromBrowsers(&pending_commands(),
843 &tab_to_available_range_,
830 &windows_tracking_); 844 &windows_tracking_);
831 if (!windows_tracking_.empty()) { 845 if (!windows_tracking_.empty()) {
832 // We're lazily created on startup and won't get an initial batch of 846 // We're lazily created on startup and won't get an initial batch of
833 // SetWindowType messages. Set these here to make sure our state is correct. 847 // SetWindowType messages. Set these here to make sure our state is correct.
834 has_open_trackable_browsers_ = true; 848 has_open_trackable_browsers_ = true;
835 move_on_new_browser_ = true; 849 move_on_new_browser_ = true;
836 } 850 }
837 StartSaveTimer(); 851 StartSaveTimer();
838 } 852 }
839 853
840 void SessionService::ScheduleCommand(SessionCommand* command) { 854 void SessionService::ScheduleCommand(scoped_ptr<SessionCommand> command) {
841 DCHECK(command); 855 DCHECK(command);
842 if (ReplacePendingCommand(command, pending_commands())) 856 if (ReplacePendingCommand(pending_commands(), &command))
843 return; 857 return;
844 BaseSessionService::ScheduleCommand(command); 858 bool is_closing_command = IsClosingCommand(command.get());
859 BaseSessionService::ScheduleCommand(command.Pass());
845 // Don't schedule a reset on tab closed/window closed. Otherwise we may 860 // Don't schedule a reset on tab closed/window closed. Otherwise we may
846 // lose tabs/windows we want to restore from if we exit right after this. 861 // lose tabs/windows we want to restore from if we exit right after this.
847 if (!pending_reset() && pending_window_close_ids_.empty() && 862 if (!pending_reset() && pending_window_close_ids_.empty() &&
848 commands_since_reset() >= kWritesPerReset && !IsClosingCommand(command)) { 863 commands_since_reset() >= kWritesPerReset && is_closing_command) {
849 ScheduleResetCommands(); 864 ScheduleResetCommands();
850 } 865 }
851 } 866 }
852 867
853 void SessionService::CommitPendingCloses() { 868 void SessionService::CommitPendingCloses() {
854 for (PendingTabCloseIDs::iterator i = pending_tab_close_ids_.begin(); 869 for (PendingTabCloseIDs::iterator i = pending_tab_close_ids_.begin();
855 i != pending_tab_close_ids_.end(); ++i) { 870 i != pending_tab_close_ids_.end(); ++i) {
856 ScheduleCommand(CreateTabClosedCommand(*i)); 871 ScheduleCommand(CreateTabClosedCommand(*i).Pass());
857 } 872 }
858 pending_tab_close_ids_.clear(); 873 pending_tab_close_ids_.clear();
859 874
860 for (PendingWindowCloseIDs::iterator i = pending_window_close_ids_.begin(); 875 for (PendingWindowCloseIDs::iterator i = pending_window_close_ids_.begin();
861 i != pending_window_close_ids_.end(); ++i) { 876 i != pending_window_close_ids_.end(); ++i) {
862 ScheduleCommand(CreateWindowClosedCommand(*i)); 877 ScheduleCommand(CreateWindowClosedCommand(*i).Pass());
863 } 878 }
864 pending_window_close_ids_.clear(); 879 pending_window_close_ids_.clear();
865 } 880 }
866 881
867 bool SessionService::IsOnlyOneTabLeft() const { 882 bool SessionService::IsOnlyOneTabLeft() const {
868 if (!profile() || profile()->AsTestingProfile()) { 883 if (!profile() || profile()->AsTestingProfile()) {
869 // We're testing, always return false. 884 // We're testing, always return false.
870 return false; 885 return false;
871 } 886 }
872 887
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
1070 return; 1085 return;
1071 } 1086 }
1072 1087
1073 // Check for any open windows for the current profile that we aren't tracking. 1088 // Check for any open windows for the current profile that we aren't tracking.
1074 for (chrome::BrowserIterator it; !it.done(); it.Next()) { 1089 for (chrome::BrowserIterator it; !it.done(); it.Next()) {
1075 if ((*it)->profile() == profile()) 1090 if ((*it)->profile() == profile())
1076 return; 1091 return;
1077 } 1092 }
1078 DeleteSessionOnlyData(profile()); 1093 DeleteSessionOnlyData(profile());
1079 } 1094 }
OLDNEW
« no previous file with comments | « chrome/browser/sessions/session_service.h ('k') | chrome/browser/sessions/session_service_commands.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698