bug 882196 - Android crash in nsXPCWrappedJS::AddRef, remove nsAppShell::CallObservers r=snorp
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user