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