Bug 766437 - Fire an event when content inside a remote <iframe mozbrowser> crashes. r=vingtetun,cjones

This commit is contained in:
Justin Lebar 2012-08-02 10:26:57 -04:00
parent 333a47aeae
commit 027b8b945a
2 changed files with 33 additions and 5 deletions

View File

@ -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;
};
},
};

View File

@ -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);
}
}
}
}