зеркало из https://github.com/mozilla/gecko-dev.git
Bug 571371 - [e10s] Move BrowserView event handling to message-based API [r=vingtetun]
This commit is contained in:
Родитель
6744369541
Коммит
bcac88eb36
|
@ -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();
|
||||
|
|
Загрузка…
Ссылка в новой задаче