1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_SHELL_RENDERER_TEST_RUNNER_WEBTASK_H_ 6 #define CONTENT_SHELL_RENDERER_TEST_RUNNER_WEBTASK_H_ 7 8 #include <vector> 9 10 namespace content { 11 12 class WebTaskList; 13 14 // WebTask represents a task which can run by WebTestDelegate::postTask() or 15 // WebTestDelegate::postDelayedTask(). 16 class WebTask { 17 public: 18 explicit WebTask(WebTaskList*); 19 virtual ~WebTask(); 20 21 // The main code of this task. 22 // An implementation of run() should return immediately if cancel() was called. 23 virtual void run() = 0; 24 virtual void cancel() = 0; 25 26 protected: 27 WebTaskList* m_taskList; 28 }; 29 30 class WebTaskList { 31 public: 32 WebTaskList(); 33 ~WebTaskList(); 34 void registerTask(WebTask*); 35 void unregisterTask(WebTask*); 36 void revokeAll(); 37 38 private: 39 std::vector<WebTask*> m_tasks; 40 }; 41 42 // A task containing an object pointer of class T. Derived classes should 43 // override runIfValid() which in turn can safely invoke methods on the 44 // m_object. The Class T must have "WebTaskList* mutable_task_list()". 45 template<class T> 46 class WebMethodTask : public WebTask { 47 public: WebMethodTask(T * object)48 explicit WebMethodTask(T* object) 49 : WebTask(object->mutable_task_list()) 50 , m_object(object) 51 { 52 } 53 ~WebMethodTask()54 virtual ~WebMethodTask() { } 55 run()56 virtual void run() 57 { 58 if (m_object) 59 runIfValid(); 60 } 61 cancel()62 virtual void cancel() 63 { 64 m_object = 0; 65 m_taskList->unregisterTask(this); 66 m_taskList = 0; 67 } 68 69 virtual void runIfValid() = 0; 70 71 protected: 72 T* m_object; 73 }; 74 75 } // namespace content 76 77 #endif // CONTENT_SHELL_RENDERER_TEST_RUNNER_WEBTASK_H_ 78