1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/* 25abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * Copyright (C) 2010 Google Inc. All rights reserved. 35abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * 4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without 5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions are 6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * met: 75abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * 8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * * Redistributions of source code must retain the above copyright 9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer. 10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * * Redistributions in binary form must reproduce the above 11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * copyright notice, this list of conditions and the following disclaimer 12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * in the documentation and/or other materials provided with the 13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * distribution. 14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * * Neither the name of Google Inc. nor the names of its 15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * contributors may be used to endorse or promote products derived from 16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * this software without specific prior written permission. 175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * 18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */ 30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#ifndef Task_h 325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#define Task_h 33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "webkit/support/webkit_support.h" 3581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <wtf/OwnPtr.h> 365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include <wtf/Vector.h> 37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickclass TaskList; 39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// WebTask represents a task which can run by postTask() or postDelayedTask(). 415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// it is named "WebTask", not "Task", to avoid conflist with base/task.h. 4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass WebTask : public webkit_support::TaskAdaptor { 435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickpublic: 445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick WebTask(TaskList*); 455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // The main code of this task. 465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // An implementation of run() should return immediately if cancel() was called. 475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick virtual void run() = 0; 485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick virtual void cancel() = 0; 495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick virtual ~WebTask(); 5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochprivate: 5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch virtual void Run() { run(); } 5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 54f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochprotected: 555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick TaskList* m_taskList; 565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}; 57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickclass TaskList { 595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickpublic: 605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick TaskList() {} 615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick ~TaskList() { revokeAll(); } 625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick void registerTask(WebTask* task) { m_tasks.append(task); } 635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick void unregisterTask(WebTask* task); 645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick void revokeAll(); 655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickprivate: 665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Vector<WebTask*> m_tasks; 675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}; 68db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// A task containing an object pointer of class T. Is is supposed that 705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// runifValid() calls a member function of the object pointer. 715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Class T must have "TaskList* taskList()". 725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merricktemplate<class T> class MethodTask: public WebTask { 735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickpublic: 745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick MethodTask(T* object): WebTask(object->taskList()), m_object(object) {} 755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick virtual void run() 765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (m_object) 785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick runIfValid(); 795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 80f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch virtual void cancel() 81f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch { 82f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_object = 0; 83f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_taskList->unregisterTask(this); 84f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_taskList = 0; 85f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick virtual void runIfValid() = 0; 875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickprotected: 885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick T* m_object; 89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}; 90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid postTask(WebTask* task); 925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid postDelayedTask(WebTask* task, int64_t ms); 93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif // Task_h 95