jscher2000 Moderator

Hi swelljoe, sorry for the delay in responding.

Google image results have a Content Security Policy that blocks the script from being inserted by Violentmonkey in Firefox. It should work in Tampermonkey, Greasemonkey, or FireMonkey. I haven't had time to dig into how to modify the script to make it work in Violentmonkey.

For DuckDuckGo, I'll need to study the page layout to add support for image results.


Re: @freeos:

You should only call GM_config.open() when the user wants to open it or you need the user to decide something.

I think a better alternative solution would be if the options could be accessed through the Violentmonkey extenesion popup.

You can add one or more menu commands to appear below the name of your script for users to call up the settings dialog, but the dialog would need to launch from the script in the web page, for example, in an overlay or popup window.

The code to allow real-time settings changes to take effect immediately can be laborious to write. As an example -- by someone without a programming background, so surely it's not very efficient -- you could look at:

https://www.jeffersonscher.com/gm/google-hit-hider/


Firefox: I added user includes in Violentmonkey for the three sites:

Chrome: I added a user include in Tampermonkey for the first site:

  • https://search.snopyta.org/ => the script runs, but inline style rules -- like display:none to hide the dialogs -- are blocked by CSP. What a mess.

It's not a quick rewrite to work around this, but I'll think about it for a future update.


The new FireMonkey extension cannot load this script without modifications.

First issue: this script tries to match all possible Google sites with URL patterns like:

// @include http*://www.google.*/*
// @include http*://www.google.co*.*/*

FireMonkey can only use URL patterns that are legal for extensions, meaning I can't have the * in the last part of the host name (protocol://hostname/path). Since Firefox rejects the pattern, the script cannot run.

If you manually edit the @include lines to match the sites you use, so there are no * left in the host name part of the address, then the script should load.

Second issue: FireMonkey is more like Greasemonkey than like Tampermonkey and Violentmonkey in how you store and retrieve block list data. The script sets GM4 = true only for Greasemonkey, but it needs to be set to true for FireMonkey, too.

I don't have an idea at this point how to manage these differences, but if anyone is interested in using FireMonkey, let me know so I can give it a higher priority. Thanks.


You mischaracterized what I wrote. However, we're not going to change one another's minds, so you do your thing and I'll do mine.


I disagree with this conclusion:

  1. Switching away from GPL is a violation of the license even if you are the original Copyright holder, i.e. license is irrevocable, because you are a licensor and the terms apply to an original Author as well under contract law.

The GPL grants rights to and imposes obligations on "You", the licensee. There are no obligations or limitations imposed by the license on "I" or "Me" or "We" or "Us" or "licensor" or "copyright holder" related to use or distribution of the work.


A userscript author has a lot of flexibility in relation to their own original code, the code for which they are the copyright owner. They can choose the license for each release, and change the license for any subsequent release. (From the licenses allowed on this site, of course.)

If a userscript author incorporated someone else's code into their script, their use of that third party code in their script is subject to the license terms for that code. If the author created a work based on (or incorporated) MIT-licensed code, there aren't many limitations in what license the author chooses for their userscript. On the other hand, if the author created a work based on (or incorporated) GPL-licensed code, then they cannot license their usercript under any license other than the same or newer GPL (or AGPL) license.

Once you add GPL licensing to Code it can't be removed ever period. e.g. it's "sticky" and must remain free software forever with all the conditions that GPL requires.

The GPL-licensed release continues to be under the GPL license, but the author (copyright owner) can re-license on on other terms. Why? Because the author (copyright owner) did not receive their own code under the GPL license. Therefore they are not bound by the GPL for that code.


Hi wili, you might want to start your own thread, but since we're both here:

When I try "Import Script from Github" on https://openuserjs.org/user/add/scripts it shows a list of my repositories, not my gists.

If your code is in a gist, you probably need to use copy/paste to post it on this site.

You might also need to change the updateURL to the address indicated on that page, instead of your gist address. I don't know if that's mandatory.



