Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
// ==UserScript==
// @name ScrollFunctions.uc.js
// @namespace http://d.hatena.ne.jp/Griever/
// @include main
// ==/UserScript==
/*
引数で指定したピクセルだけウインドウをスクロールする。
キャレットブラウズモードの時はスクロール量が1行に固定される
keyconfig 等で pixelScroll.up(200); を実行する
要素にスクロールバーがあってもウインドウしかスクロールしない問題あり
*/
var pixelScroll = {
isCaret : function(){
return Cc["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch)
.getBoolPref('accessibility.browsewithcaret')
},
up : function (num){
if (this.isCaret() || !num){
goDoCommand('cmd_scrollLineUp');
return;
}
var aWindow = document.commandDispatcher.focusedWindow;
aWindow.scrollBy(0, -num);
},
down : function (num){
if (this.isCaret() || !num){
goDoCommand('cmd_scrollLineDown');
return;
}
var aWindow = document.commandDispatcher.focusedWindow;
aWindow.scrollBy(0, num);
},
left : function (num){
if (this.isCaret() || !num){
goDoCommand('cmd_scrollLeft');
return;
}
var aWindow = document.commandDispatcher.focusedWindow;
aWindow.scrollBy(-num, 0);
},
right : function (num){
if (this.isCaret() || !num){
goDoCommand('cmd_scrollRight');
return;
}
var aWindow = document.commandDispatcher.focusedWindow;
aWindow.scrollBy(num, 0);
},
};
/*
半画面スクロールを再現する
キャレットブラウズモードの時は PageUp/PageDown が実行される(キャレットが付いてこないため)
keyconfig 等で halfScroll.up(); を実行する
要素にスクロールバーがあってもウインドウしかスクロールしない問題あり
*/
var halfScroll = {
isCaret : function(){
return Cc["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch)
.getBoolPref('accessibility.browsewithcaret')
},
up : function (){
if (this.isCaret()){
goDoCommand('cmd_scrollPageDown');
return;
}
var aWindow = document.commandDispatcher.focusedWindow;
aWindow.scrollBy(0, parseInt(aWindow.innerHeight/-2));
},
down : function (){
if (this.isCaret()){
goDoCommand('cmd_scrollPageDown');
return;
}
var aWindow = document.commandDispatcher.focusedWindow;
aWindow.scrollBy(0, parseInt(aWindow.innerHeight/2));
},
};
/*
引数で指定した回数だけスクロールコマンドを実行する。
キャレットブラウズモードの時はスクロール量が 1 に固定される
keyconfig 等で repeatScroll.up(5); を実行する
*/
var repeatScroll = {
isCaret : function(){
return Cc["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch)
.getBoolPref('accessibility.browsewithcaret')
},
up : function (num){
if (this.isCaret() || !num) num = 1;
for (var i = 0; i < num; i++)
goDoCommand('cmd_scrollLineUp');
},
down : function (num){
if (this.isCaret() || !num) num = 1;
for (var i = 0; i < num; i++)
goDoCommand('cmd_scrollLineDown');
},
left : function (num){
if (this.isCaret() || !num) num = 1;
for (var i = 0; i < num; i++)
goDoCommand('cmd_scrollLeft');
},
right : function (num){
if (this.isCaret() || !num) num = 1;
for (var i = 0; i < num; i++)
goDoCommand('cmd_scrollRight');
}
};
/*
引数で指定した回数だけスクロールコマンドを実行する
キャレットブラウズモードの時はリンクにフォーカスが合った時にスクロールを止める
keyconfig 等で caretNavigation.up(8); を実行する
高速スクロール&空間ナビゲーションをイメージしたもの
*/
var caretNavigation = {
defaultScrollNums : 8,
isCaret : function(){
return Cc["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch)
.getBoolPref('accessibility.browsewithcaret')
},
up : function (num){
var caretMode = this.isCaret()
if (!num) num = this.defaultScrollNums;
for (var i = 0; i < num; i++){
goDoCommand('cmd_scrollLineUp');
if (caretMode && content.document.activeElement.localName == 'A')
break;
}
},
down : function (num){
var caretMode = this.isCaret()
if (!num) num = this.defaultScrollNums;
for (var i = 0; i < num; i++){
goDoCommand('cmd_scrollLineDown');
if (caretMode && content.document.activeElement.localName == 'A')
break;
}
},
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.