mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-03-03 07:01:19 +00:00
Bug 766437 - Fire an event when content inside a remote <iframe mozbrowser> crashes. r=vingtetun,cjones
This commit is contained in:
parent
333a47aeae
commit
027b8b945a
@ -134,6 +134,7 @@ function BrowserElementParent(frameLoader, hasRemoteFrame) {
|
||||
this._pendingDOMRequests = {};
|
||||
this._hasRemoteFrame = hasRemoteFrame;
|
||||
|
||||
this._frameLoader = frameLoader;
|
||||
this._frameElement = frameLoader.QueryInterface(Ci.nsIFrameLoader).ownerElement;
|
||||
if (!this._frameElement) {
|
||||
debug("No frame element?");
|
||||
@ -178,6 +179,7 @@ function BrowserElementParent(frameLoader, hasRemoteFrame) {
|
||||
|
||||
let os = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
|
||||
os.addObserver(this, 'ask-children-to-exit-fullscreen', /* ownsWeak = */ true);
|
||||
os.addObserver(this, 'oop-frameloader-crashed', /* ownsWeak = */ true);
|
||||
|
||||
function defineMethod(name, fn) {
|
||||
XPCNativeWrapper.unwrap(self._frameElement)[name] = function() {
|
||||
@ -474,12 +476,30 @@ BrowserElementParent.prototype = {
|
||||
this._windowUtils.remoteFrameFullscreenReverted();
|
||||
},
|
||||
|
||||
_fireFatalError: function() {
|
||||
let evt = this._createEvent('error', {type: 'fatal'},
|
||||
/* cancelable = */ false);
|
||||
this._frameElement.dispatchEvent(evt);
|
||||
},
|
||||
|
||||
observe: function(subject, topic, data) {
|
||||
if (topic == 'ask-children-to-exit-fullscreen' &&
|
||||
this._isAlive() &&
|
||||
this._frameElement.ownerDocument == subject &&
|
||||
this._hasRemoteFrame)
|
||||
this._sendAsyncMsg('exit-fullscreen');
|
||||
switch(topic) {
|
||||
case 'oop-frameloader-crashed':
|
||||
if (this._isAlive() && subject == this._frameLoader) {
|
||||
this._fireFatalError();
|
||||
}
|
||||
break;
|
||||
case 'ask-children-to-exit-fullscreen':
|
||||
if (this._isAlive() &&
|
||||
this._frameElement.ownerDocument == subject &&
|
||||
this._hasRemoteFrame) {
|
||||
this._sendAsyncMsg('exit-fullscreen');
|
||||
}
|
||||
break;
|
||||
default:
|
||||
debug('Unknown topic: ' + topic);
|
||||
break;
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -120,6 +120,14 @@ TabParent::ActorDestroy(ActorDestroyReason why)
|
||||
nsRefPtr<nsFrameLoader> frameLoader = GetFrameLoader();
|
||||
if (frameLoader) {
|
||||
frameLoader->DestroyChild();
|
||||
|
||||
if (why == AbnormalShutdown) {
|
||||
nsCOMPtr<nsIObserverService> os = services::GetObserverService();
|
||||
if (os) {
|
||||
os->NotifyObservers(NS_ISUPPORTS_CAST(nsIFrameLoader*, frameLoader),
|
||||
"oop-frameloader-crashed", nullptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user