Okay, that's interesting. I don't have Tor installed, but I will try to test.

Are changes required to the @include list?


I'm not familiar with that site. When I look at the description on this page, it definitely sounds like the watch list is oriented toward shows they recognize as a series: http://www.tvmaze.com/features

Are there other pages that have the missing information about "specials" you've watched? It's sometimes possible to pull another page in the background and insert some of its contents into the page you're currently viewing. Could be a lot of work...


Why would the site only allow downloads in Chrome? Did you contact them about this problem?


Could I suggest truncating the IP addresses sent to Google Analytics? The benefit of this is that you won't need to worry about responding to requests to coax Google to delete data associated with a specific IP address. While you may lose some precision in your geographic statistics, that level of detail may not be particularly relevant/useful anyway.

You just need to add:

ga('set', 'anonymizeIp', true);

immediately before:

ga('send', 'pageview');

See:


Firefox does not allow WebExtensions to have random access to the hard drive. Storage interfaces are tightly constrained for security reasons.


You probably need a different approach for that.

Firefox extensions (such as Greasemonkey, Tampermonkey, Violentmonkey) cannot write to the desktop without displaying a download dialog, so it's not possible to write a userscript to do that, either.

The exception is those extensions which manipulate an external program (so called "native application"). Maybe there is one along the lines you're interested in. If not, perhaps an external program like AutoHotKey can do it.


By the way, user scripts are written in JavaScript and some things they do involve CSS. For example, by adding a class name to an element, the script can take advantage of a CSS rule that will hide that element.

So there are quite a few things to learn, and unfortunately, this script is a terrible example! The code was built up a little at a time over many years so it's hard to follow. I should take a programming class some time.


Hello, thank you for your comment. I think it's possible to change the way the first list works. Instead of:

  • Block List => notice
  • Perma-ban => invisible
  • default => show

You could:

  • Whitelist => show
  • Perma-ban => invisible
  • default => notice

Since I search for very different things all the time, that wouldn't really work for me, but if you are always searching for the same thing and really only want to see sites you trust on that topic, maybe then it would work.

I think it would be best if someone makes a copy of the script and rewrites it to work that way. It would be very complicated to have the same script work both ways. At least it seems complicated to me (I'm not a programmer).


Conversion is a hidden feature of userstyles.org. Let's say you have this URL:

https://userstyles.org/styles/152417/dashed-green-outline-on-focused-element

The URL to generate a userscript is:

https://userstyles.org/styles/userjs/152417/dashed-green-outline-on-focused-element.user.js

As a bookmarklet:

javascript:var parts=location.href.split('/styles/'); location.href=parts[0]+'/styles/userjs/'+parts[1]+'.user.js'; void 0;

You can convert a few to see the pattern the site uses. It hink you need to manually generate @include/@match for styles that use a regex with @-moz-document.



This seems to be mostly working.

There are three unusual features of Baidu:

(1) The domain is not coded into the title link. Instead, the script needs to read the green text below the excerpt. Sometimes this text is incomplete and ends with "...". Since there is no convenient way for the script to learn the full domain, the script records the ... and will use that in matching the green text. Sometimes, you end up needing to block two different domains:

(2) Baidu removes the MutationObserver object, which is how scripts normally detect changes to the page, such as new results when you click page 2+. So the script needs to use an older technology that can slow down the site called a DOM mutation listener. There might be a better way to work around this, but this seems to work for now.

(3) When loading new results, Baidu removes the style rules and forms added by the script, so those need to be reinjected. This is why you currently cannot move the Manage Hiding button to the top or bottom on pages 2+ of your results. I will try to fix that later.

Please post feedback on how it works for you.



Sorry, I just realized you were talking about a different script, so never mind on the link in my previous reply.




Thanks. I don't know how I missed that. I found it easier to stop using GM_addStyle() across the board than to figure out function hoisting. New version posted.