Bug 903386 - Make all delayed PluginModuleParent tasks revocable. r=aklotz

This commit is contained in:
Georg Fritzsche 2013-09-23 19:34:00 +02:00
parent 4867db1fcc
commit dff984e6ff
4 changed files with 94 additions and 14 deletions

View File

@ -493,19 +493,10 @@ PluginModuleParent::TerminateChildProcess(MessageLoop* aMsgLoop)
// this must run before the error notification from the channel,
// or not at all
bool isFromHangUI = aMsgLoop != MessageLoop::current();
if (isFromHangUI) {
// If we're posting from a different thread we can't create
// the task via mTaskFactory
aMsgLoop->PostTask(FROM_HERE,
NewRunnableMethod(this,
&PluginModuleParent::CleanupFromTimeout,
isFromHangUI));
} else {
aMsgLoop->PostTask(
FROM_HERE,
mTaskFactory.NewRunnableMethod(
&PluginModuleParent::CleanupFromTimeout, isFromHangUI));
}
aMsgLoop->PostTask(
FROM_HERE,
mTaskFactory.NewRunnableMethod(
&PluginModuleParent::CleanupFromTimeout, isFromHangUI));
if (!KillProcess(OtherProcess(), 1, false))
NS_WARNING("failed to kill subprocess!");

View File

@ -10,6 +10,7 @@
#include "base/process.h"
#include "mozilla/FileUtils.h"
#include "mozilla/PluginLibrary.h"
#include "mozilla/plugins/ScopedMethodFactory.h"
#include "mozilla/plugins/PluginProcessParent.h"
#include "mozilla/plugins/PPluginModuleParent.h"
#include "npapi.h"
@ -302,7 +303,7 @@ private:
const NPNetscapeFuncs* mNPNIface;
nsDataHashtable<nsPtrHashKey<void>, PluginIdentifierParent*> mIdentifiers;
nsNPAPIPlugin* mPlugin;
ScopedRunnableMethodFactory<PluginModuleParent> mTaskFactory;
ScopedMethodFactory<PluginModuleParent> mTaskFactory;
nsString mPluginDumpID;
nsString mBrowserDumpID;
nsString mHangID;

View File

@ -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 <base/task.h>
/*
* 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 T>
class ScopedMethodFactory : public RevocableStore
{
private:
template<class TaskType>
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 <class Method>
inline Task* NewRunnableMethod(Method method) {
typedef TaskWrapper<RunnableMethod<Method, Tuple0> > TaskWrapper;
TaskWrapper* task = new TaskWrapper(this);
task->Init(object_, method, MakeTuple());
return task;
}
template <class Method, class A>
inline Task* NewRunnableMethod(Method method, const A& a) {
typedef TaskWrapper<RunnableMethod<Method, Tuple1<A> > > TaskWrapper;
TaskWrapper* task = new TaskWrapper(this);
task->Init(object_, method, MakeTuple(a));
return task;
}
protected:
template <class Method, class Params>
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

View File

@ -39,6 +39,7 @@ EXPORTS.mozilla.plugins += [
'PluginStreamChild.h',
'PluginStreamParent.h',
'PluginUtilsOSX.h',
'ScopedMethodFactory.h',
'StreamNotifyChild.h',
'StreamNotifyParent.h',
]