Index: chrome/browser/sessions/base_session_service.cc |
diff --git a/chrome/browser/sessions/base_session_service.cc b/chrome/browser/sessions/base_session_service.cc |
index a30981e47c096d70ebea1db6098885abd011dd6f..a05d30b01b14e28233e70db16450c24abaf849ce 100644 |
--- a/chrome/browser/sessions/base_session_service.cc |
+++ b/chrome/browser/sessions/base_session_service.cc |
@@ -22,17 +22,6 @@ |
using content::BrowserThread; |
using content::NavigationEntry; |
-// InternalGetCommandsRequest ------------------------------------------------- |
- |
-BaseSessionService::InternalGetCommandsRequest::InternalGetCommandsRequest( |
- const CallbackType& callback) |
- : CancelableRequest<InternalGetCommandsCallback>(callback) { |
-} |
- |
-BaseSessionService::InternalGetCommandsRequest::~InternalGetCommandsRequest() { |
- STLDeleteElements(&commands); |
-} |
- |
// BaseSessionService --------------------------------------------------------- |
namespace { |
@@ -51,6 +40,24 @@ void WriteStringToPickle(Pickle& pickle, int* bytes_written, int max_bytes, |
} |
} |
+// Helper used by ScheduleGetLastSessionCommands. It runs callback on TaskRunner |
+// thread if it's not canceled. |
+void RunIfNotCanceled( |
+ const CancelableTaskTracker::IsCanceledCallback& is_canceled, |
+ base::TaskRunner* task_runner, |
+ const BaseSessionService::InternalGetCommandsCallback& callback, |
+ ScopedVector<SessionCommand> commands) { |
+ if (is_canceled.Run()) |
+ return; |
+ |
+ if (task_runner->RunsTasksOnCurrentThread()) { |
+ callback.Run(commands.Pass()); |
+ } else { |
+ task_runner->PostTask(FROM_HERE, |
+ base::Bind(callback, base::Passed(&commands))); |
+ } |
+} |
+ |
} // namespace |
// Delay between when a command is received, and when we save it to the |
@@ -259,16 +266,22 @@ bool BaseSessionService::ShouldTrackEntry(const GURL& url) { |
return url.is_valid(); |
} |
-BaseSessionService::Handle BaseSessionService::ScheduleGetLastSessionCommands( |
- InternalGetCommandsRequest* request, |
- CancelableRequestConsumerBase* consumer) { |
- scoped_refptr<InternalGetCommandsRequest> request_wrapper(request); |
- AddRequest(request, consumer); |
+CancelableTaskTracker::TaskId |
+ BaseSessionService::ScheduleGetLastSessionCommands( |
+ const InternalGetCommandsCallback& callback, |
+ CancelableTaskTracker* tracker) { |
+ CancelableTaskTracker::IsCanceledCallback is_canceled; |
+ CancelableTaskTracker::TaskId id = tracker->NewTrackedTaskId(&is_canceled); |
+ |
+ InternalGetCommandsCallback callback_runner = |
+ base::Bind(&RunIfNotCanceled, |
+ is_canceled, base::MessageLoopProxy::current(), callback); |
+ |
RunTaskOnBackendThread( |
FROM_HERE, |
base::Bind(&SessionBackend::ReadLastSessionCommands, backend(), |
- request_wrapper)); |
- return request->handle(); |
+ is_canceled, callback_runner)); |
+ return id; |
} |
bool BaseSessionService::RunTaskOnBackendThread( |