diff -r 000000000000 -r 6474c204b198 dom/plugins/ipc/ScopedMethodFactory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/plugins/ipc/ScopedMethodFactory.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,87 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_plugins_ScopedMethodFactory_h +#define mozilla_plugins_ScopedMethodFactory_h + +#include + +/* + * This is based on the ScopedRunnableMethodFactory from ipc/chromium/src/base/task.h + * Chromiums factories assert if tasks are created and run on different threads, + * which is something we need to do in PluginModuleParent (hang UI vs. main thread). + * ScopedMethodFactory just provides cancellable tasks that don't assert this. + */ + +namespace mozilla { +namespace plugins { + +template +class ScopedMethodFactory : public RevocableStore +{ +private: + template + class TaskWrapper : public TaskType + { + public: + explicit TaskWrapper(RevocableStore* store) : revocable_(store) { } + + virtual void Run() { + if (!revocable_.revoked()) + TaskType::Run(); + } + + private: + Revocable revocable_; + }; + +public: + explicit ScopedMethodFactory(T* object) : object_(object) { } + + template + inline Task* NewRunnableMethod(Method method) { + typedef TaskWrapper > TaskWrapper; + + TaskWrapper* task = new TaskWrapper(this); + task->Init(object_, method, MakeTuple()); + return task; + } + + template + inline Task* NewRunnableMethod(Method method, const A& a) { + typedef TaskWrapper > > TaskWrapper; + + TaskWrapper* task = new TaskWrapper(this); + task->Init(object_, method, MakeTuple(a)); + return task; + } + +protected: + template + class RunnableMethod : public Task { + public: + RunnableMethod() { } + + void Init(T* obj, Method meth, const Params& params) { + obj_ = obj; + meth_ = meth; + params_ = params; + } + + virtual void Run() { DispatchToMethod(obj_, meth_, params_); } + + private: + T* obj_; + Method meth_; + Params params_; + }; + +private: + T* object_; +}; + +} // namespace plugins +} // namespace mozilla + +#endif // mozilla_plugins_ScopedMethodFactory_h