Bug 571371 - [e10s] Move BrowserView event handling to message-based API [r=vingtetun]

This commit is contained in:
Mark Finkle 2010-06-11 10:23:24 -04:00
Родитель 6744369541
Коммит bcac88eb36
5 изменённых файлов: 72 добавлений и 64 удалений

Просмотреть файл

@ -215,13 +215,12 @@ BrowserView.Util = {
},
ensureMozScrolledAreaEvent: function ensureMozScrolledAreaEvent(aBrowser, aWidth, aHeight) {
let event = document.createEvent("Event");
event.initEvent("MozScrolledAreaChanged", true, false);
event.x = 0;
event.y = 0;
event.width = aWidth;
event.height = aHeight;
aBrowser.dispatchEvent(event);
let message = {};
message.target = aBrowser;
message.name = "Browser:MozScrolledAreaChanged";
message.json = { width: aWidth, height: aHeight };
Browser._browserView.updateScrolledArea(message);
}
};
@ -272,8 +271,10 @@ BrowserView.prototype = {
this._idleService.addIdleObserver(this._idleServiceObserver, kBrowserViewPrefetchBeginIdleWait);
this._idleServiceWait = kBrowserViewPrefetchBeginIdleWait;
let browsers = document.getElementById("browsers");
browsers.addEventListener("MozScrolledAreaChanged", this.handleMozScrolledAreaChanged, false);
let self = this;
messageManager.addMessageListener("Browser:MozScrolledAreaChanged", this);
messageManager.addMessageListener("Browser:MozAfterPaint", this);
messageManager.addMessageListener("Browser:PageScroll", this);
},
uninit: function uninit() {
@ -474,8 +475,6 @@ BrowserView.prototype = {
let browserChanged = (oldBrowser !== browser);
if (oldBrowser) {
oldBrowser.removeEventListener("MozAfterPaint", this.handleMozAfterPaint, false);
oldBrowser.removeEventListener("scroll", this.handlePageScroll, false);
oldBrowser.setAttribute("type", "content");
oldBrowser.docShell.isOffScreenBrowser = false;
}
@ -489,11 +488,7 @@ BrowserView.prototype = {
this.beginBatchOperation();
browser.addEventListener("MozAfterPaint", this.handleMozAfterPaint, false);
browser.addEventListener("scroll", this.handlePageScroll, false);
browser.docShell.isOffScreenBrowser = true;
if (browserChanged)
this._viewportChanged(true, true);
@ -505,40 +500,52 @@ BrowserView.prototype = {
return this._browser;
},
handleMozAfterPaint: function handleMozAfterPaint(ev) {
let browser = this._browser;
receiveMessage: function receiveMessage(aMessage) {
switch (aMessage.name) {
case "Browser:MozAfterPaint":
this.updateDirtyTiles(aMessage);
break;
case "Browser:PageScroll":
this.updatePageScroll(aMessage);
break;
case "Browser:MozScrolledAreaChanged":
this.updateScrolledArea(aMessage);
break;
}
return {};
},
updateDirtyTiles: function updateDirtyTiles(aMessage) {
let browser = aMessage.target;
if (browser != this._browser)
return;
let rects = aMessage.json.rects;
let tm = this._tileManager;
let vs = this._browserViewportState;
let { x: scrollX, y: scrollY } = BrowserView.Util.getContentScrollOffset(browser);
let clientRects = ev.clientRects;
let rects = [];
let dirtyRects = [];
// loop backwards to avoid xpconnect penalty for .length
for (let i = clientRects.length - 1; i >= 0; --i) {
let e = clientRects.item(i);
let r = new Rect(e.left + scrollX,
e.top + scrollY,
e.width, e.height);
for (let i = rects.length - 1; i >= 0; --i) {
let r = Rect.fromRect(rects[i]);
r = this.browserToViewportRect(r);
r.expandToIntegers();
if (r.right < 0 || r.bottom < 0)
continue;
r.restrictTo(vs.viewportRect);
if (!r.isEmpty())
rects.push(r);
dirtyRects.push(r);
}
tm.dirtyRects(rects, this.isRendering(), true);
tm.dirtyRects(dirtyRects, this.isRendering(), true);
},
/** If browser scrolls, pan content to new scroll area. */
handlePageScroll: function handlePageScroll(aEvent) {
if (aEvent.target != this._browser.contentDocument || this._ignorePageScroll)
updatePageScroll: function updatePageScroll(aMessage) {
if (aMessage.target != this._browser || this._ignorePageScroll)
return;
// XXX shouldn't really make calls to Browser
Browser.scrollContentToBrowser();
},
@ -548,32 +555,21 @@ BrowserView.prototype = {
this._ignorePageScroll = aIgnoreScroll;
},
handleMozScrolledAreaChanged: function handleMozScrolledAreaChanged(ev) {
let tab = Browser.getTabForDocument(ev.originalTarget) ||
(ev.target.contentDocument && Browser.getTabForDocument(ev.target.contentDocument));
if (!tab)
return;
updateScrolledArea: function updateScrolledArea(aMessage) {
let browser = aMessage.target;
if (!browser)
throw "MozScrolledAreaChanged: Could not find browser";
let browser = tab.browser;
let json = aMessage.json;
let tab = Browser.getTabForBrowser(browser);
let bvs = tab.browserViewportState;
let { x: scrollX, y: scrollY } = BrowserView.Util.getContentScrollOffset(browser);
let x = ev.x + scrollX;
let y = ev.y + scrollY;
let w = ev.width;
let h = ev.height;
// Adjust width and height from the incoming event properties so that we
// ignore changes to width and height contributed by growth in page
// quadrants other than x > 0 && y > 0.
if (x < 0) w += x;
if (y < 0) h += y;
let vis = this.getVisibleRect();
let viewport = bvs.viewportRect;
let oldRight = viewport.right;
let oldBottom = viewport.bottom;
viewport.right = bvs.zoomLevel * w;
viewport.bottom = bvs.zoomLevel * h;
viewport.right = bvs.zoomLevel * json.width;
viewport.bottom = bvs.zoomLevel * json.height;
if (browser == this._browser) {
// Page has now loaded enough to allow zooming.

Просмотреть файл

@ -104,7 +104,7 @@
case "DOMLinkAdded":
let link = aMessage.json;
if (link.location != this._documentURI)
return;
return {};
let linkType = this._getLinkType(link);
switch(linkType) {
@ -121,6 +121,8 @@
}
break;
}
return {};
]]></body>
</method>

Просмотреть файл

@ -797,6 +797,8 @@ var BrowserUI = {
gObserverService.notifyObservers(download, "dl-done", null);
break;
}
return {};
},
supportsCommand : function(cmd) {

Просмотреть файл

@ -576,7 +576,7 @@ var Browser = {
ImagePreloader.cache();
messageManager.addMessageListener("FennecViewportMetadata", this);
messageManager.addMessageListener("MozApplicationManifest", OfflineApps);
messageManager.addMessageListener("Browser:MozApplicationManifest", OfflineApps);
this._pluginObserver = new PluginObserver(bv);
@ -2984,7 +2984,7 @@ var OfflineApps = {
},
receiveMessage: function receiveMessage(aMessage) {
if (aMessage.name == "MozApplicationManifest") {
if (aMessage.name == "Browser:MozApplicationManifest") {
this.offlineAppRequested(aMessage.json);
}
}

Просмотреть файл

@ -233,13 +233,16 @@ Coalescer.prototype = {
case "MozApplicationManifest": {
let doc = aEvent.originalTarget;
sendAsyncMessage("MozApplicationManifest", {
sendAsyncMessage("Browser:MozApplicationManifest", {
location: doc.documentURIObject.spec,
manifest: doc.documentElement.getAttribute("manifest"),
charset: doc.characterSet
});
break;
}
case "scroll":
sendSyncMessage("Browser:PageScroll", {});
break;
}
},
@ -260,8 +263,8 @@ Coalescer.prototype = {
// Adjust width and height from the incoming event properties so that we
// ignore changes to width and height contributed by growth in page
// quadrants other than x > 0 && y > 0.
var x = x + scrollOffset.x;
var y = y + scrollOffset.y;
x = x + scrollOffset.x;
y = y + scrollOffset.y;
this._pendingSizeChange = {
width: width + (x < 0 ? x : 0),
height: height + (y < 0 ? y : 0)
@ -292,20 +295,24 @@ Coalescer.prototype = {
},
flush: function flush() {
var dirtyRect = this._pendingDirtyRect;
var sizeChange = this._pendingSizeChange;
let dirtyRect = this._pendingDirtyRect;
let sizeChange = this._pendingSizeChange;
if (sizeChange) {
sendMessage("FennecMozScrolledAreaChanged", sizeChange.width, sizeChange.height);
sendSyncMessage("Browser:MozScrolledAreaChanged", { width: sizeChange.width, height: sizeChange.height });
if (!this._incremental)
sendMessage("FennecMozAfterPaint", [new Rect(0, 0, sizeChange.width, sizeChange.height)]);
sendSyncMessage("Browser:MozAfterPaint", { rects: [ { left: 0, top: 0, right: sizeChange.width, bottom: sizeChange.height } ] });
this._pendingSizeChange = null;
// After first size change has been issued, assume subsequent size changes are only incremental
// changes to the current page.
this._incremental = true;
}
else if (!dirtyRect.isEmpty()) {
// No size change has occurred, but areas have been dirtied.
sendMessage("FennecMozAfterPaint", [dirtyRect]);
sendSyncMessage("Browser:MozAfterPaint", { rects: [dirtyRect] });
// Reset the rect to empty
dirtyRect.top = dirtyRect.bottom;
dirtyRect.left = dirtyRect.right;
}
@ -682,6 +689,7 @@ function Content() {
addEventListener("MozAfterPaint", this._coalescer, false);
addEventListener("MozScrolledAreaChanged", this._coalescer, false);
addEventListener("MozApplicationManifest", this._coalescer, false);
addEventListener("scroll", this._coalescer, false);
this._progressController = new ProgressController(this);
this._progressController.start();