Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
ec6f7e4
// wip
clayboone Jan 17, 2018
e326262
// wip: changed layout of options
clayboone Jan 17, 2018
81b8a2b
//wip: minimap title
clayboone Jan 17, 2018
a3571c4
// wip: added space to line up with other table
clayboone Jan 17, 2018
f98e5d9
// wip: another minimap title
clayboone Jan 17, 2018
bb89499
// wip: add buttons & labels to options.html
clayboone Jan 17, 2018
f24ecbb
// wip: remove IsOverText() minimap title
clayboone Jan 17, 2018
cc3395f
//wip: small refactor in onMouseDown()
clayboone Jan 17, 2018
cd7685d
//wip: renames in onMouseDown()
clayboone Jan 18, 2018
500f764
add: added left-side to the cursor appearance
clayboone Jan 18, 2018
94d2f3b
// wip: options minimap title
clayboone Jan 18, 2018
b87deda
change: removed spaces from checkbox labels in options
clayboone Jan 18, 2018
2600321
add: more cleanup
clayboone Jan 18, 2018
0e4e30e
//wip: changed the debug message
clayboone Jan 18, 2018
9be3b18
//wip: made a couple tables in the table in the table
clayboone Jan 18, 2018
461aa1c
fix: left my bugbox in there from last commit
clayboone Jan 18, 2018
80004fd
fix: formatting
clayboone Jan 18, 2018
b8030cf
add: new even listeners for new options
clayboone Jan 18, 2018
00ca4ad
// WIP: each place i'll need to append to later
clayboone Jan 18, 2018
3ebf785
change: simplied [LMR]BUTTON_OVERRIDE_TAGS
clayboone Jan 18, 2018
028d285
change: added <select> back to forbidden tags
clayboone Jan 18, 2018
34e28c6
//wip: prelim. onUpdate() options.js
clayboone Jan 18, 2018
f7b7d29
add: auto selecting options that make sense together working now
clayboone Jan 18, 2018
92ceb46
add: load the rest of the new options in content.js
clayboone Jan 18, 2018
ee930a7
fix: disable buttons working now
clayboone Jan 18, 2018
b4f2136
change: remove minimap titles
clayboone Jan 18, 2018
a20d413
updated comment to match code
clayboone Jan 18, 2018
3990303
added a fixme comment for edge case
clayboone Jan 18, 2018
be627ce
corrected comment about options loading but not displaying correctly
clayboone Jan 18, 2018
6abc92d
added my own wishlist; doesn't need tracking though
clayboone Jan 19, 2018
e442719
fix: forgot to check for <embed> tag
clayboone Jan 19, 2018
c145b3a
fix: a close-paren
clayboone Jan 19, 2018
b62aaf4
add: add new options to background.js
clayboone Jan 19, 2018
a4c8002
fixed options being auto-checked/disabled on page [re]load
clayboone Jan 19, 2018
bf5e961
fixed options being auto-checked/disabled on page [re]load
clayboone Jan 19, 2018
0a74f1f
Merge remote-tracking branch 'origin/drag-on-links-imgs' into drag-on…
clayboone Jan 19, 2018
c212be3
tener: ignore my todo.md
clayboone Jan 19, 2018
cac7a33
add and icon
clayboone Jan 19, 2018
813efa8
add actions to manifest and background.js
clayboone Jan 19, 2018
0166c93
rename option
clayboone Jan 19, 2018
c34d082
content.js honors browser_enabled now
clayboone Jan 19, 2018
aefd06a
fix: call saveOptions at the end of onClicked listener
clayboone Jan 19, 2018
3c91f8a
removed a comment that was forgotten
clayboone Jan 19, 2018
65f697a
add permission for contextMenus
clayboone Jan 19, 2018
3bb7343
add context menu item and function
clayboone Jan 19, 2018
0d87d04
update comments and remove extra console.log()s
clayboone Jan 19, 2018
3a77546
Merge branch 'add-site-via-contextmenu' into merge-onlinks-browseract…
clayboone Jan 20, 2018
531e964
Merge branch 'drag-on-links-imgs' into merge-onlinks-browseraction-co…
clayboone Jan 20, 2018
4336e1e
delete my todo.md
clayboone Jan 20, 2018
86a6429
added typscript type checking
clayboone Feb 3, 2018
63d7b4d
various type fixes
clayboone Feb 3, 2018
a51a252
remove leftover debug line..
clayboone Feb 3, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"private": true,
"devDependencies": {
"@types/chrome": "0.0.59",
"grunt": "^0.4.5",
"grunt-contrib-clean": "^0.7.0",
"grunt-zip": "^0.16.2",
Expand Down
58 changes: 55 additions & 3 deletions src/background.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
defaultOptions = { "button": 2,
// @ts-check
var defaultOptions = { "button": 2,
"key_shift": false,
"key_ctrl": false,
"key_alt": false,
Expand All @@ -8,9 +9,15 @@ defaultOptions = { "button": 2,
"friction": 10,
"cursor": true,
"notext": false,
"nolinks": false,
"nobuttons": false,
"nolabels": false,
"noimages": false,
"noembeds": false,
"grab_and_drag": false,
"debug": false,
"blacklist": "",
"browser_enabled": true,
}

for (var k in defaultOptions)
Expand All @@ -24,9 +31,9 @@ function loadOptions() {
return o
}

clients = {}
var clients = {}

chrome.extension.onConnect.addListener(function(port) {
chrome.runtime.onConnect.addListener(function(port) {
port.postMessage({ saveOptions: localStorage })
var id = port.sender.tab.id + ":" + port.sender.frameId
console.log("connect: "+id)
Expand All @@ -47,6 +54,51 @@ function saveOptions(o) {
}
}

chrome.browserAction.onClicked.addListener(function(tab) {
if (localStorage['browser_enabled'] == "true") {
localStorage['browser_enabled'] = "false"
chrome.browserAction.setIcon({path:"icon16dis.png"})
}
else {
localStorage['browser_enabled'] = "true"
chrome.browserAction.setIcon({path:"icon16.png"})
}
saveOptions({o:'browser_enabled'})
})

// This does not require "permissions":["tabs"] becuase it only acts on its
// current tab.
chrome.contextMenus.create({
title:"Add site to SA blacklist",
contexts:["all"],
type:"normal",
onclick: (info, tab) => {
// 'document.location.hostname' here is a string containing our app ID.
// info.pageUrl and tab.url are both the full URL of this page, we only
// want the hostname, so use a dummy object (instead of requiring another
// library to parse the URL)
let dummy = document.createElement('a')
dummy.href = tab.url

// Use dummy.hostname for now; If @davidparsson agrees on issue #68, then
// this should change to use dummy.host as well.
let blacklist = localStorage["blacklist"].split('\n')

for (var i = blacklist.length - 1; i >= 0; i--) {
var blacklistEntry = blacklist[i].trim();
if (dummy.hostname === blacklistEntry) {
// no need to check subdomains when adding to list
console.log(dummy.hostname,'already in blacklist')
return
}
}
console.log('pushing',dummy.hostname,'to blacklist')
blacklist.push(dummy.hostname)
localStorage['blacklist'] = blacklist.join('\n')
saveOptions({o:'blacklist'})
}
})

// Inject content script into all existing tabs (doesn't work)
// This functionality requires
// "permissions": ["tabs"]
Expand Down
83 changes: 51 additions & 32 deletions src/content.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@

ScrollbarAnywhere = (function() {
//@ts-check
var ScrollbarAnywhere = (function() {

// === Options ===

Expand All @@ -11,9 +12,15 @@ ScrollbarAnywhere = (function() {
options = msg.saveOptions
options.cursor = (options.cursor == "true")
options.notext = (options.notext == "true")
options.nolinks = (options.nolinks == "true")
options.nobuttons = (options.nobuttons == "true")
options.nolabels = (options.nolabels == "true")
options.noimages = (options.noimages == "true")
options.noembeds = (options.noembeds == "true")
options.grab_and_drag = (options.grab_and_drag == "true")
options.debug = (options.debug == "true")
options.enabled = isEnabled(options.blacklist)
options.browser_enabled = (options.browser_enabled == "true")
debug("saveOptions: ",options)
}
})
Expand Down Expand Up @@ -81,7 +88,6 @@ ScrollbarAnywhere = (function() {
function vmag(v) { return Math.sqrt(v[0]*v[0] + v[1]*v[1]) }
function vunit(v) { return vdiv(vmag(v),v) }


// Test if the given point is directly over text
var isOverText = (function() {
var bonet = document.createElement("SPAN")
Expand Down Expand Up @@ -175,23 +181,26 @@ ScrollbarAnywhere = (function() {
}
}

// Don't drag when left-clicking on these elements
const LBUTTON_OVERRIDE_TAGS = ['A','INPUT','SELECT','TEXTAREA','BUTTON','LABEL','OBJECT','EMBED']
const MBUTTON_OVERRIDE_TAGS = ['A']
const RBUTTON_OVERRIDE_TAGS = ['A','INPUT','TEXTAREA','OBJECT','EMBED']
function hasOverrideAncestor(e) {
// Don't drag when clicking on these elements
const MANDATORY_OVERRIDE_TAGS = ['INPUT', 'TEXTAREA', 'SELECT']
function hasMandatoryOverrideAncestor(e) {
if (e == null) return false
if (options.button == LBUTTON && shouldOverrideLeftButton(e)) return true;
if (options.button == MBUTTON && MBUTTON_OVERRIDE_TAGS.some(function(tag) { return tag == e.tagName })) return true
if (options.button == RBUTTON && RBUTTON_OVERRIDE_TAGS.some(function(tag) { return tag == e.tagName })) return true
if (MANDATORY_OVERRIDE_TAGS.some(function(tag) { return tag == e.tagName })) return true
return arguments.callee(e.parentNode)
}

function shouldOverrideLeftButton(e) {
return LBUTTON_OVERRIDE_TAGS.some(function(tag) { return tag == e.tagName; }) || hasRoleButtonAttribute(e);
function hasOptionalOverrideAncestor(e) {
if (e == null) return false
if (options.nolinks && e.tagName == 'A') return true
if (options.nobuttons && (e.tagName == 'BUTTON' || hasRoleButtonAttribute(e))) return true
if (options.nolabels && e.tagName == 'LABEL') return true
if (options.noimages && e.tagName == 'IMG') return true
if (options.noembeds && (e.tagName == 'OBJECT' || e.tagName == 'EMBED')) return true
return arguments.callee(e.parentNode)
}

function hasRoleButtonAttribute(e) {
// FIXME: github has a lot of links that look like buttons...
if (e.attributes && e.attributes.role) {
return e.attributes.role.value === 'button';
}
Expand Down Expand Up @@ -248,16 +257,16 @@ ScrollbarAnywhere = (function() {
var scrollFixElement = null;

function createScrollFix() {
scrollFixElement = document.createElement('div');
scrollFixElement.setAttribute('style', 'background: transparent none !important');
scrollFixElement.style.position = 'fixed';
scrollFixElement.style.top=0;
scrollFixElement.style.right=0;
scrollFixElement.style.bottom=0;
scrollFixElement.style.left=0;
scrollFixElement.style.zIndex=99999999;
scrollFixElement.style.display='block';
//scrollFixElement.style.borderRight='5px solid rgba(0,0,0,0.04)';
scrollFixElement = document.createElement("div");
scrollFixElement.setAttribute("style", "background: transparent none !important");
scrollFixElement.style.position = "fixed";
scrollFixElement.style.top = "0";
scrollFixElement.style.right = "0";
scrollFixElement.style.bottom = "0";
scrollFixElement.style.left = "0";
scrollFixElement.style.zIndex = "99999999";
scrollFixElement.style.display = "block";
//scrollFixElement.style.borderRight="5px solid rgba(0,0,0,0.04)";
}

function show() {
Expand Down Expand Up @@ -421,7 +430,7 @@ ScrollbarAnywhere = (function() {
})()


Scroll = (function() {
var Scroll = (function() {
var scrolling = false
var element
var scrollOrigin
Expand Down Expand Up @@ -577,10 +586,15 @@ ScrollbarAnywhere = (function() {
return true;
}

if (!options.browser_enabled) {
debug("browserAction is disabled, ignoring")
return true;
}

switch (activity) {

case GLIDE:
stopGlide(ev)
stopGlide()
// fall through

case STOP:
Expand All @@ -599,11 +613,21 @@ ScrollbarAnywhere = (function() {
break
}

if (hasOverrideAncestor(ev.target)) {
if (hasMandatoryOverrideAncestor(ev.target)) {
debug("forbidden target element, ignoring",ev)
break
}

if (hasOptionalOverrideAncestor(ev.target)) {
debug("optional target element disabled, ignoring",ev)
break
}

if (options.notext && isOverText(ev)) {
debug("detected text node, ignoring")
break
}

if (isOverScrollbar(ev)) {
debug("detected scrollbar click, ignoring",ev)
break
Expand All @@ -615,11 +639,6 @@ ScrollbarAnywhere = (function() {
break
}

if (options.notext && isOverText(ev)) {
debug("detected text node, ignoring")
break
}

debug("click MouseEvent=",ev," dragElement=",dragElement)
activity = CLICK
mouseOrigin = [ev.clientX,ev.clientY]
Expand Down Expand Up @@ -686,7 +705,7 @@ ScrollbarAnywhere = (function() {
Clipboard.unblockPaste()
ScrollFix.hide()
if (ev.button == 0) getSelection().removeAllRanges()
if (document.activeElement) document.activeElement.blur()
if (document.activeElement) document.activeElement.blur() // FIXME: a) is this ever running? b) is it working when it does run?
if (ev.target) ev.target.focus()
if (ev.button == options.button) activity = STOP
break
Expand All @@ -699,7 +718,7 @@ ScrollbarAnywhere = (function() {
break

case GLIDE:
stopGlide(ev)
stopGlide()
break

default:
Expand Down
Binary file added src/icon16dis.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 7 additions & 0 deletions src/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,13 @@
"background": {
"scripts": ["background.js"]
},
"browser_action": {
"default_title": "Click to toggle Scrollbar Anywhere"
},

"permissions": [
"contextMenus"
],
"options_page": "options.html",
"manifest_version": 2,
"minimum_chrome_version": "49"
Expand Down
Loading