mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-29 15:52:07 +00:00
Bug 1043531 - Move PluginCrashed event generation to C++. r=smaug,jesup
This commit is contained in:
parent
0fb5f3331b
commit
48b52013e5
@ -108,22 +108,12 @@ GlobalPCList.prototype = {
|
||||
}
|
||||
};
|
||||
|
||||
let hasPluginId = function(list, winID, pluginID, name, crashReport) {
|
||||
let broadcastPluginCrash = function(list, winID, pluginID, name, crashReportID) {
|
||||
if (list.hasOwnProperty(winID)) {
|
||||
list[winID].forEach(function(pcref) {
|
||||
let pc = pcref.get();
|
||||
if (pc) {
|
||||
if (pc._pc.pluginCrash(pluginID)) {
|
||||
// Notify DOM window of the crash
|
||||
let event = new CustomEvent("PluginCrashed",
|
||||
{ bubbles: false, cancelable: false,
|
||||
detail: {
|
||||
pluginName: name,
|
||||
pluginDumpId: crashReport,
|
||||
submittedCrashReport: false }
|
||||
});
|
||||
pc._win.dispatchEvent(event);
|
||||
}
|
||||
pc._pc.pluginCrash(pluginID, name, crashReportID);
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -167,8 +157,8 @@ GlobalPCList.prototype = {
|
||||
let name = rest.slice(0, sep);
|
||||
let crashId = rest.slice(sep+1);
|
||||
for (let winId in this._list) {
|
||||
hasPluginId(this._list, winId, pluginId, name, crashId);
|
||||
}
|
||||
broadcastPluginCrash(this._list, winId, pluginId, name, crashId);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -60,8 +60,8 @@ interface PeerConnectionImpl {
|
||||
/* Puts the SIPCC engine back to 'kIdle', shuts down threads, deletes state */
|
||||
void close();
|
||||
|
||||
/* Notify DOM window if this plugin crash is ours */
|
||||
boolean pluginCrash(unsigned long long pluginId);
|
||||
/* Notify DOM window if this plugin crash is ours. */
|
||||
boolean pluginCrash(unsigned long long pluginId, DOMString name, DOMString pluginDumpID);
|
||||
|
||||
/* Attributes */
|
||||
readonly attribute DOMString fingerprint;
|
||||
|
@ -45,6 +45,16 @@
|
||||
#include "dtlsidentity.h"
|
||||
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
#ifdef XP_WIN
|
||||
// We need to undef the MS macro for nsIDocument::CreateEvent
|
||||
#ifdef CreateEvent
|
||||
#undef CreateEvent
|
||||
#endif
|
||||
#endif // XP_WIN
|
||||
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
#include "nsIDocument.h"
|
||||
#endif
|
||||
#include "nsPerformance.h"
|
||||
#include "nsGlobalWindow.h"
|
||||
#include "nsDOMDataChannel.h"
|
||||
@ -55,7 +65,6 @@
|
||||
#include "nsXULAppAPI.h"
|
||||
#include "nsContentUtils.h"
|
||||
#include "nsDOMJSUtils.h"
|
||||
#include "nsIDocument.h"
|
||||
#include "nsIScriptError.h"
|
||||
#include "nsPrintfCString.h"
|
||||
#include "nsURLHelper.h"
|
||||
@ -77,8 +86,19 @@
|
||||
#include "DOMMediaStream.h"
|
||||
#include "rlogringbuffer.h"
|
||||
#include "WebrtcGlobalInformation.h"
|
||||
#include "mozilla/dom/Event.h"
|
||||
#include "nsIDOMCustomEvent.h"
|
||||
#include "mozilla/EventDispatcher.h"
|
||||
#endif
|
||||
|
||||
#ifdef XP_WIN
|
||||
// We need to undef the MS macro again in case the windows include file
|
||||
// got imported after we included nsIDocument.h
|
||||
#ifdef CreateEvent
|
||||
#undef CreateEvent
|
||||
#endif
|
||||
#endif // XP_WIN
|
||||
|
||||
#ifndef USE_FAKE_MEDIA_STREAMS
|
||||
#include "MediaSegment.h"
|
||||
#endif
|
||||
@ -1637,14 +1657,72 @@ PeerConnectionImpl::Close()
|
||||
}
|
||||
|
||||
bool
|
||||
PeerConnectionImpl::PluginCrash(uint64_t aPluginID)
|
||||
PeerConnectionImpl::PluginCrash(uint64_t aPluginID,
|
||||
const nsAString& aPluginName,
|
||||
const nsAString& aPluginDumpID)
|
||||
{
|
||||
// fire an event to the DOM window if this is "ours"
|
||||
bool result = mMedia ? mMedia->AnyCodecHasPluginID(aPluginID) : false;
|
||||
if (result) {
|
||||
CSFLogError(logTag, "%s: Our plugin %llu crashed", __FUNCTION__, static_cast<unsigned long long>(aPluginID));
|
||||
if (!result) {
|
||||
return false;
|
||||
}
|
||||
return result;
|
||||
|
||||
CSFLogError(logTag, "%s: Our plugin %llu crashed", __FUNCTION__, static_cast<unsigned long long>(aPluginID));
|
||||
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
nsCOMPtr<nsIDocument> doc = mWindow->GetExtantDoc();
|
||||
if (!doc) {
|
||||
NS_WARNING("Couldn't get document for PluginCrashed event!");
|
||||
return true;
|
||||
}
|
||||
|
||||
ErrorResult rv;
|
||||
nsRefPtr<Event> event =
|
||||
doc->CreateEvent(NS_LITERAL_STRING("customevent"), rv);
|
||||
nsCOMPtr<nsIDOMCustomEvent> customEvent(do_QueryObject(event));
|
||||
if (!customEvent) {
|
||||
NS_WARNING("Couldn't QI event for PluginCrashed event!");
|
||||
return true;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIWritableVariant> variant;
|
||||
variant = do_CreateInstance("@mozilla.org/variant;1");
|
||||
if (!variant) {
|
||||
NS_WARNING("Couldn't create detail variant for PluginCrashed event!");
|
||||
return true;
|
||||
}
|
||||
|
||||
customEvent->InitCustomEvent(NS_LITERAL_STRING("PluginCrashed"),
|
||||
true, true, variant);
|
||||
event->SetTrusted(true);
|
||||
event->GetInternalNSEvent()->mFlags.mOnlyChromeDispatch = true;
|
||||
|
||||
nsCOMPtr<nsIWritablePropertyBag2> propBag;
|
||||
propBag = do_CreateInstance("@mozilla.org/hash-property-bag;1");
|
||||
if (!propBag) {
|
||||
NS_WARNING("Couldn't create a property bag for PluginCrashed event!");
|
||||
return true;
|
||||
}
|
||||
|
||||
// add a "pluginDumpID" property to this event
|
||||
propBag->SetPropertyAsAString(NS_LITERAL_STRING("pluginDumpID"),
|
||||
aPluginDumpID);
|
||||
|
||||
|
||||
// add a "pluginName" property to this event
|
||||
propBag->SetPropertyAsAString(NS_LITERAL_STRING("pluginName"),
|
||||
aPluginName);
|
||||
|
||||
// add a "submittedCrashReport" property to this event
|
||||
propBag->SetPropertyAsBool(NS_LITERAL_STRING("submittedCrashReport"),
|
||||
false);
|
||||
|
||||
variant->SetAsISupports(propBag);
|
||||
|
||||
EventDispatcher::DispatchDOMEvent(mWindow, nullptr, event, nullptr, nullptr);
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
nsresult
|
||||
|
@ -482,7 +482,9 @@ public:
|
||||
rv = Close();
|
||||
}
|
||||
|
||||
bool PluginCrash(uint64_t aPluginID);
|
||||
bool PluginCrash(uint64_t aPluginID,
|
||||
const nsAString& aPluginName,
|
||||
const nsAString& aPluginDumpID);
|
||||
|
||||
nsresult InitializeDataChannel(int track_id, uint16_t aLocalport,
|
||||
uint16_t aRemoteport, uint16_t aNumstreams);
|
||||
|
Loading…
Reference in New Issue
Block a user