bug 882196 - Android crash in nsXPCWrappedJS::AddRef, remove nsAppShell::CallObservers r=snorp

This commit is contained in:
Brad Lassey
2013-06-15 17:40:27 -04:00
parent 5c7fd99586
commit f12392615d
7 changed files with 48 additions and 68 deletions

View File

@@ -518,6 +518,10 @@ nsAppShell::ProcessNextNativeEvent(bool mayWait)
break;
}
case AndroidGeckoEvent::CALL_OBSERVER:
CallObserver(curEvent->Characters(), curEvent->CharactersExtra(), curEvent->Data());
break;
case AndroidGeckoEvent::NOOP:
break;
@@ -708,29 +712,6 @@ nsAppShell::AddObserver(const nsAString &aObserverKey, nsIObserver *aObserver)
return NS_OK;
}
/**
* The XPCOM event that will call the observer on the main thread.
*/
class ObserverCaller : public nsRunnable {
public:
ObserverCaller(nsIObserver *aObserver, const char *aTopic, const PRUnichar *aData) :
mObserver(aObserver), mTopic(aTopic), mData(aData) {
NS_ASSERTION(aObserver != nullptr, "ObserverCaller: aObserver is null!");
}
NS_IMETHOD Run() {
ALOG("ObserverCaller::Run: observer = %p, topic = '%s')",
(nsIObserver*)mObserver, mTopic.get());
mObserver->Observe(nullptr, mTopic.get(), mData.get());
return NS_OK;
}
private:
nsCOMPtr<nsIObserver> mObserver;
nsCString mTopic;
nsString mData;
};
void
nsAppShell::CallObserver(const nsAString &aObserverKey, const nsAString &aTopic, const nsAString &aData)
{
@@ -745,16 +726,8 @@ nsAppShell::CallObserver(const nsAString &aObserverKey, const nsAString &aTopic,
const NS_ConvertUTF16toUTF8 sTopic(aTopic);
const nsPromiseFlatString& sData = PromiseFlatString(aData);
if (NS_IsMainThread()) {
// This branch will unlikely be hit, have it just in case
observer->Observe(nullptr, sTopic.get(), sData.get());
} else {
// Java is not running on main thread, so we have to use NS_DispatchToMainThread
nsCOMPtr<nsIRunnable> observerCaller = new ObserverCaller(observer, sTopic.get(), sData.get());
nsresult rv = NS_DispatchToMainThread(observerCaller);
ALOG("NS_DispatchToMainThread result: %d", rv);
unused << rv;
}
MOZ_ASSERT(NS_IsMainThread());
observer->Observe(nullptr, sTopic.get(), sData.get());
}
void