var win;
const nsISelectionController = SpecialPowers.Ci.nsISelectionController;
function controllerForWindow(aWin) {
return SpecialPowers.wrap(aWin)
.docShell
.QueryInterface(SpecialPowers.Ci.nsIInterfaceRequestor)
.getInterface(SpecialPowers.Ci.nsISelectionDisplay)
.QueryInterface(SpecialPowers.Ci.nsISelectionController);
}
function testCollapsed(id, flags, startAt, expected) { var c = win.document.getElementById("c" + id); var target = win.document.getElementById("target" + id); var controller;
if (target.contentDocument) {
controller = controllerForWindow(target.contentWindow);
target = target.contentDocument.getElementById("target" + id);
} else {
controller = controllerForWindow(win);
} var selection = controller.getSelection(nsISelectionController.SELECTION_NORMAL);
selection.collapse(target.parentNode, 0);
c.scrollTop = startAt;
try {
controller.scrollSelectionIntoView(
nsISelectionController.SELECTION_NORMAL,
nsISelectionController.SELECTION_FOCUS_REGION,
nsISelectionController.SCROLL_SYNCHRONOUS | flags
);
} catch (e) {}
is(c.scrollTop, expected, "Scrolling " + target.id + " into view with flags " + flags + ", starting at " + startAt);
}
function doTest() {
// Test scrolling an element smaller than the scrollport
testCollapsed("1", nsISelectionController.SCROLL_VERTICAL_START, 0, 400);
testCollapsed("1", nsISelectionController.SCROLL_VERTICAL_END, 0, 220);
testCollapsed("1", nsISelectionController.SCROLL_VERTICAL_NEAREST, 0, 220);
testCollapsed("1", nsISelectionController.SCROLL_VERTICAL_START, 500, 400);
testCollapsed("1", nsISelectionController.SCROLL_VERTICAL_END, 500, 220);
testCollapsed("1", nsISelectionController.SCROLL_VERTICAL_NEAREST, 500, 400);
// overflow:hidden elements should not be scrolled by selection
// scrolling-into-view
testCollapsed("2", nsISelectionController.SCROLL_VERTICAL_START, 0, 0);
testCollapsed("2", nsISelectionController.SCROLL_VERTICAL_END, 0, 0);
testCollapsed("2", nsISelectionController.SCROLL_VERTICAL_NEAREST, 0, 0);
testCollapsed("2", nsISelectionController.SCROLL_VERTICAL_START, 500, 500);
testCollapsed("2", nsISelectionController.SCROLL_VERTICAL_END, 500, 500);
testCollapsed("2", nsISelectionController.SCROLL_VERTICAL_NEAREST, 500, 500);
// Test scrolling an element larger than the scrollport
testCollapsed("3", nsISelectionController.SCROLL_VERTICAL_START, 0, 400);
testCollapsed("3", nsISelectionController.SCROLL_VERTICAL_END, 0, 500);
testCollapsed("3", nsISelectionController.SCROLL_VERTICAL_NEAREST, 0, 400);
testCollapsed("3", nsISelectionController.SCROLL_VERTICAL_START, 1000, 400);
testCollapsed("3", nsISelectionController.SCROLL_VERTICAL_END, 1000, 500);
// If the element can't be completely visible, show as much as possible,
// and don't hide anything which was initially visible.
testCollapsed("3", nsISelectionController.SCROLL_VERTICAL_NEAREST, 1000, 500);
// Test scrolling an element larger than the scrollport
testCollapsed("4", nsISelectionController.SCROLL_VERTICAL_START, 0, 400);
testCollapsed("4", nsISelectionController.SCROLL_VERTICAL_END, 0, 500);
testCollapsed("4", nsISelectionController.SCROLL_VERTICAL_NEAREST, 0, 400);
testCollapsed("4", nsISelectionController.SCROLL_VERTICAL_START, 1000, 400);
testCollapsed("4", nsISelectionController.SCROLL_VERTICAL_END, 1000, 500);
// If the element can't be completely visible, show as much as possible,
// and don't hide anything which was initially visible.
testCollapsed("4", nsISelectionController.SCROLL_VERTICAL_NEAREST, 1000, 500);
// Test that scrolling a translated element into view takes
// account of the transform.
testCollapsed("5", nsISelectionController.SCROLL_VERTICAL_START, 0, 400);
// Test that scrolling a scaled element into view takes
// account of the transform.
testCollapsed("6", nsISelectionController.SCROLL_VERTICAL_START, 0, 150);
// Test that scrolling an element with a translated, scrolling container
// into view takes account of the transform.
testCollapsed("7", nsISelectionController.SCROLL_VERTICAL_START, 0, 400);
win.close();
SimpleTest.finish();
}
function openWindow() {
win = open("scroll_selection_into_view_window.html", "_blank", "width=500,height=350");
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.