Index: chrome_frame/chrome_frame_delegate.h |
diff --git a/chrome_frame/chrome_frame_delegate.h b/chrome_frame/chrome_frame_delegate.h |
index d2e992153ff3985907ffa04138b18fb078c419f6..2373b94c419252bc7bb01f44f246a05afe3352fb 100644 |
--- a/chrome_frame/chrome_frame_delegate.h |
+++ b/chrome_frame/chrome_frame_delegate.h |
@@ -12,8 +12,10 @@ |
#include <string> |
#include <vector> |
+#include "base/callback.h" |
#include "base/file_path.h" |
#include "base/location.h" |
+#include "base/pending_task.h" |
#include "base/synchronization/lock.h" |
#include "base/task.h" |
#include "chrome/common/automation_constants.h" |
@@ -65,9 +67,6 @@ class ChromeFrameDelegate { |
virtual ~ChromeFrameDelegate() {} |
}; |
-// Disable refcounting of ChromeFrameDelegate. |
-DISABLE_RUNNABLE_METHOD_REFCOUNT(ChromeFrameDelegate); |
- |
extern UINT kAutomationServerReady; |
extern UINT kMessageFromChromeFrame; |
@@ -92,7 +91,7 @@ class ChromeFrameDelegateImpl : public ChromeFrameDelegate { |
virtual void OnHostMoved() {} |
protected: |
- // Protected methods to be overriden. |
+ // Protected methods to be overridden. |
virtual void OnNavigationStateChanged( |
int flags, const NavigationInfo& nav_info) {} |
virtual void OnUpdateTargetUrl(const std::wstring& new_target_url) {} |
@@ -129,7 +128,7 @@ class ChromeFrameDelegateImpl : public ChromeFrameDelegate { |
class TaskMarshaller { // NOLINT |
public: |
virtual void PostTask(const tracked_objects::Location& from_here, |
- Task* task) = 0; |
+ const base::Closure& task) = 0; |
}; |
// T is expected to be something CWindowImpl derived, or at least to have |
@@ -138,16 +137,18 @@ template <class T> class TaskMarshallerThroughWindowsMessages |
: public TaskMarshaller { |
public: |
TaskMarshallerThroughWindowsMessages() {} |
- virtual void PostTask(const tracked_objects::Location& from_here, |
- Task* task) { |
+ virtual void PostTask(const tracked_objects::Location& posted_from, |
+ const base::Closure& task) OVERRIDE { |
T* this_ptr = static_cast<T*>(this); |
if (this_ptr->IsWindow()) { |
this_ptr->AddRef(); |
- PushTask(task); |
- this_ptr->PostMessage(MSG_EXECUTE_TASK, reinterpret_cast<WPARAM>(task)); |
+ base::PendingTask* pending_task = |
+ new base::PendingTask(posted_from, task); |
+ PushTask(pending_task); |
+ this_ptr->PostMessage(MSG_EXECUTE_TASK, |
+ reinterpret_cast<WPARAM>(pending_task)); |
} else { |
DVLOG(1) << "Dropping MSG_EXECUTE_TASK message for destroyed window."; |
- delete task; |
} |
} |
@@ -162,7 +163,7 @@ template <class T> class TaskMarshallerThroughWindowsMessages |
<< pending_tasks_.size() |
<< " pending tasks"; |
while (!pending_tasks_.empty()) { |
- Task* task = pending_tasks_.front(); |
+ base::PendingTask* task = pending_tasks_.front(); |
pending_tasks_.pop(); |
delete task; |
} |
@@ -176,10 +177,11 @@ template <class T> class TaskMarshallerThroughWindowsMessages |
enum { MSG_EXECUTE_TASK = WM_APP + 6 }; |
inline LRESULT ExecuteTask(UINT, WPARAM wparam, LPARAM, |
BOOL& handled) { // NOLINT |
- Task* task = reinterpret_cast<Task*>(wparam); |
- if (task && PopTask(task)) { |
- task->Run(); |
- delete task; |
+ base::PendingTask* pending_task = |
+ reinterpret_cast<base::PendingTask*>(wparam); |
+ if (pending_task && PopTask(pending_task)) { |
+ pending_task->task.Run(); |
+ delete pending_task; |
} |
T* this_ptr = static_cast<T*>(this); |
@@ -187,17 +189,17 @@ template <class T> class TaskMarshallerThroughWindowsMessages |
return 0; |
} |
- inline void PushTask(Task* task) { |
+ inline void PushTask(base::PendingTask* pending_task) { |
base::AutoLock lock(lock_); |
- pending_tasks_.push(task); |
+ pending_tasks_.push(pending_task); |
} |
- // If the given task is front of the queue, removes the task and returns true, |
+ // If |pending_task| is front of the queue, removes the task and returns true, |
// otherwise we assume this is an already destroyed task (but Window message |
// had remained in the thread queue). |
- inline bool PopTask(Task* task) { |
+ inline bool PopTask(base::PendingTask* pending_task) { |
base::AutoLock lock(lock_); |
- if (!pending_tasks_.empty() && task == pending_tasks_.front()) { |
+ if (!pending_tasks_.empty() && pending_task == pending_tasks_.front()) { |
pending_tasks_.pop(); |
return true; |
} |
@@ -206,7 +208,7 @@ template <class T> class TaskMarshallerThroughWindowsMessages |
} |
base::Lock lock_; |
- std::queue<Task*> pending_tasks_; |
+ std::queue<base::PendingTask*> pending_tasks_; |
}; |
#endif // CHROME_FRAME_CHROME_FRAME_DELEGATE_H_ |