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

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

Issue 11446033: Convert SessionService to use new CancelableTaskTracker (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years 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_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>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/bind_helpers.h" 13 #include "base/bind_helpers.h"
14 #include "base/command_line.h" 14 #include "base/command_line.h"
15 #include "base/file_util.h" 15 #include "base/file_util.h"
16 #include "base/memory/scoped_vector.h"
17 #include "base/message_loop.h" 16 #include "base/message_loop.h"
18 #include "base/metrics/histogram.h" 17 #include "base/metrics/histogram.h"
19 #include "base/pickle.h" 18 #include "base/pickle.h"
20 #include "base/threading/thread.h" 19 #include "base/threading/thread.h"
21 #include "chrome/browser/extensions/tab_helper.h" 20 #include "chrome/browser/extensions/tab_helper.h"
22 #include "chrome/browser/prefs/session_startup_pref.h" 21 #include "chrome/browser/prefs/session_startup_pref.h"
23 #include "chrome/browser/profiles/profile.h" 22 #include "chrome/browser/profiles/profile.h"
24 #include "chrome/browser/sessions/session_backend.h" 23 #include "chrome/browser/sessions/session_backend.h"
25 #include "chrome/browser/sessions/session_command.h" 24 #include "chrome/browser/sessions/session_command.h"
26 #include "chrome/browser/sessions/session_restore.h" 25 #include "chrome/browser/sessions/session_restore.h"
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 static const SessionCommand::id_type kCommandWindowClosed = 17; 75 static const SessionCommand::id_type kCommandWindowClosed = 17;
77 static const SessionCommand::id_type kCommandSetTabUserAgentOverride = 18; 76 static const SessionCommand::id_type kCommandSetTabUserAgentOverride = 18;
78 static const SessionCommand::id_type kCommandSessionStorageAssociated = 19; 77 static const SessionCommand::id_type kCommandSessionStorageAssociated = 19;
79 static const SessionCommand::id_type kCommandSetActiveWindow = 20; 78 static const SessionCommand::id_type kCommandSetActiveWindow = 20;
80 79
81 // Every kWritesPerReset commands triggers recreating the file. 80 // Every kWritesPerReset commands triggers recreating the file.
82 static const int kWritesPerReset = 250; 81 static const int kWritesPerReset = 250;
83 82
84 namespace { 83 namespace {
85 84
86 // The callback from GetLastSession is internally routed to SessionService
87 // first and then the caller. This is done so that the SessionWindows can be
88 // recreated from the SessionCommands and the SessionWindows passed to the
89 // caller. The following class is used for this.
90 class InternalSessionRequest
91 : public BaseSessionService::InternalGetCommandsRequest {
92 public:
93 InternalSessionRequest(
94 const CallbackType& callback,
95 const SessionService::SessionCallback& real_callback)
96 : BaseSessionService::InternalGetCommandsRequest(callback),
97 real_callback(real_callback) {
98 }
99
100 // The callback supplied to GetLastSession.
101 SessionService::SessionCallback real_callback;
102
103 private:
104 ~InternalSessionRequest() {}
105
106 DISALLOW_COPY_AND_ASSIGN(InternalSessionRequest);
107 };
108
109 // Various payload structures. 85 // Various payload structures.
110 struct ClosedPayload { 86 struct ClosedPayload {
111 SessionID::id_type id; 87 SessionID::id_type id;
112 int64 close_time; 88 int64 close_time;
113 }; 89 };
114 90
115 struct WindowBoundsPayload2 { 91 struct WindowBoundsPayload2 {
116 SessionID::id_type window_id; 92 SessionID::id_type window_id;
117 int32 x; 93 int32 x;
118 int32 y; 94 int32 y;
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 const SessionID& window_id, 469 const SessionID& window_id,
494 const SessionID& tab_id, 470 const SessionID& tab_id,
495 const std::string& user_agent_override) { 471 const std::string& user_agent_override) {
496 if (!ShouldTrackChangesToWindow(window_id)) 472 if (!ShouldTrackChangesToWindow(window_id))
497 return; 473 return;
498 474
499 ScheduleCommand(CreateSetTabUserAgentOverrideCommand( 475 ScheduleCommand(CreateSetTabUserAgentOverrideCommand(
500 kCommandSetTabUserAgentOverride, tab_id.id(), user_agent_override)); 476 kCommandSetTabUserAgentOverride, tab_id.id(), user_agent_override));
501 } 477 }
502 478
503 SessionService::Handle SessionService::GetLastSession( 479 CancelableTaskTracker::TaskId SessionService::GetLastSession(
504 CancelableRequestConsumerBase* consumer, 480 const SessionCallback& callback,
505 const SessionCallback& callback) { 481 CancelableTaskTracker* tracker) {
482 // OnGotSessionCommands maps the SessionCommands to browser state, then run
483 // the callback.
506 return ScheduleGetLastSessionCommands( 484 return ScheduleGetLastSessionCommands(
507 new InternalSessionRequest( 485 base::Bind(&SessionService::OnGotSessionCommands,
508 base::Bind(&SessionService::OnGotSessionCommands, 486 base::Unretained(this), callback),
509 base::Unretained(this)), 487 tracker);
510 callback),
511 consumer);
512 } 488 }
513 489
514 void SessionService::Save() { 490 void SessionService::Save() {
515 bool had_commands = !pending_commands().empty(); 491 bool had_commands = !pending_commands().empty();
516 BaseSessionService::Save(); 492 BaseSessionService::Save();
517 if (had_commands) { 493 if (had_commands) {
518 RecordSessionUpdateHistogramData(chrome::NOTIFICATION_SESSION_SERVICE_SAVED, 494 RecordSessionUpdateHistogramData(chrome::NOTIFICATION_SESSION_SERVICE_SAVED,
519 &last_updated_save_time_); 495 &last_updated_save_time_);
520 content::NotificationService::current()->Notify( 496 content::NotificationService::current()->Notify(
521 chrome::NOTIFICATION_SESSION_SERVICE_SAVED, 497 chrome::NOTIFICATION_SESSION_SERVICE_SAVED,
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 const SessionID& window_id) { 822 const SessionID& window_id) {
847 ActiveWindowPayload payload = 0; 823 ActiveWindowPayload payload = 0;
848 payload = window_id.id(); 824 payload = window_id.id();
849 SessionCommand* command = 825 SessionCommand* command =
850 new SessionCommand(kCommandSetActiveWindow, sizeof(payload)); 826 new SessionCommand(kCommandSetActiveWindow, sizeof(payload));
851 memcpy(command->contents(), &payload, sizeof(payload)); 827 memcpy(command->contents(), &payload, sizeof(payload));
852 return command; 828 return command;
853 } 829 }
854 830
855 void SessionService::OnGotSessionCommands( 831 void SessionService::OnGotSessionCommands(
856 Handle handle, 832 const SessionCallback& callback,
857 scoped_refptr<InternalGetCommandsRequest> request) { 833 ScopedVector<SessionCommand> commands) {
858 if (request->canceled())
859 return;
860
861 ScopedVector<SessionWindow> valid_windows; 834 ScopedVector<SessionWindow> valid_windows;
862 SessionID::id_type active_window_id = 0; 835 SessionID::id_type active_window_id = 0;
836
863 RestoreSessionFromCommands( 837 RestoreSessionFromCommands(
864 request->commands, &(valid_windows.get()), &active_window_id); 838 commands.get(), &valid_windows.get(), &active_window_id);
865 static_cast<InternalSessionRequest*>(request.get())->real_callback.Run( 839 callback.Run(valid_windows.Pass(), active_window_id);
866 request->handle(), &(valid_windows.get()), active_window_id);
867 } 840 }
868 841
869 void SessionService::RestoreSessionFromCommands( 842 void SessionService::RestoreSessionFromCommands(
870 const std::vector<SessionCommand*>& commands, 843 const std::vector<SessionCommand*>& commands,
871 std::vector<SessionWindow*>* valid_windows, 844 std::vector<SessionWindow*>* valid_windows,
872 SessionID::id_type* active_window_id) { 845 SessionID::id_type* active_window_id) {
873 std::map<int, SessionTab*> tabs; 846 std::map<int, SessionTab*> tabs;
874 std::map<int, SessionWindow*> windows; 847 std::map<int, SessionWindow*> windows;
875 848
876 VLOG(1) << "RestoreSessionFromCommands " << commands.size(); 849 VLOG(1) << "RestoreSessionFromCommands " << commands.size();
(...skipping 899 matching lines...) Expand 10 before | Expand all | Expand 10 after
1776 contents->GetController().GetDefaultSessionStorageNamespace(); 1749 contents->GetController().GetDefaultSessionStorageNamespace();
1777 session_storage_namespace->SetShouldPersist(false); 1750 session_storage_namespace->SetShouldPersist(false);
1778 SessionTabHelper* session_tab_helper = 1751 SessionTabHelper* session_tab_helper =
1779 SessionTabHelper::FromWebContents(contents); 1752 SessionTabHelper::FromWebContents(contents);
1780 TabClosed(session_tab_helper->window_id(), 1753 TabClosed(session_tab_helper->window_id(),
1781 session_tab_helper->session_id(), 1754 session_tab_helper->session_id(),
1782 contents->GetClosedByUserGesture()); 1755 contents->GetClosedByUserGesture());
1783 RecordSessionUpdateHistogramData(content::NOTIFICATION_WEB_CONTENTS_DESTROYED, 1756 RecordSessionUpdateHistogramData(content::NOTIFICATION_WEB_CONTENTS_DESTROYED,
1784 &last_updated_tab_closed_time_); 1757 &last_updated_tab_closed_time_);
1785 } 1758 }
OLDNEW
« chrome/browser/sessions/session_service.h ('K') | « chrome/browser/sessions/session_service.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698