diff -r 000000000000 -r 6474c204b198 layout/ipc/test-ipcbrowser-chrome.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layout/ipc/test-ipcbrowser-chrome.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,131 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +function init() { + enableAsyncScrolling(); + messageManager.loadFrameScript( + "chrome://global/content/test-ipcbrowser-content.js", true + ); +} + +function browser() { + return document.getElementById("content"); +} + +function frameLoader() { + return browser().QueryInterface(Components.interfaces.nsIFrameLoaderOwner).frameLoader; +} + +function viewManager() { + return frameLoader().QueryInterface(Components.interfaces.nsIContentViewManager); +} + +function rootView() { + return viewManager().rootContentView; +} + +function enableAsyncScrolling() { + frameLoader().renderMode = Components.interfaces.nsIFrameLoader.RENDER_MODE_ASYNC_SCROLL; +} + +// Functions affecting the content window. + +function loadURL(url) { + browser().setAttribute('src', url); +} + +function scrollContentBy(dx, dy) { + messageManager.broadcastAsyncMessage("scrollBy", + { dx: dx, dy: dy }); + +} + +function scrollContentTo(x, y) { + messageManager.broadcastAsyncMessage("scrollTo", + { x: x, y: y }); +} + +function setContentViewport(w, h) { + messageManager.broadcastAsyncMessage("setViewport", + { w: w, h: h }); +} + +function setContentDisplayPort(x, y, w, h) { + messageManager.broadcastAsyncMessage("setDisplayPort", + { x: x, y: y, w: w, h: h }); +} + +function setContentResolution(xres, yres) { + messageManager.broadcastAsyncMessage("setResolution", + { xres: xres, yres: yres }); +} + +// Functions affecting . + +function scrollViewportBy(dx, dy) { + rootView().scrollBy(dx, dy); +} + +function scrollViewportTo(x, y) { + rootView().scrollTo(x, y); +} + +function setViewportScale(xs, ys) { + rootView().setScale(xs, ys); +} + +var kDelayMs = 100; +var kDurationMs = 250; +var scrolling = false; +function startAnimatedScrollBy(dx, dy) { + if (scrolling) + throw "don't interrupt me!"; + + scrolling = true; + + var start = mozAnimationStartTime; + var end = start + kDurationMs; + // |- k| so that we do something in first invocation of nudge() + var prevNow = start - 20; + var accumDx = 0, accumDy = 0; + + var sentScrollBy = false; + function nudgeScroll(now) { + if (!scrolling) { + // we've been canceled + return; + } + var ddx = dx * (now - prevNow) / kDurationMs; + var ddy = dy * (now - prevNow) / kDurationMs; + + ddx = Math.min(dx - accumDx, ddx); + ddy = Math.min(dy - accumDy, ddy); + accumDx += ddx; + accumDy += ddy; + + rootView().scrollBy(ddx, ddy); + + if (!sentScrollBy && 100 <= (now - start)) { + messageManager.broadcastAsyncMessage("scrollBy", + { dx: dx, dy: dy }); + sentScrollBy = true; + } + + if (now >= end || (accumDx >= dx && accumDy >= dy)) { + var fixupDx = Math.max(dx - accumDx, 0); + var fixupDy = Math.max(dy - accumDy, 0); + rootView().scrollBy(fixupDx, fixupDy); + + scrolling = false; + } + else { + mozRequestAnimationFrame(nudgeScroll); + } + + prevNow = now; + } + + nudgeScroll(start); + mozRequestAnimationFrame(nudgeScroll); +}