From fc6bed0372e51c3dd7c7f0cbb4b848dae426f5f2 Mon Sep 17 00:00:00 2001 From: Justin Lebar Date: Wed, 5 Sep 2012 10:34:06 -0400 Subject: [PATCH] Bug 787378 - Part 1: Fire a "firstpaint" event in iframe mozbrowser. --- dom/browser-element/BrowserElementChild.js | 19 +++++++++++++++++++ dom/browser-element/BrowserElementParent.js | 1 + 2 files changed, 20 insertions(+) diff --git a/dom/browser-element/BrowserElementChild.js b/dom/browser-element/BrowserElementChild.js index 86e9c10c4fb..0d2d706747e 100644 --- a/dom/browser-element/BrowserElementChild.js +++ b/dom/browser-element/BrowserElementChild.js @@ -107,6 +107,12 @@ BrowserElementChild.prototype = { /* useCapture = */ true, /* wantsUntrusted = */ false); + this._afterPaintHandlerClosure = this._afterPaintHandler.bind(this); + addEventListener('MozAfterPaint', + this._afterPaintHandlerClosure, + /* useCapture = */ true, + /* wantsUntrusted = */ false); + var self = this; function addMsgListener(msg, handler) { addMessageListener('browser-element-api:' + msg, handler.bind(self)); @@ -351,6 +357,19 @@ BrowserElementChild.prototype = { } }, + _afterPaintHandler: function(e) { + let uri = docShell.QueryInterface(Ci.nsIWebNavigation).currentURI; + debug("Got afterpaint event: " + uri.spec); + if (uri.spec != "about:blank") { + /* this._afterPaintHandlerClosure == arguments.callee, except we're in + * strict mode so we don't have arguments.callee. */ + removeEventListener('MozAfterPaint', this._afterPaintHandlerClosure, + /* useCapture */ true); + + sendAsyncMsg('firstpaint'); + } + }, + _closeHandler: function(e) { let win = e.target; if (win != content || e.defaultPrevented) { diff --git a/dom/browser-element/BrowserElementParent.js b/dom/browser-element/BrowserElementParent.js index 152520215c0..a9fca6a470c 100644 --- a/dom/browser-element/BrowserElementParent.js +++ b/dom/browser-element/BrowserElementParent.js @@ -195,6 +195,7 @@ function BrowserElementParent(frameLoader, hasRemoteFrame) { addMessageListener("securitychange", this._fireEventFromMsg); addMessageListener("error", this._fireEventFromMsg); addMessageListener("scroll", this._fireEventFromMsg); + addMessageListener("firstpaint", this._fireEventFromMsg); addMessageListener("keyevent", this._fireKeyEvent); addMessageListener("showmodalprompt", this._handleShowModalPrompt); addMessageListener('got-screenshot', this._gotDOMRequestResult);